CSS - Cascading Style Sheet
CSS 참조방식에 인라인 방식, 내장 방식, 링크 방식이 있는데 이걸 보니 CSS 우선순위에 대해 한번 정리하고 넘어가야 할 것 같아 이와 관련된 내용을 찾아보게 되었다.
!importantp {
color: red;
}
p {
color: blue;
}
=> 같은 선택자가 또 나오면 이전에 나온 스타일을 덮어쓰니 파란색이다.
p {
color: red !important;
}
p {
color: blue;
}
=> 이 경우 !important 가 붙은게 최우선 순위라 빨간색으로 나타난다.
1) CSS 명시도 계산법
명시도(specificity) : 같은 요소를 가리키지만 선택자가 다르다면 명시도에 따라 우선순위가 결정된다.
인라인 스타일이 가장 우선순위가 높다.
인라인 스타일 : HTML 요소 내부에 style 속성을 사용해서 css 스타일을 적용하는 방법, 해당 요소에만 스타일 적용 가능하다.
가상 엘리먼트 : 선택자로 선택한 요소의 뒤에 붙여 미리 표기하는 약속된 기워드
선택자::가상요소 {
속성: 속성 값;
}
| 가상 요소 | 설명 |
|---|---|
| ::before | 요소 내용 앞쪽에 새 컨텐츠를 추가 |
| ::after | 요소 내용 끝에 새 컨텐츠를 추가 |
| ::selection | 마우스 드래그로 선택한 텍스트 컨텐츠 영역 선택 |
| ::marker | 목록 아이템 앞에 붙는 마커 선택 |
| ::first-letter | 현재 웹 브라우저에 보이는 상태를 기준으로 요소의 텍스트 컨텐츠 첫 글자를 선택 |
| ::first-line | 현재 웹 브라우저에 보이는 상태를 기준으로 요소의 텍스트 컨텐츠 첫 줄 내용을 선택 |
예시

2) 같은 선택자가 나중에 또 나오면 이전에 나온 스타일을 덮어쓴다.
<p class="important">Paragraph 1</p>
<p>Paragraph 2</p>
<p class="important">Paragraph 3</p>
<p class="important">Paragraph 4</p>
<p id="favorite">Paragraph 5</p>
<p>Paragraph 6</p>/* 'important'라는 클래스를 갖고 있는 모든 태그 */
.important {
color: orange;
}
/* 'favorite'라는 아이디를 갖고 있는 태그 */
#favorite {
color: blue;
}
<i>Outside</i>
<div class="div1">
<i>Inside 1</i>
<p>Blah blah <i>Inside 2</i></p>
<i>Inside 3</i>
</div>/* 'div1' 클래스를 갖고 있는 요소의 자식 중 모든 <i> 태그 */
.div1 i {
color: orange;
} 
<i>Outside</i>
<div class="div1">
<i>Inside 1</i>
<p>Blah blah <i>Inside 2</i></p>
<i>Inside 3</i>
</div>/* 'div1' 클래스를 갖고 있는 요소의 직속 자식 중 모든 <i> 태그 */
.div1 > i {
color: orange;
} 
.orange + li {
color: red;
}
/* .orange 다음에 li 가 아니라 span 이 오고 li 가 오면 적용이 안된다. */
orange ~ li {
color: red;
}
<p class="one">Outside 1</p>
<p class="two">Outside 2</p>
<div>
<p class="one">Inside 1</p>
<p class="two">Inside 2</p>
<p class="three">Inside 3</p>
<p class="four">Inside 4</p>
<p class="five">Inside 5</p>
</div>/* 'two' 클래스를 가지고 있는 태그 모두와 'four' 클래스를 가지고 있는 태그 모두 선택 */
.two, .four {
color: orange;
} 
<p class="outside one">Outside 1</p>
<p class="outside two">Outside 2</p>
<div>
<p class="inside one">Inside 1</p>
<p class="inside two">Inside 2</p>
<p class="inside three">Inside 3</p>
<p class="inside four">Inside 4</p>
<p class="inside five">Inside 5</p>
</div>/* 'outside' 클래스를 갖고 있으면서 'one' 클래스도 갖고 있는 태그 */
.outside.one {
color: blue;
}
/* 'inside' 클래스를 갖고 있으면서 'two' 클래스도 갖고 있는 태그 */
.inside.two {
color: orange;
} 
콜론(:)을 사용하면 몇 가지 '가상 클래스'를 선택할 수 있습니다.
n번째 자식
<div class="div1">
<p>Paragraph 1</p>
<p>Paragraph 2</p>
<p>Paragraph 3</p>
<p>Paragraph 4</p>
<p>Paragraph 5</p>
<p>Paragraph 6</p>
</div> /* .div1의 자식인 <p> 태그 중 3번째 */
.div1 p:nth-child(3) {
color: blue;
}
/* .div1의 자식인 <p> 태그 중 첫 번째 */
.div1 p:first-child {
color: red;
}
/* .div1의 자식인 <p> 태그 중 마지막 */
.div1 p:last-child {
color: green;
}
/* .div1의 자식 중 마지막 자식이 아닌 <p> 태그 */
.div1 p:not(:last-child) {
font-size: 150%;
}
/* .div1의 자식 중 첫 번째 자식이 아닌 <p> 태그 */
.div1 p:not(:first-child) {
text-decoration: line-through;
}

