uni-app制作新手引导
<p>新手引导一般用于新用户打开APP,引导用户使用的流程</p><p><img src="https://img2020.cnblogs.com/blog/1094267/202106/1094267-20210610224442606-1831585766.gif" alt="" loading="lazy"></p>
<p> </p>
<p>实现思路,以uni-app为例,也是基于vue实现</p>
<p>1. 获取需要高亮元素的宽高以及left, top 使用 boundingClientRect 方法</p>
<p>2. 使用box-shadow 将其它区域遮盖住即可</p>
<p>具体步骤:</p>
<p>一、封装我们需要的数据</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">data () {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
guideList: [{
el: </span>'.head-portrait .avge'<span style="color: rgba(0, 0, 0, 1)">, // 需要高亮的元素,这里最好唯一
tips: </span>'点击这里,加入神奇的左汪右喵世界'<span style="color: rgba(0, 0, 0, 1)">, // 提示文字
next: </span>'下一步'<span style="color: rgba(0, 0, 0, 1)">, // 下一步按钮显示文字
style: { // 高亮样式
borderRadius: </span>'12rpx'<span style="color: rgba(0, 0, 0, 1)">,
margin: </span>'-10rpx 0 0 -10rpx'<span style="color: rgba(0, 0, 0, 1)">
},
tipStyle: { // tips样式
left: </span>'-200rpx'<span style="color: rgba(0, 0, 0, 1)">
}
}, {
el: </span>'.navList .nav-image-1-1'<span style="color: rgba(0, 0, 0, 1)">,
tips: </span>'点击这里,快速记录小可爱成长的点点滴滴'<span style="color: rgba(0, 0, 0, 1)">,
next: </span>'下一步'<span style="color: rgba(0, 0, 0, 1)">,
style: {
borderRadius: </span>'12rpx'<span style="color: rgba(0, 0, 0, 1)">,
margin: </span>'-10rpx 0 0 -32rpx'<span style="color: rgba(0, 0, 0, 1)">
},
tipStyle: {
left: </span>'-164rpx'<span style="color: rgba(0, 0, 0, 1)">
}
}, {
el: </span>'.navList .nav-image-2-3'<span style="color: rgba(0, 0, 0, 1)">,
tips: </span>'点击这里,是小可爱的智能硬件仓库'<span style="color: rgba(0, 0, 0, 1)">,
next: </span>'下一步'<span style="color: rgba(0, 0, 0, 1)">,
style: {
borderRadius: </span>'12rpx'<span style="color: rgba(0, 0, 0, 1)">,
margin: </span>'-10rpx 0 0 -32rpx'<span style="color: rgba(0, 0, 0, 1)">
},
tipStyle: {
left: </span>'-356rpx'<span style="color: rgba(0, 0, 0, 1)">
}
}],
index: </span>0<span style="color: rgba(0, 0, 0, 1)">, // 当前展示的索引
showGuide: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">, // 是否显示引导
}
},</span></pre>
</div>
<p>二、 展示布局</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="guide"</span><span style="color: rgba(255, 0, 0, 1)"> @touchmove.stop.prevent</span><span style="color: rgba(0, 0, 255, 1)">="moveHandle"</span><span style="color: rgba(255, 0, 0, 1)"> v-if</span><span style="color: rgba(0, 0, 255, 1)">="showGuide"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view
</span><span style="color: rgba(255, 0, 0, 1)">:style</span><span style="color: rgba(0, 0, 255, 1)">="getStyle"</span><span style="color: rgba(255, 0, 0, 1)">
class</span><span style="color: rgba(0, 0, 255, 1)">="guide-box"</span><span style="color: rgba(255, 0, 0, 1)">
catchtouchmove</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="tips"</span><span style="color: rgba(255, 0, 0, 1)"> :style</span><span style="color: rgba(0, 0, 255, 1)">="{left: guideInfo.tipStyle.left}"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ guideInfo.tips }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="next"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">text </span><span style="color: rgba(255, 0, 0, 1)">@click</span><span style="color: rgba(0, 0, 255, 1)">="next"</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ guideInfo.next }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">text</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="arrow"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>三、计算当前展示的数据</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">computed: {
guideInfo() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span>.guideList[<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.index];
},
getStyle () {
const { width, height, left, top, style } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.guideInfo;
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
width: </span>120 + 'rpx'<span style="color: rgba(0, 0, 0, 1)">,
height: </span>120 + 'rpx'<span style="color: rgba(0, 0, 0, 1)">,
left: left </span>+ 'px'<span style="color: rgba(0, 0, 0, 1)">,
top: top </span>+ 'px'<span style="color: rgba(0, 0, 0, 1)">,
...style,
boxShadow: </span>'rgb(33 33 33 / 80%) 0px 0px 0px 0px, rgb(33 33 33 / 50%) 0px 0px 0px 5000px'<span style="color: rgba(0, 0, 0, 1)">
}
}
},</span></pre>
</div>
<p>四、方法处理</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mounted() {
const guide </span>= uni.getStorageSync('guide_key'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">guide) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getDomInfo();
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.showGuide = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}
},
methods: {
getDomInfo () {
const { el } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.guideInfo;
const query </span>= uni.createSelectorQuery().<span style="color: rgba(0, 0, 255, 1)">in</span>(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.$root);
setTimeout(() </span>=><span style="color: rgba(0, 0, 0, 1)"> {
query.select(el).boundingClientRect(data </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (data) {
const index </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.index;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.guideList.splice(index, 1<span style="color: rgba(0, 0, 0, 1)">, {
...</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.guideList,
left: data.left,
top: data.top,
width: data.width,
height: data.height
});
}
}).exec();
}, </span>10<span style="color: rgba(0, 0, 0, 1)">)
},
next () {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.index === <span style="color: rgba(0, 0, 255, 1)">this</span>.guideList.length - 1<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.showGuide = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
uni.setStorageSync(</span>'guide_key', 'true'<span style="color: rgba(0, 0, 0, 1)">);
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.index += 1<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getDomInfo();
}
},
moveHandle () {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
}
},</span></pre>
</div>
<p>五、样式展示</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)"><style lang="less" scoped>
.guide </span>{<span style="color: rgba(255, 0, 0, 1)">
position</span>:<span style="color: rgba(0, 0, 255, 1)"> fixed</span>;<span style="color: rgba(255, 0, 0, 1)">
top</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
left</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
right</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
bottom</span>:<span style="color: rgba(0, 0, 255, 1)"> 0px</span>;<span style="color: rgba(255, 0, 0, 1)">
z-index</span>:<span style="color: rgba(0, 0, 255, 1)"> 1000</span>;<span style="color: rgba(255, 0, 0, 1)">
.guide-box {
position</span>:<span style="color: rgba(0, 0, 255, 1)"> fixed</span>;<span style="color: rgba(255, 0, 0, 1)">
z-index</span>:<span style="color: rgba(0, 0, 255, 1)"> 100</span>;<span style="color: rgba(255, 0, 0, 1)">
transition</span>:<span style="color: rgba(0, 0, 255, 1)"> all 0.2s</span>;<span style="color: rgba(255, 0, 0, 1)">
&</span>:<span style="color: rgba(0, 0, 255, 1)">:before {
content: ''</span>;<span style="color: rgba(255, 0, 0, 1)">
height</span>:<span style="color: rgba(0, 0, 255, 1)"> 140rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
width</span>:<span style="color: rgba(0, 0, 255, 1)"> 140rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
border</span>:<span style="color: rgba(0, 0, 255, 1)"> 1px dashed #fff</span>;<span style="color: rgba(255, 0, 0, 1)">
border-radius</span>:<span style="color: rgba(0, 0, 255, 1)"> 12rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
position</span>:<span style="color: rgba(0, 0, 255, 1)"> absolute</span>;<span style="color: rgba(255, 0, 0, 1)">
top</span>:<span style="color: rgba(0, 0, 255, 1)"> -12rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
left</span>:<span style="color: rgba(0, 0, 255, 1)"> -12rpx</span>;
}<span style="color: rgba(128, 0, 0, 1)">
.arrow </span>{<span style="color: rgba(255, 0, 0, 1)">
height</span>:<span style="color: rgba(0, 0, 255, 1)"> 20rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
width</span>:<span style="color: rgba(0, 0, 255, 1)"> 20rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
background</span>:<span style="color: rgba(0, 0, 255, 1)"> #DC5F45</span>;<span style="color: rgba(255, 0, 0, 1)">
position</span>:<span style="color: rgba(0, 0, 255, 1)"> absolute</span>;<span style="color: rgba(255, 0, 0, 1)">
top</span>:<span style="color: rgba(0, 0, 255, 1)"> 144rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
left</span>:<span style="color: rgba(0, 0, 255, 1)"> 50%</span>;<span style="color: rgba(255, 0, 0, 1)">
transform</span>:<span style="color: rgba(0, 0, 255, 1)"> rotate(45deg)</span>;
}<span style="color: rgba(128, 0, 0, 1)">
.tips </span>{<span style="color: rgba(255, 0, 0, 1)">
background</span>:<span style="color: rgba(0, 0, 255, 1)"> #DC5F45</span>;<span style="color: rgba(255, 0, 0, 1)">
box-shadow</span>:<span style="color: rgba(0, 0, 255, 1)"> 0px 2px 9px 0px rgba(0, 0, 0, 0.1)</span>;<span style="color: rgba(255, 0, 0, 1)">
color</span>:<span style="color: rgba(0, 0, 255, 1)"> #fff</span>;<span style="color: rgba(255, 0, 0, 1)">
position</span>:<span style="color: rgba(0, 0, 255, 1)"> absolute</span>;<span style="color: rgba(255, 0, 0, 1)">
top</span>:<span style="color: rgba(0, 0, 255, 1)"> 152rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
left</span>:<span style="color: rgba(0, 0, 255, 1)"> -50%</span>;<span style="color: rgba(255, 0, 0, 1)">
padding</span>:<span style="color: rgba(0, 0, 255, 1)"> 15rpx 20rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
font-size</span>:<span style="color: rgba(0, 0, 255, 1)"> 28rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
border-radius</span>:<span style="color: rgba(0, 0, 255, 1)"> 12rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
.text {
white-space</span>:<span style="color: rgba(0, 0, 255, 1)"> nowrap</span>;
}<span style="color: rgba(128, 0, 0, 1)">
.next </span>{<span style="color: rgba(255, 0, 0, 1)">
text-align</span>:<span style="color: rgba(0, 0, 255, 1)"> right</span>;<span style="color: rgba(255, 0, 0, 1)">
padding-right</span>:<span style="color: rgba(0, 0, 255, 1)"> 0rpx</span>;<span style="color: rgba(255, 0, 0, 1)">
margin-top</span>:<span style="color: rgba(0, 0, 255, 1)"> 10rpx</span>;
}<span style="color: rgba(128, 0, 0, 1)">
}
}
}
</style></span></pre>
</div>
<p> </p>
<p>参考网站: https://introjs.com/docs/examples/basic/json-config</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/shenjp/p/14873233.html
頁:
[1]