分享 30+ 個(gè)常用的前端技術(shù)知識(shí)點(diǎn)

前端要會(huì)打組合拳,復(fù)盤30+技術(shù)點(diǎn)打出的功能
一、前言
tips:總結(jié)。
①會(huì)用才算學(xué)到,能靈活運(yùn)用打組合拳是學(xué)會(huì)的標(biāo)志之一。
②每一個(gè)技術(shù)點(diǎn)都值得優(yōu)寫優(yōu)學(xué),當(dāng)他們組合在一起可能會(huì)有驚喜。
③要用的時(shí)候能想到,想到的時(shí)候會(huì)用,用的時(shí)候能優(yōu)雅,就是精通了。這也是我堅(jiān)持寫“每個(gè)技術(shù)點(diǎn)都值得優(yōu)學(xué)優(yōu)寫系列”的初衷。
④寫到后面有點(diǎn)疲憊,其實(shí)可以算是50+的知識(shí)技術(shù)點(diǎn),組合一起偷懶了。
⑤前端是真的知識(shí)點(diǎn)廣啊啊啊,更新迭代還快,不總結(jié)沒發(fā)現(xiàn),一總結(jié)嚇一跳,我不想說前端卷,看看下面這張圖。

原創(chuàng)的手寫進(jìn)階圖,前文已經(jīng)開發(fā)完,今天總結(jié)一下,涉及到的前端知識(shí)技術(shù)點(diǎn),看看開發(fā)一個(gè)這樣的進(jìn)階圖,需要用到哪些知識(shí)和技術(shù)點(diǎn)。
會(huì)用的知識(shí)技術(shù)才算學(xué)到的,進(jìn)階圖的每一步都是作者原創(chuàng),市面上并沒有發(fā)現(xiàn)參考庫(kù),雖說難度不大,但這其中也涉及到不少的前端知識(shí)技術(shù)點(diǎn),最重要的是涉及到的思維組織,邏輯設(shè)計(jì),技術(shù)點(diǎn)的靈活配套運(yùn)用,知道該用什么技術(shù)點(diǎn)實(shí)現(xiàn)什么,在什么時(shí)候用。
我一共總結(jié)了涉及到的30+知識(shí)技術(shù)點(diǎn),也有更可能不止,歡迎評(píng)論區(qū)分享。
二、30+前端技術(shù)點(diǎn)
這些知識(shí)技術(shù)點(diǎn)被分為下面幾個(gè)系列:
1. Vue 系列
1. props
進(jìn)階圖用到 props 主要是用來接收父組件傳遞而來的主面板數(shù)據(jù),例如 hasScale 用于在父組件調(diào)用面板組件時(shí),傳遞一個(gè) Boolean 值告訴面板組件是否支持縮放。而 progressData 則是用來接收渲染面板的數(shù)據(jù),要注意的是,父組件中的傳遞名稱應(yīng)該和子組件中的 props 中定義的名稱一致。如下是關(guān)于 props 在進(jìn)階圖中的應(yīng)用。
props 可以是數(shù)組或?qū)ο?,用于接收來自父組件的數(shù)據(jù)。props 可以是簡(jiǎn)單的數(shù)組,或者使用對(duì)象作為替代,對(duì)象允許配置高級(jí)選項(xiàng),如類型檢測(cè)、自定義驗(yàn)證和設(shè)置默認(rèn)值。支持配置屬性 type:數(shù)據(jù)類型,default 設(shè)置默認(rèn)值,required 是否必須,validator 自定義驗(yàn)證函數(shù)。
??"list"></main-panel>
復(fù)制代碼
props:?{
????//?是否支持縮放
????hasScale:?{
??????type:?Boolean,
??????default:?false
????},
????//?類型:只讀(detail)或?編輯(默認(rèn))
????type:?{
??????type:?String,
??????default:?''
????},
????//?主面板數(shù)據(jù)
????progressData:?{
??????type:?Array,
??????default:?function?()?{
????????return?[]
??????}
????}
},
復(fù)制代碼
2. $emit
$emit 用于向上派發(fā)事件并傳遞參數(shù),通常配合 props 使用,以達(dá)到父子組件通信的目的。進(jìn)階圖中是于父組件派發(fā)change事件,并傳遞 this.bodyWidth, this.list 兩個(gè)參數(shù)。注意父組件在接收事件時(shí)應(yīng)保持名稱一致。
watch:?{
??'list':?{
????deep:?true,
????handler?(newVal,?oldVal)?{
??????this.bodyWidth?=?this.list.length?*?392?+?60?+?'px'
??????//?派發(fā)事件
??????this.$emit('change',?this.bodyWidth,?this.list)
????}
??},
},
復(fù)制代碼
<--?接收?change?事件?-->
<main-panel?@change="change">main-panel>
復(fù)制代碼
3. ref
ref 在 Vue 中用于綁定組件,可以通過 this.refs[綁定名稱]或this.refs[綁定名稱] 或 this.refs[綁定名稱]或this.refs.綁定名稱 來獲取組件實(shí)例對(duì)象,這有時(shí)非常有用。例如,當(dāng)我們想要在一個(gè)組件中調(diào)用其子組件的某個(gè)方法或?qū)傩詴r(shí),可通過這種方式調(diào)用。
<--?使用?ref?綁定面板組件?-->
<main-panel?ref="mainPanel">main-panel>
復(fù)制代碼
4. watch
watch 是 vue 中被常用的 api 之一,用于監(jiān)聽數(shù)據(jù),可以監(jiān)聽 data 中的數(shù)據(jù),也可以監(jiān)聽 props 中的數(shù)據(jù)。
watch 觀察 Vue 實(shí)例上的一個(gè)表達(dá)式或者一個(gè)函數(shù)計(jì)算結(jié)果的變化。回調(diào)函數(shù)得到的參數(shù)為新值和舊值。表達(dá)式只接受簡(jiǎn)單的鍵路徑。對(duì)于更復(fù)雜的表達(dá)式,用一個(gè)函數(shù)取代。
進(jìn)階圖中使用 watch 監(jiān)聽 data 中的面板數(shù)據(jù) list 和 props 中的 父組件傳遞下來的面板數(shù)據(jù) progressData。其中使用到了 deep 屬性,表示是否進(jìn)行深層次的內(nèi)部值得監(jiān)聽。根據(jù)官網(wǎng)的提示,數(shù)組其實(shí)不需要使用 deep:true 去監(jiān)聽數(shù)組內(nèi)部值得變化。
watch:?{
??'list':?{
????deep:?true,
????handler?(newVal,?oldVal)?{
??????this.bodyWidth?=?this.list.length?*?392?+?60?+?'px'
??????this.$emit('change',?this.bodyWidth,?this.list)
????}
??},
??'progressData':?{
????handler?(newVal,?oldVal)?{
??????this.list?=?newVal
????}
??}
},
復(fù)制代碼
5. computed
computed 是計(jì)算屬性,對(duì)于任何復(fù)雜邏輯,你都應(yīng)當(dāng)使用計(jì)算屬性,這就是它的應(yīng)用場(chǎng)景,雖然通過 methods 或 watch 也能完成,但是 computed 在處理復(fù)雜邏輯時(shí)更有優(yōu)勢(shì):計(jì)算屬性是基于它們的響應(yīng)式依賴進(jìn)行緩存的。
進(jìn)階圖的實(shí)現(xiàn)多次用到了 computed

