
내가 몰랐던 CSS, HTML
강의나 서적을 통해 오랜만에 CSS, HTML를 빠르게 훑고 있다. 블로그에 자주 쓰지않아서 잊기 쉬운 것들이나 내가 몰랐던 CSS, HTML 특징? 에 대해 정리해놓으면 나중에 까먹었을 때 보기 편할 것 같아서 정리한다.
강조하기 위한 태그들
#b 태그 vs. strong 태그
#b 태그는 글자를 굵게만 만들지만, strong 태그는 그 내용이 중요하다는 의미 또한 담고 있다.
i 태그 vs. em 태그
#둘 다 글자를 기울이지만, i 태그와 달리 em 태그는 강조하는 역할을 한다.
첨자 태그
#<sup> 위 첨자
<sub> 아래 첨자
1<sup>st</sup>, 2<sup>nd</sup>
H<sub>2</sub>O, x<sub>n</sub>밑줄, 취소선 태그
#<u> : 철자 오류 표시
<s> : 더 이상 유효하지 않은 정보 표시
인용 태그
#<blockquote> : 비교적 긴 인용문에 사용
<cite> : 저작물의 출처 표기
<q> : 비교적 짧은 인용문에 사용
<mark> : 인용문 중 하이라이트 또는 사용자 행동과 연관된 곳 표시
<abbr> : 준말/머릿글자 표시 ex) <abbr title="HyperText Markup Language">HTML</abbr>
목록 표현 태그
#<ol> : 순서가 있는 목록, type, start 속성 사용 가능
테이블 태그
#<caption> : 표 설명 또는 제목
<table>
<caption>1에서 9까지의 숫자들</caption>
...
</table>다른 곳으로의 링크
#tel: 전화번호 연결, 스마트폰에서 누르면 전화창으로 감
전화 <a href="tel:010-1234-5678">010-1234-5678</a>입력 받기
#<input> 태그에 maxlength, minlength 속성이 있다.
<accept> : 받아들일 수 있는 파일 형식
multiple : 여러 파일 업로드 가능 여부
<input
id="fileIp"
type="file"
accept="image/png, image/jpeg"
multiple
><select> 태그 안에 <optgroup> 태그 활용 가능
<select id="shopping">
<optgroup label="과일">
<option value="f_apl">사과</option>
<option value="f_grp">포도</option>
<option value="f_org">오렌지</option>
</optgroup>
<optgroup label="채소">
<option value="v_crt">당근</option>
<option value="v_tmt">토마토</option>
<option value="v_ept">가지</option>
</optgroup>
<optgroup label="육류">
<option value="m_bef">소고기</option>
<option value="m_prk">돼지고기</option>
<option value="m_ckn">닭고기</option>
</optgroup>
</select>결합자와 가상 클래스
#/* 자식(1촌 자손) 결합자 */
.outer > li {
color: dodgerblue;
}
/* 뒤따르는 모든 동생들 결합자 */
.starter ~ li {
font-style: italic;
}
/* 뒤따르는 바로 다음 동생 결합자 */
.starter + li {
font-weight: bold;
}
/* 첫 번째, 마지막 요소 가상 클래스 */
ol li:first-child,
ol li:last-child {
color: yellowgreen;
}
/* ~가 아닌 요소 가상 클래스 */
.outer > li:not(:last-child) {
text-decoration: line-through;
}
ul:not(.outer) li {
font-weight: bold;
}
/* ~번째 요소 가상 클래스 */
/* #, #n, #n+#, odd, even 등 시도해보기 */
ol li:nth-child(3) {
font-weight: bold;
color: deeppink;
}텍스트 스타일
#text-transform 속성은 알파벳의 대소문자 표시에 사용된다.
p {
/* capitalize, uppercase, lowercase */
text-transform: none;
}문단, 목록 스타일
#letter-spacing으로는 자간 조절 word-spacing으로는 단어 간격 조절 text-indent 속성으로는 들여쓰기를 조절
list-style
ul {
list-style: circle; // "👉" custom 가능
}
/* li별로 지정하는 것도 가능 */
ul > li:first-child {
list-style: "🚩 "
}
ol {
list-style: lower-alpha;
}인라인 요소와 블록 요소
#| inline | block | inline-block | |
| 기본 너비 | 컨텐츠만큼 | 부모의 너비만큼 | 컨텐츠만큼 |
| width, height 속성 | 무시 | 적용 | 적용 |
| 가로공간 차지 | 공유 | 독점 | 공유 |
| margin 속성 ( 바깥쪽 여백 ) | 가로만 적용 | 모두 적용 ( 상하 상쇄 ) | 모두 적용 |
| padding 속성 ( 안쪽 여백 ) | 가로만 적용, 세로는 배경색만 | 모두 적용 | 모두 적용 |
박스 모델
#뷰포트(viewport) 너비와 높이의 1/100 단위인 vw와 vh, 이들 중 큰 것과 작은 것의 1/100 단위인 vmax와 vmin도 유용하게 사용
텍스트가 한 줄일 경우 height과 line-height을 똑같이 맞춰주면 세로 방향에서 가운데로 정렬한 것과 같은 모습이 됨
블록 요소의 위, 아래 margin은 전후 블록 요소의 것과 상쇄됨
margin에서 auto 값은 너비가 지정된 블록 요소의 가로 방향에서 남은 공간을 채움
포지셔닝
#position 속성은 자식 요소에게 대물림되지 않는다는 점이 있다.
static은 기본값으로, 전적으로 페이지의 흐름을 따르며, top, bottom, left, right, z-index 속성의 영향을 받지 않음
relative 값은 원래 위치를 기준으로 top~right 속성값이 적용, 요소의 위치는 이동하지만 요소가 차지하는 공백의 위치는 유지
absolute 값은 static이 아닌 첫 부모 요소를 기준으로 top~right을 사용하여 위치를 조정
블록 요소도 position이 absolute나 fixed가 되면 가로너비를 가득 채우지 않게 됨
요소 감추기
#opacity 속성을 0으로 하면 모습만 감춤
visibility 속성을 hidden으로 하면 위 효과에 더해 마우스 오버 효과나 포커스, 클릭 등도 무효하게 됨
display 속성을 none으로 하면 위 효과들에 더해 자리도 차지하지 않게 됨
Flex
#flex-wrap은 내부 요소의 갯수 X 길이가 컨테이너를 넘어갈 때 이들을 여러 줄에 걸쳐 나열할지 여부를 정한다.
flex 컨테이너 안 아이템의 속성들
#flex-basis 는 메인 축상의 길이로, 컨테이너의 flex-direction 값에 따라 너비 또는 높이값으로 작용한다. 기본값은 auto
flex-grow는 빈 공간을 채울지 여부, 그리고 채울 시 다른 아이템들의 동 속성값에 비례해서 공백을 나눠갖음. 기본값은 0
flex-shrink 속성은 전체 공간이 부족할 때, 해당 아이템의 길이가 컨텐츠의 너비 또는 flex-basis 로 지정한 값보다 작아질 수 있을지를 지정한다. 기본값은 1이며, 증가할수록 길이가 많이 줄어든다.
flex: (flex-grow 값) (flex-shrink 값) (flex-basis 값);
플렉스 컨테이너의 아이템들은 order 속성을 사용해서 순서를 임의 변경할 수 있다.
<div style="order: 2;">1</div>meta 태그
#IE 관련 호환정보
#<meta name="viewport" content="width=device-width, initial-scale=1.0">
모바일 등 특수 상황
- 시각적 뷰포트: 사람에게 보여지는 영역
- 레이아웃 뷰포트: 브라우저가 웹페이지를 그리는 영역

