实现滚动穿透,保留原本元素的事件,仅实现滚动穿透

网络上都是一堆解决滚动穿透的,却没有一条是实现滚动穿透的方案。

小程序或者某些组件会有滚动穿透,但是如果是自己要造轮子,在某些场景下就需要去实现滚动穿透。比如我打开一个可滑动的弹框,在弹框上打开一个可滑动的组件,但是这个可滑动的组件在弹框的底部,高度不确定且又要让这个可滑动组件定位到弹框子item下面,这样子可能会导致这个可滑动组件的位置被底部遮挡或位置无法调整,无法滚动父级实现组件位置的调整,造成体验低下。

这里滚动穿透的核心就是:

1、position: fixed;保证元素覆盖父级

2、pointer-events: none;取消这个元素的事件实现事件穿透,但因为pointer-events没有单独指定某个事件,所以要js支持

3、监听鼠标滚轮事件,滚动时才添加pointer-events: none;,不滚动就取消添加。

简单代码示例:

html 复制代码
<!--
 * @轮子的作者: 轮子哥
 * @Date: 2023-12-15 10:14:35
 * @LastEditTime: 2023-12-15 14:43:16
-->
<div class="container">
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">
        <div class="mask" onclick="writess()">
            实现滚动穿透(遮罩层),尝试在此遮罩区域滚动试试。
        </div>
        <div class="maskOv">
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
            <div class="maskItem">我是根据父级item定位的模拟滑动下拉框</div>
        </div>
    </div>
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">我是父级虚拟滑动列表</div>
    <div class="item">我是父级虚拟滑动列表</div>
</div>
<div class="writeDom"></div>

<style>
    .container {
        position: relative;
        overflow: scroll;
        height: 500px;
        background: red;
    }

    .mask {
        position: fixed;
        top: 0;
        left: 0;
        width: 50%;
        height: 100%;
        background-color: #32323229;
        z-index: 1;
        text-align: center;
        line-height: 500px;
        color: blue;
    }

    .scrolled {
        pointer-events: none;
    }

    .item {
        position: relative;
        height: 150px;
        background-color: aqua;
        margin: 10px;
    }

    .maskOv {
        overflow: auto;
        height: 200px;
        position: absolute;
        z-index: 2;
        width: 400px;
    }

    .maskItem {
        position: relative;
        height: 50px;
        background-color: rgb(207, 233, 62);
        margin: 10px;
    }
</style>
<script>
    var mask = document.querySelector(".mask");
    let timer = null;

    //监听滚动
    mask.addEventListener("wheel", function (event) {
        mask.classList.add("scrolled");
        if (timer) {
            clearTimeout(timer);
            timer = setTimeout(() => {
                timer = null;
                mask.classList.remove("scrolled");
            }, 300)
        } else {
            timer = setTimeout(() => {
                timer = null;
                mask.classList.remove("scrolled");
            }, 300)
        }
    });


    let writeDom = document.querySelector(".writeDom");
    function writess() {
        console.log("点击触发,保留其它事件,仅实现滚动穿透")
        writeDom.innerHTML = "点击触发,保留其它事件,仅实现滚动穿透" + new Date()
    }

</script>
相关推荐
Setsuna_F_Seiei1 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲3 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙3 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan4 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen5 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理5 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒6 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche15006 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情6736 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具
SoonITer6 小时前
怎样构建一个 Agent-friendly 的网站
前端·agent