CSS에서 이루어지는 상속에 대해 알아보자.
CSS 상속은 부모 요소에 적용된 스타일 속성이 자식 요소에게 전달 되는 것을 말한다.
부모의 속성을 자식이 상속받고, 자식은 해당 속성을 또 그 자식에게 상속한다.
스타일이 HTML 문서의 구조에 따라 흘러내리는 방식으로 적용된다.
이러한 상속을 통해서 전체적인 디자인의 일관성을 유지하면서도 코드의 중복을 줄일 수 있다.
CSS의 모든 속성이 상속이 가능한 것은 아니다.
일반적으로 텍스트와 관련된 속성들(color, font-family, font-size 등)은 상속이 되지만
레이아웃과 관련된 속성들(width, height, margin, padding 등)은 상속되지 않는다.
p 태그 안에 들어있는 span 태그는 p 태그의 색상에 영향을 받는다.
<p style="color:red">p 태그 안에 들어있는 <span>span 태그</span>는 p 태그의 색상에 영향을 받는다.</p>
p 태그 안에 들어있는 span 태그는 p 태그의 폰트에 영향을 받는다.
<p style="color:serif">p 태그 안에 들어있는 <span>span 태그</span>는 p 태그의 폰트에 영향을 받는다.</p>
p 태그 안에 들어있는 span 태그는 p 태그의 스타일에 영향을 받는다.
<p style="font-size: 10px">p 태그 안에 들어있는 <span>span 태그</span>는 p 태그의 스타일에 영향을 받는다.</p>
p 태그 안에 들어있는 span 태그는 p 태그의 스타일에 영향을 받는다.
<p style="font-weight: 700">p 태그 안에 들어있는 <span>span 태그</span>는 p 태그의 스타일에 영향을 받는다.</p>
p 태그 안에 들어있는 span 태그는 p 태그의 스타일에 영향을 받는다.
<p style="font-weight: 700">p 태그 안에 들어있는 <span>span 태그</span>는 p 태그의 스타일에 영향을 받는다.</p>
font-style, line-height, letter-spacing, word-spacing, text-align, text-indent, text-transform, white-space, direction, unicode-bidi, text-shadow, font-variant
list-style-type, list-style-position, list-style-image
(단, display: list-item은 상속되지 않는다)
border-collapse, border-spacing (단, border 자체는 상속되지 않는다)
cursor
visibility
quotes, orphans, widows, tab-size
상속을 제어하기 위해 사용하는 속성을 알아보자.
상속되는 속성을 받지않고 초기값을 갖도록 하거나, 상속되지 않는 속성을 상속받을 수 있다.
특정한 속성을 상속 제어하기 위해 사용하는 방법이다.
선택한 요소에 적용된 속성값을 부모와 동일하게, 즉 상속받게 할 수 있다.
주로 상속되지 않는 속성을 강제로 상속받게 할 때 사용한다.
p 태그 안에 들어있는 a 태그는 p 태그의 글씨 색을 상속 받지 않는다. 상속 받게 하고싶다면 a 태그의 해당 속성에 inherit 값을 사용한다.
<p style="color: yellowgreen">p 태그 안에 들어있는 <a>a 태그</a>는 p 태그의 글씨 색을 상속 받지 않는다.
상속 받게 하고싶다면 <a style="color:inherit">a 태그</a>의 해당 속성에 inherit 값을 사용한다.</p>
요소의 모든 속성을 각 속성의 초기값으로 변경한다.
이때 초기값은 브라우저에서 제공하는 사용자 에이전트 스타일이 아닌 CSS 명세에서 작성된 속성의 초기값을 말한다.
<ul style="list-style: none">
<li>첫번째</li>
<li>두번째</li>
<li style="list-style: initial">세번째</li>
</ul>
해당 속성이 자연적으로 상속되는 속성이면 inherit처럼, 아니면 initial처럼 동작한다.
이것은 자식 요소입니다. 부모의 스타일을 상속받아 **파란색 글자**로 보입니다.
이것은 자식 요소에 **`unset`**을 적용했습니다.
<style>
.parent-box {
border: 2px solid green; /* 초록색 테두리 */
color: blue; /* 파란색 글자 */
padding: 20px;
}
.child-text {
/* 이 텍스트는 부모의 스타일을 상속받습니다. */
font-size: 1.2em;
}
.child-unset {
/* 여기에 unset 속성을 적용합니다. */
color: unset;
border: unset;
}
</style>
<div class="parent-box">
이것은 **부모 요소**입니다. 글자 색상은 파란색, 테두리는 초록색입니다.
<p class="child-text">이것은 자식 요소입니다. 부모의 스타일을 상속받아 **파란색 글자**로 보입니다.</p>
<p class="child-unset">이것은 자식 요소에 **`unset`**을 적용했습니다.</p>
</div>
스타일 규칙이 없었을 때 적용되었을 상태로 복구한다.
이것은 평범한 링크입니다. 개발자가 지정한 대로 **초록색**으로 보입니다.
이것은 강조된 텍스트입니다. 개발자가 지정한 대로 **굵지 않게** 보입니다.
이것은 revert가 적용된 링크입니다.
개발자가 설정한 초록색 대신, **브라우저의 원래 스타일인 파란색**으로 돌아갑니다.
이것은 revert가 적용된 볼드체입니다.
개발자가 설정한 굵기 대신, **브라우저의 원래 스타일인 굵게**로 돌아갑니다.
<style>
/* 1. 개발자가 링크의 색상을 변경함 */
a {
color: green; /* 링크를 초록색으로 변경 */
}
/* 2. 개발자가 볼드체의 스타일을 변경함 */
b {
font-weight: normal; /* b 태그를 굵지 않게 만듦 */
}
/* 3. revert를 사용하여 원래 브라우저 스타일로 되돌림 */
.revert-a a {
color: revert;
}
.revert-b b {
font-weight: revert;
}
</style>
<p>이것은 <a href="#">평범한 링크</a>입니다. 개발자가 지정한 대로 **초록색**으로 보입니다.</p>
<p>이것은 <b>강조된 텍스트</b>입니다. 개발자가 지정한 대로 **굵지 않게** 보입니다.
</p>
<hr>
<p class="revert-a">이것은 <a href="#">revert가 적용된 링크</a>입니다.<br>
개발자가 설정한 초록색 대신, **브라우저의 원래 스타일인 파란색**으로 돌아갑니다.</p>
<p class="revert-b">이것은 <b>revert가 적용된 볼드체</b>입니다.<br>
개발자가 설정한 굵기 대신, **브라우저의 원래 스타일인 굵게**로 돌아갑니다.
</p>
all 속성에 위 값을 이용하여 전체적인 상속을 제어할 수 있다.
all 속성을 지정한 후에 작성한 스타일은 제어되지 않는다.
<style>
section {
color: royalblue;
border: 2px solid red;
font-size: 18px;
padding: 20px;
}
button {
background-color: red;
border: inherit;
color: initial;
font-size: unset;
/*all: inherit;*/
all: revert;
}
</style>
<section>
<h2>전체 상속 제어</h2>
<button>Click me</button>
</section>