js判斷并告知支持css屬性(值)的 情況分析
當(dāng)我們想用某個(gè)css新特性時(shí),總是會(huì)在意它的兼容性情況,或許我們會(huì)去搜索它的兼容性,哪些瀏覽器合適哪些不合適,在這些已知的情況下再選擇是不是使用或如何使用,這是一個(gè)已知我們即將用于什么瀏覽器下作出的選擇。
但我們往往不知道自己開發(fā)的頁面用戶會(huì)在哪個(gè)瀏覽器上進(jìn)行打開,這時(shí)我們需要根據(jù)實(shí)際使用瀏覽器情況來判斷采用何策略。這時(shí)就需要用js來判斷,我們要使用css屬性能否起效。
css屬性的兼容性,是有兩類的,一類是,css屬性本身,如 position ;另一類是,css屬性值,如,對于 position 屬性的 sticky 值
目標(biāo)
我們想知道某個(gè)css屬性(值)是否起效,一般被告知結(jié)果是“起效”或“不起效”。但是css屬性存在瀏覽器私有屬性一說,即會(huì)有加了瀏覽器前綴才會(huì)生效的css屬性。
所以你更加需要知道,對于目前瀏覽器來說,哪個(gè)前綴或不需要前綴的css屬性才會(huì)起效,而不僅僅是知道起效與否(自己每個(gè)前綴作為輸入值進(jìn)行校驗(yàn),是繁瑣的!網(wǎng)絡(luò)上的很多資料往往會(huì)告訴你是否支持你指定的css,返回的boolean值)
所以下面的方法, 只需要你把css屬性(值)作為輸入值,不需要帶上前綴,便能告知你,當(dāng)前使用的瀏覽器支持哪個(gè)前綴的用法或壓根不需要前綴。
檢查css屬性名
該方法檢查的是css的屬性本身,即屬性名,即寫css的時(shí)候 : 的左側(cè)。如果返回值是空,那么證明瀏覽器不支持該屬性。
/**
* 告知瀏覽器支持的指定css屬性情況
* @param {String} key - css屬性,是屬性的名字,不需要加前綴
* @returns {String} - 支持的屬性情況
*/
function validateCssKey(key) {
const jsKey = toCamelCase(key); // 有些css屬性是連字符號形成
if (jsKey in document.documentElement.style) {
return key;
}
let validKey = '';
// 屬性名為前綴在js中的形式,屬性值是前綴在css中的形式
// 經(jīng)嘗試,Webkit 也可是首字母小寫 webkit
const prefixMap = {
Webkit: '-webkit-',
Moz: '-moz-',
ms: '-ms-',
O: '-o-'
};
for (const jsPrefix in prefixMap) {
const styleKey = toCamelCase(`${jsPrefix}-${jsKey}`);
if (styleKey in document.documentElement.style) {
validKey = prefixMap[jsPrefix] + key;
break;
}
}
return validKey;
}
/**
* 把有連字符號的字符串轉(zhuǎn)化為駝峰命名法的字符串
*/
function toCamelCase(value) {
return value.replace(/-(\w)/g, (matched, letter) => {
return letter.toUpperCase();
});
}
檢查css屬性值
該方法檢查的是css的屬性的值,即寫css的時(shí)候 : 的右側(cè)。如果返回值是空,那么證明瀏覽器不支持該屬性值。
這里分為兩個(gè)版本,一個(gè)是es6版本,一個(gè)是基礎(chǔ)的js版本。
純屬自己多余寫了兩個(gè)版本
/**
* 檢查瀏覽器是否支持某個(gè)css屬性值(es6版)
* @param {String} key - 檢查的屬性值所屬的css屬性名
* @param {String} value - 要檢查的css屬性值(不要帶前綴)
* @returns {String} - 返回瀏覽器支持的屬性值
*/
function valiateCssValue (key, value) {
const prefix = ['-o-', '-ms-', '-moz-', '-webkit-', ''];
const prefixValue = prefix.map(item => {
return item + value;
});
const element = document.createElement('div');
const eleStyle = element.style;
// 應(yīng)用每個(gè)前綴的情況,且最后也要應(yīng)用上沒有前綴的情況,看最后瀏覽器起效的何種情況
// 這就是最好在prefix里的最后一個(gè)元素是''
prefixValue.forEach(item => {
eleStyle[key] = item;
});
return eleStyle[key];
}
/**
* 檢查瀏覽器是否支持某個(gè)css屬性值
* @param {String} key - 檢查的屬性值所屬的css屬性名
* @param {String} value - 要檢查的css屬性值(不要帶前綴)
* @returns {String} - 返回瀏覽器支持的屬性值
*/
function valiateCssValue (key, value) {
var prefix = ['-o-', '-ms-', '-moz-', '-webkit-', ''];
var prefixValue = [];
for (var i = 0; i < prefix.length; i++) {
prefixValue.push(prefix[i] + value)
}
var element = document.createElement('div');
var eleStyle = element.style;
for (var j = 0; j < prefixValue.length; j++) {
eleStyle[key] = prefixValue[j];
}
return eleStyle[key];
}
總結(jié)
我們可以簡單地上述對于兩種形式的css兼容性進(jìn)行合并,不用顯式地采用調(diào)用檢查屬性名還是屬性值的方法,直接傳入css,告知瀏覽器支持的情況。
function validCss (key, value) {
const validCss = validateCssKey(key);
if (validCss) {
return validCss;
}
return valiateCssValue(key, value);
}
到此這篇關(guān)于js判斷并告知支持css屬性(值)的 情況分析的文章就介紹到這了,更多相關(guān)js 判斷css屬性值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
CSS 有序或者無序列表的前面的標(biāo)記 list-style-type 屬性的實(shí)現(xiàn)
這篇文章主要介紹了CSS 有序或者無序列表的前面的標(biāo)記 list-style-type 屬性的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的2020-02-24
浮動(dòng)指的是一個(gè)元素脫離文檔流,懸浮在父元素之上的現(xiàn)象。這篇文章給大家介紹css浮動(dòng) float屬性的相關(guān)知識,感興趣的朋友一起看看吧2020-02-24- 這篇文章主要介紹了css選擇器四大類:基本、組合、屬性、偽類的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-14
CSS3新增屬性:background-clip ,background-origin , background-size,本文給大家分享CSS3新增的背景屬性,感興趣的朋友跟隨小編一起看看吧2019-12-25



