從王者榮耀裏我學會的(de)前端新手指引 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

從王者榮耀裏我學會的(de)前端新手指引

發表時(shí)間:2021-3-15

發布人(rén):融晨科技

浏覽次數:52


在(zài)王者的(de)世界裏,不(bù)僅僅隻有快樂,還能搞學習,讓你成爲(wéi / wèi)快樂而(ér)又富有知識的(de)人(rén)。這(zhè)其中的(de)功臣,這(zhè)不(bù)得不(bù)說(shuō)的(de)就(jiù)是(shì)它的(de)新手指引。

爲(wéi / wèi)什麽這(zhè)麽說(shuō)呢?我們先來(lái)看幾張圖。

沒錯,上(shàng)面的(de)就(jiù)是(shì)王者榮耀的(de)新手引導,手把手教學,還有妲己美妙的(de)聲音。

整個(gè)過程大(dà)約 2分鍾。它使用了(le/liǎo)多種引導方式,蒙層引導、氣泡引導、視頻引導、操作引導還有預設任務,可以(yǐ)說(shuō)在(zài)新手引導方面,真的(de)很"細",用了(le/liǎo)各種各樣的(de)花樣。但是(shì)它用了(le/liǎo)僅僅 2 分鍾的(de)指引就(jiù)讓你快速體驗到(dào)了(le/liǎo)整個(gè)産品的(de)使用方式,讓你感受到(dào)打敗敵人(rén)是(shì)如此滿足,赢得一場遊戲是(shì)如此簡單。你收獲了(le/liǎo)大(dà)量的(de)快樂同時(shí)産生對它的(de)依賴。

而(ér)如果說(shuō),沒有新手指引,讓一個(gè)沒有從來(lái)沒有玩過此類遊戲的(de)新人(rén),就(jiù)上(shàng)手一個(gè) 5v5 的(de)戰鬥,在(zài)自己還沒弄懂操作,就(jiù)上(shàng)手實戰,那麽新人(rén)肯定會被打的(de)很慘,受到(dào)隊友的(de)抱怨不(bù)說(shuō),很快會輸掉一場比賽,從而(ér)産生挫敗感,覺得這(zhè)個(gè)遊戲垃圾,更不(bù)用說(shuō)從遊戲中體驗快感。

所以(yǐ)說(shuō)新手引導是(shì)一種能讓用戶在(zài)短時(shí)間内快速了(le/liǎo)解産品特色以(yǐ)及産品使用方式。

它是(shì)非常重要(yào / yāo)也(yě)是(shì)非常有必要(yào / yāo)學習的(de)一個(gè)功能!這(zhè)也(yě)是(shì)本篇文章想要(yào / yāo)介紹的(de)重點内容。下面就(jiù)進行原理實戰講解

我先介紹一下常見的(de)幾種類型新手引導效果圖。

1.引導頁

引導頁一般出(chū)現在(zài)首次打開APP的(de)時(shí)候,由3-5個(gè)頁面組成。

2.蒙層引導

在(zài)産品的(de)整個(gè)界面上(shàng)方用一個(gè)黑色半透明蒙層進行遮罩,這(zhè)種引導方式可以(yǐ)讓用戶聚焦了(le/liǎo)解被圈注的(de)功能點或手勢說(shuō)明。

3.氣泡/彈窗提示

在(zài)操作按鈕旁邊彈出(chū)一個(gè)氣泡提示框或者直接彈出(chū)彈窗。

4.動畫/視頻引導

用戶可以(yǐ)根據動态演示,很快地(dì / de)理解整個(gè)産品。

image-20201103222839640

5.操作式引導

一步一步地(dì / de)引導你進行操作,鼓勵用戶參與其中,邊學邊用。

6.預設任務

預設任務是(shì)指在(zài)用戶進入産品後,自動爲(wéi / wèi)用戶創建了(le/liǎo)一些和(hé / huò)産品形态相關的(de)示例,而(ér)不(bù)是(shì)留給用戶一個(gè)空頁面。

人(rén)将降大(dà)任于(yú)斯人(rén)也(yě),所以(yǐ)最近我就(jiù)遇到(dào)了(le/liǎo)這(zhè)樣的(de)一個(gè)需求。不(bù)過我需要(yào / yāo)實現的(de)也(yě)比較簡單,隻需要(yào / yāo)實現蒙層引導。

