브라우저마다 다르게 보이는 스타일들을 하나로 통일시키기 위해 자주 사용되는 것 중에 하나입니다. 계속적으로 보완되고 있는 프로젝트라 기준으로 잡고 스타일링을 하는데 도움이 될 것입니다.
Normalize.css 소개
Normalize.css는 HTML 요소의 기본 스타일을 브라우저 간 일관성을 유지하도록 돕는 CSS 파일이다. 이것은 Boilerplate(보일러플레이트) 및 Bootstrap(부트스트랩) 등과 같은 크고 작은 프로젝트에서도 두루두루 사용되고 있다.
Normalize.css 특징
브라우저(모바일 브라우저를 포함하여)를 광범위하게 지원하며, HTML5 요소, 타이포그래피, 목록(lists), embeded 콘텐츠, 폼과 테이블을 일관성있게 통일시키는 CSS를 포함한다.
- 다른 CSS reset 과는 달리 사용하기 좋은 기본값들은 유지한다.
- HTML 요소의 다양한 스타일을 정규화한다.
- 버그 및 브라우저 간 차이점을 수정한다.
- 부분적인 개선과 가용성을 향상시킨다.
- 코드에 대한 자세한 주석이 달려 이해를 돕는다.
- normalize는 버전 1은 구형 IE(IE6)를 지원하지만 더이상 개발이나 수정이 이루어지지 않는다. 버전 3대가 현재 개발되고 애용되는 버전이다.
Normalize.css v3.0.3
버전별로 내용이 상이할 수 있으니 유념하도록 하자.
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
/**
* 1. 기본 글꼴을 sans-serif로 설정.
* 2. iOS와 IE에서 기기 회전시에 사용자가 확대하지 않아도 글씨 크기가 재조정되는 것을 예방.
*/
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* 기본 마진값을 제거.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* IE8/9에서 정의되지 않은 HTML5 요소를 'block'으로 지정.
* IE10/11, Firefox에서 정의되지 않은 `detail` 혹은 `summary` 를 `block`으로 지정.
* IE11에서 정의되지 않은 `main`을 `block`으로 지정
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
display: block;
}
/**
* 1. IE8/9에서 `inline-block`으로 정의되지 않은 것을 올바르게 지정.
* 2. Chrome, Firefox, Opera에서 `progress`의 세로 정렬을 표준화.
*/
audio,
canvas,
progress,
video {
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}
/**
* 모던 브라우저들에서 controls 속성없이 audio 요소가 렌더링 되는 것을 예방
* iOS 5 기기에서 높이를 초과하는 것을 제거
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* `[hidden]` 속성의 스타일이 IE 8/9/10에서 존재하지 않는 것을 해결.
* IE 8/9/10/11, Safari, Firefox < 22 에서 `template` 요소를 숨김.
*/
[hidden],
template {
display: none;
}
/* Links
========================================================================== */
/**
* IE10에서 활성화(active)된 링크의 회색 배경을 제거.
*/
a {
background-color: transparent;
}
/**
* active/hover 상태일때에도 포커스된 요소의 가독성을 향상.
*/
a:active,
a:hover {
outline: 0;
}
/* Text-level semantics
========================================================================== */
/**
* IE 8/9/10/11, Safari, Chrome에서 존재하지 않는 스타일을 부여.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Firefox 4+, Safari, Chrome에서 `bolder`로 설정되어 있는 것을 `bold`로 수정.
*/
b,
strong {
font-weight: bold;
}
/**
* Safari,Chrome에서 존재하지 않는 스타일을 부여.
*/
dfn {
font-style: italic;
}
/**
* Firefox 4+, Safari, Chrome에서 `section`과 `article` 내부의 `h1` 요소의 글꼴 크기와 마진값이 서로 다른 것을 통일시킴.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* IE 8/9에서 존재하지 않는 스타일을 부여.
*/
mark {
background: #ff0;
color: #000;
}
/**
* 브라우저마다 다른 글꼴 크기를 통일시킴.
*/
small {
font-size: 80%;
}
/**
* `sub`과 `sup`요소가 모든 브라우저에서 `line-height`에 영향을 미치는 것을 예방.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* Embedded content
========================================================================== */
/**
* IE 8/9/10에서 `a` 요소안에 이미지가 위치할 경우 생기는 테두리 제거.
*/
img {
border: 0;
}
/**
* IE 9/10/11에서 `svg` 요소가 영역의 크기를 벗어나지 않도록 수정.
*/
svg:not(:root) {
overflow: hidden;
}
/* Grouping content
========================================================================== */
/**
* IE 8/9, Safari에서 존재하지 않는 `margin` 값을 부여.
*/
figure {
margin: 1em 40px;
}
/**
* Firefox와 다른 브라우저들 사이의 차이점 해결.
*/
hr {
box-sizing: content-box;
height: 0;
}
/**
* 모든 브라우저에서 `pre` 요소의 `overfolow` 값을 통일.
*/
pre {
overflow: auto;
}
/**
* 모든 브라우저에서 글꼴과 글꼴 크기가 다른 것을 해결.
*/
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
/* Forms
========================================================================== */
/**
* 알려진 한계: 기본적으로 OS X의 Chrome과 Safari는 `border` 속성을 지정하지 않는 한
* `select` 요소의 스타일링에 매우 제한적이다.
*/
/**
* 1. color 속성이 상속되지 않는 것을 수정.
* 알려진 문제: disabled 된 요소의 color 속성에도 영향을 미친다.
* 2. font 속성이 상속되지 않는 것을 수정.
* 3. Firefox 4+, Safari, Chrome에서 마진이 서로 다른 것을 해결.
*/
button,
input,
optgroup,
select,
textarea {
color: inherit; /* 1 */
font: inherit; /* 2 */
margin: 0; /* 3 */
}
/**
* IE 8/9/10/11에서 `overflow` 속성값이 `hidden`으로 설정되어 있는 것을 수정
*/
button {
overflow: visible;
}
/**
* `button`과 `select` 요소에 `text-transform` 상속이 일치하지 않는 것을 해결
* 모든 다른 폼 컨트롤 요소는 `text-transform` 값을 상속하지 않는다.
* IE 8/9/10/11, Firefox, Opera에서 `button` 요소의 스타일 상속 수정.
* Firefox에서 `select` 요소의 스타일 상속 수정.
*/
button,
select {
text-transform: none;
}
/**
* 1. Android 4.0.*에서 `audio`와 `video` 컨트롤을 파괴하는 웹킷 버그를 방지.
* 2. iOS에서 클릭가능한 `input` 유형에 스타일링을 할 수 없는 것을 수정.
* 3. `input` 요소와 다른 요소들의 image-type의 커서 모양을 일치시켜 가용성을 향상.
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}
/**
* disabled된 요소의 기본 커서를 재설정
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* Firefox 4+에서 내부 `padding`과 `border`를 제거
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* Firefox 4+에서 UA(User Agent) 스타일시트에 `!important`를 사용한 `input` 요소의
* `line-height` 설정값을 해결.
*/
input {
line-height: normal;
}
/**
* 이러한 요소의 스타일을 설정하려고하지 않는 것이 좋다.
* Firefox에서 아래의 요소에서 box-sizing, padding, width가 구현될꺼라 기대하지 말자.
*
* 1. IE 8/9/10에서 box sizing 속성값을 `content-box`에서 `border-box`로 변경
* 2. IE 8/9/10에서 영역을 벗어나지 않도록 `padding`을 제거
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Chrome의 증가/감소 버튼의 커서 모양을 수정.
* `input` 요소의 특정 `font-size` 값에 대해 감소 버튼의 커서 모양이 `default`에서 `text`로 변한다.
*/
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* OS X의 Safari, Chrome에서 내부(inner) `padding`과 검색 취소 버튼을 제거.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* `border`, `margin`, `padding`을 일치.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. IE 8/9/10/11에서 `color`는 상속되지 않는다.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}
/**
* IE 8/9/10/11에서 기본 세로 스크롤바를 제거
*/
textarea {
overflow: auto;
}
/**
* `font-weight`는 상속되지 않는다.(applied by a rule above).
* 주의: OS X의 Chrome과 Safari에서 기본값을 변경하는 것은 안전하지 않다.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */
/**
* 테이블 요소 사이의 간격을 제거
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
td,
th {
padding: 0;
}
지원 브라우저
- Google Chrome
- Mozilla Firefox 3+
- Apple Safari 4+
- Opera 10+
- Internet Explorer 6+
/*! normalize.css v1.1.3 | MIT License | git.io/normalize */
/* ==========================================================================
HTML5 display definitions
========================================================================== */
/**
* HTML5에 새로 추가된 요소들을 블럭으로 지정
* IE 6/7/8/9, Firefox 3 적용
*/
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary {
display: block;
}
/**
* audio와 canvas 그리고 video 요소를 inline-block값을 지정하고 지원하지 않는 브라우저는 핵을 이용함
* IE 6/7/8/9, Firefox 3 적용
*/
audio, canvas, video {
display: inline-block;
*display: inline;
*zoom: 1;
}
/**
* audio요소에 contorls 속성이 정의 되지 않은 경우 이를 감춤
* 모든 웹브라우저 및 iOS 5 이상 기기 적용
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* visibility 속성의 hidden값과 display 속성의 none 값을 통일함으로 레이아웃 구현에 차이를 줄임
* IE 7/8/9. Firefox 3, Safari 4, IE 6은 지원않함
*/
[hidden] {
display: none;
}
/* ==========================================================================
Base
========================================================================== */
/**
* 1. IE 6/7 에서 body에 em 단위의 정확한 글자크기를 구현하기 위한 설정으로 100%=16px, 75%=12px
* 2. iOS에서 가로,세로 모드로 화면을 전환할때 사용자가 직접 줌하지 않는 한 글자크기를 조정하지 않음
*/
html {
font-size: 100%; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* textarea 와 다른 폼요소들 사이의 폰트글꼴이 다른 것을 일치시킴
*/
html, button, input, select, textarea {
font-family: sans-serif;
}
/**
* IE 6/7에 기본적으로 적용되어 있는 body의 margin 속성값을 초기화
*/
body {
margin: 0;
}
/* ==========================================================================
Links
========================================================================== */
/**
* Chrome과 다른 브라우저들 사이의 outline 속성값을 일치시킴
*/
a:focus {
outline: thin dotted;
}
/**
* 모든 브라우저에서 포커스되거나 마우스 오버되었을때 가독성 향상
*/
a:active,
a:hover {
outline: 0;
}
/* ==========================================================================
Typography
========================================================================== */
/**
* IE 6/7에서 폰트 크기와 마진값이 다른 것을 일치시킴
* Firefox 4+, Safari 5, Chrome에서 section 과 article 요소안에 폰트 크기가 다른 것을 일치시킴
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
h2 {
font-size: 1.5em;
margin: 0.83em 0;
}
h3 {
font-size: 1.17em;
margin: 1em 0;
}
h4 {
font-size: 1em;
margin: 1.33em 0;
}
h5 {
font-size: 0.83em;
margin: 1.67em 0;
}
h6 {
font-size: 0.67em;
margin: 2.33em 0;
}
/**
* abbr 요소의 title 속성 디자인 통일
* IE 7/8/9, Safari 5, Chrome 적용
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* 강조를 위한 b와 strong 요소에 폰트굵기 굵게 적용하고 인용을 위한 blockquote 요소의 마진값 설정
* Firefox 3+, Safari 4/5, Chrome 적용
*/
b,
strong {
font-weight: bold;
}
blockquote {
margin: 1em 40px;
}
/**
* dfn 요소의 기본 폰트 스타일을 이탤릭으로 설정
* Safari 5, Chrome 적용
*/
dfn {
font-style: italic;
}
/**
* Firefox와 다른 브라우저들의 차이점 통일
* IE 6/7 적용되지 않음
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* HTML5에 새로 추가된 mark 요소의 속성값 통일
* IE 6/7/8/9 적용
*/
mark {
background: #ff0;
color: #000;
}
/**
* IE 6/7과 다른 브라우저들 사이의 p, pre 요소의 마진값을 통일
*/
p, pre {
margin: 1em 0;
}
/**
* 폰트 글꼴을 통일
* IE 6, Safari 4/5, Chrome 적용
*/
code, kbd, pre, samp {
font-family: monospace, serif;
_font-family: 'courier new', monospace;
font-size: 1em;
}
/**
* 모든 브라우저에서 pre 요소의 가독성을 향상
*/
pre {
white-space: pre;
white-space: pre-wrap;
word-wrap: break-word;
}
/**
* IE 6/7에서 따옴표를 표시하는 q 요소를 지원하지 않기에 이를 노출되지 않게함
*/
q {
quotes: none;
}
/**
* Safari 4에서 q 요소의 :before와 :after가 지원되지 않으므로 노출되지 않게함
*/
q:before, q:after {
content: '';
content: none;
}
/**
* 모든 브라우저에서 small 요소의 폰트크기 통일
*/
small {
font-size: 80%;
}
/**
* 모든 브라우저에서 sub 와 sup 요소에 영향을 미치는 line-height 를 초기화
*/
sub, sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* ==========================================================================
Lists
========================================================================== */
/**
* IE 6/7에서 마진 값이 다른 것을 통일
*/
dl, menu, ol, ul {
margin: 1em 0;
}
dd {
margin: 0 0 0 40px;
}
/**
* IE 6/7에서 패딩 값이 다른 것을 통일
*/
menu, ol, ul {
padding: 0 0 0 40px;
}
/**
* IE 7에서 블릿에 이미지를 사용할 경우 다른 브라우저들과 위치가 다르기에 사용자가 직접 설정하게 도와줌
* 크로스 브라우징엔 background-image 속성을 이용하는 것이 좋음
*/
nav ul, nav ol {
list-style: none;
list-style-image: none;
}
/* ==========================================================================
Embedded content
========================================================================== */
/**
* 1. a 요소안에 이미지가 위치할 경우 생기는 테두리 값 제거
* IE 6/7/8/9 , Firefox 3 적용
* 2. IE 7에서 이미지를 축소/확대시 계단현상이 생기는 것을 방지
*/
img {
border: 0; /* 1 */
-ms-interpolation-mode: bicubic; /* 2 */
}
/**
* IE 9에서 svg 요소가 영역의 크기를 벗어나지 않도록 설정
*/
svg:not(:root) {
overflow: hidden;
}
/* ==========================================================================
Figures
========================================================================== */
/**
* figure 요소의 마진 값 설정
* IE 6/7/8/9, Safari 5, Opera 11.
*/
figure {
margin: 0;
}
/* ==========================================================================
Forms
========================================================================== */
/**
* IE 6/7에 설정되어 있는 마진 값을 초기화
*/
form {
margin: 0;
}
/**
* fieldset 요소의 보더, 마진, 패딩값 통일
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. IE 6/7/8/9에서 상속된 컬러가 정확하지 않는 것을 방지
* 2. Firefox 3에서 캡션 내용의 공백 문자가 다르게 처리되는 현상 방지
* 3. IE 6/7의 정확한 정렬을 위해 핵사용
*/
legend {
border: 0; /* 1 */
padding: 0;
white-space: normal; /* 2 */
*margin-left: -7px; /* 3 */
}
/**
* 1. 모든 브라우저에서 정확한 폰트 크기를 상속받게 함
* 2. 마진값 재 설정, IE 6/7, Firefox 3+, Safari 5, Chrome 적용
* 3. 모든 브라우저에서 세로 정렬 위치가 동일하게 보이도록 함
*/
button, input, select, textarea {
font-size: 100%; /* 1 */
margin: 0; /* 2 */
vertical-align: baseline; /* 3 */
*vertical-align: middle; /* 3 */
}
/**
* Firefox 3+ 에서 button 과 input 요소의 기본 line-height 값이 달라 통일시킴
*/
button, input {
line-height: normal;
}
/**
* button과 select 요소의 value 값을 브라우저마다 대소문자를 표시를 다르게 하는 경우를 방지하기 위해 초기화
* button 요소의 스타일은 Chrome, Safari 5+, IE 6+ 적용
* select 요소의 스타일은 Firefox 4+ 와 Opera 적용
*/
button, select {
text-transform: none;
}
/**
* 1. 안드로이드 4.0 이상의 웹킷 브라우저에서 audio와 video 요소에 발생하는 버그 방지
* 2. iOS에서 input 요소의 type 속성값을 인식하지 못하는 버그 방지
* 3. input 요소의 type 속성값에 적용될 마우스 커서의 스타일을 포인터로 설정
* 4. IE 7에서 텍스트 입력에 영향을 주지 않고 내부 간격을 제거하는 핵
* IE 6에서는 내부 간격이 남아있음
*/
button, html input[type="button"], /* 1 */
input[type="reset"], input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
*overflow: visible; /* 4 */
}
/**
* disabled 된 button과 input 요소들의 마우스 커서모양을 기본값으로 설정
*/
button[disabled], html input[disabled] {
cursor: default;
}
/**
* 1. IE 8/9에서 box sizing 속성값을 content-box에서 border-box로 변경
* 2. IE 8/9에서 패딩 제거
* 3. IE 7에서 핵을 이용해 패딩 제거
* IE 6에서는 패딩이 남아있음
*/
input[type="checkbox"], input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
*height: 13px; /* 3 */
*width: 13px; /* 3 */
}
/**
* 1. Safari 5와 Chrome에서 텍스트 입력이 가능하게 설정
* 2. 해당 영역의 크기를 지정하는데 콘텐츠 영역만큼의 크기만 설정하도록 content-box 설정
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* 맥의 OS X기반의 Safari 5와 Chrome의 내부 패딩과 검색 취소 버튼을 제거
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Firefox 3+ 에서 button과 input에 지정되어 있는 패딩과 보더값을 0으로 설정
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* 1. IE 6/7/8/9의 textarea 요소에 기본 지정된 세로 스크롤 제거
* 2. 모든 브라우저에서 가독성 향상과 정렬을 위함
*/
textarea {
overflow: auto; /* 1 */
vertical-align: top; /* 2 */
}
/* ==========================================================================
Tables
========================================================================== */
/**
* 테이블 요소 사이의 간격을 제거
*/
table {
border-collapse: collapse;
border-spacing: 0;
}