当前位置: 首页 > Web前端 > vue.js

如何在不使用第三方库的情况下实现【前端引导页】功能?

时间:2023-03-31 20:09:50 vue.js

.guide-modal{position:fixed;z-index:999;left:0;right:0;顶部:0;底部:0;背景色:rgba(0,0,0,0.3);}.guide-box{宽度:150px;最小高度:10px;边界半径:5px;背景色:#fff;位置:绝对;过渡:0.5s;填充:10px;text-align:center;}.btn{margin:20px5px5px5px;}前言随着应用功能越来越多,繁多详尽的功能使用和文档已经不能满足时代追求速度的需求,而引导页面(或分步指南)的精髓在于simplify简化核心功能,以更简单、更短、更清晰的文字引导用户使用相应的功能,尤其是对于ToB项目。各种新的功能需求迭代非常快,难免需要引导页的功能来快速帮助用户引导。接下来,我们将从两个方面着重介绍一下【前端引导页】:有哪些第三方库可以直接使用快捷实现功能?如何自己实现前端引导页的功能?第三方库的选型如果你不知道如何进行技术选型,可以看看山岳老师的这篇文章。在前端,如何做出更好的技术选型?,下面简单列举几个相关库进行简单介绍,具体需求具体分析选择,其他和API使用,具体实现效果可以通过官方文档或者对应的README.md查看。vue-tourvue-tour是一款轻量级、简单且可定制的Tour插件。配置比较简单明了,但是只适用于Vue2项目。具体效果请参考上一链接中的相应内容。driver.jsdriver.js是一个强大的轻量级通用JavaScript引擎,可以在整个页面上驱动用户的注意力,大小只有4kb左右,并且没有外部依赖,不仅高度可定制,而且支持所有主流浏览器设备。shepherd.jsshepherd.js包含了很多API,大部分场景都可以通过其对应的配置获取。缺点是整体封装体积比较大,配置也比较复杂。一般复杂的配置内容需要打包两次,将可用的可变和不可变配置项提取出来,具体效果可以查看其官方文档。intro.jsintro.js是一个开源的vanillaJavascript/CSS库,用于添加分步介绍或提示。大小约为10kB。它是轻量级的,没有外部依赖。详情参见官方文档。实现引导页功能引导页的核心功能其实就是两点:一是高亮部分,二是引导部分。这两点其实并不难做到。引导部分无非是随着高亮部分一起移动,加上一些简单的动画或者过渡效果就可以了,也分为遮罩层引导和非遮罩层引导。这里有一个比较复杂的蒙版层指导。下面简单介绍两种简单的实现方案。cloneNode+position+transition的核心实现:高亮部分通过el.cloneNode(true)复制对应的目标元素节点,并将clone节点加入mask层并通过margin()实现clone节点与目标节点的位置ortranslate,position等)重合引导部分通过position:fixed实现定位效果,通过动态修改left和top属性实现引导弹窗跟随目标移动。转场动画通过转场实现位置的平滑移动。当页面位置/内容发生变化时(如:resize、scroll事件),需要重新计算位置信息缺点:需要对目标节点进行深度复制,无法边引导边实现运行效果。演示:核心代码://核心配置参数constselectors=[{selector:"#btn1",message:"点击这里【新增】数据!",},{selector:"#btn2",message:"注意[删除]数据!”,},{选择器:“#btn3”,消息:“您可以通过此按钮[修改]数据!”,},{selector:"#btn4",message:"一键【完成】所有操作!",},];//Guide.vue.guide-modal{position:fixed;z-index:999;left:0;right:0;顶部:0;底部:0;背景色:rgba(0,0,0,0.3);}.guide-box{宽度:150px;最小高度:10px;边界半径:5px;背景色:#fff;位置:绝对;过渡:0.5s;填充:10px;text-align:center;}.btn{margin:20px5px5px5px;}z-index+position+transition核心实现:高亮部分通过控制z-index的值,让目标元素显示在遮罩层。引导部分通过position:fixed实现定位效果,通过动态修改left和top属性实现引导弹窗随目标移动。过渡动画通过transition实现平滑定位当移动端页面的位置/内容发生变化时(如:resize、scroll事件),需要重新计算位置信息缺点:当父元素position:fixed|绝对|目标元素的sticky,目标元素的z-index不能超过遮罩层(参考shepherd.js的svg方案)效果演示:核心代码:

{{message}}
上一步下一步
.guide-modal{position:fixed;z-指数:999;左:0;右:0;顶部:0;底部:0;背景色:rgba(0,0,0,0.3);}.guide-box{宽度:150px;最小高度:10px;边界半径:5px;背景色:#fff;位置:绝对;过渡:0.5s;填充:10px;text-align:center;}.btn{margin:20px5px5px5px;}【扩展】SVG如何完美解决z-index失败问题?这里我们以shepherd.js为例。先看官方文档展示的demo效果:上面的效果已经做了一些验证:正常点击NEXT进入下一步引导,仔细观察相关SVG数据的变化等到引导部分当指向代码块的内容区域时,复制此时SVG中路径相关的参数返回第一步,此时可以明显看出高亮部分的高度小了,直接替换将当前SVG中路径相关的参数与上一步复制的参数进行对比,此时发现整体SVG高亮内容的宽高发生了变化。核心结论:通过SVG的可编码特性,使用SVG实现遮罩效果,在绘制遮罩时保留目标元素的高亮范围(即SVG不需要绘制这部分),解决了问题使用z-index可能会失败。最后,上面是一些简单的实现,但是还有很多细节需要考虑,比如:并排操作的实现,以及定位Layer显示问题的原因等等,还有待优化。相信大多数人的第一反应是:直接用第三方库实现功能就好了。没必要自己实现功能,功能不完整,可能不好用。对于这一点,前面看到一句话说的很好:理解底层实现原理比使用库本身更有意义。当然每个人的想法都不一样,但是想要开始理解原理,不能马上去挑战一些进阶的内容,为什么不从您感兴趣的不太复杂的功能开始呢?往期文章推荐2022,你还知道微前端吗(下)—揭秘微前端核心原理2022,你还不知道微前端吗(上)—从单体应用到微应用,我听说你很了解Vue3响应式?给我一个前端Excel导入导出功能如何做前端性能优化(上)——直入正题如何做前端性能优化(下)——直奔黄龙你知道吗前端水印功能是如何实现的?