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>
相关推荐
vipbic13 分钟前
用 Turborepo 打造 Strapi 插件开发的极速全栈体验
前端·javascript
天涯学馆14 分钟前
为什么 JavaScript 可以单线程却能处理异步?
前端·javascript
Henry_Lau61729 分钟前
主流IDE常用快捷键对照
前端·css·ide
陶甜也34 分钟前
使用Blender进行现代建筑3D建模:前端开发者的跨界探索
前端·3d·blender
我命由我123451 小时前
VSCode - Prettier 配置格式化的单行长度
开发语言·前端·ide·vscode·前端框架·编辑器·学习方法
HashTang1 小时前
【AI 编程实战】第 4 篇:一次完美 vs 五轮对话 - UnoCSS 配置的正确姿势
前端·uni-app·ai编程
JIngJaneIL1 小时前
基于java + vue校园快递物流管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js
asdfg12589632 小时前
JS中的闭包应用
开发语言·前端·javascript
kirk_wang2 小时前
Flutter 导航锁踩坑实录:从断言失败到类型转换异常
前端·javascript·flutter