6. created
created 聲明周期鉤子函數(shù)之一,如果你想盡早獲取接口數(shù)據(jù),那么在這里做很合適。
在實(shí)例創(chuàng)建完成后被立即同步調(diào)用。在這一步中,實(shí)例已完成對(duì)選項(xiàng)的處理, 意味著以下內(nèi)容已被配置完畢:數(shù)據(jù)偵聽、計(jì)算屬性、方法、事件/偵聽器的回調(diào)函數(shù)。然而,掛載階段還沒開始,且 $el property 目前尚不可用。
進(jìn)階圖中就是在 created 中獲取可提供的關(guān)聯(lián)數(shù)據(jù)。
created?()?{
???//?獲取可供關(guān)聯(lián)的關(guān)聯(lián)數(shù)據(jù)
??//?this.searchList()
},
復(fù)制代碼
7. mounted
mounted 是一個(gè) vue 生命周期鉤子函數(shù),此時(shí) dom 這時(shí) el 被新創(chuàng)建的 vm.$el 替換了,我們可以在 mounted 中進(jìn)行 dom 操作, 這也是最早可以較好進(jìn)行 dom 操作的鉤子函數(shù)。
注意 mounted 不會(huì)保證所有的子組件也都被掛載完成。如果你希望等到整個(gè)視圖都渲染完畢再執(zhí)行某些操作,
可以在 mounted 內(nèi)部使用 vm.$nextTick
進(jìn)階圖中使用 mounted 鉤子,在里面做了兩件事,第一件是監(jiān)聽文檔上的 click 事件。第二件事是調(diào)用 init() 函數(shù),初始化進(jìn)階圖
??mounted?()?{
????//?監(jiān)聽?click?事件
????document.addEventListener('click',?this.clickListener)
????//?初始化進(jìn)階圖
????this.init()
??},
復(fù)制代碼
8. beforeDestroy
我們通常在 beforeDestroy 中做一些解綁和移除操作。beforeDestroy 發(fā)生在實(shí)例銷毀之前調(diào)用。在這一步,實(shí)例仍然完全可用。要注意的是,該鉤子在服務(wù)器端渲染期間不被調(diào)用。
進(jìn)階圖中在 beforeDestroy 中做的是 移除 click 監(jiān)聽,例如一些定時(shí)器也可以在這是移除,還一些解綁操作。
beforeDestroy?()?{
???//?在實(shí)例被銷毀前移除?click?監(jiān)聽
???document.removeEventListener('click',?this.clickListener)
},
復(fù)制代碼
9. 指令 v-if
v-if 指令的應(yīng)用場(chǎng)景可以是判斷是否展示(是否渲染)某一個(gè)元素,一種條件判斷指令。非常常用的指令之一,常被隨之提起來是 v-show。他們都都可以做同樣的事情, 所以常被比較,什么時(shí)候應(yīng)該用哪個(gè)?
v-show 是通過改變 css display 屬性值實(shí)現(xiàn)切換效果, v-if是真正的條件渲染, 當(dāng)一開始的值為true時(shí)才會(huì)編譯渲染,而v-show不管怎樣都會(huì)編譯,只是簡(jiǎn)單地css屬性切換 v-if適合條件不經(jīng)常改變的場(chǎng)景,因?yàn)樗那袚Q會(huì)重新編譯渲染,消耗較大。v-show適合切換較為頻繁的場(chǎng)景,開銷較小。
進(jìn)階圖中使用 v-if 指令來判斷是否支持縮放,即是否展示縮放工具欄,如下