마우스 오버 (hover)
HTML
<h1>Hello World!</h1>
CSS
h1 {
color: orange;
}
/* 마우스가 <h1> 태그에 올라갔을 때 */
h1:hover {
color: green;
}

가상 클래스
:가상이벤트 를 붙이면 특정 이벤트마다 적용할 스타일을 설정할 수 있으며 이를 가상 클래스라고 한다.:link - 방문한 적이 없는 링크:visited - 방문한 적이 있는 링크:hover - 마우스를 롤오버 했을 때:active - 마우스를 클릭했을 때:focus - 포커스 되었을 때 (input 태그 등):first - 첫번째 요소:last - 마지막 요소:first-child - 첫번째 자식:last-child - 마지막 자식:nth-child(2n+1) - 홀수 번째 자식.some-box:hover{ background-color: red; }
input.no-border:focus{ border: none }
.container-box:last-child{ margin-right: 0; }
가상 엘리먼트
::after(:after)
<p class="boring-text">적당히 평범하고 심심한 글입니다.</p>
<p>지루하지도 흥미진진하지도 않은 글입니다.</p>
<p class="exciting-text">MDN 기여는 쉽고 재밌습니다.</p>
.exciting-text::after {
content: " <- 흥미진진!";
color: green;
}
.boring-text::after {
content: " <- 먼지풀풀";
color: red;
}

::before
<q>Some quotes,</q> he said, <q>are better than none.</q>
q::before {
content: "«";
color: blue;
}
q::after {
content: "»";
color: red;
}

