CSS를 작성하기 시작하면, 본격적으로 웹페이지를 만들기 시작하는 웹 퍼블리셔의 첫 걸음을 뗐다고 볼 수 있다. CSS에 대한 사용법과 노하우 등을 소개하기 전에 CSS 작성 시 지켜야할 가이드라인이 있는데 그 부분을 먼저 소개한다.
HTML과 마찬가지로 룰을 정해두고 지키는 것이 좋으며, 내가 작성한 CSS를 남들이 봤을 때도 알아보기 쉽도록 작성하는게 가장 좋다. SMACSS, BEM, OOCSS처럼 CSS를 작성하는 방법론이 있는데 이 부분은 다음에 다뤄보도록 하겠다.
1. 문법 (Syntax)
/* Bad CSS */
.selector, .selector-secondary, .selector[type=text] {
padding:15px;
margin:0px 0px 15px;
background-color:rgba(0, 0, 0, 0.5);
box-shadow:0px 1px 2px #CCC,inset 0 1px 0 #FFFFFF
}
/* Good CSS */
.selector,
.selector-secondary,
.selector[type="text"] {
padding: 15px;
margin-bottom: 15px;
background-color: rgba(0,0,0,.5);
box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
}
- 두 번의 공백 혹은 2칸을 움직이는 소프트 탭을 사용한다. 모든 환경에서 코드가 동일하게 보여지도록 보장한다.
- 여러 개의 클래스에 같은 속성을 선언할 때, 개별 클래스는 한 줄로 유지한다.
- 가독성을 위해 클래스 선언 블록의 여는 중괄호 앞에 하나의 공백을 포함한다.
- 선언 블록의 닫는 중괄호는 새 줄에 배치하는게 좋다.
- 선언한 속성에 값을 줄 때, : 뒤에 공백을 하나 포함한다.
- 세미콜론(;)으로 모든 행을 끝낸다.
- 쉼표로 구분 된 속성 값은 각 쉼표 뒤에 공백을 포함해야 한다.
- 단, 쉼표 후 공백을 포함하지 않는 속성도 존재한다.
→ rgb(), rgba(), hsl(), hsla(), rect()
- 속성 값이나 색상 매개 변수 앞에 0을 붙이지 않는다. ex) animation-duration: 0.5s → animation-duration: .5s;
- 색상 16진수 값을 표기할 때, #fff 대신 #ffffff를 넣는게 식별하기 좋다.
- 0 값을 넣을 때는 단위를 지정하지 않는다. ex) padding: 0px; → padding: 0;
2. 선언 순서
.declaration-order {
/* Positioning */
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 100;
/* Box-model */
display: block;
float: right;
width: 100px;
height: 100px;
/* Typography */
font: normal 13px "Helvetica Neue", sans-serif;
line-height: 1.5;
color: #333;
text-align: center;
/* Visual */
background-color: #f5f5f5;
border: 1px solid #e5e5e5;
border-radius: 3px;
/* Misc */
opacity: 1;
}
관련 속성 선언은 순서에 따라 그룹화하는 것이 식별하기에 좋다.
① 포지셔닝 (Position)
② 박스 모델 (Box)
③ 폰트 (Typhograpy)
④ 비주얼 (Visual)
⑤ 기타 (Misc)
문서의 정상적인 흐름에서 요소를 제거하고 박스 모델 관련 스타일을 재정의할 수 있기 때문에 위치 지정이 우선이다. 박스 모델은 구성 요소의 치수와 배치를 지정하므로 다음에 나오는 것이 좋다.
다른 모든 작업은 구성 요소 내부 또는 이전 두 섹션에 영향을 주지 않고 발생하므로 마지막에 발생한다.
3. 사용하지 말아야 하는 것: @import
<!-- Use link elements -->
<link rel="stylesheet" href="core.css">
<!-- Avoid @imports -->
<style>
@import url("more.css");
</style>
<link> 태그로 외부에서 CSS를 연결하는 방식과 비교하여 @import는 더 느리고, 예기치 않은 문제를 일으킬 수 있다. 이를 피하고 대체 접근 방식을 선택한다.
- 여러 <link> 태그 사용
- Sass 또는 Less와 같은 전처리기에는 사용해도 좋으나, 최종적으로 CSS로 단일 컴파일을 해야 한다.
4. 미디어 쿼리 배치
.element { ... }
.element-avatar { ... }
.element-selected { ... }
@media (min-width: 480px) {
.element { ...}
.element-avatar { ... }
.element-selected { ... }
}
가능한 한 관련 규칙 세트에 가깝게 미디어 쿼리를 배치한다. 별도의 시트나 문서 끝에 묶으면 안된다. 이렇게 작성할 경우, 나중에 확인할 때 쉽게 놓칠 수 있다.
5. 단일 속성 선언
/* Single declarations on one line */
.span1 { width: 60px; }
.span2 { width: 140px; }
.span3 { width: 220px; }
/* Multiple declarations, one per line */
.sprite {
display: inline-block;
width: 16px;
height: 15px;
background-image: url("../img/sprite.png");
}
.icon { background-position: 0 0; }
.icon-home { background-position: 0 -20px; }
.icon-account { background-position: 0 -40px; }
규칙 세트에 선언이 하나만 포함 된 경우 가독성과 빠른 편집을 위해 줄바꿈을 제거하는 것이 좋다. 여러 선언이 있는 규칙 세트는 별도의 행으로 분할하는 것이 가독성 면에서 훨씬 좋다.
6. 속기 표기
/* Bad example */
.element {
margin: 0 0 10px;
background: red;
background: url("image.jpg");
border-radius: 3px 3px 0 0;
}
/* Good example */
.element {
margin-bottom: 10px;
background-color: red;
background-image: url("image.jpg");
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
사용 가능한 모든 값을 명시적으로 선언해야 한다. 그러나 속기 선언으로 사용하는 경우가 있는데 대표적으로 아래와 같다.
- padding
- margin
- font
- background
- border
- border-radius
일반적으로 속기 속성이 나타내는 모든 값을 설정할 필요는 없다. 속기 속성을 과도하게 사용할 경우, 불필요한 재정의와 의도하지 않는 코드가 발생하여 더 느려질 수도 있다.
7. 주석
/* Bad example */
/* Modal header */
.modal-header {
...
}
/* Good example */
/* Wrapping element for .modal-title and .modal-close */
.modal-header {
...
}
프로젝트는 다양한 사람들이 코드를 작성하고 유지한다. 코드가 잘 설명되어 있는지, 다른 사람이 쉽게 접근할 수 있는지 확인한다. 훌륭한 코드 주석은 이 CSS의 사용 목적을 전달한다.
8. 클래스 명명 규칙
/* Bad example */
.t { ... }
.red { ... }
.header { ... }
/* Good example */
.tweet { ... }
.important { ... }
.tweet-header { ... }
- 클래스는 소문자로 선언하고 카멜케이스 표기법이 아닌 하이픈(-), 혹은 언더바(_)를 사용하여 단어를 구분한다.
- 과도하고 임의적인 속기 표기를 하지 않는다. 단, 팀에 코딩 컨벤션에 속기 표기 단어가 정리되어있다면 그 룰을 따른다.
9. 선택자
/* Bad example */
span { ... }
.page-container #stream .stream-item .tweet .tweet-header .username { ... }
.avatar { ... }
/* Good example */
.avatar { ... }
.tweet-header .username { ... }
.tweet .avatar { ... }
- 최적의 렌더링 성능을 위해 태그 접근보다 클래스 접근으로 하는 것이 좋다.
- 선택자를 짧게 유지하고 각 선택자의 요소 수를 제한한다.
- 필요한 경우에만 클래스를 가장 가까운 부모로 범위 지정을 한다.
'Road to Web Developer > CSS' 카테고리의 다른 글
CSS 변수 선언하기 (0) | 2020.09.24 |
---|---|
CSS (Cascading Style Sheets) 란? (0) | 2018.12.03 |