10. v-for
用于遍歷循環(huán)生成系列元素,這也是常用指令,key 屬性應(yīng)該被注意,如果你希望你的元素(組件)保持足夠的獨(dú)立性。
tips1:v-for 的默認(rèn)行為會(huì)嘗試原地修改元素而不是移動(dòng)它們。要強(qiáng)制其重新排序元素,
你需要用特殊 attribute key 來提供一個(gè)排序提示。
tips2:v-if 和 v-for 當(dāng)它們處于同一節(jié)點(diǎn),v-for 的優(yōu)先級(jí)比 v-if 更高, 這意味著 v-if 將分別重復(fù)運(yùn)行于每個(gè) v-for 循環(huán)中。
當(dāng)你只想為部分項(xiàng)渲染節(jié)點(diǎn)時(shí),這種優(yōu)先級(jí)的機(jī)制會(huì)十分有用。如果不是這可能會(huì)造成不必要的消耗。
進(jìn)階圖中使用 v-for 遍歷生成系列階梯節(jié)點(diǎn)和文本行節(jié)點(diǎn),這系列節(jié)點(diǎn)構(gòu)成了進(jìn)階圖的主面板,如下

11. v-bind
v-bind最被常用,但通常我們使用它的簡(jiǎn)寫“:”,它的用法是動(dòng)態(tài)地綁定一個(gè)或多個(gè) attribute, 或一個(gè)組件 prop 到表達(dá)式。
tips:修飾符:
.prop - 作為一個(gè) DOM property 綁定而不是作為 attribute 綁定。(差別在哪里?)
.camel - (2.1.0+) 將 kebab-case attribute 名轉(zhuǎn)換為 camelCase。(從 2.1.0 開始支持)
.sync (2.3.0+) 語(yǔ)法糖,會(huì)擴(kuò)展成一個(gè)更新父組件綁定值的 v-on 偵聽器。
進(jìn)階圖中,例如 key,disabled 和 style 的動(dòng)態(tài)綁定,如下


