不关我的事 發表於 2021-6-10 22:59:00

uni-app制作新手引导

<p>新手引导一般用于新用户打开APP,引导用户使用的流程</p>
<p><img src="https://img2020.cnblogs.com/blog/1094267/202106/1094267-20210610224442606-1831585766.gif" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>实现思路,以uni-app为例,也是基于vue实现</p>
<p>1. 获取需要高亮元素的宽高以及left, top 使用&nbsp;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)">&lt;</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)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>{{ guideInfo.tips }}<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
                  <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>{{ guideInfo.next }}<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">text</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</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>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            query.select(el).boundingClientRect(data </span>=&gt;<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)">&lt;style lang="less" scoped&gt;
.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)">
      &amp;</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)">
      }
    }
}
&lt;/style&gt;</span></pre>
</div>
<p>&nbsp;</p>
<p>参考网站:&nbsp;https://introjs.com/docs/examples/basic/json-config</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/shenjp/p/14873233.html
頁: [1]
查看完整版本: uni-app制作新手引导