1. 程式人生 > 實用技巧 >JS檢測CSS屬性瀏覽器是否支援的多種方法

JS檢測CSS屬性瀏覽器是否支援的多種方法

一、原生css.supports語法

返回布林值true或者false,用來檢測是否支援某css屬性。

語法

CSS.supports(propertyName, value);
CSS.supports(supportCondition);

引數

propertyName
字串。用來檢測的CSS屬性名。
value
字串。用來檢測的CSS屬性值。
supportCondition
字串。用來檢測的CSS宣告、表示式或者語法。

案例

例如,檢測瀏覽器是否支援CSS filter濾鏡,則可以:

result = CSS.supports('filter', 'blur(5px)');
result = CSS.supports('filter: 5px');   // 錯誤語法,返回false

例如在Chrome瀏覽器下返回:

CSS.supports()還可以用來檢測表示式,例如CSS變數語法:

result = CSS.supports('--username: zhangxinxu');
result = CSS.supports('(--username: zhangxinxu)');

結果如下圖所示:

可以看到有沒有括號都支援。

CSS.supports()還支援@supports規則,支援邏輯表達,例如:

result = CSS.supports('width: fit-content or width: -webkit-fit-content');
result = CSS.supports('(width: fit-content) or (width: -webkit-fit-content)');

可見,此時括號是必須的:

相容性

和CSS@supports規則相容性一樣,Edge12+支援。

尷尬的現狀

實際開發的時候,需要使用到對CSS檢測場景,往往都是針對低版本的IE瀏覽器,例如IE9-IE11。

於是尷尬的事情出現了,低版本的IE瀏覽器並不支援瀏覽器原生支援的CSS.supports()方法,於是,我們的實際需求並沒有因為這個新的API而得到解決,不得不求助於其他方法。

二、js賦值再取值的檢測方法

這是我張鑫旭 https://www.zhangxinxu.com在實際專案中經常使用的一種方法,原理很簡單,當瀏覽器不支援某個CSS屬性的時候,就算你強制設定,獲取的計算值也不會是你設定的屬性值,還是檢測瀏覽器是否支援CSS filter濾鏡的例子。

我會這麼處理:

document.head.style.filter = 'blur(5px)';
result = window.getComputedStyle(document.head).filter == 'blur(5px)';

我們看下上面程式碼在實際瀏覽器中的表現,首先是支援的Chrome瀏覽器,result的值是true:

然後是不支援的IE11瀏覽器,result的值是false:

此方法原理很簡單,相容性也非常好,實現的關鍵點就是使用getComputedStyle這個IE9+支援的DOM API方法,不能使用dom.style.xxxx直接獲取。

如果是想要實現類似or或者and邏輯,例如帶私有字首那種,可以下面這樣處理,正則匹配關鍵的部分:

document.head.style.width= 'fit-content';
document.head.style.width= '-moz-fit-content';
result = /fit-content/.test(window.getComputedStyle(document.head).width);

例如Firefox瀏覽器下的結果:

相容性

IE9+

注意點

getComputedStyle()方法返回的是計算值,很多時候和設定的屬性值並不同。

例如設定行高為小數,在IE瀏覽器下返回就是px計算值。

又或者設定background屬性值,結果返回的是background兄弟姐妹一大家子值:

document.head.style.background = 'paint(abc)';
result = /paint/.test(window.getComputedStyle(document.head).background);
// reseult值是true
window.getComputedStyle(document.head).background
// "rgba(0, 0, 0, 0) paint(abc) repeat scroll 0% 0% / auto padding-box border-box"

需要使用模糊匹配才行。

廣州品牌設計公司https://www.houdianzi.com PPT模板下載大全https://redbox.wode007.com

三、其他方法

核心思想類似:

document.head.setAttribute('style', 'filter: blur(5px)');
result = !!document.head.style.filter;

Chrome和IE下驗證檢測結果圖: