最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3 style CSS 變量注入的實(shí)現(xiàn)

 更新時(shí)間:2021年07月22日 09:04:37   作者:guangzan  
本文主要介紹了Vue3 style CSS 變量注入的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

摘要

在單文件組件樣式中支持使用組件狀態(tài)驅(qū)動(dòng)的 CSS 變量( CSS 自定義屬性)。

基礎(chǔ)示例

<template>
  <div class="text">hello</div>
</template>

<script>
  export default {
    data() {
      return {
        color: 'red',
        font: {
          size: '2em',
        },
      }
    },
  }
</script>

<style>
  .text {
    color: v-bind (color);

    /* expressions (wrap in quotes) */
    font-size: v-bind ('font.size');
  }
</style>

動(dòng)機(jī)

Vue SFC 樣式提供了直接的 CSS 搭配和封裝,但它是純粹的靜態(tài)的 —— 這意味著到目前為止,我們沒(méi)有能力在運(yùn)行時(shí)根據(jù)組件的狀態(tài)動(dòng)態(tài)更新樣式。

現(xiàn)在,隨著大多數(shù)現(xiàn)代瀏覽器支持原生 CSS 變量,我們可以利用它來(lái)輕松連接組件的狀態(tài)和樣式。

設(shè)計(jì)細(xì)節(jié)

SFC 中的標(biāo)簽現(xiàn)在支持一個(gè)自定義 CSS 函數(shù) v-bind:

<!-- in Vue SFC -->
<style>
  .text {
    color: v-bind (color);
  }
</style>

正如預(yù)期的那樣,這將把聲明的值綁定到組件狀態(tài)的屬性上,reactively.color color

該函數(shù)內(nèi)部可以支持任意的 JavaScript 表達(dá)式,但由于 JavaScript 表達(dá)式可能包含在 CSS 標(biāo)識(shí)符中無(wú)效的字符,因此在大多數(shù)情況下需要用引號(hào)來(lái)包裹它們:v-bind

.text {
  font-size: v-bind ('theme.font.size');
}

當(dāng)檢測(cè)到這種 CSS 變量時(shí),SFC 編譯器將執(zhí)行以下操作:

重寫(xiě)到一個(gè)帶有哈希變量名稱(chēng)的本機(jī)。上面的內(nèi)容將被改寫(xiě)為:v-bind () var ()

.text {
  color: var (--6b53742-color);
  font-size: var (--6b53742-theme_font_size);
}

請(qǐng)注意,hash 將應(yīng)用于所有情況,無(wú)論標(biāo)簽是否有范圍。這意味著注入的 CSS 變量不會(huì)意外地泄漏到子組件中。

相應(yīng)的變量將作為內(nèi)聯(lián)樣式被注入到組件的根元素中。對(duì)于上面的例子,最終渲染的 DOM 將看起來(lái)像這樣:

<div style="--6b53742-color:red;--6b53742-theme_font_size:2em;" class="text">
  hello
</div>

注入是響應(yīng)式的 ——所以如果組件的屬性發(fā)生變化,注入的 CSS 變量將被相應(yīng)地更新。這種更新是獨(dú)立于組件的模板更新的,所以對(duì)一個(gè)純 CSS 的響應(yīng)式屬性的改變不會(huì)觸發(fā)模板的重新渲染。

編譯細(xì)節(jié)

為了注入 CSS 變量,編譯器需要生成并注入如下代碼到組件的 setup ()

import { useCssVars } from 'vue'

export default {
  setup() {
    //...
    useCssVars(_ctx => ({
      color: _ctx.color,
      theme_font_size: _ctx.theme.font.size,
    }))
  },
}

... 這里,運(yùn)行時(shí)幫助器設(shè)置了一個(gè)將變量響應(yīng)性地應(yīng)用到 DOM.useCssVars watchEffect 上。

該編譯策略要求腳本編譯時(shí)首先對(duì)標(biāo)簽內(nèi)容進(jìn)行簡(jiǎn)單的重碼解析,以確定要暴露的變量列表。然而,這個(gè)解析階段不會(huì)像基于 AST 的完整解析 <style> 那樣耗費(fèi)開(kāi)銷(xiāo)。

在生產(chǎn)中,變量名可以被進(jìn)一步 hash,以減少 CSS 的占用。

.text {
  color: var (--x3b2fs2);
  font-size: var (--29fh29g);
}

