개발/Vue
[VUE] Scoped 스타일에서 자식 요소 스타일링 : deep()
맛있는취나물
2024. 10. 7. 12:29
Vue에서 스타일 캡슐화(Scoped Styles)가 적용되면, 자식 컴포넌트나 특정 HTML 요소에 스타일을 적용하기 어려워진다.
:deep()을 사용하면 scoped 스타일이 자식 컴포넌트나 외부 라이브러리의 컴포넌트에도 영향을 줄 수 있다.
적용 예시
1. 부모 컴포넌트에서 scoped 스타일을 자식 컴포넌트에 적용
:deep()을 사용하여 부모 컴포넌트의 scoped 스타일을 자식 컴포넌트에도 적용할 수 있다.
<!-- 부모 컴포넌트 -->
<template>
<div class="parent">
<ChildComponent />
</div>
</template>
<style scoped>
/* 부모 컴포넌트에서 자식의 .child-element 스타일을 변경 */
:deep(.child-element) {
color: red;
}
</style>
<!-- 자식 컴포넌트 -->
<template>
<div class="child-element">자식 컴포넌트의 텍스트입니다.</div>
</template>
<style scoped>
.child-element {
font-size: 18px;
}
</style>
2. 라이브러리를 사용한 컴포넌트에 적용
Swiper, Vue-datepicker와 같은 외부 라이브러리의 컴포넌트에 scoped 스타일을 적용할 때도 :deep()을 사용하여 스타일을 캡슐화된 범위 내에서 적용할 수 있다.
<template>
<swiper>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
</swiper>
</template>
<style scoped>
/* Swiper 스타일 적용 */
:deep(.swiper-slide) {
background-color: lightblue;
color: white;
font-size: 20px;
}
</style>
3. v-html, v-dompurify-html로 렌더링된 요소에도 스타일 적용
v-html이나 v-dompurify-html로 동적으로 렌더링된 HTML 요소에도 :deep()을 통해 scoped 스타일을 적용할 수 있다.
<template>
<div class="content" v-dompurify-html="content"></div>
</template>
<style scoped>
/* v-dompurify-html로 렌더링된 요소의 스타일 적용 */
.content {
:deep(table) {
color: green;
font-weight: bold;
}
}
</style>
참고