::placeholder
<input>의 placeholder 속성 값을 선택한다.
공백 없이 클래스끼리 붙어있을 때
.class1.class2 {}
클래스 속성 내에 class1, class2가 모두 설정된 모든 요소를 선택한다. ⇒ 모든 속성을 한번에 적용시키는 요소에만 지정한 설정이 적용된다.
공백으로 연결해서 사용
.a .b .c
하위 개체로 지정한다.
a 클래스 내부의 b 클래스 내부 c 클래스 요소에만 스타일 적용한다.
⇒ css 에서 선택자가 띄어써져 있다면 각 선택자를 모두 갖게 된다.
not 가상 선택자
E: not(s)
:not(p) {color: red;}a 태그에 target 이라는 속성을 가진 요소를 선택한다.
a[target] {color: red}
[attribute] 예시
<a href="/" target="_blank">link</a> <!-- 선택함 -->
<a href="/">link</a> <!-- 선택하지 않음 -->
a 태그에 target=”_blank” 라는 속성을 가진 요소를 선택한다.
a[target="_blank"] {color: red}
[attribute=”value”] 예시
<a href="/" target="_blank">link</a> <!-- 선택함 -->
<a href="/" target="_self">link</a> <!-- 선택하지 않음 -->
apple이라는 class를 가진 요소를 선택한다. 여러 개의 class가 함께 지정되어 있어도 apple을 가졌다면 선택한다.
div[class~="apple"] {background-color: red}
[attribute~=”value”] 예시
<div class="apple">layer</div> <!-- 선택함 -->
<div class="pine apple">layer</div> <!-- 선택함-->
<div class="pine-apple">layer</div> <!-- 선택하지 않음 -->
layer라는 class로 시작하는 요소만 선택하되, 하이픈으로 구분해 더 많은, 더 다양한 요소를 선택할 수 있다.
특성값이 정확히 value이거나 value로 시작하면서 - 문자가 곧바로 뒤어 따라 붙으면 이 요소를 선택한다. 보통 언어 서브 코드 en-US , ko-KR 가 일치하는지 확인할 때 사용한다.
div[class|="layer"] { background-color: red }
[attribute|=”value”] 예시
<div class="layer">layer</div> <!-- 선택함 -->
<div class="layer-red">layer</div> <!-- 선택함-->
<div class="layer-blue">layer</div> <!-- 선택함-->
<div class="layer yellow">layer</div> <!-- 선택하지 않음 -->
<div class="green layer">layer</div> <!-- 선택하지 않음 -->
minions라는 class로 시작하는 요소를 전부 선택한다.
div[class^="minions"] { background-color: red; }
[attribute^=”value”] 예시
<div class="minions">layer</div> <!-- 선택함 -->
<div class="minions-yellow">layer</div> <!-- 선택함 -->
<div class="minions_yellow">layer</div> <!-- 선택함 -->
<div class="minions minimini">layer</div> <!-- 선택함 -->
<div class="yellow minions">layer</div> <!-- 선택하지 않음 -->
<div class="yellow_minions">layer</div> <!-- 선택하지 않음 -->
end라는 클래스로 끝나는 요소를 선택한다. .pdf등을 값으로 지정해 특정 파일만 선택하는 것도 가능하다.
div[class$="end"] { background-color: red; }
[attribute$=”value”] 예시
<div class="end">layer</div> <!-- 선택함 -->
<div class="start end">layer</div> <!-- 선택함 -->
<div class="ok_end">layer</div> <!-- 선택함 -->
<div class="end bye">layer</div> <!-- 선택하지 않음 -->
wow라는 class를 가진 모든 요소를 선택한다. class가 어떻게 조합이 되어도 wow만 완성되면 무조건 선택한다.
div[class*="wow"] { background-color: red; }
[attribute*=”value”] 예시
<div class="wow">layer</div> <!-- 선택함 -->
<div class="wow ohoh">layer</div> <!-- 선택함 -->
<div class="wow-haha">layer</div> <!-- 선택함 -->
<div class="wwwwwow">layer</div> <!-- 선택함 -->
추가
- 뒤에 i를 붙이면 대소문자 구분하지 않고 s를 붙이면 대소문자를 구분한다.
a {
color: blue;
}
/* Internal links, beginning with "#" */
a[href^="#"] {
background-color: gold;
}
/* Links with "example" anywhere in the URL */
a[href*="example"] {
background-color: silver;
}
/* Links with "insensitive" anywhere in the URL,
regardless of capitalization */
a[href*="insensitive" i] {
color: cyan;
}
/* Links with "cAsE" anywhere in the URL,
with matching capitalization */
a[href*="cAsE" s] {
color: pink;
}
/* Links that end in ".org" */
a[href$=".org"] {
color: red;
}
<ul>
<li><a href="#internal">Internal link</a></li>
<li><a href="http://example.com">Example link</a></li>
<li><a href="#InSensitive">Insensitive internal link</a></li>
<li><a href="http://example.org">Example org link</a></li>
</ul>

visibility
/* 키워드 값 */
visibility: visible;
visibility: hidden;
visibility: collapse;
/* 전역 값 */
visibility: inherit;
visibility: initial;
visibility: unset;
none으로 설정한 것과 동일하게 요소를 숨기고 차지하던 공간도 제거한다 그러나 다른 행(열)의 크기는 collapse를 적용한 행(열)이 보이는 것 처럼 취급해 계산한다. 따라서 표의 너비나 높이의 재계산 없이 빠르게 행이나 열을 제거할 수 있다.hidden과 동일합니다.opacity
opacity: 0.9;
opacity: 90%;
/* Global values */
opacity: inherit;
opacity: initial;
opacity: revert;
opacity: revert-layer;
opacity: unset;
요소의 불투명도를 설정. 불투명도는 요소 뒤의 콘텐츠가 숨겨지는 정도이며 투명도의 반대이다.
<style>
#header {background-color: rgba(0,255,0,0);}
#header_01 {background-color: rgb(0,255,0); opacity:0}
</style>
rgba 알파 특성과 opacity 의 차이점
opacity, alpha 모두 투명도를 조절한다.
opacity 속성은 투명도를 설정했을 때 설정한 요소의 모든 자식 요소까지 전부 같은 투명도로 설정한다.
하지만 알파 채널은 투명도를 설정한 요소에만 투명도를 설정하는 차이점이 존재한다.
font
color
line-height
text-align
white-space
요소가 공백 문자를 처리하는 법을 지정한다.
/* Keyword values */
white-space: normal;
white-space: nowrap;
white-space: pre;
white-space: pre-wrap;
white-space: pre-line;
white-space: break-spaces;
/* Global values */
white-space: inherit;
white-space: initial;
white-space: unset;

