전역 스타일
`<style>` 태그 내에 작성한 스타일이나, `src/main.js`에서 import 한 CSS 스타일 👉 전역 스타일
전역 스타일은 페이지 전체에서 사용되므로, 컴포넌트 간의 충돌이 발생할 수 있다 (충돌 ≒ 덮어쓰기)
<template>
<div class="child">
<h2>child1</h2>
</div>
</template>
<script>
export default {
name: 'Child1',
};
</script>
// Child2, Child3 컴포넌트도 마찬가지로 .child 스타일을 정의함
<style>
.child {
background-color: aqua;
border: solid 1px, black;
margin: 1.5em;
padding: 1em;
}
</style>
style 태그 안에 `.child` 스타일을 각각 정의했지만, 마지막에 임포트한 `Child3`의 style로 적용되어 충돌이 발생함
이렇게, 동일한 css 클래스 이름 (여기서는 `.child`)이 여러 컴포넌트에 사용되면, 마지막에 임포트한 스타일이 적용됨
다른 컴포넌트와의 스타일 충돌을 피하면서, 특정 컴포넌트만의 스타일을 지정하는 방법은 두 가지가 있음.
특정 컴포넌트 스타일 지정
1. 범위 CSS
컴포넌트가 렌더링하는 요소에 특성 기반의 추가적인 식별자를 부여하여 충돌을 피하는 가장 쉬운 방법
<style>을 `<style scoped>` 로 변경하여 적용
위에서 충돌이 발생한 Child1과 Child2의 style을 <style scoped>로 변경하면, 충돌 없이 style이 적용됨
console의 빨간 네모 박스와 같이, Child1과 Child2에 `data-v-xxxxx` 같은 특성이 추가 돼 있음
콘솔 창의 style도 마찬가지로 `.child[data-v-xxxxxx]`로 변환 되어 표기 됨
📌 일반적으로 기본 밑바탕이 되는 CSS 클래스들은 css 파일로 작성하여, `src/main.js`에서 임포트 함
해당 스타일들은 가장 먼저 임포트 하기 때문에, 앱 전체의 공통 스타일을 적용하기 편리
각 컴포넌트에 적용할 CSS 클래스들은 .vue 파일 내에서 범위 css로 충돌을 피해 적용하는 게 바람직
2. CSS 모듈
CSS 스타일을 마치 객체처럼 다룰 수 있도록 함
<style> 대신 `<style module>`로 변경하여 사용
추가 속성을 부여하는 범위 CSS와 달리, class명이 절대 충돌 안 하게끔 변경됨.
이 희한한 클래스는 `$style`옵션에 객체로 등록 됨
`.child`로 스타일을 작성했더라도,컴파일 과정에서 위처럼 고유한 이름 (여기서는 `._child_u513g_3`)으로 변환됨
👉 HTML 템플릿에서 원래 클래스 이름인 `.child`로 접근할 수 없음
따라서 우리는 `:class="$style.child"` 와 같이 v-bind 디렉티브를 사용해야 함 (= 바인딩)
여러 개를 사용하는 경우, <div `:class= "[$style.class, $style.italic]"`> ... </div> 처럼 사용
📌 범위 CSS 와 CSS 모듈의 가장 큰 차이점
- 범위 CSS: 추가 식별자 (data-v-xxxx)을 부여
- CSS 모듈: 클래스 이름을 바꿔버림