생성한 08_component-styling 프로젝트의 src 디렉터리에 App.js파일과 App.css파일이 있습니다.
App.js
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
App.css
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
프로젝트에 자동 생선된 App.css를 읽어 보면 클래스 이름이 컴포넌트 이름
- 클래스
형태로 지어져 있습니다. (예: App-link) 클래스에 컴포넌트 이름을 포함시킴으로써 다른 컴포넌트에서 실수로 중복되는 클래스를 만들어 사용하는 것을 방지할 수 있습니다.
비슷한 방식으로 BEM 네이밍 이라는 방식도 있습니다. BEM 네이밍은 CSS 방법론 중 하나로,
이름을 지을 때 일종의 규칙을 준수하여 해당 클래스가 어디에서 어떤 용소로 사용되는지 명확하게 작성하는 방식입니다. (예: .card_title_primary)
CSS Selector를 사용하면 CSS 클래스가 특정 클래스 내부에 있는 경우에만 스타일을 적용할 수 있습니다.
예를 들어 .App 안에 들어 있는 .logo에 스타일을 적용하고 싶다면, 다음과 같이 작성하면 됩니다.
.App .logo {
animation: App-logo-spin infinite 20s linear;
height: 40vmin;
}
이러한 방식을 사용하여 기존 App.css와 App.js의 CSS 클래스 부분을 다시 작성해 볼까요?
우선 CSS파일을 이렇게 수정해 보세요.
.App {
text-align: center;
}
.App .logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
// 클래스가 아닌 header 태그 자체에 스타일을 적용,
// 태그에 적용할 때는 .을 생략합니다.
.App header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App a {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
그리고 이에 맞춰 컴포넌트의 JSX 부분을 수정해 봅시다.
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header>
<img src={logo} className="logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
이런 식으로 컴포넌트의 최상위 html요소에는 컴포넌트의 이름으로 클래스 이름을 짓고(.App), 그 내부에서는 소문자를 입력하거나(.logo), header 같은 태그를 사용하여 클래스 이름이 불필요한 경우에는 아예 생략할 수도 있습니다.