normal
연속 공백을 하나로 합침. 개행 문자도 다른 공백 문자와 동일하게 처리합니다. 한 줄이 너무 길어서 넘칠 경우 자동으로 줄을 바꿉니다.
예시

nowrap
연속 공백을 하나로 합침. 줄 바꿈은 br 요소에서만 일어납니다.
예시

pre
연속 공백 유지. 줄 바꿈은 개행 문자와 br 요소에서만 일어납니다.
예시

pre-wrap
연속 공백 유지. 줄 바꿈은 개행 문자와 br 요소에서 일어나며, 한 줄이 너무 길어서 넘칠 경우 자동으로 줄을 바꾼다.
예시

pre-line
연속 공백을 하나로 합침. 줄바꿈은 개행 문자와 br 요소에서 일어나며, 한 줄이 너무 길어서 넘칠 경우 자동으로 줄을 바꿉니다.
예시

break-spaces
다음 차이점을 제외하면 pre-wrap과 동일하다.
• 연속 공백이 줄의 끝에 위치하더라도 공간을 차지한다.
• 연속 공백의 중간과 끝에서도 자동으로 줄을 바꿀 수 있다.
• 유지한 연속 공백은 pre-wrap과 달리 요소 바깥으로 넘치지 않으며, 공간도 차지하므로 박스의 본질 크기(min-content, max-content)에 영향을 준다.
예시

div.x {
background-color: #2196F3;
top: 20px;
left: 200px;
z-index: 1;
}
div.y {
background-color: #1976D2;
top: 50px;
left: 260px;
}
div.z {
background-color: #0D47A1;
top: 80px;
left: 230px;
z-index: -1;
} 
float : 뜨다
웹페이지에서 이미지를 어떻게 띄워서 텍스트와 함께 배치할 것인가에 대한 속성이다.
inherit: 부모 요소에서 상속
left: 왼쪽에 부유하는 블록 박스를 생성. 페이지 내용은 박스 오른쪽에 위치하며 위에서 아래로 흐름.
right: 오른쪽에 부유하는 블록 박스를 생성. 페이지 내용은 박스 왼쪽에 위치하며 위에서 아래로 흐름. 이후 요소에 clear 속성이 있으면 페이지 흐름이 달라짐. none 이 아니라면 display 속성은 무시된다.
none - 요소를 부유시키지 않음
⇒ left 와 right 를 통해 부유속성을 지정시 display는 무시된다. 이후 요소에 clear 속성이 있으면 페이지 흐름이 달라진다.
사용법
.content > img{float: left}

text-align 은 들어봤어도 vertical-align 은 잘 몰라서 찾아봤다.





예를 들어 글자크기가 40px일 때 line-height의 값을 1.5로 하면, 줄 높이는 40의 1.5배인 60px가 된다. 줄 높이는 60px인데 글자 크기는 40px이므로, 글자 위와 아래에 각각 10px의 여백이 생긴다. 줄 높이가 글자 크기보다 작으면 세로 방향으로 글자가 겹치게 된다.
요소의 크기 계산 기준 지정
content-box : width, height 이 content-box 의 크기
border-box : width, height 이 border, padding, margin 모두 포함했을때의 크기
box-sizing 은 border-box 포함
opacity : 투명하게 / 속성 남음 / 자리 차지
실습을 해보니 opacity 가 오른쪽 아래, visibility:hidden 이 왼쪽 파란색 블럭 위인데 hidden 이 되었을때 none 과 달리 보이지 않는 영역으로 이동하지 않는데 뚫고 뒤의 네이버 버튼이 클릭된다.
그와 달리 opacity 는 뒤의 네이버 버튼이 클릭되지 않는다.

