真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何通過CSS向JS傳參

這篇文章主要介紹了如何通過CSS向JS傳參,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元華容做網(wǎng)站,已為上家服務(wù),為華容各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

一、需要通過CSS傳參的背景

CSS中有很多媒體查詢的用法,例如設(shè)備尺寸判別,是否支持鼠標(biāo)行為,是否是黑暗模式,是否是省電模式等。

比方說最近經(jīng)常提到的黑暗模式,深色主題:

@media (prefers-color-scheme: dark) {
    /* 黑暗模式,深色主題 */
}
@media (prefers-color-scheme: light) {
    /* 淺色主題 */
}

CSS可以自動(dòng)檢測(cè),但是有時(shí)候,在JS中,我們也需要根據(jù)不同的系統(tǒng)主題,然后實(shí)現(xiàn)不同的交互邏輯,或者渲染出不一樣的內(nèi)容。

怎么辦?似乎一時(shí)間也找不到現(xiàn)成的JS API來檢測(cè)系統(tǒng)模式,只能借助于CSS中傳參了。這就是一個(gè)典型的場(chǎng)景,類似的場(chǎng)景還有很多。

例如:

1. CSS和JS邊界寬度一致性

我們?cè)谧鲰憫?yīng)式布局的時(shí)候,經(jīng)常會(huì)需要設(shè)定一個(gè)臨界寬度值,例如當(dāng)設(shè)備的寬度小于640像素的時(shí)候,我們就認(rèn)為是進(jìn)入了移動(dòng)端;或者是寬度小于480的像素的時(shí)候,就使用移動(dòng)端布局等。

此時(shí),JavaScript代碼也需要根據(jù)這個(gè)臨界寬度實(shí)現(xiàn)不同的交互效果,大于多少的時(shí)候是PC的交互,小于多少的時(shí)候是移動(dòng)端布局下的交互。

很多人在實(shí)際開發(fā)的時(shí)候就CSS代碼和JS代碼約定一下,例如:

@media screen and (max-width: 480px) {
    /* 小屏幕寬度下的響應(yīng)式布局 */
}
if (screen.width < 480) {
    /* 小屏幕寬度下的交互行為 */
}

要是這種約定會(huì)有一個(gè)問題,等項(xiàng)目過了一段時(shí)間之后,發(fā)現(xiàn)這個(gè)臨界寬度有問題,比方說手機(jī)橫屏的時(shí)候,它的寬度是大于 480px 的,也應(yīng)該是移動(dòng)端的布局方式,于是開發(fā)就改成了 640px 。

@media screen and (max-width: 640px) {
    /* 小屏幕寬度下的響應(yīng)式布局 */
}

結(jié)果忘記JS代碼中也有這一茬判斷,結(jié)果就會(huì)出現(xiàn)bug。

如果原先實(shí)現(xiàn)的時(shí)候,我們的JavaScript代碼中的屏幕判斷是基于CSS傳參的話,那就不會(huì)有這樣子的維護(hù)問題出現(xiàn)。

2. 瀏覽器是否支持:hover偽類交互

我們會(huì)開發(fā)一些ui組件,希望在桌面端和移動(dòng)端,以及物聯(lián)網(wǎng)設(shè)備上通用。

有些組件在桌面當(dāng)我們使用 mouseenter 或者 mouseover 事件來實(shí)現(xiàn)體驗(yàn)還是很不錯(cuò)的,非常便捷。但是如果這些東西用在移動(dòng)端以及其他一些觸屏設(shè)備上,則這個(gè)世界就有問題啊,因?yàn)闆]有這種hover的說法。

好在CSS代碼中是有關(guān)于瀏覽器是否支持:hover偽類交互媒體查詢判斷(此查詢有專門文章介紹,點(diǎn)擊這里):

@media (any-hover: none) {
    /* 設(shè)備不支持hover事件 */
}

可惜JS中并沒有這樣的API直接判斷。很多人應(yīng)該是通過判斷瀏覽器是否支持 touchstart 之類的事件來進(jìn)行判斷的。不過可惜這種判斷方法是不準(zhǔn)確的。因?yàn)楹芏嘤|摸設(shè)備也是可以連接鼠標(biāo)設(shè)備的,此時(shí)hover事件也應(yīng)該被良好支持。

