李恒道 发表于 2022-2-24 01:18:45

[油猴脚本开发指南]CSS属性绑定

# 前文

在传统网页开发中,我们可以使用class和style

但是在vue中,我们不仅可以使用class和style

更可以通过bing函数,也就是:来动态设置class和style

这里有多种写法,我们可以浅尝截止一下

# 对象语法

```js
<div :class="{ active: isActive }"></div>

```

这里isActive变量的真假来控制active的class名的存在与不存在

:class与class可以共存

```js
<div
class="static"
:class="{ active: isActive, 'text-danger': hasError }"
></div>

```

期期中isActive以及hasError控制类名的存在与不存在

假设isActive为真,而hasError为假

则渲染的结果为

```js
<div class="static active"></div>

```

当数据的变化发生改变,则会相应的进行动态更新

我们也可以:bind上一个对象,对象包含上述的内容

```js
<div :class="classObject"></div>

```

```js
data() {
return {
    classObject: {
      active: true,
      'text-danger': false
    }
}
}

```

同理,只要符合数据格式的响应式对象即可,我们也可以绑定一个计算属性

```js
<div :class="classObject"></div>

```

```js
data() {
return {
    isActive: true,
    error: null
}
},
computed: {
classObject() {
    return {
      active: this.isActive && !this.error,
      'text-danger': this.error && this.error.type === 'fatal'
    }
}
}

```

# 数组语法

我们除了给:class绑定一个对象,也可以绑定一个数组,如

```js
<div :class=""></div>

```

```js
data() {
return {
    activeClass: 'active',
    errorClass: 'text-danger'
}
}

```

则绑定的结果为

```js
<div class="active text-danger"></div>

```

我们也可以在数组中使用三元表达式,来动态的计算数组中返回的数据变量或字符串

```js
<div :class=""></div>
```

该表达式errorClass始终存在,而activeClass根据isActive的值来判断

我们也可以在数组中使用对象语法,但是这种我们通常不会使用

```js
<div :class="[{ active: isActive }, errorClass]"></div>

```

# 在组件上使用

假如我们声明了一个组件

```js
const app = Vue.createApp({})

app.component('my-component', {
template: `<p class="foo bar">Hi!</p>`
})

```

同时在调用该组件的父组件添加了一个动态的class

```js
<div id="app">
<my-component class="baz boo"></my-component>
</div>

```

则组件的class与组件自身的class会融合在一起

在Vue3中,可以声明多个根节点,当存在多个根节点的时候,使用$attrs属性来进行融合父组件设置的class

```js
<div id="app">
<my-component class="baz"></my-component>
</div>

```

```js
const app = Vue.createApp({})

app.component('my-component', {
template: `
    <p :class="$attrs.class">Hi!</p>
    <span>This is a child component</span>
`
})

```

# 总结

我们可以对动态class设置一个对象,或一个数组

如果是对象,类名在前,真假在后,如果是数组,则可以使用三元表达式

数组和对象可以结合

# 内联样式

CSS属性名可以使用驼峰式,如camelCase或短横线分割kebab-case,style动态跟动态class的用法基本一致

```js
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>

```

```js
data() {
return {
    activeColor: 'red',
    fontSize: 30
}
}

```

我们也可以直接绑定一个样式对象

```js
<div :style="styleObject"></div>

```

```js
data() {
return {
    styleObject: {
      color: 'red',
      fontSize: '13px'
    }
}
}

```

同理也可以使用计算属性

# 数组语法

同理,我们也可以设置多个样式对象到同一个数组上

```js
<div :style=""></div>
```

# 自动添加前缀

css具有很多实验性的特性,浏览器厂商为了兼容这些特性,同时不与其他浏览器冲突

所以经常会添加一个特殊的前缀

如transition,有-moz-,-ms-,-webkit-,等等

一开始一个厂商会具有一个前缀,而后来为了抢占市场分量,开始互相兼容对象前缀

如果我们正常写css代码,我们需要自己写前缀

也可以使用scss编译,自动添加前缀

而在vue中

vue将会自动侦测并且添加响应的前缀,vue会在运行时检测哪些样式的属性是被浏览器所支持的

如果不支持某个属性,会通过多次尝试来找到支持他的前缀

(这里个人并没有特别理解,大概翻了一下源码也没翻到)

感觉不像是autoprefix,而是根据js代码检测特定前缀来进行处理的?

# 多重值

可以在style绑定的过程中,为属性提供一个包含多个值的数组,提供多个带前缀的值,例如

```js
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
```

这样只会渲染数组中最后一个被浏览器支持的值。

# 结语

我们只需要记住绑定动态class以及style的时候可以是数组形式,也可以是对象形式,会自动添加前缀

需要的时候查什么即可。

撒花~

rubinTime 发表于 2022-2-24 09:03:23

哥哥牛逼

王一之 发表于 2022-2-24 10:01:00

哥哥这些markdown都有整理么?
论坛的观感好差。。。

李恒道 发表于 2022-2-24 10:53:58

王一之 发表于 2022-2-24 10:01
哥哥这些markdown都有整理么?
论坛的观感好差。。。

还没....最近在研究vue3+ts舒服一点的写法...
我晚上就开始整理
页: [1]
查看完整版本: [油猴脚本开发指南]CSS属性绑定