image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

    1. //页面加载完毕之后 再执行js代码
    2. window.addEventListener('load', function () {
    3. var preview_img = document.querySelector('.preview_img'); //事件源
    4. var mask = document.querySelector('.mask'); //图标上面的小遮罩盒子
    5. var big = document.querySelector('.big'); //存放放大图片的盒子
    6. // 1. 当我们鼠标经过preview_img 就显示和隐藏 mask 遮罩层 和big 大盒子
    7. preview_img.addEventListener('mouseover', function () {
    8. mask.style.display = 'block';
    9. big.style.display = 'block';
    10. })
    11. preview_img.addEventListener('mouseout', function () {
    12. mask.style.display = 'none';
    13. big.style.display = 'none';
    14. })
    15. // 2. 鼠标移动的时候,让黄色的盒子跟着鼠标来走
    16. preview_img.addEventListener('mousemove', function (e) {
    17. // (1). 先计算鼠标在盒子里面的坐标
    18. var x = e.pageX - this.offsetLeft;
    19. var y = e.pageY - this.offsetTop;
    20. console.log(x, y);
    21. // (2). 减去盒子自身高度的一般,让鼠标位于盒子中心
    22. // (3). 我们mask 移动的距离
    23. var maskX = x - mask.offsetWidth / 2;
    24. var maskY = y - mask.offsetHeight / 2;
    25. // (4). 如果X 坐标小于0 就让他停在0的位置
    26. // 遮挡层的最大移动距离
    27. var maskMax = preview_img.offsetWidth - mask.offsetWidth;
    28. if (maskX <= 0) {
    29. maskX = 0;
    30. } else if (maskX >= maskMax) {
    31. maskX = maskMax;
    32. }
    33. if (maskY <= 0) {
    34. maskY = 0;
    35. } else if (maskY >= maskMax) {
    36. maskY = maskMax;
    37. }
    38. mask.style.left = maskX + 'px';
    39. mask.style.top = maskY + 'px';
    40. // 大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离
    41. var bigImg = document.querySelector('.bigImg');
    42. // 大图片最大移动距离
    43. var bigMax = bigImg.offsetWidth - big.offsetWidth;
    44. // 大图片的最大移动距离
    45. var bigX = maskX * bigMax / maskMax;
    46. var bigY = maskY * bigMax / maskMax;
    47. bigImg.style.left = -bigX + 'px';
    48. bigImg.style.top = -bigY + 'px';
    49. })
    50. })

    image.png
    image.png
    image.png
    image.png

    flexible.js

    image.png
    image.png
    Scroll 是内容高度和宽度的大小(包含内边距,但不包含边框)
    image.png
    image.png
    image.png
    image.png

    1. <body>
    2. <div class="slider-bar">
    3. <span class="goBack">返回顶部</span>
    4. </div>
    5. <div class="header w">头部区域</div>
    6. <div class="banner w">banner区域</div>
    7. <div class="main w">主体部分</div>
    8. <script>
    9. // 1. 获取元素
    10. var sliderbar = document.querySelector('.slider-bar'); //侧部导航栏
    11. var banner = document.querySelector('.banner');
    12. // console.log(banner.offsetTop); //到带有定位的父盒子上方的偏移
    13. // banner.offsetTop 就是被卷去的头部
    14. var bannerTop = banner.offsetTop;
    15. // 当我们侧边栏 固定定位后 应该变化的数值
    16. var sliderbarTop = sliderbar.offsetTop - bannerTop;
    17. // 获取main 主体元素
    18. var main = document.querySelector('.main');
    19. var goBack = document.querySelector('.goBack')
    20. var mainTop = main.offsetTop;
    21. // 2. 页面滚动事件 scroll
    22. document.addEventListener('scroll', function () {
    23. // window.pageYOffset 页面被卷去的头部
    24. // console.log(window.pageYOffset);
    25. // 3. 当我们页面被卷去的头部大于等于了172 此时 侧边栏就要改为固定定位
    26. if (window.pageYOffset >= bannerTop) {
    27. sliderbar.style.position = 'fixed';
    28. sliderbar.style.top = sliderbarTop + 'px';
    29. } else {
    30. sliderbar.style.position = 'absolute';
    31. sliderbar.style.top = '300px';
    32. }
    33. if (window.pageYOffset >= mainTop) {
    34. goBack.style.display = 'block';
    35. } else {
    36. goBack.style.display = 'none';
    37. }
    38. })
    39. goBack.addEventListener('click', function () {
    40. //滚动条返回顶部
    41. window.scrollTo(0, 0);
    42. })
    43. </script>
    44. </body>

    image.png
    image.png