今天我們就(jiù)來(lái)實現一下這(zhè)個(gè)功能。先來(lái)看一下我們目标的(de)樣子(zǐ)。核心代碼大(dà)概隻需要(yào / yāo)花 5 分鍾就(jiù)能學會,隻需 9 行 js 代碼,60 行 css 代碼。所以(yǐ)接着往下看吧 ~ 高亮部分會有不(bù)一樣的(de)收獲哦 ~

image-20201102235430928

主要(yào / yāo)包括三個(gè)部分: 蒙層、氣泡、高亮。

蒙層和(hé / huò)氣泡對于(yú)很多同學來(lái)說(shuō),真的(de)是(shì)太熟悉了(le/liǎo)。這(zhè)裏就(jiù)隻貼代碼了(le/liǎo),沒有什麽過多的(de)可以(yǐ)講解,主要(yào / yāo)是(shì)利用了(le/liǎo)絕對定位。

// 蒙層實現
<style>
.guide-mask {
  z-index: 999999;
  background-color: #000;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  position: fixed;
  opacity: 0.8;
}
style>
<div class="guide-mask">div>
複制代碼
// 氣泡實現
<style>
.tooltip-box:before {
  content: "";
  position: absolute;
  right: 100%;
  top: -10px;
  left: 20%;
  width: 0;
  height: 0;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
  border-bottom: 13px solid white;
}
style>
<div class='tooltip-box'>
  秋風的(de)技能
div>
複制代碼

圖層拼接

而(ér)這(zhè)個(gè)高亮怎麽實現呢?如何能讓蒙層中間産生一個(gè)空白框呢?在(zài)我所知的(de) CSS 屬性中并沒有相關的(de)屬性可以(yǐ)實現這(zhè)個(gè)特性,如果不(bù)能這(zhè)樣實現。那意味着我是(shì)不(bù)是(shì)需要(yào / yāo)自己将這(zhè)個(gè)高亮區塊給空出(chū)來(lái)呢,自己通過拼接的(de)方式來(lái)實現。如下所示,這(zhè)是(shì)我第一直覺想到(dào)的(de)方案。

這(zhè)一種方法比較傻瓜式,但是(shì)就(jiù)是(shì)比較繁瑣。

z-index

z-index 屬性設定了(le/liǎo)一個(gè)定位元素及其後代元素或 flex 項目的(de) z-order。 當元素之(zhī)間重疊的(de)時(shí)候, z-index 較大(dà)的(de)元素會覆蓋較小的(de)元素在(zài)上(shàng)層進行顯示。

因爲(wéi / wèi)我們可以(yǐ)利用 z-index 這(zhè)個(gè)特性,隻要(yào / yāo)将我們目标元素的(de) z-index 設置成比我們的(de)蒙層高就(jiù)行。

通過圖層分解,我們可以(yǐ)看到(dào),目标的(de)元素那一行秋風的(de)技能是(shì)處于(yú)最高層,而(ér)不(bù)是(shì)和(hé / huò) 秋風的(de)筆記文字處于(yú)同一層。因此采取的(de)方案是(shì),我們沒辦法讓蒙層在(zài)中間空出(chū)來(lái),但是(shì),我們可以(yǐ)通過z-index讓我們的(de)目标元素置于(yú)蒙層之(zhī)上(shàng),然後再在(zài)蒙層和(hé / huò)目标元素之(zhī)間加入一個(gè)白色的(de)背景框,這(zhè)樣就(jiù)達到(dào)了(le/liǎo)高亮的(de)效果。如果還看不(bù)明白可以(yǐ)看下圖。

