2021年7月21日星期三

Vue3 style CSS 变量注入

摘要

在单文件组件样式中支持使用组件状态驱动的 CSS 变量( CSS 自定义属性)。

基础示例

<template> <div >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>

动机

Vue SFC 样式提供了直接的 CSS 搭配和封装,但它是纯粹的静态的 —— 这意味着到目前为止,我们没有能力在运行时根据组件的状态动态更新样式。

现在,随着大多数现代浏览器支持原生 CSS 变量,我们可以利用它来轻松连接组件的状态和样式。

设计细节

SFC 中的标签现在支持一个自定义 CSS 函数 v-bind

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

正如预期的那样,这将把声明的值绑定到组件状态的属性上,reactively.color color

该函数内部可以支持任意的 JavaScript 表达式,但由于 JavaScript 表达式可能包含在 CSS 标识符中无效的字符,因此在大多数情况下需要用引号来包裹它们:v-bind

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

当检测到这种 CSS 变量时,SFC 编译器将执行以下操作:

  1. 重写到一个带有哈希变量名称的本机。上面的内容将被改写为:v-bind () var ()

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

    请注意,hash 将应用于所有情况,无论标签是否有范围。这意味着注入的 CSS 变量不会意外地泄漏到子组件中。

  2. 相应的变量将作为内联样式被注入到组件的根元素中。对于上面的例子,最终渲染的 DOM 将看起来像这样:

    <div > hello</div>

    注入是响应式的 ——所以如果组件的属性发生变化,注入的 CSS 变量将被相应地更新。这种更新是独立于组件的模板更新的,所以对一个纯 CSS 的响应式属性的改变不会触发模板的重新渲染。

编译细节

  • 为了注入 CSS 变量,编译器需要生成并注入如下代码到组件的 setup ()

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

    ... 这里,运行时帮助器设置了一个将变量响应性地应用到 DOM.useCssVars watchEffect 上。

  • 该编译策略要求脚本编译时首先对标签内容进行简单的重码解析,以确定要暴露的变量列表。然而,这个解析阶段不会像基于 AST 的完整解析 <style> 那样耗费开销。

  • 在生产中,变量名可以被进一步 hash,以减少 CSS 的占用。

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

    相应的生成的 JavaScript 代码将相应地使用相同的哈希值。

采用策略

这是一个完全向后兼容的新功能。然而,我们应该明确指出,它依赖于本地的 CSS 变量,所以用户需要了解浏览器的支持范围。

实践

在 script 中声明两个响应式的属性,分别是 wallpaperBlurwallpaperMaskwallpaperBlur 表示壁纸的模糊程度, wallpaperMask 表示遮罩的透明度。通过 v-bind 将它们应用到 style,这意味着当我们在 script 中改变这两个值时,样式会响应更改。

// scriptconst 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); }}

image

提示

绑定恰当的属性

在上面的例子中,你可能想到到更改遮罩的透明度仅需要声明一个 0-1 的数字,之后在 style 中这样写:

.wallpaper-mask { background-color: rgba(0, 0, 0, v-b......

原文转载:http://www.shaoqun.com/a/890940.html

跨境电商:https://www.ikjzd.com/

promoted:https://www.ikjzd.com/w/971

商标抢注:https://www.ikjzd.com/w/1053

墩煌网:https://www.ikjzd.com/w/189


摘要在单文件组件样式中支持使用组件状态驱动的CSS变量(CSS自定义属性)。基础示例<template><div>hello</div></template><script>exportdefault{data(){return{color:'red',font:{size:'2em',},}},}<
costco:https://www.ikjzd.com/w/1680
法瑞儿:https://www.ikjzd.com/w/412
米兰网:https://www.ikjzd.com/w/1304.html
太原周边一日游景点 太原周边自驾游一日游攻略:http://www.30bags.com/a/425814.html
太子岭滑雪场几月能滑雪?:http://www.30bags.com/a/225388.html
太子湾 抓住最美的秋色不放手:http://www.30bags.com/a/416156.html
太子湾公园几月份去好?太子湾公园最佳旅游时间是什么时候?:http://www.30bags.com/a/435409.html
交换第一次,我的第一次换妻真实感受:http://lady.shaoqun.com/a/247064.html
你第一次看小说《白鹿原》的时候在想什么?遇到好书太早不如错过好书:http://lady.shaoqun.com/a/427369.html
分手,出轨,爆料...如何用英语聊天八卦?:http://lady.shaoqun.com/a/427370.html
夫妻什么时候不能性爱 4个性生活禁忌日别冲动 :http://lady.shaoqun.com/a/427371.html
"品质男"开着两百万豪车,在大学门口"泡妞",只需要一分钟:http://lady.shaoqun.com/a/427372.html

没有评论:

发表评论