12. v-on
v-on 用于綁定事件,我們更常用的是它的縮寫 “@”,結(jié)合一些修飾符使用,有時(shí)會(huì)非常有用,例如 click.stop 可以阻止冒泡。
tips 一些修飾符:
.stop - 調(diào)用 event.stopPropagation()。
.prevent - 調(diào)用 event.preventDefault()。
.capture - 添加事件偵聽器時(shí)使用 capture 模式。
.self - 只當(dāng)事件是從偵聽器綁定的元素本身觸發(fā)時(shí)才觸發(fā)回調(diào)。
.{keyCode | keyAlias} - 只當(dāng)事件是從特定鍵觸發(fā)時(shí)才觸發(fā)回調(diào)。
.native - 監(jiān)聽組件根元素的原生事件。
.once - 只觸發(fā)一次回調(diào)。
.left - (2.2.0) 只當(dāng)點(diǎn)擊鼠標(biāo)左鍵時(shí)觸發(fā)。
.right - (2.2.0) 只當(dāng)點(diǎn)擊鼠標(biāo)右鍵時(shí)觸發(fā)。
.middle - (2.2.0) 只當(dāng)點(diǎn)擊鼠標(biāo)中鍵時(shí)觸發(fā)。
.passive - (2.3.0) 以 { passive: true } 模式添加偵聽器
tips 從 2.4.0 開始,v-on 同樣支持不帶參數(shù)綁定一個(gè)事件/監(jiān)聽器鍵值對(duì)的對(duì)象。注意當(dāng)使用對(duì)象語(yǔ)法時(shí),是不支持任何修飾器的。
進(jìn)階圖中主要是用于綁定事件,并配合 .stop 使用阻止事件冒泡,如下所示

13. v-html
v-html 用于綁定 html 字符串,它的作用是更新元素的 innerHTML。
tips1:在網(wǎng)站上動(dòng)態(tài)渲染任意 HTML 是非常危險(xiǎn)的,因?yàn)槿菀讓?dǎo)致 XSS 攻擊。只在可信內(nèi)容上使用 v-html,永不用在用戶提交的內(nèi)容上。
tips2:在單文件組件里,scoped 的樣式不會(huì)應(yīng)用在 v-html 內(nèi)部,因?yàn)槟遣糠?HTML 沒有被 Vue 的模板編譯器處理。如果你希望針對(duì) v-html 的內(nèi)容設(shè)置帶作用域的 CSS,你可以替換為 CSS Modules 或用一個(gè)額外的全局 元素手動(dòng)設(shè)置類似 BEM 的作用域策略。
進(jìn)階圖開發(fā)中,用 v-html 綁定可關(guān)聯(lián)數(shù)據(jù)的 title,如下
<span?v-html="item.title">span>
復(fù)制代碼
14. v-model
v-model 可用于綁定表單組件的值,實(shí)現(xiàn)雙向綁定。能使用 v-model 的元素包括四類:
components
tips:修飾符:
.lazy - 取代 input 監(jiān)聽 change 事件
.number - 輸入字符串轉(zhuǎn)為有效的數(shù)字
.trim - 輸入首尾空格過濾
結(jié)合修飾符使用,有時(shí)會(huì)顯得很有用,例如進(jìn)階圖中使用 v-model.trim, 這樣在輸入鏈接文字的時(shí)候,就會(huì)自動(dòng)去掉首尾的空格,而這并不影響功能, 而有時(shí)會(huì)很妙,例如一些 iOS 手機(jī)上在表單網(wǎng)頁(yè)上常常在輸入完成后會(huì)自動(dòng)帶上空格, 我遇到的一個(gè)例子是輸入賬號(hào)密碼時(shí),一不小心就攜帶了空格,而這并不友好, 如果使用 .trim 就好多了,這是指在這種場(chǎng)景下。

