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>
相关推荐
风骏时光牛马1 小时前
AIAgent高可用架构:弹性容错与故障自愈的落地实践
前端
IT_陈寒1 小时前
Vue的响应式什么时候会失灵?这个坑我踩了
前端·人工智能·后端
烟锁池塘柳01 小时前
解决 Firefox 浏览器网页文本选中高亮不明显问题(含仅修改特定网站高亮显示的方案)
前端·firefox
Patrick_Wilson1 小时前
Web 认证方案技术指南
前端·后端·面试
YuJie2 小时前
JSBridge 基础知识
前端·javascript
BigTopOne2 小时前
Ubuntu 虚拟机编译 WebRTC Android AAR(M140 / branch-heads/7339)
前端
默_笙2 小时前
🍕 后端接口还没写好,前端已经跑起来了?Mock 数据 + axios 接口层,前后端再也不互相"等"
前端·javascript
书源2 小时前
AI 时代写给前端同行:什么在贬值,什么在涨价
前端·程序员·ai编程
爱勇宝2 小时前
客户只想看个页面,我却做了一个静态演示发布系统
前端·javascript·后端
渔夫正在掘金2 小时前
告别构建时代:为什么 AI 编程浪潮正让 Vue 与 React 走向落后?
前端