分享 30+ 個常用的前端技術(shù)知識點

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

原創(chuàng)的手寫進(jìn)階圖,前文已經(jīng)開發(fā)完,今天總結(jié)一下,涉及到的前端知識技術(shù)點,看看開發(fā)一個這樣的進(jìn)階圖,需要用到哪些知識和技術(shù)點。
會用的知識技術(shù)才算學(xué)到的,進(jìn)階圖的每一步都是作者原創(chuàng),市面上并沒有發(fā)現(xiàn)參考庫,雖說難度不大,但這其中也涉及到不少的前端知識技術(shù)點,最重要的是涉及到的思維組織,邏輯設(shè)計,技術(shù)點的靈活配套運(yùn)用,知道該用什么技術(shù)點實現(xiàn)什么,在什么時候用。
我一共總結(jié)了涉及到的30+知識技術(shù)點,也有更可能不止,歡迎評論區(qū)分享。
二、30+前端技術(shù)點
這些知識技術(shù)點被分為下面幾個系列:
1. Vue 系列
1. props
進(jìn)階圖用到 props 主要是用來接收父組件傳遞而來的主面板數(shù)據(jù),例如 hasScale 用于在父組件調(diào)用面板組件時,傳遞一個 Boolean 值告訴面板組件是否支持縮放。而 progressData 則是用來接收渲染面板的數(shù)據(jù),要注意的是,父組件中的傳遞名稱應(yīng)該和子組件中的 props 中定義的名稱一致。如下是關(guān)于 props 在進(jìn)階圖中的應(yīng)用。
props 可以是數(shù)組或?qū)ο螅糜诮邮諄碜愿附M件的數(shù)據(jù)。props 可以是簡單的數(shù)組,或者使用對象作為替代,對象允許配置高級選項,如類型檢測、自定義驗證和設(shè)置默認(rèn)值。支持配置屬性 type:數(shù)據(jù)類型,default 設(shè)置默認(rèn)值,required 是否必須,validator 自定義驗證函數(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 兩個參數(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.綁定名稱 來獲取組件實例對象,這有時非常有用。例如,當(dāng)我們想要在一個組件中調(diào)用其子組件的某個方法或?qū)傩詴r,可通過這種方式調(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 實例上的一個表達(dá)式或者一個函數(shù)計算結(jié)果的變化。回調(diào)函數(shù)得到的參數(shù)為新值和舊值。表達(dá)式只接受簡單的鍵路徑。對于更復(fù)雜的表達(dá)式,用一個函數(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ù)組其實不需要使用 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 是計算屬性,對于任何復(fù)雜邏輯,你都應(yīng)當(dāng)使用計算屬性,這就是它的應(yīng)用場景,雖然通過 methods 或 watch 也能完成,但是 computed 在處理復(fù)雜邏輯時更有優(yōu)勢:計算屬性是基于它們的響應(yīng)式依賴進(jìn)行緩存的。
進(jìn)階圖的實現(xiàn)多次用到了 computed

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

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

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


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

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

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

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

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


26. localStorage
可以使用鍵值對的形式,存取數(shù)據(jù)到 localStorage,存到 localStorage 中的數(shù)據(jù)可以被永久存儲, 除非被主動刪除。
進(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ù)的鍵值對 key/value 的構(gòu)造方式, 并且可以輕松的將數(shù)據(jù)通過XMLHttpRequest.send() 方法發(fā)送出去。如果送出時的編碼類型被設(shè)為 "multipart/form-data",它會使用和表單一樣的格式。
進(jìn)階圖開發(fā)中,使用 new FormData() 來組織數(shù)據(jù),上傳 blob 格式的圖片。如下:

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

3. css 和 scss
29. @mixin 和 @include
進(jìn)階圖的開發(fā)使用了 scss 作為 css 預(yù)處理語言,其中使用了 @mixin 和 @include。
@mixin 指令允許我們定義一個可以在整個樣式表中重復(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)屬性。廠商在實現(xiàn)非標(biāo)準(zhǔn)的CSS屬性時,通常會加上前綴,甚至在將來會實現(xiàn)的標(biāo)準(zhǔn)也加,
當(dāng)標(biāo)準(zhǔn)被發(fā)布后,廠商會將前綴移除。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
