Web 표준은 html로 웹사이트 틀을 만들고, Css로 꾸며주고, Javascript로 동작시키는데..
이것들은 각각 분리하여 작성되어야 나중에라도, 누구라도,, 알아보기 쉽고 유지 관리에도 도움이 된다!
░
우선.. 이 Web 코딩 강좌는 html 5와 Css 3,
Bootstrap 5에 의거하여(추가적으로, 약간의 자바스크립트 코드도 가미하고, 외부 플러그인 라이브러리들도 좀 써서)
작성되었음을 알리며 문을 엽니다
- 곧, 이 웹사이트의 모든 모양과 움직임, 다양한 효과 등은 다 그 자체로 이 강좌에 나오는 내용들을 바탕으로 해서 작성된 것입니다!
░Css 선택자는 Css 정의 블록 내부({ .. })의 Css 속성을 적용하기 위해
어떤 부분(= 선택 대상)를 선택해야 하는지 브라우저에 알려주는 선택 패턴이다
요소 선택자
Css 선택자는 스타일 속성을 적용하기 위한 선택 대상 을 지정하는데,
가장 기본적인 요소 선택자는 특정 요소 (tag)를 대상으로 스타일을 적용한다:
[ 요소 선택자 ]
/* p 요소를 대상으로 하는 [선택자 p] */
p { /* 모든 p 요소에 Css 속성([속성명: 속성값;])을 설정한다 */
color: red;
background: gray; /* 속성 정의 뒤에는 ;를 붙여야 한다! */
}
p { /* 다시, p 요소를 대상으로 위와 동일한 스타일인 color를 정의한다 */
color: blue; /* 이제, 나중에 정의된 이 p 스타일이 위에서 먼저 정의된 p 스타일을 덮는다! */
}
/* h1, h2(태그), #title(아이디), .para(클래스), [lang](속성) 모두에 적용할 공용 스타일 */
h1, h2, #title, .para, [lang] {
color: red;
}
☞
콤마(,)로 구분하여 서로 다른 태그들(및 Class명, ID명, 속성명, .. 등)을 함께 지정해줄 수도 있다
- 이하 同
아이디, 클래스 선택자
ID 선택자, Class 선택자는 특정 id, class 를 대상으로 스타일을 적용하는데,
#id 스타일은 원칙적으로 문서 내의 단 한 곳에서만 쓸 수 있는 반면(곧, 해당 id 속성을 가진 단 하나의 대상),
.class 스타일은 하나의 태그에 여러개 적용하거나 서로 다른 태그들에 걸쳐 사용할 수도 있다:
[ ID, Class 선택자 ]
/* id 스타일 */
#idName { .. } /* idName ID를 가진 요소 */
h1#idName { .. } /* idName ID를 가진 h1 태그 */
/* class 스타일 */
.className { .. } /* className 클래스를 가진 요소(들) */
p.className1 { .. } /* className1 클래스를 가진 p 태그(들) */
p.className1.className2 { .. } /* className1, className2 클래스를 함께 가진 p 태그(들) */
☞
위와 같이 .으로 연결하여 클래스 속성을 복수로 조합할 수 있다!
➥
ID를 사용하는 것 외에 달리 방법이 없는 특별한 경우가 아니라면;
대부분의 경우 요소에 #id 대신 .class를 사용하는 것이
미처 예기치 못한 에러의 가능성을 방지한다는 차원에서 더 유익하다!
요소 속성 선택자
요소 속성 선택자는 요소의 속성 을 대상으로 하는 선택자인데,
좀 혼란스럽지만.. 아래 참조하여 찬찬히 살펴보십시오:
[ 요소 속성 선택자 ]
요소[속성] { .. } /* 특정 [속성]을 지닌 요소 */
요소[속성 = "값"] { .. } /* [속성 = "값"]을 지닌 요소 */
요소[속성 ~= "값"] { .. } /* [속성]에서 "값"이 하나라도(단어 단위) 포함된 요소 */
요소[속성 |= "값"] { .. } /* [속성]에서 "값"이 하나라도(단어 단위) 포함된(뒤에 -가 붙은 경우도 포함하는) 요소 */
요소[속성 *= "값"] { .. } /* [속성]에서 "값"이 일부라도 포함된 요소 */
요소[속성 ^= "http"] { .. } /* [속성]에서 "값"이 "http"로 시작하는 요소 */
요소[속성 $= ".com"] { .. } /* [속성]에서 "값"이 ".com"으로 끝나는 요소 */
☞
뒤에 i 플래그를 붙이면; 대/소문자 를 구분하지 않는다: 요소[속성 *= "iFlag" i]←
html과는 달리, Css는 기본적으로 영문 대/소문자 를 구분한다!
요소 관계(위치) 선택자
요소 관계 선택자는 요소의 (모든)후손, (직계)자식,
(모든)형제, (바로 아래)형제 등을 구분하는데,
이 선택자를 이해하기 위해서는; 먼저, 상위요소(= 부모)와 하위요소(= 자식 및 후손)를 구분할 필요가 있다:
이 문단에는 굵은 텍스트가 포함되어 있습니다
이 문단에는 이탤릭체 텍스트가 포함되어 있습니다
☞
여기서 <div>는 내부 모든 요소들을 포함하는 최상위 조상 이 되고,
아래 <p> 요소들은 그 자식들 이 된다(서로는 형제간 이다).
각 <p> 요소들은 또 그 밑에 <b> 및 <i>라는 자식
을 거느리고 있다(<p>와 <b> 및 <i> 모두 <div>의 후손들 이다).
각 <p> 요소들은 그 부모 <div>와 관련하여 자식 이 되며,
그 자식 <b> 및 <i>와 관련해서는 부모 가 된다
← 이러한 관계는 각각에 대해 서로 상대적이다!
[ 요소 관계(위치) 선택자 ]
div p { .. } /* div에 속한 모든 p 요소들(후손들: 자식, 손자, ..) */
div > p { .. } /* div 내부 바로 밑 단계에 위치한 p 요소들(자식들) */
h1 ~ p { .. } /* h1과 같은 단계에서 뒤에 나오는 모든 p 요소들(모든 형제들) */
h1 + p { .. } /* h1과 같은 단계에서 바로 뒤에 나오는 p 요소 하나(바로 아래 형제) */
☞
<table> 태그에서는 계층구조상 브라우저 차원에서 <thead>, <tbody>, <tfoot>가 자동으로 추가되므로,
사용시 주의할 필요가 있다!
➥
Css 선택자는 위쪽을 대상으로 선택할 수는 없고,
오직 하위 요소를 대상으로 하여 아래쪽으로만 선택할 수 있다 는 점은 기억해둘만한 가치가 있다!
범용 전체 선택자
범용 전체 선택자 *는 모든 하위 요소를 대상으로 한 스타일 적용에 사용되는데,
보통 문서의 기본 스타일 초기화에 사용된다:
[ 범용 전체 선택자 ]
* { margin: 0; padding: 0; } /* html 문서 전체 스타일 정의 */
html, body { /* html과 body 전체 스타일 정의 */
margin: 0 auto; padding: 0;
}
에밋코딩 가이드
░Emmet 코딩은 Css 선택자에 착안하여 만들어진 코딩 도우미로서 많은 복잡한 표기법들이 있지만,
여기서는 꼭 알아둘만한 몇 가지만 추려서 간략히 살펴봅니다..
이하, 길게 설명하지 않으니 직접 코드를 치면서 스스로 그 사용법을 체득하시길 바랍니다 ㅡㅡ;
ol>li*3>a ⤶
1.
위 코드와 그 결과를 대충 보아하니..
> 기호(= 부모>자식 관계)는 앞의 부모요소 <ol> 내부에 자식요소 <li>를 만들라는 것인데,
li*3이니 3개 만들라는 것 같습니다
← 일단, 위 결과로 보아 *는 >보다 우선순위가 높군요:
ol > (li*3)
2.
거기서, 다시 뒤에 >a가 붙어 있는데,
각 <li> 요소 안에다 <a> 요소를 만들어주어야 할 듯합니다:
ol > ((li*3) > a)
* cf)
참고로, 앞쪽의 > 기호에 뒤쪽에도 > 기호가 있네요.
아마도 같은 기호 사이에서는 뒤에서부터 계산해오는 듯한데..
이런 경우에는; 같은 넘들끼리 우선순위를 따지기보다는 괄호를 사용해주는 것이 좀 더 알기쉽고 깔끔할 듯합니다.
이하, 모두,, 직접 코딩하고 하나 하나 따져보면서 스스로 결과를 확인해보십시오..
dl>(dt+dd)*2 ⤶
1.
() 기호의 의미는 잘 알고 있을 터이고..
부모요소 <dl>을 만들고, 그 안에서 자식요소 <dt>와 <dd>를 만들라는 것이니
+ 기호는 형제 요소를 의미하는 것 같군요.
2.
(dt+dd)에 다시 *2가 붙어 있군요.
*가 >보다 우선순위가 높은건 위에서 이미 보았고,
()는 무엇보다도 우선순위가 높다는거 잘 알지요?
dl > ((dt+dd) * 2)
div+div>p^h5 ⤶
1.
<div> 요소를 하나 만들고, 그 옆에 형제요소 <div>를 붙여주고, 그 안에 자식요소 <p>를 만들라는군요:
div + (div>p)← 여기서는(?), +보다 > 기호가 우선순위가 높군요
2.
그 다음에 ^h5가 붙어 있는데, 이것은 바로 앞의 div>p를 벗어나서 <h5> 요소를 만들라는 얘기입니다.
곧, 앞 블록에서 바깥으로 나가서 (앞 블록과)형제요소가 되라는의미입니다:
div + ((div>p) ^ h5)
div+div>p+h5 ⤶
1.
이곳은 시작은 위쪽과 같은데, 맨 끝에는 그와 다르게 +h5가 붙어 있군요.
이것은 바로 앞 블록 <div> 안에서 p+h5를 만들라는 얘기입니다:
div + (div > (p+h5))← 위에서와는 달리, 여기서는(?) >보다 + 기호가 우선순위가 높군요 ㅎ
2.
다시 부연하자면; 앞 블록과의 관계에서 ^ 기호는 앞 블록에서 바깥으로 빠져 나가라는 의미인 반면,
+ 기호는 앞 블록 내부에서 맨 뒤에 붙이라는(앞 블록 내부의 자식요소가 되라는) 이야기입니다
← 위에서 > 기호가 둘일 때 뒤에서부터 계산해오던 것처럼,
+ 기호 또한 마찬가지입니다!
div>(h5*3>span) ⤶
1.
<div> 요소를 만들고,
그 안에서 h5*3를 만들어 각각의 <h5> 요소 아래(즉, 부모요소 내부에) <span> 요소를 하나씩 (자식요소로)편입시키라는 이야기입니다:
div > ((h5*3) > span)
2.
*가 >보다 우선순위가 높은건 확실한 듯하군요.
직접 타이핑치면서 결과를 확인해보세요..
div>(h5*3>span)+p ⤶
1.
(위쪽 코드에다)뒤에 +p를 붙였는데,
이 <p> 요소가 맨 앞 부모요소인 <div>의 (형제요소가 아니라)자식요소라는 점에서 약간 헷갈립니다만..
혹시 헷갈리시면; 밖에다 괄호 하나 더 쳐서 확실히 해주십시오:
div > ((h5*3 > span) + p)
2.
여기서는 또, +가 >보다 우선순위가 높군요.
이처럼 우선순위만으로 기호간 우열을 따지는 건 좀 애매한 점이 많고..
이런 경우의 + 기호는 앞 블록에 이어 맨 뒤에 배치되는 (앞 블록의)형제요소가 되라는 뜻으로 받아들이면 됩니다:
div > (((h5*3) > span) + p)
div#id명.class명1.class명2 ⤶
1.
#id명은 <div> 요소의 id="값"으로 id명 을 넣어주고,
.class명은 class="값"으로 class명 을 넣어주는데,
클래스 이름은 .class명1.class명2 식으로 복수로 붙여줄 수 있습니다
2.
# 및 .은 우선순위가 가장 높습니다
← ()보다도 우선입니다!
ul>li.class명$*3 ⤶
1.
일단, <ul> 요소 아래에 class명을 붙인 <li> 요소를 3 개 만들라는 의미인 듯하군요:
ul > ((li.class명$) * 3)
2.
그런데, class명 뒤에 $ 기호가 또 붙어있네요?
이것은 class명 뒤에 (순서)번호를 붙여주라는 이야기입니다:
class명1.class명2.class명3← .이 여럿일 때는 앞에서부터 순차적으로 나아갑니다!
(! 밑에도 또 다른 코드가 하나 붙어있군요. 위와 같은데, $이 2개네요?
직접 코딩하여 확인해보시라고 답은 적지 않았습니다 ㅡㅡ;)
ul>li.class$$*3 ⤶
░ 이 외에도 더 많은 복잡한 표기법들이 있지만, 다 살펴볼 필요는 없을 듯합니다.
한 예로, p{텍스트} ⤶ 방식으로 태그와 함께 안에 들어갈 텍스트도 동시에 넣어줄 수 있지만,
p ⤶ 하고나면; 곧바로 커서가 텍스트 입력 위치에 놓여져 바로 내용을 적을 수 있고,
여러 곳에 같은 것을 입력할 경우에도 Alt+드래그 및 Ctrl+클릭이 있으니 굳이 더 어렵게 기억하며 다 배워야할 필요는 없다는 생각입니다
- 솔직히, p{텍스트} ⤶ 하는거보다는 p ⤶ 한 뒤,
커서가 놓여지는 곳에서 바로 텍스트라고 적는게 더 속 편하네요,
에밋코딩 기법들 다 배우자면 두뇌 훈련에는 상당히 유용할 듯하지만..
그런 목적이 아니라면; 코딩 시의 단순 손노동을 줄여주는데 필요한 정도로만 익혀두어도 될 듯합니다 ^^
상속과 우선순위
░
Css 코드에서 충돌 문제가 발생할 때; 이를 해결하기 위해서는
Css의 우선순위와 상속 및 Cascading(나중에 정의된 스타일이 앞서 정의된 스타일을 덮는다)
개념에 대한 깊은 이해가 필요해진다
스타일의 상속
1.
기본적으로, 상위요소에서의 스타일은 하위요소로(아래로만!)
상속되며(주로 텍스트 디자인에 관련된 것들:
color, font-size, font-family, letter-spacing, ..),
모든 html 요소에는 브라우저 기본값으로 정의된 initial 속성값과 함께, 부모요소로부터 내려받는 inherit 속성값이 복합적으로 내포되어 있다:
☞
위와 같이 inherit 키워드를 사용하면; 상위요소의 '계산된 값'을 상속받도록 할 수 있다
←
따라서, 나중에 .my-component 값을 바꾸면; 그 하위 요소에서도 자동적으로 그 바뀐 값이 적용된다!
aside strong {
font-weight: initial; /* 이는 Css 초기값인 font-weight: 700; 값이 된다 */
}
☞initial 키워드는 속성을 Css 초기 기본값으로 되돌린다!
➥
박스모델 속성 등 공간에 관련된 것들(border, margin, padding, ..)은
상속되지 않으며, 부모요소 내부의 <button> 태그에서도 역시 상속되지 않는다!
☞
<button> 태그 내에서 부모요소의 속성을 상속받고자 한다면; 위와 같이 명시적으로 inherit 값을 지정해주어야 한다!
2.
스타일의 상속에서 속성: unset; 설정은 특정 속성 을 자연스럽게 재설정해 준다
- 곧, 해당 속성 이 자연적으로 상속되면; inherit 로 작동되고,
그렇지 않으면; initial 로 작동되는 것이다:
[div_style_set 내부의 p 요소들]
여기는 패딩과 글자색이 스타일링된 기본 p 문단입니다..
여기는 글자색만 unset한(패딩은 상속됨!) p 문단입니다..
/* [상속의 초기화: unset 키워드] */
.div_style_set p { /* .div_style_set 내부의 p 요소들에 대한 공통 스타일 설정 */
padding: 1em; color: goldenrod;
} .div_style_set p.div_unset { /* .div_style_set 내부의 특정 p 요소들에 대한 unset 스타일 설정 */
color: unset;
}
☞
위 코드에서는 색상만 초기화했지만(color: unset;), 대신에 all: unset;으로 주면;
.div_style_set p.div_unset에 기존 설정된 다른 모든 스타일 설정들까지 다 initial 초기값으로 돌아간다!
Style의 우선 순위
1.중요도:
운영체제 사용자 정의 스타일(윈도우의 고대비 설정 등)
> 작성자 중요 스타일(!important) > 작성자 일반 스타일
> 기본적인 브라우저 스타일(링크 텍스트 밑줄 등)
.green { color: green; } /* .green 클래스의 글자색 설정 */
p { color: blue; } /* p의 글자색 설정 */
☞
<p> 요소의 글자색 설정이 .green 클래스의 글자색 설정보다 나중에 정의되었지만,
(구체적 우선순위에 의해)먼저 정의된 .green 클래스의 글자색이 적용되었다!
➥
ID는 Css를 더욱 구체적으로 만들므로 ID에 적용된 스타일은 다른 많은 방법으로 적용된 스타일을 재정의한다
- 이런 이유로 id에 스타일을 추가하는 것은 좋지 않다
←
곧, 해당 스타일을 다른 것으로 덮어쓰기가 어려울 수 있다!
3.Cascading: 중요도와 구체적 우선순위가 같은 경우; 나중에 정의된 스타일이 앞서 정의된 스타일을 덮는다:
나는 무슨 색입니까?
p { color: blue; font-style: italic; }
p { color: green; } /* 위 p 요소 스타일(의 중복된 속성만)을 덮는다 */
☞
위 중복된 <p> 요소 스타일에서 덮어 쓰는 것은 스타일 전체가 아니라 동일한 속성만이다
- 이러한 메카니즘은 스타일 정의의 반복을 피할 수 있도록 해준다
←
곧, font-style: italic;은 그대로 둔 채 중복된 color 속성의 값만 새 값으로 덮는 것이다!
➥
단, 위에서 말한 우선순위들은 그저 대략적인 원칙일 뿐, 실제는 많은 복잡한 규칙들의 조합으로 결정됩니다
- 대개는 그때, 그때,, 코드 확인하면서 해결해나가야만 합니다
←
[브라우저 개발자 화면]의 [요소] 탭에서 문제가 있는(취소선이 그어진) Css 속성들을 확인할 수 있습니다..
➥ !important 선언
!important 선언은 같은, 또는 상위의 속성이나 값에 정의된 것보다 더 우선시해서 적용할 것을 요구하는데,
이는 해당 요소의 특정 속성에 대한 이전의 모든 스타일링을 재정의하여 우선 적용된다
- 이러한 간섭은 Css 코드를 혼란스럽게 하고 디버깅을 어렵게 한다!
그럼에도, 도저히 Css 스타일 충돌 문제를 해결할 수 없는 경우나 기존에 정의된 동일한 속성들에 대해 모두 같은 값을 적용해야만 하는 경우 등에는
!important 사용을 고려해볼 수 있다: .o-hidden { overflow: hidden !important; }
➥
이 !important 선언을 무력화시키는 유일한 방법은
이 코드의 밑에서 다른 !important 선언을 포함시켜 재정의해주는 것뿐이다!
Css 타이포그래피
░
Css는 기본적으로 5가지의 글꼴을 정의해두고 있는데, 그 정확한 모양은 각 브라우저 및 운영체제에 따라 다를 수 있다!
font-face 규칙과 font-family 설정
@font-face { .. } 규칙은
(원격 서버에서 가져와 설치한, 또는 시스템 내장 글꼴모음의)글꼴을 선언하고
이름을 부여하며(다양한 옵션들도 설정해줄 수 있다),
font-family 설정은 Css 규칙 내에서 이 선언된 글꼴을 html 요소에 적용한다:
[ font-face 규칙과 font-family 설정 ]
@font-face { /* 1. 사용자정의 폰트 font-family를 정의한다 */
font-family: "myFont"; /* 폰트 이름 지정 */
/* 가져올 폰트 파일의 경로와 형식 */
src:
local("myFont"),
url("myFont.woff2") format("woff2"),
url("myFont.woff") format("woff");
/* 폰트의 초기값 설정 */
font-weight: normal;
font-style: normal;
}
html { /* 2. Css 규칙 내에서 사용할 글꼴 목록들을 지정한다 */
font-family: myFont, "Bitstream Vera Serif", serif; /* 앞쪽 글꼴이 없으면; 브라우저는 순서대로 대체해서 사용한다 */
}
☞
폰트에는 ttf(PC용 기본 폰트),
woff 및 woff2(최신 브라우저용 폰트),
svg 및 svgz(Svg 폰트) 등이 있는데
(최신 브라우저에서 지원하는, 따라서 모든 최신 기능을 갖춘)woff2 폰트를 먼저 적고
(용량이 큰)ttf는 나중에 적어준다
←
자주 사용하는 폰트는 이미 사용자 시스템에 설치되어 있을 수 있으므로, 가장 먼저 local 폰트도 함께 지정해주는 것이 좋다!
웹문서의 기본 글꼴은 <head> 안에서 font-family:글꼴[, 글꼴2, "글꼴 3"]; 식으로 지정해서 사용할 수 있는데..
(어떤 이유로건)글꼴이 로드되지 못하는 경우에 대비하여 복수의 글꼴 스택을
(원하는 폰트 > 웹안전 대체폰트 > 시스템 기본폰트 순으로)지정해주는 것이 좋다.
Css 기본 글꼴들의 종류에는 다음과 같은 것들이 있다:
serif // 문자의 시작부터 끝까지 같은 굵기에, 글자 끝 장식이 있는 글꼴
sans-serif // Non serif 글꼴
monospace // 모든 문자의 너비가 같은 고정폭 글꼴
← 주로, 프로그래밍 코드를 표시할 때 사용된다!
cursive // 손글씨를 흉내낸 글꼴
fantasy // 장식용 글꼴
글꼴 크기 및 스타일
px 단위는 창 크기 변경에도 항상 body 기본 크기인 16px 로 표시되기에
스마트폰 등을 고려한다면; em 단위도 좋다:
em 단위는 부모요소 글꼴의 대문자 M의 크기를 1em
(= 16px)로 놓고, 지정된 px 크기를 16으로 나누어 em
단위로 변환한다(브라우저에서는 이를 다시 px로 변환하여 표시한다!)
단, em 단위는 부모요소에서 지정된 글꼴 크기들의 중첩에 따라 em 수치가 계속 달라진다는 단점이 있다.
이에 em 단위의 단점을 해결하기 위해서 나온 것이 rem 단위인데,
body에서 font-size: 16px;로 설정해준 다음,
이를 기준으로 하는 글꼴 크기를 rem 단위로 지정하는 것이다:
이하, 길게 설명하지 않으니 한번 읽어보고, 더 상세한 설명이 필요해지면; MDN의 관련 부분을 참조하십시오..
font-size:px / em | small / medium / large | larger / smaller | %; // 글자 크기
←small/medium/large 값은 브라우저에서 설정하는 크기이며,
larger/smaller 및 % 값은 부모요소의 글자 크기에 대비한 크기이다
font-weight:normal / bold | 100 ~ 900; // 글자 굵기
←normal (기본값)은 400, bold 는 700 에 해당한다
font-style:italic; // 이택릭체 기울임꼴
font-variant:small-caps; // 작은 대문자: namsan
font:caption / icon / menu / message-box / small-caption / status-bar;←
각각에 어울리는 모양의 글꼴 형태로 표시한다!
text-decoration-line:underline / overline / line-through; // 텍스트에 그어주는 밑줄/윗줄/취소선
←
보통, 링크 기본값인 underline (밑줄) 대신 none 값을 주어 링크 밑줄을 제거하는데 사용된다!
text-decoration-color/style/thickness:값; // 텍스트에 그어준 선의 색상/스타일/두께
←
보통, text-decoration:색상 스타일 두께; 식으로 일괄 지정하는데, 순서는 상관없다!
text-transform:capitalize / uppercase / lowercase; // (영문에서)첫 대문자로/모두 대문자로/모두 소문자로 변환
←
한글과 같은 형태의 2byte 문자에서는 full-width 값을 주어 고정너비 사각형 형태로 넣어줄 수 있다!
letter/word-spacing:글자/단어 간격;←
보통은, 단어 간격 보다는 (em 단위로)글자 간격 을 이용한다!
* 문의 사항 있으시면; 제 구글 메일로 보내주십시오
word-break:break-all; // 줄바꿈 시 단어분할 처리하기
←break-all 은 필요한 경우; 브라우저가 단어를 분할하여 다음 줄로 내려보낸다
어제 새벽까지 개표방송 본다고 잠 좀 모자랐더니.. 머리가 띵~하군요ㅡㅡ; 그래도,, 선거 개표방송은 언제나 밤새워 지켜볼만한 최고의 드라마입니다 ^^
☞
단어를 분할해서 아래 줄로 내려가는 형태는 찬찬히 화면을 줄이고 늘리면서 끈기있게 확인해봐야 할 듯합니다,
고생 좀 하세요 ㅡㅡ;
링크 및 커서 스타일
링크 텍스트의 기본 색상은 color:색상; 으로 변경해줄 수 있고,
text-decoration:none; 값으로 링크 밑줄을 없애줄 수도 있다.
나아가, 요소 위에 마우스가 올라갔을 때의 커서 모양 또한 변경해줄 수 있다:
cursor:default / none; // 일반 커서의 모양
←auto (기본값)는 현재의 맥락에 맞추어 자동으로 커서 모양이 결정되며,
default 는 각 플랫폼에 따르는 기본 커서를 쓰며, none 은 커서를 숨긴다
cursor:키워드; // 각각의 키워드로 지정한 커서 모양
←
링크 및 마우스 오버 시의 상태, 선택 상태, 드래그&드롭, 크기 조절 및 스크롤, 확대/축소 등에 따르는 각각의 커서 모양
cursor:url('이미지파일') x값 y값, auto; // 이미지로 커서 모양 지정
←
맨 뒤에 일반 커서도 반드시 포함해야 하며,
x, y 값은 박스 좌상단 모서리를 기준으로 하는 좌표 거리인데 32px 미만이어야 한다!
Google WebFonts
░
구글 웹폰트와 같은 온라인 웹폰트를 사용하고자 한다면; 웹문서에 한 두줄의 간단한 코드를 넣는 것만으로 바로 사용할 수 있다!
구글 웹폰트
1.
구글 웹폰트를 사용하려면; 먼저,
사이트에서 원하는 폰트를 찾아 <head>에 링크해주는 것이 우선이고, 이어서 구글 Web 폰트 사용을 위한 Css 스타일을 사용자 정의해준다:
[ Google Web Font 링크 및 설정 ]
2.
다음, 웹폰트를 적용하고자 하는 <body> 내부 특정 요소(들)에서..
위에서 만들어 놓은 사용자정의 클래스 스타일을 입혀준다:
선거결과 촌평
☞
원한다면; body에 위 webfont_lead 사용자정의 클래스를 적용하여 문서 전체에서 사용할 수도 있다!
Css 크기 단위
░
Css에서 크기를 나타내는 방식에는 단위붙은 숫자(단위별 크기: 픽셀 16px, 각도 45deg, 초 1s, 밀리초 1000ms,
비율적 크기: 부모요소 기준 lem, body 기준 1rem, 비율 100% 등),
단순 숫자(예: 불투명도 opacity: 0;, 라인 높이 line-height: 1.5;) 등이 있다
웹문서의 크기 단위: %
% 단위는 원칙적으로 부모요소 크기에 대한 비율인데, 박스에서 마진이나 패딩을 % 단위로 줄 경우는;
마진/패딩의 병합현상, 내부 박스의 고정된 크기, 내부 컨텐츠의 양 등의 문제들과 얽혀 예상과는 많이 다르게 나타난다
- 이것은 기억해둘만하다!
부모박스
부모박스 내부: 10% 마진/패딩
뷰포트 기준 단위: vw, vh
vw, vh 단위는 뷰포트 너비/높이(100 기준)에 대비한 비례적 크기,
vmin, vmax 단위는 뷰포트 너비와 높이 중 짧은 쪽/긴 쪽(100 기준)에 대비한 비례적 크기로 설정된다:
➥
뒷 배경이 그대로 보이는, 즉 완전한 투명을 의미하는 transparent 키워드도 사용할 수 있는데,
이는 rgba(0, 0, 0, 0)와 같다.
한편, currentColor 키워드는 color 속성의 계산된 동적 값이다.
예컨대, currentColor를 정의하는 요소에 정의된 색상값이 없는 경우;
대신 상위 부모요소의 색상을 물려받게 된다.
Background(바탕화면 배경색), Highlight(선택한 항목에 대한 강조 색상)
등은 시스템 운영체제에 의해 정의되는 색상명이다(대소문자를 구분한다!)
2.RGB 색상 모델:red, green, blue 삼원색의 조합으로 특정 색을 표현하는데,
Alpha 채널 옵션을 추가하여 색의 투명도를 표현할 수도 있다:
16진수 표기법:#rrggbb(#000000 =black, #ffffff =white) 및 #rgb(#000 =black, #fff =white)
hsl[a] 표기법:hsl[a]([0~360deg, ]0~360, 0~360, 0~360 [, 1~0]); // [색상환 각도, ]색상환, 채도, 밝기[, alpha]
←alpha 값은 1 및 100%(불투명)에서 0.5 및 50%(중간), 0(투명)까지
➥
최근에는 모든 브라우저에서 rgb()와 hsl()에
alpha, 곧 불투명도를 추가할 수 있게 되었고, 이것이 표준 표기법이다
- 각 값들을 빈칸으로 구분하여 넣어주면 되는데, alpha 값은 /로 구분해서 넣어주는 것이 좋다:
color: rgb(255 255 255 / 50%);← 불투명도에는 % 단위나 소수점 단위(= 0.5) 모두 사용할 수 있다!
➥
강조를 위해 색상에만 의존하는 것은 좋지않다(특히, 적색과 녹색은 색맹인 사용자가 상태 변화를 보는 데 어려움을 겪거나 심지어 완전히 놓칠 수도 있다!).
색상 외에도 텍스트 설명 및 아이콘을 적절하게 활용해주는 것이 접근성 측면에서 유익하다!
요소의 불투명도
1.
Css의 opacity 속성은 요소의 불투명도를 설정하는데,
0 (요소가 완전히 투명해져 안보이고, 뒷 배경만 드러남)
~ 1 (요소가 온전히 표시되어 뒷 배경이 가려짐) 사이의 값을 쓸 수 있다:
opacity: 1; // 요소가 온전히 드러남
opacity: 0.9; // 요소가 거의 드러남
opacity: 0.5; // 요소가 반투명해짐
opacity: 0.1; // 요소가 거의 투명해짐
opacity: 0; // 요소가 완전히 투명해짐
2.
요소의 불투명도 설정 시 자식요소만 불투명하게 유지하고 싶다면;
background-color: rgba(0 0 0 / 0.1); 방식으로 사용하여 배경 요소를 투명하게 해주면 된다:
opacity 속성은 (부모요소 위에 놓인)자식요소(위 코드의 내부 <div>들)의 투명도를 지정하는 것이며,
background-color의 alpha 값은 (자식요소를 품고 있는) 부모요소(아래 코드의 바깥 <div>)의 투명도를 지정하는 것이다!
☞
위 <div> 요소의 배경색은 검정색이지만(background-color: rgb(0 0 0);),
여기에 0.1의 알파값을 주어 배경색을 투명하게 해준 것이다: background-color: rgb(0 0 0 / 0.1);
➥
요소에 마우스가 올라갈 때의 주목도를 높이기 위해, 요소에 불투명도(및 확대 효과)를 주는 경우가 많다:
/* 요소에 마우스를 올리면; 불투명도 값을 0.5(opacity: 0.5)로 설정하고, 요소의 크기는 10% 더 확대하라(zoom: 1.1) */
.img-opacity:hover { opacity: 0.5; zoom: 1.1; }
Css 위치 지정
░
Css 객체모델의 표준 좌표계에서 위치는 특정 기준점으로부터
x, y 방향으로 떨어진 수평, 수직 오프셋 값(px)으로 지정된다
- 곧, 주어진 컨테이너 박스의 좌상단 모서리를 원점(0, 0)으로 하는
(x, y) 좌표(양수는 박스 안쪽 방향, 음수는 박스 바깥쪽 방향)이다
Css 좌표계
Css 객체모델에서 사용되는 표준 좌표계에는 스크린, 문서, 뷰포트, 오프셋이 있다:
1.오프셋 좌표계는 추적 중인 요소 또는 이벤트가 발생한 요소의 좌상단 모서리를 기준으로 하는 상대적 위치값이다.
예컨대, 마우스 이벤트가 발생하면 이벤트의 offsetX와 offsetY에 지정된 마우스 위치는
이벤트가 전달된 요소의 좌상단 모서리를 기준으로 상대적으로 주어진다
←
원점은 padding-left 및 padding-top에 의해 지정된 거리만큼 안쪽으로 들어가게 된다!
2.뷰포트 좌표계는 이벤트가 발생한 뷰포트 또는 탐색 맥락의 좌상단을 기준으로 한다.
이는 문서가 보여지는 전체 보기 영역으로서(메뉴바와 툴바, 탭 등은 제외한 영역),
문서를 스크롤하면 문서 내 특정 위치의 뷰포트 좌표가 변경된다.
예컨대, 아래로 스크롤한 다음, 현재 화면에 보이는 좌상단 모서리가 뷰포트 (0, 0) 좌표가 된다!
✓ 문서 좌표계는 렌더링된 전체 웹문서의 좌상단 모서리를 기준으로 한다.
즉, 문서 내의 요소 안에 있는 점은 레이아웃이 변경되어 요소가 이동하지 않는 한
사용자가 문서에서 수평 또는 수직으로 스크롤한 후에도 동일한 좌표를 가지게 된다
←
하지만, 일반적으로, 웹문서에서 문서 좌표는 별 의미가 없다 - 웹문서는 항상 스크롤된다!
3.스크린 좌표계에서는 스크린 화면의 좌상단 모서리가 원점이 되며,
창의 좌상단 모서리 좌표는 문서의 내용이나 수행된 스크롤에 관계없이 항상 (0, 0)이다.
하지만, 창을 이동하거나 디스플레이 해상도를 변경하거나 하는 경우에는 문서 내 주어진 위치값이 변경될 수 있다!
* 이 그림은, 좌표계에 대한 이해를 돕기 위해
문서에서 잠시 빌려온 것입니다:
박스 스타일
░
아래서는 Css 3)의 박스 관련 속성들을 간략히 정리합니다.
각 속성별로 옆에 링크해둔 자동 생성기를 사용할 수도 있습니다..
박스 테두리 스타일
박스 테두리를 그려주는 border 속성의 각 방면 설정은
하나(4방면 모두),
2개(상하 -> 좌우),
3개(상 -> 좌우 -> 하),
4개(상 -> 우 -> 하 -> 좌 순)으로 줄 수 있다
←
박스 마진(margin)과 패딩(padding)에서도 모두 같은 방식으로 사용된다!
border:색상 두께 스타일; // 4방면 모두의 테두리 색상, 두께, 스타일 일괄 지정
←
순서는 상관없되, 생략된 부분의 기본값은 none 으로 설정된다!
* cf)border-top/right/bottom/left:값; 식으로 각 방향별로, 또
border-top/right/bottom/left-color/width/style:값; 식으로 각 방향(및 스타일)별로 설정해줄 수도 있다!
➥
박스 윤곽선(예컨대, Tab 키 등에 의해 링크 텍스트가 선택된 때 등)을 표시하는
outline 속성도 또한 border 속성과 같은 방식으로 사용해주면 된다
←
다만 이 외곽선은, 테두리와는 달리, 요소 바깥에 그려지며 절대 공간을 차지하지 않는다!
박스 모서리 스타일
border-radius:값; 속성은
박스 모서리를 둥글게 꾸며준다(px 값은 둥글게 할 원의 반지름 크기, % 값은 요소 내에서의 반지름 비율이다).
값은 4개(좌상단 모서리부터 시계방향 순), 2개(좌상단 코너에서 대각선 방향, 우상단 코너에서 대각선 방향 쌍)로 줄 수 있고,
각 방향별 속성을 사용할 수도 있다:
box-shadow:수평거리 수직거리 [흐림 번짐 색상]; 속성은 박스에 그림자를 그려주는데,
거리값에서 양수는 오른쪽 및 아래쪽 방향으로,
음수는 왼쪽 및 위쪽 방향으로 그림자가 드리워진다.
추가 옵션으로 흐림(기본값 0px로 시작하여 값이 커질수록 부드러운 그림자가 된다),
번짐(기본값 0px로 시작하여 양수는 박스보다 크게 퍼져나가고, 음수는 안쪽으로 오무라든다),
색상(공백으로 구분하여 복수로 지정해줄 수 있다) 등을 설정해줄 수 있다:
Box 그림자
☞
여기서는 수평거리 및 수직거리 에다 색상 옵션을 추가하였다
텍스트 그림자 스타일
text-shadow:가로 세로 번짐 색상; 속성은 텍스트에 그림자 효과를 주는데,
,로 구분하여 복수의 그림자를 겹쳐줄 수도 있다:
텍스트 그림자
Css 패러그래프 스타일
░
아래서는 Css 3)의 패러그래프 관련 속성들을 간략히 정리합니다
문단 첫글자 들여쓰기
text-indent:값 | %; 속성은 문단 첫 글자를 들여쓴다
←값 은 음수도 가능하며, %로 주면;
부모요소의 너비를 기준으로 하는 상대적 크기가 되어 브라우저 창의 크기 변화에 연동시킬 수 있다!
Css의 첫 글자 들여쓰기 속성(text-indent)을 이용하면
문단 첫 글자를 들여쓰는 자신만의 사용자정의 클래스를 만들어 쓸 수 있다:
/* 문단 첫 글자 들여쓰기를 위한 사용자정의 Css */
.indent_2per { text-indent: 2%; }
.indent_2rem { text-indent: 2rem; }
☞
자주 쓸 일이 있다면; 이런 식으로 사용자정의 스타일로 작성하여 쓰시면 됩니다..
줄 높이 설정하기
line-height: px / em | 숫자 | %; 속성은 줄 높이를 설정하는데,
font-size 속성값에 따라 line-height 속성값이 달라질 수 있도록
단위 없는 숫자 값(적정 권장값은 1.5 ~ 1.8 정도)을 사용하는 것이 좋다!
➥font:font-size값 / line-height값; 속성으로 font-size 값과 line-height 값을 함께 지정해줄 수도 있다:
값을 %로 줄 경우; font-size 값은 부모요소를, line-height 값은 현재 요소를 기준으로 하는데,
부모요소의 높이(= height)와 같은 line-height 값을 주면;
(한 줄)텍스트를 세로 방향 가운데로 배치할 수 있다!
공백 및 줄바꿈, 넘치는 텍스트 처리
1.white-space:pre / nowrap; 속성에서
pre 는 공백은 그대로 표시하면서 자동 줄바꿈은 하지 않으며(곧, <pre> 태그와 같다!),
nowrap 은 공백은 하나로 처리하고, 자동 줄 바꿈은 하지 않는다
←
참고로, html 문서는 기본적으로(기본값인 normal) 여러 칸의 공백은 하나로 처리하고, 자동으로 줄바꿈을 해준다!
2.text-overflow:clip / ellipsis; 속성은 해당 요소의
overflow 값이 hidden 이거나 scroll, auto 이면서
white-space 값이 nowrap 일 때; 넘치는 텍스트를 어떻게 처리할 지 여부를 결정한다.
기본값인 clip 은 넘치는 텍스트를 자르며, ellipsis 는 ...로 잘린 텍스트가 있음을 표시한다
해당 요소에서 overflow 값이 hidden(및 scroll, auto)이면서 white-space 값이 nowrap일 때 넘치는 텍스트를 어떻게 처리할 지 여부
해당 요소에서 overflow 값이 hidden(및 scroll, auto)이면서 white-space 값이 nowrap일 때 넘치는 텍스트를 어떻게 처리할 지 여부
.ex_content1, .ex_content2 {
width: 400px; height: 50px; padding: 10px; line-height: 50px; border: 1px solid #ccc;
overflow: hidden; /* 넘치는 부분은 숨긴다 */
white-space: nowrap; /* 공백은 하나로 처리하며 줄바꿈은 하지 않는다 */
} .ex_content2 {
text-overflow: ellipsis; /* 넘쳐서 숨겨진 내용은 ...로 표시한다 */
}
.ex_content1:hover, .ex_content2:hover { /* 마우스 오버 시; */
overflow: visible; /* 숨겨진 내용을 보여준다 */
}
문단/텍스트 정렬
1.text-align:left / right / center / justify | start / end; 속성은
문단의 가로 정렬 기준점을 지정한다
←start / end 값은 논리적 속성으로서, 현재의 쓰기모드를 기준으로 앞/뒤로부터 정렬한다!
2.vertical-align 속성은 인라인으로 배치된 요소(display: inline; 및 display: inline-block;)의
수직 배치 기준점을 설정한다:
baseline; // 인라인 요소의 기준선을 부모요소의 기준선에 맞춤(기본값)
top / bottom / middle; // 인라인 요소의 위/아래/가운데를 부모요소의 가운데에 맞춤
값; // 기준선을 0px로 놓고 양수면 기준선 위로, 음수면 기준선 아래로 지정한 크기만큼 옮김
%; // 기준선을 0%로 놓고 line-height의 몇 %인지에 따라 양수면 위로, 음수면 아래로 옮김
리스트 스타일
1.list-style-type:disc / circle / square; 속성은 <ul>에서 불릿 형태를 지정하며,
list-style-type:숫자 / decimal-leading-zero / lower-alpha / upper-alpha / lower-roman / upper-roman;
속성은 <ol>에서 숫자 형태를 지정한다.
한편, list-style-position:inside; 값을 주면; 목록을 텍스트 진행 방향으로 더 들여쓰기한다:
2.list-style-image:url("이미지파일"); 속성은 불릿을 이미지로 대체하는데,
그보다는 아래 예제처럼 Css의 background-* 계열 속성을 사용하는 편이 더 효율적이다:
➥list-style:type position image; 방식으로 리스트 속성을 일괄 지정해줄 수도 있다
←
순서는 상관없지만.. 생략된 값은 Css 기본값으로 설정된다는 점은 알아둘 필요가 있다!
의사클래스 선택자
░
html 요소는 상호작용하거나 자식요소 중 하나가 특정 상태에 있을 수 있기에 다양한 상태로 존재하게 된다.
의사 클래스는 (해당 유형의 첫 번째 요소이거나 마우스 포인터로 가리키고 있는 등)특정 상태에 있는 요소를 의미하는데,
이 의사 클래스는 마치 해당 상태에 대한 스타일을 동적으로 DOM에 추가한 것처럼 동작한다
요소 위치 의사클래스 선택자
의사클래스 선택자 :는 html DOM에 클래스를 추가한 것처럼,
특정 상태(요소의 위치, 또는 사용자의 반응)에 있는 문서의 일부를 대상으로 하여 동작한다:
div p:first-child { color: green; }←
부모요소 <div> 아래(= 내부)에 있는 <p> 요소들 중 첫번째 <p>
p(1)
p(2)
p(3)
☞
위 코드의 선택자를 div :first-child 및 div *:first-child로 대체해도 같은 결과를 가져온다!
사용자 반응 의사클래스 선택자
1.
일부 의사 클래스는 사용자가 요소와 상호작용할 때만 적용되는데,
대표적으로 요소에 마우스가 올라간 상태를 가리키는 요소:hover(예: 마우스 롤오버 효과를 만들 때)가 있다:
여기 마우스를 올려보세요..
3.요소:focus는 요소에 포커스가 주어진 상태(예: 입력 필드에 커서를 놓거나 TAB 키를 눌러 포커스를 이동했을 때, 테이블의 특정 셀에 커서를 놓거나 특정 요소에 마우스를 올렸을 때 등..)를 가리킨다.
예컨대, <button>과 같이 포커스를 받을 수 있는 요소의 경우; :focus 의사클래스를 써서 해당 상태에 반응할 수 있다.
나아가, 해당 요소의 자식요소가 :focus-within으로 포커스를 받으면 이에 반응할 수도 있다:
아래, [포커스 버튼] 예제 문서 참조 요
체크박스나 라디오버튼에서 해당 요소의 현재 상태를 가리키는데,
요소:checked는 해당 요소가 선택된 때를 가리킨다:
input[type="radio"] :checked{ .. }
➥:checked는 오직 true 또는 false 상태이지만,
체크박스는 체크되거나 체크되지 않은 채로 있는 중간 상태(:indeterminate 상태)도 가질 수 있다:
예컨대, 체크박스 그룹 내 모든 확인란을 선택하는 [모두 선택] 컨트롤이 있는 경우이다
- 곧, 사용자가 [모두 선택]에 체크한 이후 개별 확인란 중 하나를 [선택 취소]하는 경우;
이제 [모두 선택] 확인란은 다시 결정되지 않은 상태로 전환되어야 하는 것이다!
A 링크 상태표시 의사클래스 선택자를 써서 링크 스타일을 지정해주는데,
먼저 링크가 존재할 수 있는 다양한 상태에 대한 이해가 요구된다:
a:link는 텍스트 링크(파란색 밑줄),
a:visited는 방문한 링크(자주색),
a:focus는 Tab 키 등으로 이동하여 포커스가 주어진 링크(초점이 맞춰져 윤곽선이 표시된 때),
a:hover는 마우스 커서가 올라온 때(손모양 포인터),
a:active는 클릭한 순간(빨간색)인데.. 스타일 설정 시 반드시 이 순서를 지켜주어야 한다!
.ol-1 li:first-child { background: rgb(191, 227, 247); } /* 부모(.ol-1) 밑 자식 중 장남 */
.ol-1 :last-child { background: rgb(236, 236, 186); } /* 부모(.ol-1) 밑 자식 중 막내 */
/* 부모가 어떤 ul이나 ol이건간에.. 부모 아래 유일한 독자로 태어난 li */
li:only-child { color: red; } /* .ol-1 :only-child { color: red; } 식으로 해도 같다! */
2.:first-of-type은 같은 요소 타입에서 처음에 위치한 요소를 가리키며,
:last-of-type은 같은 요소 타입에서 마지막에 위치한 요소를 가리킨다.
한편, :only-of-type은 (다른 자식요소들과는 무관하게)해당 타입의 요소로는 유일할 때를 가리킨다:
.my-parent :first-child { /* .my-parent 아래, 첫번째 자식*/
color: blue;
}
.my-parent div:first-of-type { /* .my-parent 아래, div 타입 중 첫번째 */
color: red;
} .my-parent div:last-of-type { /* .my-parent 아래, div 타입 중 맨 끝 */
color: goldenrod;
} /* 아래 코드도 또한 작동됩니다: 아래 코드의 주석을 풀어준 뒤 확인해보십시오.. */
/* .my-parent div:last-child { color: green; } */
➥
Css 선택자는 아래쪽으로 내려가면서 선택할 수 있을뿐, 위쪽으로 거슬러 올라가면서 선택하는 방법은 없으니
(애비, 할배에다 증조부, 고조부까지 올라가야 하는)'4대 독자' 찾기는 포기하세요 ㅡㅡ;
←
참고로, 차남 등 중간 자식들을 지정하는 방법은 따로 있습니다..
░
실제로는 자식과 형제 관계가 그리 명쾌하게 구분되지 않고,
따라서 언제 child 를 쓸지 언제 type 을 쓸지도 애매하고,
거기에 앞에 부모요소를 붙일 때와 그렇지 않을 때의 차이점도 그렇고,
순서 번호도 0 이 시작인지 1 이 시작인지도 명확히 구분되지 않는 경우도 있고 하니..
실제로 각 상황에 맞춰 그때 그때 직접 결과를 확인해가면서 코딩해야할 것입니다..
순서 지정 선택자
1.:nth-child(n)는 (자식 대상)n 번째 요소를 선택하며,
:nth-of-type(n)는 (타입 대상)n 번째(모두 1 부터 센다) 요소를 선택한다.
반면, :nth-last-child(n) 및 :nth-last-of-type(n)는 뒤에서부터 n 번째(1 부터 센다) 요소를 선택한다:
➥
이 문서내 위치(순서) 지정 선택자는 가상요소 선택자와 더불어 Css와 JavaScript 등에서 빈번히 사용되긴 하지만,
또한 가장 혼란스러운 선택자이니 여러 상황에서(예컨대, ul 아래 li.. 들이 들어있는 경우와 여러 div 아래 각각의 h4 & p.. 들이 들어있는 경우 등)
직접 여러 상황을 만들어 코딩하면서 수많은 시행착오를 거쳐야만 그 움직임들을 제대로 파악할 수 있습니다
- 그래도 역시 혼란스럽고 애매하긴 합니다, 그저 코딩 시 이넘들은 최대한 피하는게 상책입니다 ㅡㅡ;
가상요소 선택자
░가상요소 선택자는 기존 요소에 클래스를 적용하는 것이 아니라,
DOM에 완전히 새로운 html 요소를 마크업에 추가한 것처럼 작동한다
가상요소 선택자::before 및 ::after
1.가상요소 선택자는 지정한 요소의 앞이나 뒤 공간에 텍스트나 이미지 요소를 생성하는데,
다른 선택자와는 달리 content 속성을 사용할 수 있다(사용해야만 한다!).
곧, 가상요소 선택자::before 및 ::after는
content 속성을 정의하는 경우에만 요소 내에 하위 요소를 만든다:
☞
참고로, 이 코드는 단지 가상요소가 무언가를 보여주기 위한 것일 뿐,
가상요소를 써서 실제로 텍스트 문자열을 넣는 것은 바람직하지 않다!
➥::before나 ::after 가상요소가 생성되면 제한없이 원하는 대로 스타일을 지정할 수 있다.
단, ::before나 ::after 요소는 내부에 하위요소를 허용하는 요소(= 문서 트리가 있는 요소)에만 삽입할 수 있다
←
따라서 <img> 및 <video>, <input>와 같은 태그에서는 사용할 수 없다!
2.가상요소는 보통 불릿 기호, 버튼의 그림자 효과나 아이콘, 캐릭터 이미지 등을 만들 때,
또는 레이아웃상의 가로/세로 선을 그어줄 때, 자동 번호 매기기 등의 경우에 태그 대신 사용되는데,
<img> 및 <video>, <input> 등에서는 사용할 수 없다:
☞
위 Css 코드에서 content= "✓"만 바꿔주면(복사하여 넣든, 해당하는 엔티티 코드값을 넣든간에)
다른 불릿 기호를 사용할 수 있습니다
←
필요하다면; 위 코드의 color: 색상;에서 불릿 기호의 색상도 바꿔줄 수 있습니다!
플레이스홀더 가상요소::placeholder
가상요소 선택자 요소::placeholder는 <input>나 <textarea> 요소 내의 사전 입력 텍스트를 나타내는데,
이 플레이스홀더 텍스트는 사용자가 <input> 요소에 컨텐츠를 입력할 때 사라지게 되지만..
특정 사용자에게는 이 텍스트 정보가 입력된 값으로 받아들여질 위험성이 상존한다!
☞
가상요소 ::placeholder에 사용가능한 속성들로는
color, background, font- 및 text- 관련 속성 등이 있다
➥
따라서, 플레이스홀더를 사용하는 대신; 입력필드 외부 가까운 위치에 포함시키고,
aria-describedby 속성을 사용하여 <input> 요소와 해당 힌트를 연결해주는 것도 좋다
- 이를 통해 입력필드에 컨텐츠가 입력되어도 힌트 내용은 계속 제공되며,
페이지가 로드될 때 입력필드에는 사전 입력된 내용 없이 나타나게 된다:
백드롭 가상요소::backdrop
<dialog>나 <video>와 같이 풀스크린 모드로 표시되는 요소가 있는 경우;
가상요소 선택자 ::backdrop을 써서
배경(해당 요소와 페이지의 나머지 부분 사이의 공간) 스타일을 지정해줄 수 있다:
video::backdrop { background-color: goldenrod; }
WebVTT 큐 가상요소::cue
가상요소 선택자 요소::cue는 <video> 요소의 자막인 WebVTT 큐를 스타일링하는데,
::cue(요소)로 캡션 내 특정 요소의 스타일을 지정해줄 수도 있다:
░
Css 레이아웃 모델에서 Marker는 각 목록 항목과 연결된 마커 상자로 표시되는데,
마커 상자는 일반적으로 불릿 기호를 포함하는 컨테이너이다.
예컨대, <li> 요소 전체가 아닌 마커 상자만의 스타일을 지정하고자 할 때,
::marker 의사클래스 선택자를 사용한다!
리스트 마커
1.
리스트 가상요소 선택자 ::marker는 목록 리스트의 글머리 기호(나 숫자),
<summary> 요소의 화살표 스타일을 지정할 수 있다
←
참고로, ::marker 의사클래스 요소는 ::before 의사클래스를 사용하여 삽입한 요소보다 앞에 위치한다!
☞
가상요소 ::marker에 사용가능한 속성들로는 글자색(color),
font 관련(font-size, font-weight 등), 텍스트 관련(white-space 등),
content, animation 및 transition 속성 등이 있다
←
바로 위에서 엄청 복잡한 Css 스타일 설정을 통해 리스트 불릿 색상을 바꿔봤는데, 이 방식이 훨씬 간결하군요 ^^
2.
<li>가 아닌 항목에도 display: list-item; 속성을 추가하여 리스트 항목으로 만들 수 있다
- 예컨대, 타이틀에 불릿 기호를 넣어 ::marker 의사클래스를 사용하여 다른 것으로 변경할 수 있도록 하는 것이다:
☞
가상요소 ::first-letter에 사용가능한 속성들로는 color,
배경 관련(background-image 등),
테두리 관련(border-color 등),
글꼴 관련(font-size, font-weight 등),
텍스트 관련(text-decoration, word-spacing 등),
float 등이 있다
문단 첫 줄::first-line
가상요소 선택자 요소::first-line은
지정한 (블록)요소의 첫 줄 을 지정하여 선택한다:
가상요소 선택자에는 원칙적으로 :: 기호를 쓰도록 규정되어 있지만,
모든 브라우저에서 이전 웹페이지들과의 호환성을 위하여 : 기호 또한 지원한다!
가상요소는 기존 요소에 클래스를 적용하는 것이 아니라 완전히 새로운 html 요소를 마크업에 추가한 것처럼 작동한다!
.firstline_ex p:first-child::first-line { /* .firstline_ex 아래에 있는 첫번째 p의 첫번째 줄 */
font-style: italic; color: goldenrod;
}
☞
가상요소 선택자 ::first-line에 사용가능한 속성들로는 color,
배경(background), font- 및 text- 관련 속성 등이 있다
☞
가상요소 ::selection에 사용가능한 속성들로는 color,
background-color, text- 관련 속성 등이 있다
Css 함수와 변수
░
사용자가 정의하는 Css 변수에는 문서 전반에 걸쳐 재사용할 임의의 값
(만!)을 담는데,
이를 사용하면 한 곳에 값 을 저장해두고 다른 여러 곳에서 '참조'하여 사용할 수 있다!
함수와 변수
1.Css 함수는 특정 작업을 수행하도록 작성된 독립적인 코드 조각으로서, 함수 이름으로 호출한다
- 함수 호출 시 인수를 주어 데이터를 전달할 수도 있다:
.container :is(h1, h2, h3) { line-height: 1.5; }
☞
위 :is() { .. } 함수는 Css 선택자를 인수로 받는데,
인수로 받은 선택자와 일치하는 항목이 있는 경우 { .. } 내부의 Css 규칙이 적용된다!
2.Css 변수는 Css 코드의 값을 토큰화할 수 있는 변수 로서, 캐스케이드의 영향도 받는다
(이는 상황에 맞게 조작하거나 재정의할 수 있음을 의미한다!).
이 Css 변수는 var(); 함수를 써서 접근할 수 있다
- 곧, Css의 var(); 함수는 Css 변수의 값 을 다른 속성의 값 으로 설정해줄 때 사용된다:
:root { --default-color: green; } /* Css 변수 --default-color 선언 및 값 설정 */
.def-color { /* 사용자정의 속성 .def-color 선언 */
/* var(); 함수를 써서 Css 변수 --default-color에 담긴 값을 가져온다 */
background-color: var(--default-color); /* 사용자정의 속성 .def-color의 배경색 설정 */
}
☞
위 코드의 var(--default-color); 함수는
값으로 반환하려는 Css 변수(--default-color)을 인수로 사용하며, 해석된 값을 반환한다
←
참고로, Css 변수 앞에는 --를 붙여야 하며 대소문자를 구분한다!
3.Css 변수는 대개 :root { .. }에서 정의하는데,
간혹은 (그 적용 범위을 제한하기 위해)다른 하위 요소에서 정의해주는 경우도 있다:
☞
주어진 변수가 아직 정의되지 않았을 때,
var(); 함수의 Css 변수값에 다수의 대체값들을 옵션으로 추가해줄 수 있다:
var(--main-bg-color, blue, red[, ..])
←
이는 사용자정의 요소 및 Shadow DOM으로 작업할 때 유용하게 쓸 수 있다!
➥
스크립트에서는 Css에서 표준 속성을 사용하는 것과 같은 방식으로 Css 변수값을 넣어주면 된다:
대상요소.style.setProperty("--my-var", myValue + 1);
Css 함수들
░
는 사용자정의 속성(= Css 변수)에 대한 값
을 반환하기 위해 특별한 데이터 처리나 계산을 수행하는 문으로서,
리턴값 을 계산하기 위해 인수 를 받을 수도 있다
계산 표현식calc();
1.
Css의 calc(); 함수는 모든 대상에서, 모든 값과 연산기호 사용이 가능하다.
이 함수는 단일 수학 표현식을 인자로 받는데,
이 인자는 길이 length, 숫자 number, 각도 angle 및 주파수 frequency 등..
다양한 유형의 혼합일 수 있고, 단위 또한 혼합할 수 있다:
.calc_input { /* 입력 영역의 전체 너비에서 양끝으로 1em의 여백을 준다 */
display: block; width: calc(100% - 1em); padding: 4px 8px;
}
➥calc(); 함수를 써서 텍스트 크기를 조절할 때는 피연산자 중 하나는 반드시 상대길이 단위를 사용해주어야 한다.
그래야만 페이지 확대/축소 시에도 그 비율이 일정하게 유지될 수 있다:
font-size: calc(1.5rem + 3vw);
최소값/최대값min/max();
min();과 max(); 함수는 전달된 인수들 중 가장 작게/크게 계산되는 값을 반환한다:
body {
margin: 0 auto; /* 가로 정중앙 배치 */
width: min(1024px, calc(70% + 100px)); /* 둘 중 더 작은 값이 선택된다! */
}
p { font-size: max(1.2rem, 1.2vw); } /* 둘 중 더 큰 값이 선택된다! */
속성값 검색 및 설정하기attr();
attr(); 함수는 선택한 요소의 속성값을 검색하여 스타일시트에서 사용하는 데 쓰이는데,
가상요소에서도 사용할 수 있다. 이 경우 가상요소의 원래 요소에 있던 속성값이 반환된다:
URL은 이미지나 글꼴 등 리소스를 가리키는 문자열로서
background-image, cursor, list-style 등 다양한 속성에서 사용되는데,
url("데이터 소스"); 함수를 써서 URL의 데이터 소스(따옴표로 묶어야 한다!)를 불러와
이미지, 글꼴 및 컨텐츠 등을 표시할 수 있다:
☞
참고로, mixed 값은 기호와 텍스트 방향이 뒤죽박죽이 되어버려 (한국어와 관련해서는)실제로 쓸 일은 없을 듯합니다
←
필요하다면; 위 코드에서 text-orientation: mixed;로 변경해서 확인해보십시오..
Css 논리적 속성
░
Css의 새로운 규격인 논리적 속성에는 언어 및 텍스트 방향에 관계없이
블록 흐름에 적절한 새로운 속성값 키워드들이 존재하며, 이를 통해 쓰기모드에 반응하는 Css 속성을 적용할 수 있게 된다
쓰기모드에 따르는 논리적 속성
요소의 너비/높이(width, height),
박스 가장자리(top, right, bottom, left),
박스 공간(margin, padding, border) 등의 물리적 속성은
뷰포트의 실제 (눈에 보이는)위치 및 크기를 나타낸다.
반면, 논리적 속성에서 요소의 크기, 박스 가장자리 및 여백 등은 컨텐츠의 흐름과 관련되고,
따라서 쓰기모드(writhin-mode)가 변경되면 그에 맞추어 달라지게 된다:
물리적 크기
width: 200px; height: 100px;
논리적 크기
inline-size: 200px; block-size: 100px;
1.
문단의 정렬 방향인 text-align: left/right; 대신 start 및 end 값을 써서
텍스트 진행방향(direction: ltr/rtl;)에 대응하는 논리적 속성으로 사용할 수 있다:
direction: ltr; text-align: start;
direction: rtl; text-align: start;
2.width/height에 매핑되는 논리적 크기는 inline-size/block-size이며,
이제 쓰기모드(writing-mode)를 vertical-lr 및 vertical-rl 로 변경해주면;
아래와 같이 작동한다:
➥
마찬가지로, min-width와 min-height는 min-inline-size와 min-block-size로,
max-width와 max-height는 max-inline-size와 max-block-size로 매핑된다.
또한, 물리적 단위 vw와 vh에 대응하는 논리적 속성 단위에는 vi와 vb가 마련되어 있는데,
이 단위는 항상 읽는 방향으로 매핑된다!
3.
마진과 패딩, 테두리 등에서의 *-top과 *-bottom에 매핑되는 논리적 방향으로는 *-block-start와 *-block-end를,
*-left와 *-right에 매핑되는 논리적 방향으로는 *-inline-start와 *-inline-end를 사용할 수 있다:
ltr: margin-inline-end
rtl: margin-inline-end
☞
여기서는 서로 다른 문서 방향인 ltr 과 rtl 에서 아이콘 옆 텍스트와의 마진 간격을 설정하는데,
논리적 마진을 사용함으로써 문서 방향이 정반대임에도 동일한 결과를 가져오고 있다!
░
사실, 최근에는 훨~씬 간편하고 더욱 유용한 플렉스박스와 그리드로 쉽게 페이지 레이아웃을 구성할 수
있기에(이미지와 텍스트간 조화로운 배치라는 플로팅의 원초적 기능을 제외한다면)
Css 플로팅으로 쌩 머리 짜내면서 페이지 레이아웃을 짤 일은 없습니다만..
아직도 많은 웹사이트들의 레이이아웃이 플로팅 레이아웃에 기반하고 있기에
필요시 코드를 읽기 위해서라도 여전히(?) 심오하게 알아두어야 할 필요가 남은 구시대적(?) 유물입니다 ㅡㅡ;
플로팅 및 해제
float: left/right; 속성은 박스의 플로팅 방향을 지정하며,
clear: both; 속성은 (다음에 나오는 요소에서 사용되어)플로팅을 해제한다:
웹문서에서 이미지와 텍스트를 나란히 배치하고자 할 때,
이미지에 float: 속성 값으로 right를 주면; 이미지는 우측에서부터 배치되는데..
이 때 너비값은 이미지 표시에 필요한 만큼만 차지하고 나머지 영역은 비워지면서 이 빈 영역에 텍스트가 자리잡게 된다
←float 속성을 사용할 때 플로팅 요소 다음에 오는 요소의 레이아웃이 무너질 수 있으므로,
반드시 플로팅을 해제해주어야 한다!
(* 다음에 나오는, 이 <p> 요소에서 <p style="clear:both;">로 플로팅을 해제함 )
➥
플로팅을 해제하기 위해서는, 부모요소 자체에서 overflow: hidden;이나
overflow: auto; 속성값을 설정해주어도 되지만,
위 예제에서와 같이 뒤에서 가상요소로 넣어주는 방식이 다른 요소의 스타일 정의와 충돌할 일도 없고,
코드 읽기도 쉬워진다!
✓
예기치 않은 결과를 만들지 않으면서 (부모요소에서)플로팅을 해제하는 가장 확실한 최신 코드는
부모요소에서 display: flow-root; 값을 주는 것이다:
참조 요.
Css MediaQuery
░반응형 웹디자인은 웹페이지가 모든 화면 크기와 해상도에 즉각적으로 반응하여 렌더링되도록 하면서도
사용자 편의성을 보장하는 웹디자인 접근방식으로서, 멀티 디바이스 웹을 위한 최신 디자인 방식이다!
미디어쿼리 선언
미디어쿼리는 단말기의 유형, 화면 해상도 및 뷰포트 너비 등에 즉각적으로 반응하여 웹사이트나 앱의 스타일을 변경하도록 한다
- 곧, 미디어쿼리는 컨텐츠 자체를 변경하지 않고도 장치의 해상도나 뷰포트 너비, 미디어 유형 등에 따르는 스타일을 설정해준다:
[ 미디어쿼리 선언 ]
☞미디어 타입 은 ,로 구분하여 복수로 나열할 수 있으며,
기본값인 all(모든 장치) 외의 다른 값으로는
screen(디바이스 화면), print(인쇄 결과물 및 결과 미리보기),
speech(음성 합성장치)가 있다.
(조건) 은 and, not 등의 연산자로 이어서 작성할 수 있다:
@media screen, print and (조건) not (조건) { .. }
☞
뷰포트 크기에 반응하는 vw 단위를 사용하면; 미디어쿼리 없이도 반응형 타이포그래피로 작동된다:
h1 { font-size: 2vw; }←
단, 이 경우에는 사용자가 글꼴 크기를 설정할 수 없다는 단점이 있는데,
이 문제는 Css의 calc() 함수를 써서 해결할 수 있다:
h1 { font-size: calc(1.5rem + 2vw); }
➥ 모바일 First
html에서 Mobile 페이지는 기본적으로 미디어쿼리 없이
Css로 작성하되(세로 방향일 때; 너비 320px, 가로 방향일 때; 너비 480px 이상),
화면 크기가 768px 이상이면; 태블릿, 1024px 이상이면; 데스크톱으로 지정한다
←
참고로, Bootstrap 5)에서는 이를 좀 더 세분화하여 6단계의 브레이크 포인트를 사용한다!
@media only screen and (min-width:1024px) and (orientation:landscape) { .. }
☞min-('이상'의 의미)은 크기가 작은 것부터,
max-('이하'의 의미)는 크기가 큰 것부터 순차적으로 작성한다
←
미디어쿼리 사용 시 크기의 기준은 뷰포트 영역이 된다!
✓
미디어쿼리에 의해 페이지 레이아웃이 변경되는 지점이 바로 브레이크포인트인데,
미디어쿼리를 사용할 때는; 먼저, 모바일 기기를 위한 단일 열 레이아웃을 만들고,
현재 기기가 그보다 화면이 더 넓은지를 확인하여 다중 열 레이아웃으로 전환하는 방식이 일반적이다!
뷰포트 선언
░뷰포트는 웹 컨텐츠를 볼 수 있는 창 영역이다.
이것은 렌더링된 문서 페이지와 반드시 같은 크기는 아니며,
필요 시; 웹 브라우저는 사용자가 스크롤하여 모든 컨텐츠에 액세스할 수 있도록 스크롤 바를 제공하게 된다!
뷰포트 선언
1.뷰포트 메타 태그는 모바일 브라우저에 뷰포트의 너비를 기기 너비로 설정하고
문서의 크기를 의도한 크기의 100% 로 조정하여 문서를 모바일에 최적화된 크기로 표시해야 함을 알려준다.
곧, 뷰포트 선언은 데스크탑 화면과는 다른 스마트 기기(기본 뷰포트 너비: 980px)의
보이는 영역을 기기의 실제 화면 크기로 변경하여 미디어 쿼리가 기기의 화면 크기를 정확히 감지하도록 해주는 것이다:
☞
여기서 width=device-width, height=device-height는 뷰포트 너비, 높이의 100%를 의미한다.
initial-scale 은 페이지가 처음 로드될 때의 줌 값이다(0.1 ~ 10, 기본값: 1)
2.
웹사이트의 성격에 맞추어 뷰포트를 특정 크기로 설정할 수도 있다
- 예컨대, width=320, initial-scale=1 은 작은 스마트기기의 디스플레이에 정확히 맞추기 위해 사용될 수 있는데,
이는 브라우저가 페이지를 더 큰 크기로 렌더링할 때 문제를 일으킬 수 있다!
이 문제를 해결하기 위해 브라우저는 필요한 경우, 뷰포트 너비를 확장하게 된다:
☞
초기 또는 최대 크기를 설정하는 페이지의 경우, 이는 width 속성이 실제로 최소 뷰포트 너비로 변환된다는 것을 의미한다.
예컨대, 레이아웃에 최소 500px의 너비가 필요한 경우 위와 같은 옵션을 사용할 수 있다
←
화면이 500px보다 크면; 브라우저는 줌인 대신 화면에 맞게 뷰포트를 확장하게 된다!
➥뷰포트는 웹 컨텐츠를 볼 수 있는 창 영역을 말하는데, 데스크탑의 뷰포트 영역은
[브라우저 개발자 화면]에서 확인할 수 있다(스마트 기기는 대부분 980px 크기로 설정되어 있다).
스마트폰과 같이 작은 기기는 불러온 웹 문서를 화면보다 넓은 이 가상 뷰포트에서 렌더링한 다음,
렌더링된 결과를 기기 화면 크기로 축소하고..
이후 사용자는 페이지의 다른 영역을 더 자세히 보기 위해 확대/축소할 수 있게 된다.
그러나 이러한 메카니즘은 미디어쿼리를 사용하여 좁은 화면에 최적화된 페이지에는 적합하지 않다(예컨대,
가상 뷰포트가 980px인 경우 640px 또는 480px 이하에서 시작되는 미디어쿼리는 사용되지 않으므로 이러한 반응형 디자인 기법의 효과는 제한된다!)
←뷰포트 선언은 좁은 화면 장치에서 가상 뷰포트의 이러한 문제점을 완화시켜주는 역할을 하는 것이다!