有了(le/liǎo)以(yǐ)上(shàng)的(de)知識就(jiù)差定位了(le/liǎo),我們通過 getBoundingClientRect 屬性來(lái)獲取目标元素的(de)大(dà)小及其相對于(yú)視口的(de)位置。然後通過絕對定位來(lái)進行布局。以(yǐ)下就(jiù)是(shì)這(zhè)個(gè)實現的(de)主要(yào / yāo)邏輯(代碼比較粗糙,主要(yào / yāo)是(shì)意思表達

<style>
  ...
  .guide-helper-layer {
    position: absolute;
    z-index: 9999998;
    background-color: #FFF;
    background-color: rgba(255, 255, 255, .9);
    border-radius: 4px;
  }
  .guide-content {
    position: absolute;
    z-index: 10000000;
    background-color: transparent;
  }
  .guide-mark-relative {
    position: relative;
    z-index: 9999999 !important;
  }
  ...
style>
head>
<body>
    <h2>秋風的(de)筆記h2>
    <div class="skill guide-mark-relative">
        ...
    div>
    <div class="guide-mask">div>
    <div class="guide-helper-layer" style="width: 472px; height:58px; top:55px;left: 36px;">
        <div class='tooltip-box'>
            秋風的(de)技能
        div>
    div>
    <script>
        const guideTarget = document.querySelector('.skill')
        const tooltip = document.querySelector('.tooltip-box')
        var rect = guideTarget.getBoundingClientRect()
        const helperLayer = document.querySelector('.guide-helper-layer')
        helperLayer.style.left = rect.left - 3 + 'px'
        helperLayer.style.top = rect.top - 3 + 'px'
        helperLayer.style.width = rect.width + 3 * 2 + 'px'
        helperLayer.style.height = rect.height + 3 * 2 + 'px'
        tooltip.style.top = rect.height + 3 * 2 + 10 + 5 + 'px'
script>
複制代碼

以(yǐ)上(shàng)就(jiù)是(shì)實現一個(gè)蒙層引導的(de)實現方案。當然這(zhè)麽精妙的(de)設計也(yě)是(shì)離不(bù)開偉大(dà)的(de)開源項目,以(yǐ)上(shàng)就(jiù)是(shì)參考了(le/liǎo)開源項目 introjs 來(lái)實現的(de)。

box-shadow

這(zhè)個(gè)方案除了(le/liǎo)兼容性問題(不(bù)兼容低版本ie8以(yǐ)及以(yǐ)前版本),也(yě)是(shì)比較簡單的(de)一個(gè)方法。來(lái)看看 box-shadow 的(de)方法介紹。

/* x偏移量 | y偏移量 | 陰影模糊半徑 | 陰影擴散半徑 | 陰影顔色 */
box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);
複制代碼

核心思路爲(wéi / wèi)我們可以(yǐ)通過設置一個(gè)比較大(dà)的(de)陰影擴散半徑,來(lái)實現,再設置一個(gè)半透明的(de)背景色。

box-shadow: 0 0 0 2000px rgba(0,0,0,.5);
複制代碼

canvas

先通過 canvas 繪制出(chū)全屏的(de)半透明遮罩,然後繪制出(chū)高亮部分,通過 globalCompositeOperation 中的(de) xor選項,将重疊部分變透明。

const canvas = document.getElementById('guide-mask')
const width = window.innerWidth;
const height = window.innerHeight;
canvas.setAttribute("width", width);
canvas.setAttribute("height", height);
const ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = 'source-over';
ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
ctx.fillRect(0, 0, width, height);
ctx.fill();
ctx.fillStyle = 'rgb(255, 255, 255)';
ctx.globalCompositeOperation = "xor";
ctx.fillRect(rect.left - 3, rect.top - 3, rect.width + 3 * 2 + 10 + 5, rect.height + 3 * 2);
複制代碼

完整代碼倉庫: github.com/hua1995116/…

我順便來(lái)介紹一下目前我看到(dào)新手引導比較好的(de)幾個(gè)開源項目。

jquery-pagewalkthrough

優勢: 手繪風,适用于(yú)特定的(de)網站風格。

缺點: 需要(yào / yāo)依賴 jQuery。

intro.js

優勢: 擁有豐富的(de)蒙層引導示例,可自定義主題

缺點: 個(gè)人(rén)免費,商業需要(yào / yāo)付費。

image-20201103112854822

driver.js

優勢: MIT 開源,擁有與 intro.js 差不(bù)多的(de)功能。

缺點: 示例沒有 intro.js 豐富。

至此,本文就(jiù)到(dào)此結束了(le/liǎo)。

參考

zhuanlan.zhihu.com/p/33508501

www.zhihu.com/question/20…

www.woshipm.com/ucd/3506054…

juejin.im/post/684490…

developer.mozilla.org/zh-CN/docs/…

歡迎關注「秋風的(de)筆記」,前端學習不(bù)迷路或加微信 qiufengblue,一起交流學習。


相關案例查看更多