css新手引导实现方式总结

新手引导功能一般都是用一个半透明的黑色进行遮罩,蒙层上方对界面进行高亮,旁边配以弹窗进行讲解,样式如下

但是由于交互不同,实现方案也不一样,下面就针对不用的交互,总结了不同的实现方法(下文描述时以上面的图片为例)

场景一:点击任意位置关闭新手引导功能

在页面上增加 mask 蒙层覆盖满屏,蒙层内是自定义的讲解文案和按钮等,根据自己需求实现即可。

<body>
    <h1>新手引导功能</h1>
    <button onclick="click1()" class="btn">点我11111111</button>
    <button onclick="click2()" class="btn btn2">点我22222</button>

    <div class="mask" onclick="click3()">
        <div class="tips">
            点击按钮召唤神龙
            <button>知道啦</button>
        </div>
    </div>
</body>

核心样式代码:

  • 给需要高亮的元素设置box-shadow,把spread阴影扩展半径设置成非常大的值,保证能铺满全屏
  • mask 蒙层设置成透明色,fixed 布局,absolute 布局也行,tips 定位到指定位置,这里为了简洁,我随便写的位置,实际应该需要获取一些高亮元素的位置,动态设置 tips 的位置
body {
    position: relative;
}

.btn2 {
    box-shadow: 1px 1px 1px 2000px rgba(0,0,0,.6);
    margin-left: 50px;
}
.mask {
    position: fixed;
    z-index: 999;
    background-color: transparent;
    height: 100%;
    width: 100%;
    top: 0;
    left: 0;
}
.tips {
    position: absolute;
    top: 150px;
    left: 58%;
    background: white;
    width: 300px;
    height: 150px;
    display: flex;
    justify-content: center;
    align-items: center;
}

方法如下:   

<script>
    function click1(){
        alert('1111');
    }
    function click2(){
        alert('22222');
    }
    function click3() {
        // 隐藏新手引导功能
        document.querySelector('.mask').style.display = 'none';
        document.querySelector('.btn2').style.boxShadow = 'none';
    }
</script>

实现效果:

 

场景二:点击【知道啦】关闭新手引导功能,点击其他位置无交互

dom 基本与场景一一致,只是方法绑定在【知道啦】按钮上

<body>
    <h1>新手引导功能</h1>
    <button onclick="click1()" class="btn">点我11111111</button>
    <button onclick="click2()" class="btn btn2">点我22222</button>

    <div class="mask">
        <div class="tips">
            点击按钮召唤神龙
            <button onclick="click3()">知道啦</button>
        </div>
    </div>
</body>

样式代码和方法与场景一一样, 实现效果:

场景三:点击【知道啦】关闭新手引导功能,点击【添加推荐商品】触发相应的方法并关闭新手引导功能,点击其他位置无交互

pointer-events: none实现(不行)

用如上的方式实现我们可以发现,用蒙层覆盖住页面后,下边的方法是不会被触发的,然后就想到一个css 属性 pointer-events: none,这个属性设置后,该dom 上的事件就会不生效,点击会穿透触发到下层的元素。

.mask {
    position: fixed;
    z-index: 999;
    background-color: rgba(0,0,0,.6);
    height: 100%;
    width: 100%;
    top: 0;
    left: 0;
    pointer-events: none;
}

设置后,虽然点击高亮元素,能触发指定方法,但是其他非高亮的元素的点击事件也会触发,这明显不是我们想要的效果呀,所以用这个属性不行

z-index 实现(完美实现)

于是又想到一个办法,就是用 z-index 实现,高亮元素的 z-index 设置大值,mask 蒙层设置成半透明色,实现如下:

body {
    position: relative;
}
.btn2 {
    margin-left: 50px;
    z-index: 1000;
    position: relative;
}
.mask {
    position: fixed;
    z-index: 999;
    background-color: rgba(0,0,0,.6);
    height: 100%;
    width: 100%;
    top: 0;
    left: 0;
}
.tips {
    position: absolute;
    top: 150px;
    left: 58%;
    background: white;
    width: 300px;
    height: 150px;
    display: flex;
    justify-content: center;
    align-items: center;
}

 方法如下:

<script>
    function click1(){
        alert('1111');
    }
    function click2(){
        alert('22222');
        click3();
    }
    function click3() {
        // 隐藏新手引导功能
        document.querySelector('.mask').style.display = 'none';
        document.querySelector('.btn2').style.boxShadow = 'none';
    }
</script>

实现效果:

总结一下,如果不需要场景3这种支持高亮元素点击触发原逻辑的需求,可以直接使用box-shadow实现,如果需要的话,可使用 z-index 实现,当然还有很多其他种实现方法,如果有更好的实现方法,也可以一起交流哦~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值