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>
相关推荐
小爷毛毛_卓寿杰6 分钟前
给 Embedding 模型也加一块“游乐场“—— Xinference 是怎么把 vector 变成肉眼可见的体验的
前端
忆江南9 分钟前
iOS 性能优化全面详解
前端
lichenyang45311 分钟前
HAP / HAR / HSP 到底啥区别?顺带把「导入」那点疑惑讲清楚
前端
基德爆肝c语言13 分钟前
MySQL表的操作
前端·数据库·mysql
秃头网友小李18 分钟前
前端难点:Element Plus 样式覆盖 —— :deep()、CSS 变量与滚动状态类名
前端·vue.js
the_answer20 分钟前
XSS 与 CSRF 深度解析
前端
打呵欠的猫28 分钟前
AI 生成的代码你敢直接上线吗?我总结出 3 条铁律
前端·ai编程
极速蜗牛30 分钟前
我在 Taro 小程序项目里实践的 API First + AI 编程方式
前端·人工智能·后端
锋行天下1 小时前
数据库安全并发控制详解:乐观锁 vs 悲观锁 vs 原子操作
前端·数据库·后端
饼饼饼2 小时前
React19 新手指南:JSX 没那么难,用好这几条规则就够了
前端·javascript·react.js