| width | 뷰포트의 너비 | device-width : 기기의 화면 너비. 정수를 넣으면 픽셀 단위로 |
| initial-scale | 페이지가 처음 로드될 때의 줌 레벨 | 기본 1.0 |
접근성
#이모지나 SVG 요소 등을 스크린 리더에게만 감추고 싶다면 aria-hidden 속성을 true로 만든다.
특정 정보를 나타내는 이모지나 SVG 요소 등을 스크린 리더가 특정 텍스트로 읽도록 하려면 role 속성에 이미지임을 명시하고 aria-label 속성에 값을 넣는다.
선택자 심화
#/* 속성 값을 기준으로 선택 */
a[href="https://binary01.me"] {
color: #ff4e00;
font-weight: bold;
}
/* 특정 속성이 있는 요소 선택 */
input[disabled]+label {
color: lightgray;
text-decoration: line-through;
}
/* 속성값이 특정 텍스트를 포함하는 요소 */
span[class*="item"] {
text-decoration: underline;
}
/* 속성값이 특정 텍스트로 시작하는 요소 */
span[class^="fruit"] {
color: tomato;
}
span[class^="vege"] {
color: olivedrab;
}
/* 속성값이 특정 텍스트로 끝나는 요소 */
span[class$="-1"] {
font-weight: bold;
}
/* 체크된 것 */
input[type=radio]:checked+label {
color: tomato;
font-weight: bold;
}
/* 활성화된 것 */
input[type=radio]:enabled+label {
text-decoration: underline;
}
/* 비활성화된 것 */
input[type=radio]:disabled+label {
color: lightgray;
text-decoration: line-through;
}
/* 인풋 등이 클릭되어 포커스된(입력을 받는) 상태 */
input[type="text"]:focus {
/* border 밖의 선 (박스 요소가 아님) */
outline: 2px solid dodgerblue;
}
/* 필수 입력요소 */
input:required {
border-color: orangered;
}
/* 값이 유효한 입력요소 */
input[type="email"]:valid {
border-color: green;
}
/* 값이 무효한 입력요소 */
input[type="email"]:not(:valid) {
border-color: purple;
}
[class*="focus"]:focus {
outline: 2px solid deeppink;
}
.tab-focus:focus,
.no-focus:focus {
outline: none;
}
/* 탭으로 포커스된 요소에 적용 */
/* 브라우저 지원 확인 */
[class*="tab-focus"]:focus-visible {
outline: 2px solid dodgerblue;
}
/* 부모 요소 내 첫 번째 ~요소 */
b:first-of-type {
text-decoration: overline;
}
/* 부모 요소 내 마지막 ~요소 */
i:last-of-type {
text-decoration: line-through;
}
/* 부모 요소 내 N번째 ~요소 */
b:nth-of-type(2) {
text-decoration: underline;
}
/* 부모 요소 내 유일한 ~요소 */
div :only-of-type {
text-decoration: overline line-through underline;
}
/* 부모 요소 내 종류 무관 유일한 요소 (독자) */
div :only-child {
text-decoration: wavy underline tomato;
}inherit : 스스로의 값을 포기하고 부모로부터 받은 상속값을 적용
initial : 브라우저가 부여한 값을 포기하고 각 속성의 초기값을 적용합니다. 브라우저가 기본적으로 제공하는 p의 display 속성은 block인데, 속성값을 initial로 주게 되면 display 속성의 초기값인 inline으로 바뀌게 된다.
unset : 상속되는 값이 있다면 inherit, 없다면 initial처럼 작동합니다.
벤더 프리픽스
#| 접두사 | 브라우저 |
| -webkit- | 사파리, 크롬, 오페라 |
| -moz- | 파이어폭스 |
| -ms- | 엣지, 익스플로러 |
| -o- | 구버전 오페라 |
텍스트 심화
#vertical-align 속성
#1. inline 요소 안에서의 사용 2. table-cell 요소 안에서의 사용
Grid
#gird로 layout 만들기
<main>
<nav>nav</nav>
<aside>aside</aside>
<section class="sec-1">.sec-1</section>
<section class="sec-2">
.sec-2
<div>
살어리 살어리랏다<br>쳥산애 살어리랏다<br>멀위랑 다래랑 먹고<br> 쳥산애 살어리랏다<br>얄리얄리 얄랑셩<br>얄라리 얄라<br>
우러라 우러라 새여<br>자고 니러 우러라 새여<br>널라와 시름 한 나도<br>자고 니러 우니로라<br>얄리얄리 얄라셩<br>얄라리 얄라<br>
가던 새 가던 새 본다<br>믈 아래 가던 새 본다<br>잉무든 장글란 가지고<br>믈 아래 가던 새 본다<br>얄리얄리 얄라셩<br>얄라리 얄라
</div>
</section>
<section class="sec-3">.sec-3</section>
<footer>footer</footer>
</main>body { margin: 0; }
main { width: 100vw; }
main > * {
padding: 0.8em;
color: slateblue;
background-color: lavender;
}
.sec-2 div {
margin: 2em;
padding: 1.6em;
line-height: 2.8em;
font-family: serif;
color: #555;
background-color: white;
}
main {
display: grid;
grid-template-columns: 200px 1fr 300px;
grid-template-rows: 80px 200px auto 200px;
gap: 12px;
}
nav {
grid-column: 1 / -1;
}
aside {
grid-column: 1;
grid-row: 2 / span 2;
}
.sec-1 {
grid-column: 2 / -1;
}
footer {
grid-column: 1 / -1;
}변형
#transform 속성은 주위 요소들에 영향을 끼치지 않으면서 요소의 모습을 바꾼다.
scroll-snap 관련 속성
#scroll-snap-type
#부모 요소에 스크롤 스냅할 방향( x | y | both )과 방식( proximity | mandatory )을 설정
- proximity: 스냅할 위치에 가까울 때 스냅
- mandatory: 항상 가까운 방향으로 스냅
scroll-snap-align
#자식 요소에 스크롤 스냅될 기준선을 지정
<section class="result">
<section style="scroll-snap-type: y;">
<div class="_1" style="scroll-snap-align: start;"></div>
<div class="_2"></div>
<div class="_3"></div>
<div class="_4"></div>
<div class="_5"></div>
<div class="_6"></div>
<div class="_7"></div>
<div class="_8"></div>
<div class="_9"></div>
<div class="_10"></div>
</section>
</section>aspect-ratio 속성
#박스 요소의 가로 세로 비율을 지정한다.
Reference
#제대로 파는 HTML CSS - by 얄코(Yalco)| 얄팍한 코딩사전 - 인프런 강의
현재 평점 4.9점 수강생 3,068명인 강의를 만나보세요. 코알못도 따라올 수 있는 친절하고 쉬운 강좌! 현업 개발자는 HTML & CSS 박사로 들어주는 끝판왕 강좌! HTML과 CSS의 기초부터 고급까지, Emmet으로 HTML 간편하게 코딩하기, 웹 표준을 준수하는