클래스 및 스타일 바인딩


Directory


HTML 클래스 바인딩


객체 구문

객체를 v-bind:class에 전달하여 클래스를 동적으로 전환할 수 있습니다. v-bind:class 一个对象,以动态地切换 class:

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

上面的语法表示 active 这个 class 存在与否将取决于数据属性 isActivetruthiness

你可以在对象中传入更多属性来动态切换多个 class。此外,v-bind:class 指令也可以与普通的 class 属性共存。当有如下模板:

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

和如下 data:

data: {
  isActive: true,
  hasError: false
}

结果渲染为:

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

isActive 或者 hasError 变化时,class 列表将相应地更新。例如,如果 hasError 的值为 true,class 列表将变为 "static active text-danger"

绑定的数据对象不必内联定义在模板里:

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

渲染的结果和上面一样。我们也可以在这里绑定一个返回对象的计算属性。这是一个常用且强大的模式:

<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'
    }
  }
}


数组语法

我们可以把一个数组传给 v-bind:class,以应用一个 class 列表:

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

这样写将始终添加 errorClass,但是只有在 isActive 是 truthy[1] 时才添加 activeClass

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

위 구문은 active 이 클래스는 isActive에 따라 달라집니다. target="_blank">진실

.

객체에 더 많은 속성을 전달하여 여러 클래스를 동적으로 전환할 수 있습니다. 또한 v-bind:class 지시어는 일반 클래스 속성과 공존할 수 있습니다. 다음 템플릿이 있는 경우:

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

및 다음 데이터: 🎜
<my-component class="baz boo"></my-component>
🎜결과는 다음과 같이 렌더링됩니다. 🎜
<p class="foo bar baz boo">Hi</p>
🎜isActive 또는 hasError가 변경되면 클래스 목록 그에 따라 업데이트됩니다. 예를 들어 hasErrortrue로 평가되면 클래스 목록은 "static active text-danger"가 됩니다. 🎜🎜바운드 데이터 개체는 템플릿에서 인라인으로 정의될 필요가 없습니다. 🎜
<my-component v-bind:class="{ active: isActive }"></my-component>
<p class="foo bar active">Hi</p>
🎜렌더링 결과는 위와 동일합니다. 반환된 객체의
계산 속성 🎜을 여기에 바인딩할 수도 있습니다. 이는 일반적이고 강력한 패턴입니다. 🎜
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
  activeColor: 'red',
  fontSize: 30
}
🎜🎜🎜

🎜🎜array 구문🎜🎜🎜🎜배열을 v-bind:class에 전달할 수 있습니다. 클래스 목록을 적용하려면: 🎜

<div v-bind:style="styleObject"></div>
data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}
🎜는 다음과 같이 렌더링됩니다: 🎜
<div v-bind:style="[baseStyles, overridingStyles]"></div>
🎜 조건에 따라 목록의 클래스를 전환하려는 경우 삼항 표현식을 사용할 수 있습니다. 🎜
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
🎜 이와 같이 작성하면 항상 가 추가됩니다. errorClass, 그러나 isActive가 진실인 경우에만 activeClass[1] 🎜코드>. 🎜🎜그러나 조건부 클래스가 여러 개인 경우 이렇게 작성하는 것은 약간 번거롭습니다. 따라서 객체 구문은 배열 구문에도 사용할 수 있습니다: 🎜rrreee🎜🎜🎜

구성 요소에 사용됨

이 장에서는 사용자가 이미 Vue 구성 요소에 대해 어느 정도 이해하고 있다고 가정합니다. 물론 여기를 건너뛰고 나중에 다시 돌아올 수도 있습니다.

사용자 정의 구성 요소에서 class 속성을 ​​사용하면 이러한 클래스가 구성 요소의 루트 요소에 추가됩니다. 이 요소에 이미 존재하는 클래스는 덮어쓰지 않습니다. class 属性时,这些 class 将被添加到该组件的根元素上面。这个元素上已经存在的 class 不会被覆盖。

例如,如果你声明了这个组件:

rrreee

然后在使用它的时候添加一些 class:

rrreee

HTML 将被渲染为:

rrreee

对于带数据绑定 class 也同样适用:

rrreee

isActive 为 truthy[1] 时,HTML 将被渲染成为:

rrreee


绑定内联样式


对象语法

v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名:

rrreeerrreee

直接绑定到一个样式对象通常更好,这会让模板更清晰:

rrreeerrreee

同样的,对象语法常常结合返回对象的计算属性使用。


数组语法

v-bind:style 的数组语法可以将多个样式对象应用到同一个元素上:

rrreee


自动添加前缀

v-bind:style 使用需要添加浏览器引擎前缀的 CSS 属性时,如 transform,Vue.js 会自动侦测并添加相应的前缀。


多重值

2.3.0+

从 2.3.0 起你可以为 style 绑定中的属性提供一个包含多个值的数组,常用于提供多个带前缀的值,例如:

rrreee

这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex


译者注

[1] truthy 不是 true예를 들어, 이 구성 요소를 rrreee

로 선언하고 이를 사용할 때 일부 클래스를 추가하면

rrreee
HTML은 다음과 같이 렌더링됩니다.

rrreee

데이터 바인딩이 있는 클래스에도 동일하게 적용됩니다.

rrreee🎜When < code>isActive
가 진실[1]🎜이면 HTML은 다음과 같이 렌더링됩니다: 🎜rrreee🎜🎜🎜

🎜인라인 스타일 바인딩🎜🎜


객체 구문 🎜🎜🎜🎜v-bind:style의 객체 구문은 매우 직관적입니다. CSS와 매우 유사해 보이지만 실제로는 JavaScript 객체입니다. . CSS 속성 이름은 camelCase 또는 kebab-case로 명명할 수 있습니다(따옴표로 묶어야 함): 🎜rrreeerrreee🎜 일반적으로 템플릿을 더 명확하게 만드는 스타일 객체에 직접 바인딩하는 것이 더 좋습니다: 🎜rrreeerrreee🎜마찬가지로 객체 구문은 다음과 같습니다. 객체를 반환하는 계산된 속성과 함께 사용되는 경우가 많습니다. 🎜🎜🎜🎜

🎜🎜Array Grammar🎜🎜🎜🎜v-bind:style의 배열 구문은 동일한 요소에 여러 스타일 개체를 적용할 수 있습니다. : 🎜rrreee🎜🎜🎜

🎜🎜자동으로 접두어 추가🎜🎜🎜🎜v-bind:style을 사용하는 경우 를 추가해야 합니다. ="https ://developer.mozilla.org/zh-CN/docs/Glossary/Vendor_Prefix" target="_blank">브라우저 엔진 접두사 🎜 transform, Vue.js와 같은 CSS 속성은 적절한 접두사를 자동으로 감지하고 추가합니다. 🎜🎜🎜🎜

🎜🎜Multiple value🎜🎜🎜🎜🎜2.3.0+🎜🎜🎜2.3.0부터는 style을 바인딩할 수 있습니다. 여러 값을 포함하는 배열. 접두사가 붙은 여러 값을 제공하는 데 자주 사용됩니다. 예: 🎜rrreee🎜 이와 같이 작성하면 브라우저에서 지원하는 배열의 마지막 값만 렌더링됩니다. 이 예에서 브라우저가 브라우저 접두사 없이 flexbox를 지원하면 display: flex만 렌더링됩니다. 🎜🎜🎜🎜

🎜Translator's Note🎜🎜🎜[1] 진실은 true가 아닙니다. 자세한 내용은 🎜MDN🎜의 설명을 참조하세요. 🎜🎜🎜🎜🎜 🎜