因此,最后的方法還是通過CSS媒體查詢判斷,然后把這個(gè)判斷結(jié)果以參數(shù)形式傳遞給js。

好啦,下面問題來了,上面舉了這三個(gè)案例,我們?nèi)绾瓮ㄟ^CSS把我們的參數(shù)傳遞給JS代碼呢?

二、CSS傳參給JS的方法

通常借助CSS向JS傳參,我都是使用下面這兩種方法。

1. content偽元素內(nèi)容傳參

例如:

@media (any-hover: none) {
    body::before {
        content: 'hoverNone';
        display: none;
    }
}

此時(shí)就可以通過JS代碼獲取body偽元素傳遞的信息是什么了:

var strContent = getComputedStyle(document.body, '::before').content;
// strContent結(jié)果是'none'則表示支持hover
// strContent結(jié)果是'"hoverNone"'則表示不支持hover經(jīng)過,需要換成click事件

本文就預(yù)埋了上面這樣的CSS代碼,因此,Chrome瀏覽器下,打開控制臺(tái),進(jìn)入移動(dòng)端預(yù)覽模式,輸入JS測(cè)試下,可以看到我們CSS傳遞的字符串信息被JS獲取到了。

如何通過CSS向JS傳參

此時(shí),我們就可以根據(jù) ::before , ::after 偽元素配合 content 屬性,獲知CSS中傳遞的信息了。

這種傳參方式的優(yōu)點(diǎn)在于兼容性相對(duì)較好,但是不足卻也很明顯,那就是我們傳遞的參數(shù)值的數(shù)量是有限的,如果我們想一次性傳多個(gè)值,就有些捉襟見肘,此時(shí)可以試試下面這種方法,借助CSS自定義屬性。

2. CSS自定義屬性(CSS變量)傳參

直接上代碼,有了 CSS自定義屬性(CSS變量) ,黑暗模式和淺色模式的開發(fā)和維護(hù)工作就變得相對(duì)容易很多,除此之外,這個(gè)CSS自定義屬性我們還可以用來給JS做模式識(shí)別。

:root {
    --mode: 'unknown';
}
@media (prefers-color-scheme: dark) {
    /* 黑暗模式 */
    :root {
         --mode: 'dark';
         --colorLink: #bfdbff;
         --colorMark: #cc0000;
         --colorText: #ffffff;
         --colorLight: #777777;
    }
}
@media (prefers-color-scheme: light) {
    /* 淺色主題 */
    :root {
         --mode: 'light';
         --colorLink: #34538b;
         --colorMark: #cc0000;
         --colorText: #000000;
         --colorLight: #cccccc;
    }
}

JS檢測(cè)代碼:

var mode = getComputedStyle(document.documentElement).getPropertyValue('--mode').trim();
// mode結(jié)果是'"dark"'則表示黑夜主題,深色模式,黑暗風(fēng)格,護(hù)眼模式。
// mode結(jié)果是其他表示默認(rèn)模式

例如在我這個(gè)電腦上運(yùn)行的結(jié)果是下圖這個(gè):

如何通過CSS向JS傳參

在Mac OS X或者移動(dòng)端設(shè)備上應(yīng)該會(huì)顯示其他的值,歡迎幫忙測(cè)試截個(gè)圖發(fā)我,我更新到文章中。

使用CSS自定義屬性傳統(tǒng)的好處是非常靈活,我們可以定義很多很多的變量都可以。而且其實(shí)我們也沒有任何必要擔(dān)心兼容性的問題。為什么呢?因?yàn)榉彩侵С趾谝鼓J降脑O(shè)備瀏覽器,一定支持CSS自定義屬性。

因此,綜合來看,使用CSS自定義屬性傳參在黑暗模式這個(gè)場(chǎng)景中是最佳的實(shí)現(xiàn)。但是,如果是基于設(shè)備寬度傳參響應(yīng)式布局這場(chǎng)場(chǎng)景,還是使用CSS content 屬性傳參為佳。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“如何通過CSS向JS傳參”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!


網(wǎng)站欄目:如何通過CSS向JS傳參
鏈接分享:http://weahome.cn/article/piieps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部