Appearance
样式绑定
绑定 HTML class
需求:美化 h1 元素,有如下的 CSS 样式:
- 其中
.normal
类样式总是生效; - 点击 toggle active 按钮切换
.active
类样式; - 点击 toggle decoration 按钮切换
.decoration
类样式;
less
/* 普通样式:正常粗细 */
.normal {
font-weight: normal;
}
/* 激活时的样式:加粗、橘黄色、倾斜 */
.active {
font-weight: bold;
color: orange;
font-style: italic;
}
/* 文本装饰 */
.decoration {
text-decoration: underline solid purple 0.6em;
text-underline-offset: -0.4em;
text-decoration-skip-ink: none;
}
动静分离 + 三元表达式
总是生效的类名可以写到静态的 class
属性中,动态绑定的类名可以结合三元表达式写到 v-bind:class
属性中。动态和静态的 class 属性可以并存。
js
setup() {
// 用来控制是否为元素应用 .active 类样式
const isActive = ref(false)
return {
isActive
}
}
html
<button @click="isActive = !isActive">toggle active</button>
<h1 class="normal" :class="isActive ? 'active' : ''">文章标题 --- {{ isActive }}</h1>
TIP
直接绑定三元表达式的缺点:无法控制多个类名的按需切换。
class 数组
结合数组可以动态为 class 属性绑定多个类名。代码示例如下:
js
setup() {
// 用来控制是否为元素应用 .active 类样式
const isActive = ref(false)
// 用来控制是否为元素应用 .decoration 类样式
const isDecorate = ref(false)
return {
isActive,
isDecorate
}
}
html
<button @click="isActive = !isActive">toggle active</button>
<button @click="isDecorate = !isDecorate">toggle decotation</button>
<h1 class="normal" :class="[isActive ? 'active' : '', isDecorate? 'decoration': '']">文章标题 --- {{ isActive }} --- {{ isDecorate }}</h1>
class 对象
在数组中声明多个三元表达式会让代码比较臃肿。其实三元表达式的本质是:根据布尔值的 true/false,控制是否为元素应用指定的 class 类样式。
因此为了代码的简洁,数组中的多个三元表达式可以替换成对象的写法:
html
<p :class="{类名A: 布尔值1, 类名B: 布尔值2}"></p>
<!-- 当“布尔值1”为 true 的时候,为元素应用“类名A”,否则移除“类名A” -->
<!-- 当“布尔值2”为 true 的时候,为元素应用“类名B”,否则移除“类名B” -->
代码示例:
html
<h1 class="normal" :class="{active: isActive, decoration: isDecorate}">文章标题 --- {{ isActive }} --- {{ isDecorate }}</h1>
class 计算属性
为了进一步简化 HTML 模板中的 JS 逻辑,我们可以把 class 对象封装为计算属性:
js
setup() {
// 源数据
const isActive = ref(false)
const isDecorate = ref(false)
// 计算属性:控制标题的样式
const titleClassObj = computed(() => ({ active: isActive.value, decoration: isDecorate.value }))
return {
isActive,
isDecorate,
titleClassObj
}
}
html
<button @click="isActive = !isActive">toggle active</button>
<button @click="isDecorate = !isDecorate">toggle decotation</button>
<!-- 把计算属性返回的“样式对象”绑定到 class,能让模板结构更简洁 -->
<h1 class="normal" :class="titleClassObj">文章标题 --- {{ isActive }} --- {{ isDecorate }}</h1>
绑定内联样式
样式对象
vue 支持为 style 属性动态绑定样式对象,语法格式如下:
html
<p style="静态的行内样式" :style="{ 属性A: 值1, 属性B: 值2 }"></p>
示例代码:
js
setup() {
const fontSize = ref(12)
const color = ref('#ffffff')
return {
fontSize,
color
}
}
html
<button @click="fontSize+=2">fontSize +2</button>
<input type="color" v-model="color" />
<h1 :style="{'font-size': fontSize + 'px', color}">地表最强系列·视频教程</h1>
计算属性
为 style 绑定多个样式属性时,会让模板中的代码显得臃肿,此时推荐把动态绑定的样式对象封装为计算属性:
js
setup() {
const fontSize = ref(12)
const color = ref('#ffffff')
// 计算属性:返回样式对象
const styleObject = computed(() => ({ 'font-size': fontSize.value + 'px', color: color.value }))
return {
fontSize,
color,
styleObject
}
}
html
<button @click="fontSize+=2">fontSize +2</button>
<input type="color" v-model="color" />
<h1 :style="styleObject">地表最强系列·视频教程</h1>