處理在js寫css樣式在各個瀏覽器的兼容問題

前言:在開發前端項目的時候,我們有時候需要通過js來操作css的樣式,對於不同的瀏覽器,我們可以要把一個樣式書寫很多遍,例如我們在爲某個元素添加transform樣式的時候:

let app = document.getElementById('app')
app.style.transform = 'scale(1.5)' // 正常瀏覽器
app.style['webkitTransform'] = 'scale(1.5)' // 谷歌瀏覽器
app.style['mozTransform'] = 'scale(1.5)' // 火狐瀏覽器
.....其他瀏覽器等等

如果我們經常需要在js中添加樣式,那麼代碼量就會變得非常的巨大。我們可以通過封裝一些方法來處理這個瀏覽器兼容問題。封裝完之後,我們就可以用一句就代碼就處理各個瀏覽器樣式名的寫法。

app.style[prefixStyle('transform')]= 'scale(1.5)' // 處理上述重複代碼

第一步:

創建一個dom對象,獲取他的style屬性

let elementStyle = document.createElement('div').style

第二步:

創建一個自調用函數,在函數裏面,創建一個transform樣式在各個瀏覽器的寫法。然後遍歷這個對象,使用elementStyle來判斷在目前瀏覽器transform的寫法,然後返回對應瀏覽器的標識:

    let vendor = (() => {
        // 3.存儲各個瀏覽器的樣式寫法。用transform來做比較
        let transformNames = {
            webkit: 'webkitTransform',
            o: 'OTransform',
            moz: 'MozTransform',
            ms: 'msTransform',
            standard: 'transform'
        }
        // 遍歷transformNames對象
        for (let key in transformNames) {
            // 判斷style上是否存在對應的屬性
            if (elementStyle[transformNames[key]] !== undefined) {
                // 存在就返回
                return key
            }
        }
        // 樣式出錯返回false
        return false
    })()

第三步:

封裝一個處理樣式寫法的函數,接收參數的css屬性字符串,返回該樣式在目前瀏覽器支持的寫法:

    // 4.編寫處理樣式函數
    function prefixStyle(style) {
        console.log(vendor)
        // 出錯
        if (!vendor) {
            return
        }
        // 正常
        if (vendor === 'standard') {
            return style
        }
        // 各個瀏覽器的兼容
        return vendor + style.charAt(0).toUpperCase() + style.substr(1)
    }

第四步:

使用封裝的函數,假如我們需要在js中添加transform樣式,我們可以這樣做:

    let app = document.getElementById('app')
    // 獲取transform在目前瀏覽器的兼容寫法
    const transform = prefixStyle('transform')
    // 添加css樣式
    app.style[transform] = 'scale(1.5)

例子全部代碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
</head>

<body>
    <div id="app" style="width: 100px;height: 100px; background-color: red;"></div>
</body>
<script>
    // 1.創建一個元素,使用他的style屬性
    let elementStyle = document.createElement('div').style
    // 2.構建一個自動執行函數,讓他返回瀏覽器的標識,例如:webkit(谷歌)、o(歐朋)、moz(火狐)、ms(ie)、standard(這個是用來標識正常的)。
    let vendor = (() => {
        // 3.存儲各個瀏覽器的樣式寫法。用transform來做比較
        let transformNames = {
            webkit: 'webkitTransform',
            o: 'OTransform',
            moz: 'MozTransform',
            ms: 'msTransform',
            standard: 'transform'
        }
        // 遍歷transformNames對象
        for (let key in transformNames) {
            // 判斷style上是否存在對應的屬性
            if (elementStyle[transformNames[key]] !== undefined) {
                // 存在就返回
                return key
            }
        }
        // 樣式出錯返回false
        return false
    })()
    // 4.編寫處理樣式函數
    function prefixStyle(style) {
        console.log(vendor)
        // 出錯
        if (!vendor) {
            return
        }
        // 正常
        if (vendor === 'standard') {
            return style
        }
        // 各個瀏覽器的兼容
        return vendor + style.charAt(0).toUpperCase() + style.substr(1)
    }
    console.log(prefixStyle('transform')) // webkitTransform
    console.log(prefixStyle('fontSmooth')) // webkitFontSmooth
    console.log(prefixStyle('fontSize')) // webkitFontSize
    let app = document.getElementById('app')
    // 獲取transform在目前瀏覽器的兼容寫法
    const transform = prefixStyle('transform')
    // 添加css樣式
    app.style[transform] = 'scale(1.5)'
</script>

</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章