寫到這里,我其實(shí)也沒想到,一個(gè)進(jìn)階圖涉及這么多技術(shù)點(diǎn),所以平時(shí)應(yīng)該積少成多, 養(yǎng)成學(xué)習(xí)寫作積累的習(xí)慣。更多的積累,有時(shí)能夠靈活配套打出一套更有力的拳。涉及 vue 的,可能還有更多技術(shù)點(diǎn),歡迎關(guān)注的同學(xué)評(píng)論區(qū)指出。
2. JavaScript 和 Html 系列
15. addEventListener 和 removeEventListener
EventTarget.addEventListener() 方法將指定的監(jiān)聽器注冊(cè)到 EventTarget 上,當(dāng)該對(duì)象觸發(fā)指定的事件時(shí),指定的回調(diào)函數(shù)就會(huì)被執(zhí)行。事件目標(biāo)可以是一個(gè)文檔上的元素 Element,Document和Window或者任何其他支持事件的對(duì)象 (比如 XMLHttpRequest)。
addEventListener()的工作原理是將實(shí)現(xiàn)EventListener的函數(shù)或?qū)ο筇砑拥秸{(diào)用它的EventTarget上的指定事件類型的事件偵聽器列表中。
進(jìn)階圖開發(fā)中,使用 addEventListener 監(jiān)聽 click 事件, 監(jiān)聽回調(diào)為 clickListener,結(jié)合了 Element.contains() 以實(shí)現(xiàn)擊行為發(fā)生在 menuPanel(菜單區(qū)域) 區(qū)域外,關(guān)閉右鍵彈起的菜單。如下:
??mounted?()?{
????//?監(jiān)聽?click?事件
????document.addEventListener('click',?this.clickListener)
??},
??beforeDestroy?()?{
????//?移除監(jiān)聽
????document.removeEventListener('click',?this.clickListener)
??},
復(fù)制代碼
clickListener?(event)?{
??if?(this.type?===?'detail')?return
??if?(!this.$refs.menuPanel)?return
??//?點(diǎn)擊行為發(fā)生在?menuPanel(菜單區(qū)域)?區(qū)域外,關(guān)閉右鍵彈起的菜單
??//?element.contains(),有時(shí)是非常有用的?api
??if?(this.$refs.menuPanel?&&?!this.$refs.menuPanel.contains(event.target))?{
????this.showMenu?=?false
??}
},
復(fù)制代碼
16. keyup.enter.native
keyup 事件在按鍵被松開時(shí)觸發(fā),keyup.enter 的作用是在 enter 回車鍵被松開的時(shí)候觸發(fā)。這常常被用在登錄、檢索、和表單提交等需要回車鍵表示發(fā)送或確定的場(chǎng)景中。
進(jìn)階圖中就是為實(shí)現(xiàn)回車鍵 Enter 被松開時(shí)觸發(fā)檢索關(guān)聯(lián)數(shù)據(jù)而使用。如下
<el-input?v-model="searchValue"?@keyup.enter.native="clickSearch"?placeholder="檢索姓名或工號(hào)">el-input>
復(fù)制代碼
17. new Date()
new Date() 是 javascript 的全局 api,可以用來創(chuàng)建當(dāng)前時(shí)間。進(jìn)階圖開發(fā)中, 是在生成 uuid 時(shí)用來獲取當(dāng)前時(shí)間的毫秒數(shù)。如下:
//?獲取當(dāng)前時(shí)間的毫秒數(shù)
let?d?=?new?Date().getTime()
//?console.log(d)?1651127122490
復(fù)制代碼
18. window.performance.now()
據(jù) mozilla:該方法返回一個(gè)DOMHighResTimeStamp對(duì)象,該對(duì)象表示從某一時(shí)刻(譯者注:某一時(shí)刻通常是 navigationStart 事件發(fā)生時(shí)刻)到調(diào)用該方法時(shí)刻的毫秒數(shù)。
19. Math.random() 和 Math.floor
Math 是 javascript 的一個(gè)全局 api, Math.random() 的返回值是一個(gè)浮點(diǎn)型偽隨機(jī)數(shù)字,范圍是[0,1)。Math.floor() 的作用是為向下取整,返回一個(gè)整數(shù)。
來自 mozilla 的tips:Math.random() 不能提供像密碼一樣安全的隨機(jī)數(shù)字。不要使用它們來處理有關(guān)安全的事情。使用Web Crypto API 來代替, 和更精確的window.crypto.getRandomValues() 方法.
20. String.replace()
String.replace() 被用于替換字符,但不會(huì)改變?cè)址?,而是返回改變后的字符串?/p>
tips:replace() 方法返回一個(gè)由替換值(replacement)替換部分或所有的模式(pattern)匹配項(xiàng)后的新字符串。
模式可以是一個(gè)字符串或者一個(gè)正則表達(dá)式,替換值可以是一個(gè)字符串或者一個(gè)每次匹配都要調(diào)用的回調(diào)函數(shù)。如果pattern是字符串,則僅替換第一個(gè)匹配項(xiàng)。
21. toString()
方法返回一個(gè)表示該對(duì)象的字符串,可以用于將數(shù)字(number)轉(zhuǎn)換為字符串(string)。
22. Array.push()、Array.map()、Array.findIndex() 和 Array.splice()
push() 可用于向數(shù)組添加數(shù)據(jù)項(xiàng),在數(shù)組尾部添加;map() 可用于遍歷數(shù)組;findIndex() 可用于查找符合條件的數(shù)據(jù)項(xiàng);splice() 可用于刪除數(shù)組中的元素,或在某個(gè)位置添加元素。
進(jìn)階圖開發(fā)中都用到了這些數(shù)組的方法,例如 findIndex 和 push 結(jié)合使用,避免重復(fù)添加數(shù)據(jù),舉例如下:

