8-1. 일반 CSS

송한솔·2023년 4월 27일
0

ReactStudy

목록 보기
39/54

생성한 08_component-styling 프로젝트의 src 디렉터리에 App.js파일과 App.css파일이 있습니다.

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 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 같은 태그를 사용하여 클래스 이름이 불필요한 경우에는 아예 생략할 수도 있습니다.

0개의 댓글