내용이 넘쳤을때 보여짐을 제어하는 단축 속성
visible : 넘친 내용을 그대로 보여줌
hidden : 넘친 내용을 잘라냄
scroll : 넘친 내용을 잘라냄, 스크롤바 생성
auto : 넘친 내용이 있는 경우에만 잘라내고 스크롤바 생성
background-position은 배경 이미지의 위치를 정해주는 속성이다.
/* 단어로 지정해주기 (가로: left, center, right, 세로: top, center, bottom) */
/* 아래와 같은 총 9개의 조합이 가능 */
background-position: left top;
background-position: left center;
background-position: left bottom;
background-position: right top;
background-position: right center;
background-position: right bottom;
background-position: center top;
background-position: center center;
background-position: center bottom;
/* 퍼센트로 지정해주기 (가로: 전체 width의 25% 지점, 세로: 전체 height의 75% 지점 ) */
background-position: 25% 75%;
/* 픽셀로 지정하기 (가로: 가장 왼쪽 가장자리에서부터 오른쪽으로 100px 이동한 지점, 세로: 가장 상단 가장자리에서 아래로 200px 이동한 지점) */
background-position: 100px 200px;
`<!DOCTYPE html>
<html>
<head>
<title>background-position</title>
<meta charset="utf-8">
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<div id="div1">
</div>
<div id="div2">
</div>
<div id="div3">
</div>
<div id="div4">
</div>
<div id="div5">
</div>
<div id="div6">
</div>
<div id="div7">
</div>
<div id="div8">
</div>
</body>
</html>`
body {
background-color: gray;
}
div {
width: 300px;
height: 230px;
border: 2px solid white;
background-image: url("https://i.imgur.com/WxH5bez.png");
margin: 30px;
background-repeat: no-repeat;
}
#div1 {
/* 단어로 지정해주기 (가로: 왼쪽, 세로: 상단) */
background-position: left top;
}
#div2 {
/* 단어로 지정해주기 (가로: 왼쪽, 세로: 센터) */
background-position: left center;
}
#div3 {
/* 단어로 지정해주기 (가로: 센터, 세로: 상단) */
background-position: center top;
}
#div4 {
/* 단어로 지정해주기 (가로: 오른쪽, 세로: 하단) */
background-position: right bottom;
}
#div5 {
/* 퍼센트로 지정해주기 (가로: 전체 width의 25% 지점, 세로: 전체 height의 75% 지점 ) */
background-position: 25% 75%;
}
#div6 {
/* 퍼센트로 지정해주기 (가로: 전체 width의 50% 지점, 세로: 전체 height의 100% 지점 ) */
background-position: 50% 100%;
}
#div7 {
/* 픽셀로 지정하기 (가로: 가장 왼쪽 가장자리에서부터 오른쪽으로 10px 이동한 지점, 세로: 가장 상단 가장자리에서 아래로 200px 이동한 지점) */
background-position: 10px 200px;
}
#div8 {
/* 픽셀로 지정하기 (가로: 가장 왼쪽 가장자리에서부터 오른쪽으로 150px 이동한 지점, 세로: 가장 상단 가장자리에서 아래로 20px 이동한 지점) */
background-position: 150px 20px;
}

박스의 크기를 어떤 것을 기준으로계산할지를 정하는 속성이다.
특징
box-sizing:
content-box
border-box
initial
inherit
부모 요소의 속성값을 상속받는다.