23. JSON.parse() 和 JSON.stringify()
JSON.parse() 這套組合還被我常用于 storage 的存儲(chǔ)中,主要是為了保持?jǐn)?shù)據(jù)的完整性和真實(shí)性, 例如一個(gè) int 數(shù)字不會(huì)被改動(dòng)為 string。進(jìn)階圖開發(fā)中,使用 JSON.parse() 和 JSON.stringify() 實(shí)現(xiàn)深拷貝, 深拷貝之后拷貝前后的兩份數(shù)據(jù)將是完整獨(dú)立的, 一方的變動(dòng)不會(huì)影響另一方。如下:
this.form.relation.push(JSON.parse(JSON.stringify(this.outItem)))
復(fù)制代碼
24. window.open()
tips:Window 接口的 open() 方法,是用指定的名稱將指定的資源加載到瀏覽器上下文(窗口 window ,內(nèi)嵌框架 iframe 或者標(biāo)簽 tab )。如果沒有指定名稱,則一個(gè)新的窗口會(huì)被打開并且指定的資源會(huì)被加載進(jìn)這個(gè)窗口的瀏覽器上下文中。
window.open() 在進(jìn)階圖開發(fā)中,用于打開一個(gè)新窗口訪問詳情頁(yè)。如下

25. MouseEvent.screenX 和 MouseEvent.screenY
screenX 是 MouseEvent 的只讀屬性,提供鼠標(biāo)在全局(屏幕)中的水平坐標(biāo)(偏移量)。screenY 則是提供鼠標(biāo)在全局(屏幕)中的垂直坐標(biāo)(偏移量)。
在進(jìn)階圖開發(fā)中,是利用鼠標(biāo)的這兩個(gè)坐標(biāo)結(jié)合固定定位實(shí)現(xiàn)右鍵菜單的位置是跟隨鼠標(biāo)位置的。如下:


