css实现毛玻璃滚动效果

效果图展示(建议使用手机模式): 在线运行

​编辑

完整代码:

js 复制代码
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="renderer" content="webkit" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
    />
    <style>
      .filter_wrapper {
        width: 100%;
        height: 100%;
        position: relative;
        overflow: hidden;
      }

      .filter_bg_wrapper {
        filter: blur(8px);
        height: 100%;
        width: 100%;
      }

      .filter_cover_img {
        width: 100%;
        height: 100%;
        position: absolute;
        top: 0;
        right: 0;
        left: 0;
        clip-path: circle(0%);
      }

      img {
        width: 100%;
        vertical-align: top;
      }
    </style>
  </head>

  <body>
    <div class="wrapper">
      <img
        src="https://img-blog.csdnimg.cn/5a87670618fe4cc59d938f77d41cb816.jpeg"
        alt=""
      />
      <img
        src="https://img-blog.csdnimg.cn/2de8a9c47e054f7ba7bd959ea5041130.jpeg"
        alt=""
      />
      <img
        src="https://img-blog.csdnimg.cn/1f4a4d8d488c46f8acad53892fed08e6.jpeg"
        alt=""
      />
      <div class="filter_wrapper" id="filter_wrapper">
        <div class="filter_bg_wrapper" id="filter_bg_wrapper">
          <img
            src="https://img-blog.csdnimg.cn/0cdb2d2f90b143c491a5a4b92075fa04.jpeg"
            alt="占位毛玻璃图片"
          />
        </div>
        <img
          id="filter_cover_img"
          class="filter_cover_img"
          src="https://img-blog.csdnimg.cn/0cdb2d2f90b143c491a5a4b92075fa04.jpeg"
          alt="清晰圆环图片"
        />
      </div>
      <img
        src="https://img-blog.csdnimg.cn/7b6c25d2f32645f986a26648ef0b0001.jpeg"
        alt=""
      />
      <img
        src="https://img-blog.csdnimg.cn/fbc54f7c6e2a41889d3221e1d3223127.jpeg"
        alt=""
      />
      <img
        src="https://img-blog.csdnimg.cn/d6316c5661344816bbd664a1510f9978.jpeg"
        alt=""
      />
      <div class="filter_wrapper" id="filter_wrapper">
        <div class="filter_bg_wrapper" id="filter_bg_wrapper">
          <img
            src="https://img-blog.csdnimg.cn/21d2c257112a42d88bcf48892bb3d3c3.jpeg"
            alt="占位毛玻璃图片"
          />
        </div>
        <img
          id="filter_cover_img"
          class="filter_cover_img"
          src="https://img-blog.csdnimg.cn/21d2c257112a42d88bcf48892bb3d3c3.jpeg"
          alt="清晰圆环图片"
        />
      </div>
      <img
        src="https://img-blog.csdnimg.cn/6013a8f72e6940568964892fa4c48469.jpeg"
        alt=""
      />
      <img
        src="https://img-blog.csdnimg.cn/b4dc389c8cdb404281cd86780e33828f.jpeg"
        alt=""
      />
      <img
        src="https://img-blog.csdnimg.cn/dbe81da475594345b34f249745c24bd0.jpeg"
        alt=""
      />
    </div>
  </body>
  <script>
    /**
     * 监听滚动条
     */
    window.onscroll = function () {
      handleFilterScroll();
    };

    function handleFilterScroll() {
      let scrollY = window.scrollY;
      let wrappers = document.getElementsByClassName("filter_wrapper");
      let filter_cover_imgs =
        document.getElementsByClassName("filter_cover_img");
      for (let index = 0; index < wrappers.length; index++) {
        const element = wrappers[index];
        let offsetH = element.offsetHeight; // 获取元素的高度
        let offsetW = element.offsetWidth; // 获取元素的宽度
        let offsetT = element.offsetTop; // 元素到offsetParent顶部的距离
        let percentMax = Math.sqrt(offsetH * offsetH + offsetW * offsetW) / 2;
        let oneTen = document.body.clientHeight / 10; // 保证屏幕十分之一处全显示
        let scrollYA = scrollY + offsetH / 2 + oneTen;
        if (scrollYA > offsetT && scrollYA < offsetT + offsetH + oneTen) {
          let percent = ((scrollYA - offsetT) * 100) / percentMax;
          filter_cover_imgs[index].style.clipPath = `circle(${percent}%)`;
        } else {
          if (scrollYA - offsetT < 0) {
            filter_cover_imgs[index].style.clipPath = `circle(${0}%)`;
          }
        }
      }
    }
  </script>
</html>
相关推荐
~无忧花开~4 小时前
JavaScript实现PDF本地预览技巧
开发语言·前端·javascript
小时前端5 小时前
“能说说事件循环吗?”—— 我从候选人回答中看到的浏览器与Node.js核心差异
前端·面试·浏览器
IT_陈寒5 小时前
Vite 5.0实战:10个你可能不知道的性能优化技巧与插件生态深度解析
前端·人工智能·后端
SAP庖丁解码5 小时前
【SAP Web Dispatcher负载均衡】
运维·前端·负载均衡
天蓝色的鱼鱼5 小时前
Ant Design 6.0 正式发布:前端开发者的福音与革新
前端·react.js·ant design
HIT_Weston5 小时前
38、【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(一)
linux·前端·ubuntu
零一科技6 小时前
Vue3拓展:自定义权限指令
前端·vue.js
im_AMBER6 小时前
AI井字棋项目开发笔记
前端·笔记·学习·算法
小时前端6 小时前
Vuex 响应式原理剖析:构建可靠的前端状态管理
前端·面试·vuex
xiaoxue..6 小时前
深入理解浏览器渲染流程:从HTML/CSS/JS到像素呈现
前端·javascript·css·html