相應(yīng)的生成的 JavaScript 代碼將相應(yīng)地使用相同的哈希值。

采用策略

這是一個(gè)完全向后兼容的新功能。然而,我們應(yīng)該明確指出,它依賴于本地的 CSS 變量,所以用戶需要了解瀏覽器的支持范圍。

實(shí)踐

在 script 中聲明兩個(gè)響應(yīng)式的屬性,分別是 wallpaperBlur 和 wallpaperMask。wallpaperBlur 表示壁紙的模糊程度, wallpaperMask 表示遮罩的透明度。通過(guò) v-bind 將它們應(yīng)用到 style,這意味著當(dāng)我們?cè)?script 中改變這兩個(gè)值時(shí),樣式會(huì)響應(yīng)更改。

// script
const wallpaperBlur = ref('0px')
const wallpaperMask = ref('rgba(0, 0, 0, 0)')
// style
.wallpaper {
  filter: blur(v-bind(wallpaperBlur));
  bottom: calc(v-bind(wallpaperBlur) * -2);
  left: calc(v-bind(wallpaperBlur) * -2);
  right: calc(v-bind(wallpaperBlur) * -2);
  top: calc(v-bind(wallpaperBlur) * -2);
  .wallpaper-image {
    transition: background-image 0.6s, background-color 0.4s;
  }
  .wallpaper-mask {
    background-color: v-bind(wallpaperMask);
  }
}

提示

綁定恰當(dāng)?shù)膶傩?br />

在上面的例子中,你可能想到到更改遮罩的透明度僅需要聲明一個(gè) 0-1 的數(shù)字,之后在 style 中這樣寫(xiě):

.wallpaper-mask {
  background-color: rgba(0, 0, 0, v-bind(wallpaperMask));
}

上文已經(jīng)提到在編譯階段會(huì)將 style 中的 v-bind 改寫(xiě)為 CSS 變量的形式,上面的代碼會(huì)被改寫(xiě)為這樣:

.wallpaper-mask {
  background-color: rgba(0, 0, 0, var (--[hash]-wallpaper_mask));
}

rgba(0, 0, 0, var (--[hash]-wallpaper_mask)) 在 CSS 中是無(wú)法被解析的。所以這就是為什么將 wallpaperMask 的初始值聲明為 rgba(0, 0, 0, 0) 的原因。這是需要十分注意的一點(diǎn),CSS 中還有許多類(lèi)似的情況。

注意 style 的更新

在設(shè)計(jì)細(xì)節(jié)中提到相應(yīng)的變量將作為內(nèi)聯(lián)樣式被注入到組件的根元素中。最終渲染的 DOM 將看起來(lái)像這樣:

<div style="--6b53742-color:red;--6b53742-theme_font_size:2em;"></div>

當(dāng)你在 <script> 中改變 <style> 中綁定的屬性時(shí),內(nèi)斂樣式中的 CSS 變量將會(huì)響應(yīng)更改。但是,并不能單獨(dú)更新內(nèi)斂樣式其中的一個(gè) CSS 變量,這意味著更新一個(gè)組件中的任意一個(gè)“動(dòng)態(tài)樣式”,都將引起根組件中的內(nèi)斂樣式全部更新。當(dāng) style 屬性的值包含大量 CSS 變量時(shí),你需要考慮重新組織組件。因?yàn)榫幾g生成的 CSS 變量都將作為內(nèi)聯(lián)樣式被注入到組件的根元素中,我們無(wú)法控制這種行為,將一個(gè)引起更新的 CSS 變量和其他 CSS 變量解耦。

試想這種情況, style 中編譯生成的 CSS 變量中包含一個(gè)其值為龐大的 base64 的 CSS 變量。當(dāng)更新該組件中其他 CSS 變量時(shí),整個(gè) style 都將更新,這將帶來(lái)額外的硬件開(kāi)銷(xiāo)。我們需要將這個(gè)生成 base64 CSS 變量的組件單獨(dú)抽離,以使該 CSS 變量注入到該組件的根元素,不受其他 CSS 變量更新影響。

參考資料

https://github.com/vuejs/rfcs/pull/231