26. localStorage
可以使用鍵值對(duì)的形式,存取數(shù)據(jù)到 localStorage,存到 localStorage 中的數(shù)據(jù)可以被永久存儲(chǔ), 除非被主動(dòng)刪除。
進(jìn)階圖開發(fā)中,適用于緩存進(jìn)階圖數(shù)據(jù),如下:
localStorage.setItem('progressData',?progressData)
復(fù)制代碼
**27. new FormData() 和 canvas.toBlob() **
canvas.toBlob() 可以將 canvas 元素中的畫布內(nèi)容轉(zhuǎn)換為 blob 形式。
FormData 接口提供了一種表示表單數(shù)據(jù)的鍵值對(duì) key/value 的構(gòu)造方式, 并且可以輕松的將數(shù)據(jù)通過XMLHttpRequest.send() 方法發(fā)送出去。如果送出時(shí)的編碼類型被設(shè)為 "multipart/form-data",它會(huì)使用和表單一樣的格式。
進(jìn)階圖開發(fā)中,使用 new FormData() 來組織數(shù)據(jù),上傳 blob 格式的圖片。如下:

28. event.currentTarget 和 switch
event.currentTarget 指向事件綁定的元素,請(qǐng)注意區(qū)分 Event.target 是指向事件觸發(fā)的元素。進(jìn)階圖開發(fā)中,是巧妙利用 currentTarget 獲取事件綁定元素,進(jìn)而獲取該元素的 name 屬性值。以實(shí)現(xiàn)區(qū)分不同元素進(jìn)行的單擊操作,進(jìn)而進(jìn)行不同的邏輯處理。
switch 語(yǔ)句評(píng)估一個(gè)表達(dá)式,將表達(dá)式的值與case子句匹配,并執(zhí)行與該情況相關(guān)聯(lián)的語(yǔ)句。因?yàn)槭菞l件分支語(yǔ)句,所以當(dāng)出現(xiàn)類似條件的多余等于三個(gè)分支時(shí),可以考慮使用 switch 進(jìn)行條件判斷和處理。盡管 if 也可以實(shí)現(xiàn)目的,但 switch 此時(shí)可能看起來會(huì)更清晰。
進(jìn)階圖中的使用如下:

3. css 和 scss
29. @mixin 和 @include
進(jìn)階圖的開發(fā)使用了 scss 作為 css 預(yù)處理語(yǔ)言,其中使用了 @mixin 和 @include。
@mixin 指令允許我們定義一個(gè)可以在整個(gè)樣式表中重復(fù)使用的樣式。
@include 指令可以將混入(mixin)引入到文檔中。
進(jìn)階圖中的使用情況如下:
@mixin?cn-icon($name,$w:20,$h:20)?{
????display:?inline-block;
????width:?#{$w}px;
????height:?#{$h}px;
????background:?url('#{$name}')?no-repeat?center;
????background-size:?100%?100%;
}
復(fù)制代碼
.icon-head-home?{
????@include?cn-icon("~@/assets/icon-head-home.png",?19,?19);
????margin-right:?10px;
????cursor:?pointer;
}
復(fù)制代碼
30. css瀏覽器兼容性寫法前綴
tips:CSS非標(biāo)準(zhǔn)屬性。廠商在實(shí)現(xiàn)非標(biāo)準(zhǔn)的CSS屬性時(shí),通常會(huì)加上前綴,甚至在將來會(huì)實(shí)現(xiàn)的標(biāo)準(zhǔn)也加,
當(dāng)標(biāo)準(zhǔn)被發(fā)布后,廠商會(huì)將前綴移除。Firefox:-moz-,Chrome和Safari:-webkit-, IE:-ms-,Opera:-o-。書寫建議私有屬性(非標(biāo)準(zhǔn))放在前面,標(biāo)準(zhǔn)屬性寫在后面,例如:
-webkit-transform:rotate(-3deg);?/*?Chrome/Safari?*/
-moz-transform:rotate(-3deg);?/*?Firefox?*/
-ms-transform:rotate(-3deg);?/*?IE?*/
-o-transform:rotate(-3deg);?/*?Opera?*/
transform:rotate(-3deg);??/*?標(biāo)準(zhǔn)屬性寫在后面?*/
復(fù)制代碼
進(jìn)階圖中是在 transform 中使用了兼容性寫法,是為了更好的保證縮放功能的兼容性。如下:
??.zoom-scale?{
????transform:?scale(1.8);
????-ms-transform:?scale(1.8);?/*?IE?9?*/
????-webkit-transform:?scale(1.8);?/*?Safari?and?Chrome?*/
??}
復(fù)制代碼
關(guān)于本文
作者:靈扁扁
https://juejin.cn/post/7095889556607598629
