Day 9 vue class 以及 style 绑定

今天要讲的是和网站外貌很有关係的 classstyle 绑定

我们有几种方式为 DOM 设定样式,其中两种常用的是 .css 档案和 inline style,前者通常会使用 class 来作为 selector。

在 vue 中也有提供相关的绑定让你可以将样式的设定程式化。

Class 绑定

class 也是一种 DOM 属性,因此语法和属性绑定一样使用 v-bind:,但我们可以利用一些布林参数来切换 class

<div v-bind:class="{ active: isActive }"></div>
data: {  isActive: true}

我们用 isActive 这个 data 属性来切换 active 这个 class

v-bind:class 也可以和一般固定写死的 class 混用

<div  class="static"  v-bind:class="{ active: isActive, 'text-danger': hasError }"></div>
data: {  isActive: true,  hasError: false}

结果为

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

和其他各种绑定一样,当 data 更新的时候也会做出相关的更新,例如将 hasError 设定为 true,则上述元素会变为

<div class="static active text-danger"></div>

注: js object key name 不能使用 hypen,例如 { hey-yo: 666 } 这是不合法的,如果要使用 hypen 的话必须明确用 string 当作 key,如 { 'hey-yo': 666 },这就是为什么上面的 text-danger 要加引号其他的不用,当然其他的加引号也是没问题的。

我们也可以直接在 data 宣告一个 object 绑进去

<div v-bind:class="classObject"></div>
data: {  classObject: {    active: true,    'text-danger': false  }}

前一篇讲的 computed property 也是没问题的

<div v-bind:class="classObject"></div>
data: {  isActive: true,  error: null},computed: {  classObject: function () {    return {      active: this.isActive && !this.error,      'text-danger': this.error && this.error.type === 'fatal'    }  }}

Array syntax

有另外一个写法是传一个 array 进去

<div v-bind:class="[activeClass, errorClass]"></div>
data: {  activeClass: 'active',  errorClass: 'text-danger'}

结果是

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

这种写法如果你想做 class 的切换可以用三元运算子

<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

但这样很不直观,可以改用最一开始介绍的 object 的写法

<div v-bind:class="[{ active: isActive }, errorClass]"></div>

这属性也可以在自定义的 vue component 中使用,到时候介绍完 component 再回来看。

Inline style

一样是对 sylte 使用 v-bind: 来做绑定

<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {  activeColor: 'red',  fontSize: 30}

看起来和 css 非常相似,很方便,不过 css 中有一些用 hypen 连接的属性名称 (hypen 连接的变数命名方式称为 kebab-case),需要改写成 camelCase,但其实也可以直接使用 kebab-case,只是需要记得加上引号 (和前面 class 使用 hypen 的例子一样,可以翻回去看。

一样可以做一个 object 丢进去

<div v-bind:style="styleObject"></div>
data: {  styleObject: {    color: 'red',    fontSize: '13px'  }}

看起来更像 css 了,感觉还蛮像我们做一个一个小的样式方块,然后需要的时候可以套用进去,还蛮有趣的。

v-bind:style 同样也支援 array syntax,用法和 class 一样

<div v-bind:style="[baseStyles, blueText]"></div>
data: {  baseStyles: {    color: 'red',    fontSize: '13px'  },  blueText: {    color: 'blue',  }}

有一些 css 属性有针对浏览器相容性的 prefixes,在 Vue 2.3.0 以后的版本有支援这个部分

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

render 时只会显示浏览器支援的最后一个,例如多数浏览器目前应该都支援 flex 而不需要任何 prefixe,则上面的 code 执行结果为

<div style="display: flex"></div>

总结

Vue 提供给我们相当方便可以程式化样式套用的方法,可以更灵活且模组化地去设计 css。

下一次将更详细的介绍之前讲解过的条件式 render: v-if


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章