실제로 해보니 부모에 border-box 를 넣고 자식에 box-sizing: inherit 을 사용하고 자식에 width: 200px 을 넣었는데 border-box 와 같이 border를 포함한 width 가 200px 로 나타났다.
position 속성은 요소들이 화면에 어떻게 배치될지를 지정한다.
특이사항으로는, 이 속성은 자식 요소에게 대물림되지 않는다 는 점이 있다.
static은 기본값으로, 전적으로 페이지의 흐름을 따르며top, bottom, left, right, z-index 속성의 영향을 받지 않는다.relative 값은 원래 위치를 기준으로 top~right 속성값이 적용되도록 합니다.요소의 위치는 이동하지만 요소가 차지하는 공백의 위치는 유지된다.absolute 값은 static이 아닌 첫 부모 요소를 기준으로top~right을 사용하여 위치를 조정할 수 있습니다.요소는 페이지의 문서 흐름에서 벗어나, 자리를 차지하지 않게 됩니다.(위의 바깥쪽 div는 포지션이 relative로 되어 있다.)fixed는 부모 요소가 아닌 viewport를 기준으로 위치를 지정합니다.스크롤에 영향을 받지 않으므로, 다이얼로그 팝업처럼 움직이지 않는요소들에 유용하게 사용될 수 있다.sticky는 요소가 스크롤로 이동할 수 있는 공간을 top~right 속성으로 제한할 수 있다.z-index 속성은 static 이 아닌 요소들간 위아래 배치 순서를 지정한다. auto 는 0과 같으며, 같은 값의 요소들 중에는 나중에 배치된 것이 위로 올라오게 된다.• ⭐️ 블록 요소도 position이 absolute나 fixed가 되면 가로너비를 가득 채우지 않게 된다.
display를 flex로 지정하면 플렉스 방식으로 자식 요소들을 배치하게 된다.inline-flex는 해당 컨테니어 요소를 인라인으로 만든다는 차이가 있다.flex-direction은 내부 요소(아이템)들을 어느 축(가로 또는 세로)을이 값에 따라 justify-content, align-items, align-content 등의속성들이 작용할 방향이 결정된다.flex-wrap은 내부 요소의 갯수 X 길이가 컨테이너를 넘어갈 때 이들을여러 줄에 걸쳐 나열할지 여부를 정한다.justify-content는 메인 축에서 아이템들을 정렬할 방식을 정합니다.flex-start(end)는 row(column)-reverse의 영향을 받는다는 점에서start(end)와 다르다. flex-가 붙은 것을 사용align-items는 수직 축(메인 축의 반대)에서 아이템들을 정렬할 방식을 정한다. wrap으로 아이템이 여러 줄이 되면 align-content를사용해서 보다 다양한 방식으로 정렬할 수 있다.gap 속성으로는 아이템간에 간격을 줄 수 있으며 두 개의 값을 넣어서가로 간격과 세로 간격을 다르게 지정하는 것도 가능하다.flex-basis는 메인 축상의 길이로, 컨테이너의 `flex-direction` 값에따라 너비 또는 높이값으로 작용한다. 기본값은 autoflex-grow는 빈 공간을 채울지 여부, 그리고 채울 시 다른 아이템들의동 속성값에 비례해서 공백을 나눠갖는다. 기본값은 0 flex-shrink 속성은 전체 공간이 부족할 때, 해당 아이템의 길이가컨텐츠의 너비 또는 flex-basis로 지정한 값보다 작아질 수 있을지를지정한다. 기본값은 1이며, 증가할수록 길이가 많이 줄어든다.


@keyframes roll-and-round {
/* 시작 */
from {
left: 36px;
border-radius: 0;
transform: scale(1) rotate(0deg);
opacity: 1;
}
/* 끝 */
to {
left: 600px;
border-radius: 100%;
transform: scale(0.25) rotate(1080deg) ;
opacity: 0;
}
/* 중간과정 추가 */
/* 67% {
transform: scale(2) rotate(540deg);
border-radius: 10%;
opacity: 1;
} */
}
/* 요소에 애니메이션을 적용 */
#square {
/* 사용할 애니메이션의 이름 */
/* animation-name: roll-and-round; */
/* 지속시간 */
/* animation-duration: 2s; */
/* 시간함수 */
/* animation-timing-function: linear; */
/* 지연시간 */
/* animation-delay: 1s; */
/* 반복 횟수 */
/* animation-iteration-count: 3; */
/* animation-iteration-count: infinite; */
/* 진행방향 */
/* animation-direction: reverse; */
/* animation-direction: alternate; */
}
CSS 에 대해 알아야 할게 어마어마한데 실제로 사이트를 만들다 보면 처음 보는 속성들이 무더기로 나온다. 우선 이번 수업때 알게 되었던 사항들 부터 체화후 하나씩 지식을 추가해나가자.
추가로 얄코와 1분코딩 설명을 진짜 잘해주시는 것 같다. 이해하는데 큰 도움이 되었다. 😀