到此這篇關(guān)于Vue3 style CSS 變量注入的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue3 style CSS變量注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 將vue項(xiàng)目打包成電腦端應(yīng)用.exe的完整步驟

    將vue項(xiàng)目打包成電腦端應(yīng)用.exe的完整步驟

    最近接了個(gè)小活,其中甲方要求把vue項(xiàng)目打包成exe安裝在windows上,其中有也會(huì)出現(xiàn)一些小問(wèn)題和優(yōu)化,特此記錄,這篇文章主要給大家介紹了關(guān)于將vue項(xiàng)目打包成電腦端應(yīng)用.exe的完整步驟,需要的朋友可以參考下
    2023-10-10
  • vue中v-for指令完成列表渲染

    vue中v-for指令完成列表渲染

    這篇文章主要給大家分享的是vue中v-for指令完成列表渲染,下面文化章就圍繞中v-for的相關(guān)資料在Vue中列表渲染做個(gè)簡(jiǎn)單總結(jié)和使用演示,需要的朋友可以參考一下,希望對(duì)大家有所幫助
    2021-11-11
  • vue實(shí)例成員?插值表達(dá)式?過(guò)濾器基礎(chǔ)教程示例詳解

    vue實(shí)例成員?插值表達(dá)式?過(guò)濾器基礎(chǔ)教程示例詳解

    這篇文章主要為大家介紹了vue實(shí)例成員?插值表達(dá)式?過(guò)濾器基礎(chǔ)教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Nuxt的路由動(dòng)畫(huà)效果案例

    Nuxt的路由動(dòng)畫(huà)效果案例

    這篇文章主要介紹了Nuxt的路由動(dòng)畫(huà)效果案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • 詳解vue3+electron如何做到本地化

    詳解vue3+electron如何做到本地化

    要在Vue?3和Electron中實(shí)現(xiàn)本地化,可以使用類(lèi)似于在Vue項(xiàng)目中進(jìn)行本地化的方式,本文為大家介紹了一種常見(jiàn)的做法,希望對(duì)大家有所幫助
    2024-03-03
  • Vue.js實(shí)現(xiàn)大轉(zhuǎn)盤(pán)抽獎(jiǎng)總結(jié)及實(shí)現(xiàn)思路

    Vue.js實(shí)現(xiàn)大轉(zhuǎn)盤(pán)抽獎(jiǎng)總結(jié)及實(shí)現(xiàn)思路

    這篇文章主要介紹了 Vue.js實(shí)現(xiàn)大轉(zhuǎn)盤(pán)抽獎(jiǎng)總結(jié)及實(shí)現(xiàn)思路,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • vue拖拽改變寬度的實(shí)現(xiàn)示例

    vue拖拽改變寬度的實(shí)現(xiàn)示例

    本文主要介紹了vue拖拽改變寬度的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Vue中EpicEditor和vue-quill-editor的使用詳解

    Vue中EpicEditor和vue-quill-editor的使用詳解

    EpicEditor和Vue-quill-editor都是基于Quill.js的富文本編輯器,并且都提供了許多強(qiáng)大的功能,下面我們就來(lái)介紹一下二者的具體使用,感興趣的小伙伴可以了解一下
    2023-11-11
  • 在Vue中使用deep深度選擇器修改element UI組件的樣式

    在Vue中使用deep深度選擇器修改element UI組件的樣式

    這篇文章主要介紹了在Vue中使用deep深度選擇器修改element UI組件的樣式,本文分為兩種方法給大家介紹,在這小編比較推薦使用第二種使用 deep 深度選擇器,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • 解決elementui中NavMenu導(dǎo)航菜單高亮問(wèn)題(解決多種情況)

    解決elementui中NavMenu導(dǎo)航菜單高亮問(wèn)題(解決多種情況)

    這篇文章主要介紹了解決elementui中NavMenu?導(dǎo)航菜單高亮問(wèn)題(解決多種情況),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評(píng)論

喀喇沁旗| 疏勒县| 商城县| 霸州市| 墨竹工卡县| 遵义县| 施甸县| 怀柔区| 巴林右旗| 汶上县| 仪陇县| 康定县| 定州市| 三江| 肇源县| 南通市| 启东市| 麦盖提县| 饶河县| 花莲县| 天峻县| 伊吾县| 海伦市| 深泽县| 延长县| 盐源县| 慈溪市| 化隆| 遵义市| 全椒县| 崇信县| 昭平县| 镇平县| 古交市| 洛南县| 洛阳市| 曲阳县| 崇左市| 西青区| 鄂州市| 巩留县|