65 Scoped CSS
source: categories/study/vue-experiance/vue-experiance_9-65.md
65 Scoped CSS (::v-deep 대신 :deep 사용~!)
<style>
태그에 scoped
범위 속성이 있는 경우 해당 CSS는 현재 컴포넌트의 요소에만 적용됩니다.
이것은 Shadow DOM
에서 발견되는 스타일 캡슐화와 유사합니다.
몇 가지 주의사항이 있지만 폴리필이 필요하지 않습니다.
PostCSS
를 사용하여 다음을 변환함으로써 달성됩니다.
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
위를 다음으로:
<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template>
로컬 및 글로벌 스타일 혼합
동일한 컴포넌트에 scoped
스타일과 non-scoped
스타일을 모두 포함할 수 있습니다.
<style>
/* global styles */
</style>
<style scoped>
/* local styles */
</style>
하위 컴포넌트 루트 요소
scoped
속성이 정의되면 상위 컴포넌트의 스타일이 하위 컴포넌트로 누출되지 않습니다.
그러나 하위 컴포넌트의 루트 노드는 부모의 scoped CSS
와 자식 컴포넌트의 scoped CSS
모두의 영향을 받습니다.
이것은 부모가 레이아웃 목적으로 자식 루트 요소의 스타일을 지정할 수 있도록 의도적으로 설계된 것입니다.
Deep Selectors
scoped
스타일의 선택기를 ‘deep' (즉, 자식 컴포넌트에 영향을 미치기를 원하면) >>>
결합기를 사용할 수 있습니다.
<style scoped>
.a >>> .b { /* ... */ }
</style>
위 코드는 다음과 같이 컴파일됩니다:
.a[data-v-f3f3eg9] .b { /* ... */ }
sass
와 같은 일부 전처리기는 >>>
를 제대로 구문 분석하지 못할 수 있습니다.
이 경우 /deep/
또는 ::v-deep
결합자를 대신 사용할 수 있습니다.
둘 다 >>>
의 별칭이며 정확히 동일하게 작동합니다.
위의 예를 기반으로 이 두 표현식은 동일한 출력으로 컴파일됩니다.
<style scoped>
.a::v-deep .b { /* ... */ }
</style>
<style scoped>
.a /deep/ .b { /* ... */ }
</style>
Dynamically Generated Content (동적으로 생성된 콘텐츠)
v-html
로 만든 DOM
콘텐츠는 범위가 지정된 스타일의 영향을 받지 않지만 deep
선택기를 사용하여 스타일을 지정할 수 있습니다.
Also Keep in Mind (명심해야될 부분들)
scoped
스타일은 클래스의 필요성을 제거하지 않습니다. (클래스의 필요성이 여전히 있다는 뜻)
브라우저가 다양한 CSS 선택기를 렌더링하는 방식으로인해 p {color: red}
는 scoped
로 인해 범위가 지정될 때, (예시, data-sewf123
)
즉, 이렇게 속성 선택기와 결합될 때 몇 배나 느려집니다. (인터넷 익스플로러)
.example { color: red }
와 같이 클래스나 ID를 대신 사용하면 성능 저하를 거의 제거할 수 있습니다.
재귀 구성 요소의 자손 선택기에 주의하십시오!
선택기 .a .b
가 있는 CSS 규칙의 경우 .a
와 일치하는 요소에 재귀 하위 구성 요소가 포함되어 있으면 해당 하위 구성 요소의 모든 .b
가 규칙과 일치합니다.
(음.. 무슨 뜻이지? 이건 무슨 뜻인지 잘 이해가안된다..)