Css 3) Study

[웹코딩 가이드] 홈

이제 웹 코딩을 배우기 위한 긴 여정을 시작합니다.. diagram-arrow-down

Web 표준html로 웹사이트 틀을 만들고, Css로 꾸며주고, Javascript로 동작시키는데.. 이것들은 각각 분리하여 작성되어야 나중에라도, 누구라도,, 알아보기 쉽고 유지 관리에도 도움이 된다!


이 페이지는 Css 코딩 입문자를 위한 기초 가이드입니다만, html/Css, Javascript 등의 웹 프로그래밍 전반에 걸쳐 본격적으로 학습하고자 한다면; MDN의 문서를 찬찬히 살펴보시기를 권합니다..


Css 3) 선택자

는 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)
                                    
                                        
                                    
                                

<div> 요소를 만들고, 그 안에서 h5*3를 만들어 각각의 <h5> 요소 아래(즉, 부모요소 내부에) <span> 요소를 하나씩 (자식요소로)편입시키라는 이야기입니다: div > ((h5*3) > span)

div>(h5*3>span)+p
                                    
                                        
                                    
                                

(위쪽 코드에다)뒤에 +p를 붙였는데, 위에서 보았듯이, 블록 뒤에 붙는 +는 블록 뒤에다 붙이라는 얘기입니다 우선순위만으로 기호간 우열을 따지는 건 좀 애매한 점이 많고.. 이런 경우의 + 기호는 앞 블록의 뒤에 배치되는, (앞 블록의)형제요소가 되라는 뜻으로 받아들이면 됩니다: div > (((h5*3) > span) + p)

div#id명.class명1.class명2
                                    
                                        
                                    
                                

#id명은 <div> 요소의 id="값"으로 id명 을 넣어주고, .class명class="값"으로 class명 을 넣어주는데, 클래스 이름은 .class명1.class명2 식으로 복수로 붙여줄 수 있습니다 #.은 우선순위가 가장 높습니다 - ()보다도 우선입니다!

ul>li.class명$*3
                                    
                                        
                                    
                                

일단, <ul> 요소 아래에 class명을 붙인 <li> 요소를 3 개 만들라는 건 알겠는데.. 그런데, class명 뒤에 $ 기호가 또 붙어있네요? 이것은 class명 뒤에 (순서)번호를 붙여주라는 이야기입니다: class명1.class명2.class명3 .이 여럿일 때는 앞에서부터 순차적으로 나아갑니다!


(! 아래 코드는 위와 같은데, $이 2개 붙어있네요? 직접 코딩하여 확인해보시라고 답은 적지 않았습니다 ㅡㅡ;)

                                    
                                        ul>li.class$$*3 ⤶
                                    
                                

░ 이 외에도 더 많은 복잡한 표기법들이 있지만, 다 살펴볼 필요는 없을 듯합니다. 한 예로, p{텍스트} 방식으로 태그와 함께 안에 들어갈 텍스트도 동시에 넣어줄 수 있지만, p 하고나면; 곧바로 커서가 텍스트 입력 위치에 놓여져 바로 내용을 적을 수 있고, 여러 곳에 같은 것을 입력할 경우에도 Alt+드래그Ctrl+클릭이 있으니 굳이 더 어렵게 기억하며 다 배워야할 필요는 없다는 생각입니다 - 솔직히, p{텍스트} 하는거보다는 p 한 뒤, 커서가 놓여지는 곳에서 바로 텍스트라고 적는게 더 속 편하네요, 에밋코딩 기법들 다 배우자면 두뇌 훈련에는 상당히 유용할 듯하지만.. 그런 목적이 아니라면; 코딩 시의 단순 손노동을 줄여주는데 필요한 정도로만 익혀두시면 될 듯합니다 ^^

상속과 우선순위

Css 코드에서 충돌 문제가 발생할 때; 이를 해결하기 위해서는 Css의 우선순위상속Cascading(나중에 정의된 스타일이 앞서 정의된 스타일을 덮는다) 개념에 대한 깊은 이해가 필요해진다

스타일의 상속
기본적으로, 상위요소에서의 스타일은 하위요소로(아래로만!) 상속되며(주로 텍스트 디자인에 관련된 것들: color, font-size, font-family, letter-spacing, ..), 모든 html 요소에는 브라우저 기본값으로 정의된 initial 속성값과 함께, 부모요소로부터 내려받는 inherit 속성값이 복합적으로 내포되어 있다
[ 부모요소로부터의 상속: inherit ]
                                        
                                            .my-component {
                                                font-weight: 500;
                                            } .my-component strong { /* strong 요소의 브라우저 기본(= initial) font-weight 값은 700이지만, */
                                                font-weight: inherit; /* .my-component 내부의 strong 요소에는 font-weight: 500;을 상속(= inherit)받도록 한다 */
                                            }
                                        
                                    

위와 같이 inherit 키워드를 사용하면; 상위요소의 '계산된 값'을 상속받도록 할 수 있다 따라서, 나중에 .my-component 값을 바꾸면; 그 하위 요소에서도 자동적으로 그 바뀐 값이 적용된다!

[ Css 기본값으로의 환원: initial ]
                                        
                                            aside {
                                                font-weight: 500; /* aside 내부 요소들의 font-weight 값은 500이지만, */
                                            } aside p {
                                                font-weight: initial; /* p 요소는 Css 초기값으로 되돌린다 */
                                            }
                                        
                                    

initial 키워드는 속성을 Css 기본값으로 되돌린다!


* cf) 박스모델 속성 등 공간에 관련된 것들(border, margin, padding, ..)은 상속되지 않으며, 부모요소 내부의 <button> 태그에서도 역시 상속되지 않는다!

                                    
                                        
                                    
                                

<button> 태그 내에서 부모요소의 속성을 상속받고자 한다면; 위와 같이 명시적으로 inherit 값을 지정해주어야 한다!

스타일의 상속에서 속성: 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;
                                                    }
                                                
                                            
스타일의 우선 순위
1. 중요도: 운영체제에서 사용자가 설정한 스타일(윈도우의 고대비 설정 등) > 작성자 중요 스타일(!important) > 작성자 일반 스타일 > 기본적인 브라우저 스타일(링크 텍스트 밑줄 등)
2. 구체적 우선순위: 인라인 스타일 > #id 스타일 > .class 스타일 > 태그 스타일 > 부모요소로부터 상속받은 스타일

나는 무슨 색입니까?

                                    
                                        
                                    
                                
                                    
                                        .green { color: green; } /* .green 클래스의 글자색 설정 */
                                        p { color: blue; } /* p의 글자색 설정 */
                                    
                                

<p> 요소의 글자색 설정(태그 스타일)이 .green 클래스의 글자색 설정(클래스 스타일)보다 나중에 정의되었지만, 먼저 정의된 .green 클래스의 글자색이 적용되었다 같은 <p> 요소에서라면; 나중에 정의된 스타일이 기존 스타일을 덮어씌우게 되지만(= 캐스케이딩), 여기서는 구체적 우선순위에서 우위에 있는 .green 스타일이 적용되었다!


* cf) 특히, id는 Css를 더욱 구체적으로 만들므로 id에 적용된 스타일은 다른 많은 방법으로 적용된 스타일을 재정의한다 - 이런 이유로 id에 스타일을 추가하는 것은 좋지 않다 곧, 해당 스타일을 다른 것으로 덮어씌우기 어려울 수 있다!

3. Cascading: 중요도와 구체적 우선순위가 같은 경우; 나중에 정의된 스타일이 앞서 정의된 스타일을 덮는다

나는 무슨 색입니까?

                                    
                                        
                                    
                                
                                    
                                        p { color: blue; font-style: italic; }
                                        p { color: green; } /* 위 p 요소 스타일(의 중복된 속성만)을 덮는다 */
                                    
                                

위 중복된 <p> 요소 스타일에서 덮어 쓰는 것은 스타일 전체가 아니라 동일한 속성만이다 - 이러한 메카니즘은 스타일 정의의 반복을 피할 수 있도록 해준다 곧, font-style: italic;은 그대로 둔 채, 중복된 color 속성의 값만 새 값으로 덮는 것이다!


* cf) 단, 위에서 말한 우선순위들은 그저 대략적인 원칙일 뿐, 실제로는 많은 복잡한 규칙들의 조합으로 결정됩니다 - 대개는 그때, 그때,, 코드 확인하면서 해결해나가야만 합니다(ㅡㅡ;) [브라우저 개발자 화면]의 [요소] 탭에서 문제가 있는(취소선이 그어진) Css 속성들을 확인할 수 있습니다

!important 선언은 같은, 또는 상위의 속성이나 값에 정의된 것보다 더 우선시해서 적용할 것을 요구하는데, 이는 해당 요소의 특정 속성에 대한 이전의 모든 스타일링을 재정의하여 우선 적용된다 - 이러한 간섭은 Css 코드를 혼란스럽게 하고 디버깅을 어렵게 한다!

그럼에도, 도저히 Css 스타일 충돌 문제를 해결할 수 없는 경우나 기존에 정의된 동일한 속성들에 대해 모두 같은 값을 적용해야만 하는 경우 등에는 !important 사용을 고려해볼 수 있다:

                                                
                                                    .o-hidden { overflow: hidden !important; }
                                                
                                            

!important 선언을 무력화시키는 유일한 방법은 이 코드의 밑에서 다른 !important 선언을 포함시켜 재정의해주는 것뿐이다!

글꼴/글자 스타일

웹상에서의 글꼴 사용 문제에 관해 깊이있게 알아보고자 한다면; 을 한번 살펴보십시오..

웹 안전글꼴
Css는 기본적으로 5가지의 을 정의해두고 있는데, 그 정확한 모양은 각 브라우저 및 운영체제에 따라 다를 수 있다. Css 기본 글꼴들의 종류에는 다음과 같은 것들이 있다:
  • serif // 문자의 시작부터 끝까지 같은 굵기에, 글자 끝 장식이 있는 글꼴
  • sans-serif // Non serif 글꼴
  • monospace // 모든 문자의 너비가 같은 고정폭 글꼴 주로, 프로그래밍 코드를 표시할 때 사용된다!
  • cursive // 손글씨를 흉내낸 글꼴
  • fantasy // 장식용 글꼴
웹문서의 기본 글꼴은 <head> 안에서 font-family: 글꼴[, 글꼴2, "글꼴 3"]; 식으로 지정해서 사용할 수 있는데.. (어떤 이유로건)글꼴이 로드되지 못하는 경우에 대비하여 복수의 글꼴 스택을 (원하는 폰트 > 웹안전 대체폰트 > 시스템 기본폰트 순으로)지정해주는 것이 좋다

@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; /* 앞쪽 글꼴이 없으면; 브라우저는 순서대로 대체해서 사용한다 */
                                                        }
                                                    
                                                
글꼴 단위
px 단위는 창 크기 변경에도 항상 body 기본 크기인 16px 로 표시되기에 스마트폰 등을 고려한다면; em 단위도 좋다: em 단위는 부모요소 글꼴의 대문자 M의 크기를 1em (= 16px)로 놓고, 지정된 px 크기를 16으로 나누어 em 단위로 변환한다 브라우저에서는 이를 다시 px로 변환하여 표시한다!
단, em 단위는 부모요소에서 지정된 글꼴 크기들의 중첩에 따라 em 수치가 계속 달라진다는 단점이 있다. 이에 em 단위의 단점을 해결하기 위해서 나온 것이 rem 단위인데, body에서 font-size: 16px;로 설정해준 다음, 이를 기준으로 하는 글꼴 크기를 rem 단위로 지정하는 것이다:

body 기본 font-size 설정: body { font-size: 16px; }


p: 2em
p > span: 2em, p > span: 2rem

                                                    
                                                        
                                                    
                                                
                                                    
                                                        body { font-size: 16px; }
                                                    
                                                

길게 설명하지 않으니 한번 읽어보고, 더 상세한 설명이 필요해지면; MDN의 관련 부분을 참조하십시오..

  • font-size: px / em / rem | small / medium / large | larger / smaller | %; // 글자 크기 small/medium/large 값은 브라우저에서 설정하는 크기이며, larger/smaller% 값은 부모요소의 글자 크기에 대비한 크기이다
  • font-weight: normal / bold | 100 ~ 900; // 글자 굵기 normal (기본값)은 400, bold700 에 해당한다
  • font-style: italic; // 이택릭체 기울임꼴
  • font-variant: small-caps; // 작은 대문자: namsan
  • font: caption / icon / menu / message-box / small-caption / status-bar; 각각에 어울리는 모양의 글꼴 형태로 표시한다!

역시, 길게 설명하지 않으니 한번 읽어보고, 더 상세한 설명이 필요해지면; MDN의 관련 부분을 참조하십시오..

  • color: 글자색;
  • 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: auto / default / none; // 일반 커서의 모양 auto (기본값)는 현재의 맥락에 맞추어 자동으로 커서 모양이 결정되며, default 는 각 플랫폼에 따르는 기본 커서를 쓰며, none 은 커서를 숨긴다
  • cursor: 키워드; // 각각의 키워드로 지정한 커서 모양 링크 및 마우스 오버 시의 상태, 선택 상태, 드래그&드롭, 크기 조절 및 스크롤, 확대/축소 등에 따르는 각각의 커서 모양
  • cursor: url('이미지파일') x값 y값, auto; // 이미지로 커서 모양 지정 맨 뒤에 일반 커서도 반드시 포함해야 하며, x, y 값은 박스 좌상단 모서리를 기준으로 하는 좌표 거리인데 32px 미만이어야 한다!

구글 웹폰트

와 같은 온라인 웹폰트를 사용하고자 한다면; 웹문서에 한 두줄의 간단한 코드를 넣어주는 것만으로 바로 사용할 수 있다!

웹폰트 사용하기
구글 웹폰트를 사용하려면; 먼저, Google Fonts 사이트에서 원하는 폰트를 찾아 <head>에 링크해주는 것이 우선이고, 이어서 구글 Web 폰트 사용을 위한 Css 스타일을 사용자 정의해준다
[ Google Web Font 설정 및 사용하기 ]
                                        
                                            
                                        
                                    

이제, 웹폰트를 적용하고자 하는 <body> 내부 특정 요소(들)에서.. 위에서 만들어 놓은 사용자정의 클래스 스타일을 입혀주면 됩니다: 선거결과 촌평 <span class="webfont_lead">선거결과 촌평</span>

Css 크기 단위

Css에서 크기를 나타내는 방식에는 단위붙은 숫자(단위별 크기: 픽셀 16px, 각도 45deg, 초 1s, 밀리초 1000ms, 비율적 크기: 부모요소 기준 lem, body 기준 1rem, 비율 50% 등), 단순 숫자(예: 불투명도 opacity: 0.1;, 라인 높이 line-height: 1.5;) 등이 있다

웹문서의 비율적 크기 단위: %
% 단위는 원칙적으로 부모요소 크기에 대한 비율인데, 박스에서 마진이나 패딩을 % 단위로 줄 경우는; 마진/패딩의 병합현상, 내부 박스의 고정된 크기, 내부 컨텐츠의 양 등의 문제들과 얽혀 예상과는 많이 다르게 나타난다 - 이것은 기억해둘만하다!
부모박스
부모박스 내부: 마진 10%, 패딩 10%
                                    
                                        
                                    
                                
뷰포트 기준 단위: vw, vh
vw, vh 단위는 뷰포트 너비/높이(100 기준)에 대비한 비례적 크기, vmin, vmax 단위는 뷰포트 너비와 높이 중 짧은 쪽/긴 쪽(100 기준)에 대비한 비례적 크기로 설정한다

(! 영 헷갈리긴 하지만.. 그래도 화면 크기 줄이고 늘리고 하면서 확인해보세요 ㅡㅡ;)


vw/vh : 5vw 5vh

vmin/vmax : 5vmin 5vmax

                                                    
                                                        
                                                    
                                                

Css 색상 설정

html은 16가지 기본 색상명만을 인식하며, Css에는 148개의 색상에 이름이 지정되어 있다 웹상에서 색상을 다루는 문제와 관련해 심도깊은 이해가 필요하다면; 를 한번 살펴보십시오..

색상 표현하기
html 기본 색상명: black, gray(grey), white, aqua, cyan, blue, fuchsia, green, lime, maroon, navy, olive, orange, purple, red, silver, teal, yellow
색상명에는 뒷 배경이 그대로 보이는, 즉 완전한 투명을 의미하는 transparent 키워드도 사용할 수 있고, currentColor 키워드는 color 속성의 계산된 동적 값이다. 예컨대, currentColor 를 정의하는 요소에 정의된 색상값이 없는 경우; 대신 상위 부모요소의 색상을 물려받게 된다
Background(바탕화면 배경색), Highlight(선택한 항목에 대한 강조 색상) 등은 시스템 운영체제에 의해 정의되는 색상명 키워드이다 대소문자를 구분한다!
1. RGB 색상 모델에서는 기본적으로 red, green, blue 삼원색을 조합한 16진수 표기법으로 특정 색상을 표현한다: #rrggbb(#000000 =black, #ffffff =white) 또는, #rgb(#000 =black, #fff =white)

코딩 중 색상을 설정해줄 경우, 같은 곳을 찾아가서 적절한 색을 클릭하여 그 표시되는 색상값을 가져와서 넣어주시면 됩니다

2. rgb[a]hsl[a] 표기법을 쓰면; Alpha 채널 옵션을 추가하여 색의 (불)투명도를 표현해줄 수 있다:
rgb[a] 표기법: rgb[a](0~255, 0~255, 0~255 [, 0~1]); // red, green, blue [, alpha] 각 값들은 ,로 구분하여 표기한다(255, 255, 255, 0.5)
hsl[a] 표기법: hsl[a](0~360, 0~360, 0~360 [, 0~1]); // 색상환, 채도, 밝기[, alpha] 각 값들은 ,로 구분하여 표기한다(360, 360, 360, 0.5)

* cf) 최근에는 모든 브라우저에서 rgb()hsl()alpha, 곧 불투명도를 추가할 수 있게 되었고, 이것이 표준 표기법이다 - 각 값들을 빈칸으로 구분하여 넣어주면 되는데, alpha 값은 /로 구분해서 넣어주는 것이 좋다: color: rgb(255 255 255 / 0.5); 불투명도에는 퍼센트 단위나 소수점 단위 모두 사용할 수 있다

아래는 Css에서 색상이 사용되는 대표적인 곳들인데, 색상을 속성값으로 사용하거나 속성값의 부분 옵션으로 포함한다:

텍스트 관련 색상: 글자색(color), 텍스트 그림자(text-shadow), 링크 밑줄색(text-decoration-color)

배경 관련 색상: 배경색(background-color) 및 그라디에이션 배경(background:)

박스 관련 색상: 테두리(border-color), 윤곽선(outline-color), 박스 그림자(box-shadow)

                                                
                                                    .colors_element {
                                                        width: auto; height: 200px;
                                                        color: rgb(63, 59, 59); /* 글자색 */
                                                        background: linear-gradient(#e1e5de, #a0a7a0); /* 그라디언트 배경색 */
                                                        border: 10px solid; border-radius: 10px;
                                                        border-top-color: lightsteelblue; border-right-color: lightsteelblue; border-bottom-color: lightslategray; border-left-color: slategray;
                                                        box-shadow: 0px 0px 20px rgba(92, 89, 89, 0.9); /* 박스 그림자 */
                                                    }
                                                
                                            
요소의 불투명도
Css의 opacity 속성은 요소의 불투명도를 설정하는데, 0 (요소가 완전히 투명해져 안보이고, 뒷 배경만 드러남) ~ 1 (요소가 온전히 표시되어 뒷 배경이 가려짐) 사이의 값을 쓸 수 있다
opacity: 1; // 요소가 온전히 드러남
opacity: 0.5; // 요소가 반투명해짐
opacity: 0; // 요소가 완전히 투명해짐
                                    
                                        
                                    
                                
➥ Css) 요소의 불투명도와 확대/축소

Css의 zoom 속성은 해당 요소를 확대/축소하는데, 기본값인 1100% 이상은 확대되고, 이하는 축소된다: 남산 로고

                                        
                                            
                                        
                                    
                                        
                                            .opacity_zoom:hover { opacity: 0.5; zoom: 1.1; }
                                        
                                    

다만, 이 zoom 속성은 대상 요소의 크기를 조정하기에 페이지 레이아웃에 영향을 미칠 수 있다!


참고로, Css의 transform: scale(); 효과를 사용하여 크기가 조정된 요소는 레이아웃이 재계산되거나 주변 다른 요소를 이동시키지 않는다 컨텐츠가 부모요소보다 커지게 되면; 오버플로우된다!

배경의 투명도
요소의 불투명도 설정 시 자식요소는 온전히 유지하고자 한다면; background-color: rgb(0 0 0 / 0.3); 방식으로 사용하여 부모요소를 투명하게 해주면 된다

opacity 속성은 (부모요소 위에 놓인)자식요소(위에서.. <div> 부모 블록의 내부 자식 <div>들)의 투명도를 지정하는 것인 반면, 이 background-color 속성에 설정한 alpha 값은 (자식요소를 품고 있는)부모요소(아래.. <p> 요소의 부모 블록인 <div>)의 투명도를 지정하는 것이다!

                                    
                                        
                                    
                                

위 <div> 요소의 배경색은 검정색이지만(background-color: rgb(0 0 0);), 여기에 0.3의 알파값을 주어 배경색을 (30%)투명하게 해준 것입니다: background-color: rgb(0 0 0 / 0.3);

Css 박스 스타일

아래서는 Css 3)의 박스 관련 속성들을 간략히 정리합니다

박스 테두리 스타일
박스 테두리를 그려주는 border 속성의 각 방면 설정은 하나(4방면 모두), 2개(상하 -> 좌우), 3개(상 -> 좌우 -> 하), 4개(상 -> 우 -> 하 -> 좌 순)으로 줄 수 있다 박스 마진(margin)과 패딩(padding) 속성에서도 모두 같은 방식으로 사용된다!
  • border: 색상 두께 스타일; // 4방면 모두의 테두리 색상, 두께, 스타일 일괄 지정 순서는 상관없되, 생략된 부분의 기본값은 none 으로 설정된다!
  • border-color: 테두리 색상;
  • border-width: 테두리 두께; 단위는 px
  • border-style: solid / dashed / dotted / double | groove / inset / outset / ridge | hidden; // 테두리 스타일 기본값: black 1px solid (검은색 1px 실선)

border-top/right/bottom/left: 값; 식으로 각 방향별로, 또 border-top/right/bottom/left-color/width/style: 값; 식으로 각 방향(과 스타일)별로 설정해줄 수도 있다!


* cf) 박스 윤곽선(예컨대, Tab 키 등에 의해 링크 텍스트가 선택된 때 등)을 표시해주는 outline 속성도 또한 border 속성과 같은 방식으로 사용해주면 된다 다만 이 외곽선은, 테두리와는 달리, 요소 바깥에 표시되며 절대 공간을 차지하지 않는다!

박스 모서리 스타일
border-radius: 값; 속성은 박스 모서리를 둥글게 꾸며준다(px 은 둥글게 할 원의 반지름 크기, % 은요소 내에서의 반지름 비율이다). 값은 4개(좌상단 모서리부터 시계방향 순), 2개(좌상단 코너에서 대각선 방향, 우상단 코너에서 대각선 방향 쌍)로 줄 수 있고, 각 방향별 속성을 사용할 수도 있다

Box Box Box Box Box

                                    
                                        
                                    
                                
                                    
                                        span.ex_span00 {
                                            margin: 20px; padding: 10px; border: 10px solid burlywood;
                                        }
                                    
                                

완전한 원을 만들려면; 반지름 값을 50% 로 주면 되고, 각 모서리를 타원형으로 만들려면; 반지름 값을 가로/세로 로 주면 된다!

박스 그림자 스타일
box-shadow: 수평거리 수직거리 [흐림 번짐 색상]; 속성은 박스에 그림자를 그려주는데, 거리값에서 양수는 오른쪽아래쪽 방향으로, 음수는 왼쪽위쪽 방향으로 그림자가 드리워진다. 추가 옵션으로 흐림(기본값 0px로 시작하여 값이 커질수록 부드러운 그림자가 된다), 번짐(기본값 0px로 시작하여 양수는 박스보다 크게 퍼져나가고, 음수는 안쪽으로 오무라든다), 색상(공백으로 구분하여 복수로 지정해줄 수 있다) 등을 설정해줄 수 있다

Box 그림자

                                    
                                        
                                    
                                

여기서는 수평거리수직거리 에다 흐림 번짐 색상 옵션도 추가하였다

텍스트 그림자 스타일
text-shadow: 가로 세로 번짐 색상; 속성은 텍스트에 그림자 효과를 주는데, ,로 구분하여 복수의 그림자를 겹쳐줄 수도 있다: 텍스트 그림자
                                    
                                        
                                    
                                

박스를 좀 더 폼나게, 또는 좀 더 쉽게 만들어보고자 하신다면; , , 등의 온라인 자동생성기를 이용하실 수 있습니다..

Css 패러그래프

아래서는 Css 3)의 패러그래프 관련 속성들을 간략히 정리합니다

문단 첫글자 들여쓰기
text-indent: 값 | %; 속성은 문단 첫 글자를 들여쓴다 은 음수도 가능하며, %로 주면; 부모요소의 너비를 기준으로 하는 상대적 크기가 되어 브라우저 창의 크기 변화에 연동시킬 수 있다!
➥ 사용자정의 Css) .indent_2

Css의 첫 글자 들여쓰기 속성(text-indent)을 이용하면 문단 첫 글자를 들여쓰는 자신만의 사용자정의 클래스를 만들어 쓸 수 있다

                                        
                                            
                                        
                                    
                                        
                                            /* 문단 첫 글자 들여쓰기를 위한 사용자정의 Css */
                                            .indent_2 { 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 값은 현재 요소를 기준으로 하는데, 부모요소의 높이(= height)와 같은 line-height 값을 주면; (한 줄)텍스트를 세로 방향 가운데로 배치할 수 있다!

공백 및 줄바꿈, 넘치는 텍스트 처리
white-space: normal / pre / nowrap; 속성에서 pre 는 공백은 그대로 표시하면서 자동 줄바꿈은 하지 않으며(곧, <pre> 태그와 같다!), nowrap 은 공백은 하나로 처리하고, 자동 줄 바꿈은 하지 않는다 참고로, html 문서는 기본적으로(기본값인 normal) 여러 칸의 공백은 하나로 처리하고, 자동으로 줄바꿈을 해준다!

해당 요소에서 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; } /* 마우스 오버 시 숨겨진 내용을 보여준다 */
                                                    
                                                

만약, .ex_content1:hover, .ex_content2:hover { overflow: visible; } 속성을 추가해주지 않는다면; 어떤 일이 생길까요? 위 css 스타일에서 이 부분을 주석 처리한 뒤 스스로 확인해보세요..

문단/텍스트 정렬하기
text-align: left / right / center / justify | start / end; 속성은 문단의 가로 정렬 기준점을 지정한다 start / end 값은 논리적 속성으로서, 현재의 쓰기모드를 기준으로 앞/뒤로부터 정렬한다!
vertical-align: baseline / top / bottom / middle | 값 / %; 속성은 인라인으로 배치된 요소(display: inline;display: inline-block;)의 수직 배치 기준점을 설정한다 기본값인 baseline은 인라인 요소의 기준선을 부모요소의 기준선에 맞춘다
  • top / bottom / middle; // 인라인 요소의 위/아래/가운데를 부모요소의 가운데에 맞춘다
  • 값; // 기준선을 0px로 놓고 양수면 기준선 위로, 음수면 기준선 아래로 지정한 크기만큼 옮긴다
  • %; // 기준선을 0%로 놓고 line-height의 몇 %인지에 따라 양수면 위로, 음수면 아래로 옮긴다
리스트 스타일
리스트 스타일은 list-style: type position image; 방식으로 일괄 지정해줄 수 있다 순서는 상관없지만.. 생략된 값은 Css 기본값으로 설정된다는 점은 알아둘 필요가 있다!
  • 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: outside/ inside; (텍스트 진행 방향에 대하여)목록 들여쓰기/내어쓰기
  • list-style-image: url("이미지파일"); // (<ul>에서의)불릿을 이미지로 대체 이보다는 Css의 background-* 계열 속성을 사용하는 편이 더 효율적이다!
  • html 5
  • Css 3
  • Bootstrap 5
                                                    
                                                        
                                                    
                                                
                                                    
                                                        /* [Css 3) 불릿을 이미지로 대체하기] */
                                                        .image-list-icon {
                                                            padding-left: 3rem;
                                                            list-style-type: none;
                                                        } .image-list-icon li {
                                                            padding-left: 1.5rem;
                                                            background-image: url("./_img/external-link-26.png");
                                                            background-position: 0 0.3rem;
                                                            background-size: 1rem 1rem;
                                                            background-repeat: no-repeat;
                                                        }
                                                    
                                                

흐름 레이아웃

박스모델 개념에 대한 이해와 블록레벨 요소 대 인라인 요소의 분간은 원칙에 입각한 웹코딩의 가장 중요한 시작점이니, 꼭! 꼭!! 씹어가며 찬찬히 살펴보십시오..

웹문서의 일반 흐름
웹문서의 일반 흐름 flow layout 은 페이지 레이아웃이 전혀 적용되지 않은, 곧 브라우저가 기본값으로 웹문서의 요소들을 배치하는 것인데.. 블록레벨 요소는 블록 방향(가로쓰기 모드라면; 수직 방향, 세로쓰기 모드라면; 수평 방향)으로 확장되면서 배치되고, 블록레벨 요소 내부 컨텐츠가 흘러가는 방향(가로쓰기 모드의 가로방향, 또는 세로쓰기 모드의 세로방향)이 바로 인라인 방향이 된다

블록레벨 요소(예컨대, 이 문단 전체)는 부모요소의 너비 100%와 자체 내용물의 최대 높이를 차지하며, 내부 인라인 요소들은 자체 내용물의 최대 높이와 최대 너비 를 차지하게 된다

                                    
                                        
                                    
                                
인라인 요소 옆에서

인라인으로 쪼그라든 블록레벨 요소입니다 ㅡㅡ;

                                    
                                        
                                    
                                
                                    
                                        .divspan_ex {
                                            display: inline-block;
                                            height: 2.5em; padding: 8px; border: 1px solid gray;
                                        } .divspan_ex:hover { background-color: rgb(0 0 0 / 0.1); }
                                    
                                

(! 위 html 예제 코드에서 <p> 요소의 Css 설정(class= "divspan_ex")을 없애주면 어떤 모습이 될까요?)

인라인 요소 옆에서

자신의 블록레벨 본성을 되찾은 p 요소입니다 ^^

이것이 바로 순수 html 문서의 민낯, 즉 '일반 흐름'입니다!

블록레벨 요소는 (가로쓰기 모드에서)위쪽 블록레벨 요소 아래 새 줄로 내려가 수직 방향으로 배치되며, 각 블록레벨 요소에 주어진 마진에 의해 서로 분리된다(이 마진은 큰 쪽에 의해 작은쪽이 접혀진다 - ‘마진병합’). 반면, 인라인 요소는 (블록레벨 부모요소의 너비 내에서)다른 인라인 요소와 같은 라인에 차례로 자리잡되, 부모요소의 너비가 부족해지면; 나머지는 아래로 내려가게 된다. 하지만, 인라인 요소에 display: block; 속성값을 주면; 온전히 블록레벨 요소의 특성을 갖게 된다

인라인 요소 옆에서 블록레벨 요소로 변신한 인라인 요소입니다 !

                                    
                                        
                                    
                                
                                    
                                        .divspan_ex2 {
                                            display: block; height: 2.5em; padding: 4px; margin: 0;
                                        }
                                    
                                

* cf) 인라인 요소에 너비나 높이를 설정할 수는 없다. 인라인 요소의 크기를 제어하려면; display: block;이나 display: inline-block; 속성을 주어야 한다!

한 단락 내부에 인라인 요소인 스판 영역이 있는데, 이 인라인 요소에 display: inline-block; 속성을 주니 블록레벨 요소에서만 작동하는 width, marginpaddingtext-align 속성이 작동하는군요..

                                    
                                        
                                    
                                
                                    
                                        span.inline_In_block {
                                            display: inline-block; /* 인라인 요소에 inline-block 속성을 준다 */
                                            width: 120px; margin: 0.2em; padding: 5px; text-align: center;
                                            background-color: beige; border: 1px solid red;
                                        }
                                    
                                

인라인 요소에 display: inline-block; 속성값을 주면; 일부 블록레벨 요소의 특성을 갖게 되지만, 그럼에도 여전히 텍스트와 함께 인라인으로 흐르게 된다!

디스플레이

화면 배치 방법을 바꿔줌으로써 블록레벨 요소 대 인라인 요소 사이를 전환하는 것이 가능한데.. 단, 이는 태그의 성격 자체가 바뀌는 것은 아니고, 단지 디자인적 꾸밈새만 바뀔 뿐이다 - 예컨대, 기본적으로 세로로 배치되는 li 리스트를 가로 내비게이션으로 바꿀 때나 한 줄로 표시되는 이미지에 여백과 테두리를 추가해 갤러리로 표시할 때, Pc에서는 표시하되 Mobile에서는 없애고자 할 때 등에 속성이 사용된다

화면 전환 배치: display
웹문서의 일반 흐름에서 display 속성으로 화면 배치 방법을 바꾸어주면; 블록레벨 요소 대 인라인 요소 사이의 전환이 가능한데, display: none;은 요소를 화면에서 감추고 차지하던 공간도 삭제한다
  • display: block; 인라인 요소를 블록레벨 요소로 배치한다 (또는, none 속성을 주었던 요소를 다시 불러낸다)
  • display: inline; 블록레벨 요소를 인라인으로 배치한다
  • display: inline-block; 블록레벨 요소를 인라인으로 배치하되, 블록레벨 속성을 사용할 수 있도록한다. 또는, 인라인 요소에서 블록레벨 속성을 사용할 수 있도록 한다
1. 기본적으로 모든 요소는 흐름 레이아웃을 사용하여 블록 및 인라인 박스에 컨텐츠를 배치하는데, position, overflow 등의 속성 설정에 따라, 또는 자체적으로 블록 또는 인라인 컨텍스트에 참여하는지 여부에 따라 해당 컨텐츠에 대한 새 블록 컨텍스트를 설정하거나 해당 컨텐츠를 부모 컨텍스트에 통합하거나 하게 된다
[ flow-root 설정 ]
                                        
                                            /* flow-root 설정: 블록 컨텍스트 박스를 생성하여 서식루트가 있는 위치를 정의한다 */
                                            display: block; // 이는 display: block flow-root; 와 같다
                                            display: inline; // 이는 display: inline flow-root; 와 같다
                                            display: inline-block; /* display: inline flow-root ← 주변 컨텐츠와 함께 흐르는 블록 박스를 생성한다 */
                                        
                                    

곧, flow-root 로 주어진 요소는 새로운 블록 서식 컨텍스트를 설정하는 블록 박스를 생성하여 서식 루트가 있는 위치를 정의하는 것이다 영 생소하고 어려운 개념이군요, 이 문제는 Css 포지셔닝에서 더 살펴보기로 합니다..

2. Css의 visibility 속성은 요소를 화면에서 감추거나 드러낼 때 사용하는데(기본값: visible), hidden 은 요소를 화면에서 감추되, 그 영역은 여전히 차지한다 반면, display: none;은 화면에서 요소를 감추는 동시에 요소가 차지하던 공간도 완전히 해제한다!
visibility: hidden;
display: none;
                                    
                                        
                                    
                                

요소에 display: none;으로 설정하면 접근성 트리에서 제거되고, 스크린리더기 등에서도 접근하지 않는다. 하지만, 숨겨져 있지만 보이는 요소의 aria-describedbyaria-labelledby 속성으로 참조되는 요소는 보조기술에 노출된다 관련 디스플레이 문제에 관한 심도깊은 분석은 WebAIM 문서를 참조하십시오..

다중 키워드 구문
display 속성은 외부적으로는 요소가 블록 또는 인라인 박스로 처리되는지 여부(곧, 요소의 흐름 레이아웃)을, 내부적으로는 (플렉스 박스, 그리드 레이아웃 등에서)자식요소의 레이아웃을 설정한다. 곧, 외부 타입은 흐름 레이아웃에 대한 요소의 참여 여부를 설정하며, 내부 타입은 자식요소의 레이아웃을 설정하는 것이다: display: block flow; display: 외부타입 내부타입;
- 위 코드는 최근의 Css 3) 다중 키워드 구문인데, 앞 block 은 요소 자신의 흐름 레이아웃을, 뒤 flow 는 내부 자식요소의 레이아웃을 가리킨다
[ 다중 키워드 구문 ]
                                        
                                            /* 외부값 설정: 흐름 레이아웃에서의 요소의 표시 유형 지정 */
                                            display: block; /* display: block flow; */
                                            display: inline; /* display: inline flow; */

                                            /* 내부값 설정: 요소 내부에서 컨텐츠가 배치되는 서식 컨텍스트 유형 정의 */
                                            display: flex; /* display: block flex; */
                                            display: grid; /* display: block grid; */

                                            /* inline-내부값 설정 */
                                            display: inline-flex; /* display: inline flex; */
                                            display: inline-grid; /* display: inline grid; */
                                        
                                    

다중 키워드 구문을 지원하는 브라우저에서 외부값이 지정되지 않으면; block이, 내부값이 지정되지 않으면; flow가 기본값이 된다 - 곧, 특정 요소에 display: flex; 값을 주면; 이 요소는 블록레벨 플렉스 박스로 바뀌고, 자식요소들은 플렉스 항목으로 작동하게 되어 흐름, 정렬을 제어하는 가변형 속성을 사용할 수 있게 되는 것이다!

Css 박스모델

Css로 작성하는 모든 것은 박스Box 이다! 곧, 브라우저의 렌더링 엔진은 Css 기본 에 따라 각각의 요소를 사각형 박스로 표현하고, Css는 박스의 크기와 위치, 속성(색, 배경, 테두리 모양 등)을 결정하는 것이다

박스모델 개념
Css 박스모델 개념에서 내용물인 Contents를 둘러싼 패딩padding테두리border, 주변 박스와의 간격인 마진margin은 모두 각각 4방향으로 설정 가능하다 Css 박스모델과 관련하여 더 깊은 이해가 필요하시면; Web-dev) 박스모델 문서도 참고하십시오..
[ 박스모델 개념 ]
Border(테두리) 박스
Padding(여백) 박스
Contents(내용) 박스

Margin(= 박스간 간격)

Border(테두리) 박스
Padding(여백) 박스
Contents(내용) 박스
* cf) 이 박스 외곽선그림자박스 테두리와는 달리, 박스모델과는 전혀 무관한 (공간을 차지하지 않으면서, 단지 시각적 표시만 해주는)효과 처리일 뿐이다!
인라인 요소는 해당 컨텐츠만큼의 영역만을 차지하면서 수평 방향으로 컨텐츠가 배치된다 - 너비width높이height 설정은 할 수 없으며, left, right 방향으로 공간을 줄 수 있으나 top, bottom 방향으로는 공간을 설정할 수 없다 참고로, 인라인 요소의 높이는 기본적으로 line-height 값에 의해 결정된다!
반면, 블록레벨 요소는 (부모 요소의 너비 내에서)한줄 전체를 차지하는 박스 형태가 되어, 내용물이 늘어나면 아래 방향으로 컨텐츠를 쌓아나간다. 너비가 100%이므로 좌/우에 다른 요소가 올 수 없으며, 4방향으로 widthheight, paddingmargin 설정이 가능하다. 한편, <a>, <button>, <img>, <video> 등의 인라인-블록레벨 요소는 (줄 바꿈 되지 않는)인라인 특성을 지니면서도 블록 특성인 widthheight, 상/하 marginpadding 설정이 가능하다!
컨텐츠 박스에는 글이나 이미지 등 요소의 실제 내용이 들어간다. 그 크기는 너비(width)와 높이(height)로 표현되며, 배경색(background-color)과 배경 이미지(background-image)를 가질 수 있다. 컨텐츠 박스의 쿠션 역할을 하는 패딩(padding) 영역 바깥의 테두리(border)는 박스의 경계선이며, 이는 박스 영역의 한계점이 된다!

* cf) 컨텐츠패딩, 테두리에는 배경 이미지를 지정할 수 있지만(곧, 컨텐츠와 패딩, 테두리는 블록레벨 요소의 영역에 속한다), 마진은 단지 박스간 간격을 제어할 뿐이기에 배경 이미지가 적용되지 않는다(곧, 마진은 박스에 포함되지 않는다!). 한편, 외곽선(outline) 및 그림자(box-shadow)는 박스 테두리 바깥 마진 공간에서 덧칠되므로 역시 박스의 크기에는 전혀 영향을 미치지 않는다!

박스 사이징
블록레벨 박스의 실제 크기는 widthheight로 주어진 크기에다 각 방향별 paddingborder 값이 더해지는데(곧, 그만큼을 더한 크기로 재설정된다!), Css 스타일 설정에서 box-sizing: border-box; 속성값을 주면; 컨텐츠 영역에다 패딩과 테두리까지 합친 크기로 width, height 값이 재설정된다 - 곧, 주어진 widthheight 값이 전체 박스의 (패딩과 테두리까지 포함하는)실제 크기로 된다!
width: 400px; padding: 20px; border: 20px; margin: 20px;
box-sizing: content-box; (기본값)
실제로는; 박스 크기가 늘어남: 컨텐츠 영역(곧, 박스의 원래 크기 400px) + 패딩(20x2) + 테두리(20x2) = 480px
box-sizing: border-box;
주어진 width 값(400)에서 패딩과 테두리를 뺀 값으로 컨텐츠 영역이 줄어들어 주어진 width 값(= 400px)이 유지됨!
                                                    
                                                        
                                                    
                                                
                                                    
                                                        .div_ex00 {
                                                            width: 400px; margin: 20px; padding: 20px;
                                                            border: 20px dotted gainsboro;
                                                        }
                                                        
                                                        .div_ex00:first-of-type {
                                                            background-color:yellowgreen;
                                                        
                                                            /* 이 부분은 Css 기본값이므로, 순수 html 문서에서는 적을 필요가 없다 */
                                                            box-sizing: content-box;
                                                        }
                                                        
                                                        .div_ex00:last-of-type {
                                                            background-color: blanchedalmond;
                                                        
                                                            /* 부트스트랩에서라면; border-box가 기본값으로 재정의되어 있으므로, 실제로 적을 필요는 없다! */
                                                            box-sizing: border-box;
                                                        }
                                                    
                                                

* cf) 현재 웹문서 내 모든 요소에 box-sizing: border-box; 속성을 적용하고자 한다면; 아래와 같이 설정해주면 된다 참고로, 이미 부트스트랩 등 대다수의 플랫폼들에서는 패딩이나 테두리로 인해 박스의 너비가 변하는 것을 방지하기 위해, 자체 규격으로 이 값을 border-box 로 재설정하여 사용하는 것이 보통이다!

                                    
                                        html { box-sizing: border-box; }

                                        *, *::before, *::after { box-sizing: inherit; }
                                    
                                

이렇게 하면 여백이 요소의 최종 계산된 너비에 영향을 미치지 않도록 보장하지만, 드물게 구글 맵 등에서 문제가 발생할 경우가 있는데, 그런 경우에는 해당 요소에서 다음과 같이 재정의해줄 수 있다: .googlemap-widget { box-sizing: content-box; }

Css 간격

html은 기본적으로 자체 규격을 통해 블록 요소간 일정한 간격을 설정해준다 - 예컨대, <hr>은 (단순히 선을 그어주는 것만이 아니라)블록 방향으로 주변 요소와 일정한 간격(마진)도 준다 <p>, <h1> 등의 블록레벨 요소들은 모두 주변 요소와의 사이에 기본값으로 설정된 마진 간격이 존재한다!

마진과 패딩
마진(margin: 값;)은 해당 태그 테두리의 바깥쪽 빈 공간, 곧 주변 요소들 테두리와의 간격이고(음수도 가능하다!), 패딩(padding: 값;)은 해당 태그의 내부 빈 공간 곧 컨텐츠와 테두리 사이의 여백이다 예컨대, 메뉴로 사용된 <li>(와 <a> 조합)에서 어느 범위까지를 클릭 영역으로 할지, 어디까지의 색상을 달리할지 등 그때, 그때의 상황에 따라 margin을 사용할 지 padding을 사용할 지가 선택된다!

✓   각 방향별 마진/패딩: margin|padding-top/right/bottom/left 논리적 속성 또한 쓸 수 있다: margin|padding-block-start/end, margin|padding-inline-start/end


* cf) 12시 방향부터 출발하여 상 우 하 좌, 상 좌우 하, 상하 좌우 식으로 줄 수 있고, 의 단위는 px(= 절대 크기), %(= 부모 요소에 대한 비율), em(= 부모요소 기준) 및 rem(= body 기준) 등을 쓸 수 있으며, auto(기본값)는 남는 공간 전부를 차지하면서 적절하게 자동 배치된다(예컨대, Flex 박스에서의 자동 마진)

정중앙 레이아웃: 문단 내 텍스트의 중앙 정렬에는 text-align: center; 속성이 사용되지만, 레이아웃 요소의 중앙 정렬에서는 Css의 margin 속성을 사용한다
박스의 마진 값을 max-width: 600px; margin: 0 auto;와 같이 지정해주면; 해당 박스는 브라우저 크기에 맞추어 가변적인 크기로 항시 중앙에 위치하게 된다(= 화면 정중앙 가변 레이아웃)
                                    
                                        
                                    
                                

위 코드의 <div> 박스는 최대 크기 600px (max-width: 600px;), 상하 마진 0 & 좌우 마진 auto (margin: 0 auto;)로 되어 화면의 가로 정 중앙에 위치하게 된다!


* cf) 박스는 가변적이되 그에 무관하게 마진이나 패딩은 고정되어 있도록 하고자 한다면; Css의 calc(); 함수를 사용할 수도 있다: div { margin: calc(100% - 25px) calc(100% - 100px); } 박스 상하쪽으로 25px 만큼씩, 좌우쪽으로 100px 만큼씩의 여백을 준다

음수 마진: margin 속성에서는 음수 값도 쓸 수 있기에, 이를 이용하면 하나의 박스에서 다른 박스 영역까지 침범하여 겹쳐 쌓는 것이 가능해진다

음~ 이넘이 건방지게 지 부모 품을 벗어나 바깥으로 빠져 나갔군요 ㅡㅡ;

부모 박스
                                    
                                        
                                    
                                
마진병합 현상: 인접한 두 요소의 마진 중 큰 값에 의해 작은 값이 접히는 것을 말하는데, 다음과 같이 p1(margin-bottom: 1rem;)과 p2(margin-top: 2rem;) 사이는 큰 마진 하나로 축소되어 3rem(위/아래 합계: 1rem + 2rem)이 아니라, 2rem(큰거 하나: 2rem)의 간격이 된다

p1. 상하 마진 1rem

p2. 상하 마진 2rem

                                    
                                        
                                    
                                

Css 쓰기모드

Css에서 블록 흐름은 컨텐츠 블록이 배치되는 방향(html 기본: 위에서 아래로)을 말하며, 인라인 흐름은 블록 내부에서 텍스트가 흐르는 방향(html 기본: 좌에서 우로)을 말한다. 하지만, Css의 새로운 규격인 에는 언어 및 텍스트 방향에 관계없이 블록 흐름에 적절한 새로운 속성값 키워드들이 존재하며, 이를 통해 쓰기모드에 반응하는 Css 속성을 적용할 수 있게 된다

쓰기 모드
html 문서의 기본 쓰기 모드인 가로쓰기 모드(writing-mode: horizontal-tb;)에서는 텍스트는 수평 방향으로 흐르고, 블록은 아래 방향으로 늘어난다

기본값인 가로쓰기 모드에서 텍스트는 가로 방향으로 나아가고..
블록은 아래 방향으로 내려간다..

세로쓰기 모드(writing-mode: vertical-lr/vertical-rl;)에서는 텍스트는 수직으로(= 인라인 방향) 흐르되, 블록은 각각 좌측에서 우측으로, 우측에서 좌측으로(= 블록 방향) 배치된다
세로쓰기 vertical-lr

vertical-lr
left -> right ..

세로쓰기 vertical-rl

vertical-rl
right -> left ..


✓   문서 전체의 쓰기모드는 <html> 요소의 전역 속성인 dir를 사용하는 것이 좋다: <html lang="ar" dir="rtl">

text-orientation: mixed/upright; 속성은 문단 내 텍스트의 진행 방향을 설정하는데, 이 속성은 쓰기 모드(writing-mode)가 horizontal-tb(기본값임) 이외의 값으로 설정되어 있는 경우에만 의미가 있다:

Hi, 안녕?
vertical-lr:
upright;

Hi, 안녕?
vertical-lr:
upright;

                                                    
                                                        
                                                    
                                                

참고로, mixed 값은 기호와 텍스트 방향이 뒤죽박죽이 되어버려 (한국어와 관련해서는)실제로 쓸 일은 없을 듯합니다 필요하다면; 위 코드에서 text-orientation: mixed;로 변경해서 확인해보십시오..

쓰기모드에 따르는 논리적 속성
요소의 너비/높이(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; 대신 startend 값을 써서 텍스트 진행방향(direction: ltr/rtl;)에 대응하는 논리적 속성으로 사용할 수 있다

direction: ltr; text-align: start;

direction: rtl; text-align: start;

2. width/height에 매핑되는 논리적 크기는 inline-size/block-size이며, 마진과 패딩, 테두리 등에서의 *-top*-bottom에 매핑되는 논리적 방향으로는 *-block-start*-block-end를, *-left*-right에 매핑되는 논리적 방향으로는 *-inline-start*-inline-end를 사용할 수 있다
ltr: margin-inline-end

rtl: margin-inline-end

                                    
                                        
                                    
                                

여기서는 서로 다른 문서 방향인 ltrrtl 에서 아이콘 옆 텍스트와의 마진 간격을 설정하는데, 논리적 마진을 사용함으로써 문서 방향이 정반대임에도 동일한 결과를 가져오고 있다!

세로 레이블
                                                    
                                                        
                                                    
                                                
                                                    
                                                        .my_box_ex {
                                                            background-color: gray;
                                                            padding-block-start: 16px; /* 상단 패딩 */
                                                            margin-inline-start: -1em; /* 좌측 마진 */
                                                        }
                                                        
                                                        .h5_labeled_y {
                                                            writing-mode: vertical-lr; /* 세로 쓰기모드로 변경 */
                                                            margin-inline-start: 2em; /* 상단 마진 */
                                                        }
                                                    
                                                

배경 이미지 기본

모든 Css 박스 뒤에는 라고 하는 특수 레이어가 존재하는데.. 이 배경은 사용자의 시야로부터 가장 먼 곳에 위치하며, 패딩 영역에서부터 시작하는 컨텐츠의 뒤에서 렌더링된다!

배경색과 배경 이미지
배경색 background-color 은 필요시 원하는 요소에서 각각 따로 지정해주어야 하는데, 배경에 설정하는 색상은 (패딩 영역에서 시작하여 컨텐츠 영역까지에 걸쳐)해당 요소 뒤에서 보여진다

블록레벨 요소 <p>의 배경색 대 인라인 요소 <span>의 배경색

                                    
                                        
                                    
                                
배경 이미지 background-image 는 배경색 위에 배치되며(배경색을 가린다!), 테두리에 의해 가려지게 된다. ,로 구분하여 다수의 url("이미지"), url("이미지2"), .. 식으로 배경 이미지를 복수로 지정해줄 수도 있다 - 이 경우, 나중에 나오는 이미지가 위쪽으로 겹쳐지면서 쌓인다. 또한, 배경 이미지에는 url("이미지")만 아니라 그라디언트 배경도 넣어줄 수 있다!

블록레벨 요소 <p>의 배경색과 배경 이미지

                                    
                                        
                                    
                                

지정한 이미지가 불투명해서 아래의 배경색이 나타나지 않을지라도, 배경색을 함께 지정해주는 것이 좋다 - 이미지를 불러올 수 없는 상황에서 배경색이 이미지를 대체할 수 있기 때문이다!

기본적으로 배경 이미지는 이미지의 (실제)너비와 높이 및 자연스러운 가로/세로 비율을 유지하면서, 이미지의 좌상단으로부터 시작하여 박스를 다 덮을 때까지 채워진다
                                    
                                        /* 1. 박스보다 작은 이미지는 x, y 방향으로 반복적으로 채워진다 */
                                        .background-sizing_box {
                                            width: 600px; height: 300px; /* 박스 크기 */
                                            background: url('_images/목없는부처님-small.jpg'); /* 이미지 크기: 200 x 242 */
                                        }
                                    
                                
                                    
                                        /* 2. 박스보다 큰 이미지는 좌상단 모서리부터 박스 전체를 채운 뒤 나머지는 잘린다 */
                                        .background-sizing_box-small {
                                            width: 300px; height: 200px; /* 박스 크기 */
                                            background: url('_images/목없는부처님.jpg'); /* 이미지 크기: 331 x 400 */
                                        }
                                    
                                
배경 이미지의 반복: background-repeat
배경 이미지의 크기가 배경을 채우려는 요소보다 작은 경우; 기본적으로는 가로/세로로 반복해서 채워지는데(기본값: repeat), background-repeat: round/space/no-repeat; 등의 값을 주어 변경해줄 수 있다

배경 이미지의 크기가 배경을 채우려는 요소보다 작은 경우; 기본적으로는 가로/세로로 반복해서 채워지는데, background-repeat 속성에 round 값을 주어 이미지가 잘리지 않게 크기를 조절하여 반복하거나, space 값을 주어 끝에서 끝까지 고르게 분배해줄 수도 있다. 또는, background-repeat: repeat-x/y; 값을 주어 원하는 반복 방향을 지정해주거나 no-repeat 값을 주어 반복하지 않도록 설정해줄 수도 있다

                                    
                                        
                                    
                                

원하는 방향으로만 반복하도록 하려면; background-repeat: repeat-x/y; 값을 줄 수 있다!

background-image: url("./_images/남산부석.jpg"); background-repeat: round;

background-repeat 속성에 round 값을 주어 이미지가 잘리지 않게 크기를 조절하여 반복하거나, space 값을 주어 끝에서 끝까지 고르게 분배해줄 수도 있다.

background-image: url("./_images/남산부석.jpg"); background-repeat: space;

background-repeat 속성에 round 값을 주어 이미지가 잘리지 않게 크기를 조절하여 반복하거나, space 값을 주어 끝에서 끝까지 고르게 분배해줄 수도 있다.

background-image: url("./_images/남산부석.jpg"); background-repeat: no-repeat;

background-repeat: repeat-x/y; 값을 주어 원하는 반복 방향을 지정해주거나 no-repeat 값을 주어 반복하지 않도록 설정해줄 수도 있다

배경 이미지 위치 지정: background-position
background-position: x, y;(콤마로 구분된 하나 이상의 값이 들어간다) 속성으로 배경 이미지 배치의 시작 지점을 설정해줄 수 있다. 으로는 키워드(top/right/bottom/leftcenter)나 px, %를 쓸 수 있는데, 키워드와 숫자 등을 혼합하여 쓸 수도 있다 기본값은 좌상단 모서리인 0, 0(= left top)인데, 양수는 오른쪽 및 아래쪽 방향이 되며, 음수는 그 반대 방향이 된다

background-image: url("./_images/블렌딩모드-매화.jpg");
background-repeat: no-repeat;
background-position: right bottom;

이 위치 지정 방식은 상당히 복잡하고 혼란스러워 간략히만 살펴보니.. 배경 이미지 관련 더 세밀한 조정이 필요해지면; MDN)의 Background-position 문서를 참조하시기 바랍니다 ㅡㅡ;

                                                
                                                    /* 올바른 사용 */
                                                    background-position: left top; /* 좌상단 모서리 ← 기본값(0 0)이다! */
                                                    background-position: top left; /* 좌상단 모서리 ← 서로 다른 축인 경우; 순서는 상관없다! */                                 
                                                    background-position: left 50%; /* 좌단 가운데 */
                                                    background-position: center left; /* 좌단 가운데 ← left(및 left center)와 같다! */
                                                    background-position: right; /* 우단 가운데 ← 키워드 하나만 쓰면; 생략된 값에는 50%(center)가 들어간다! */
                                                    background-position: center; /* 박스 정중앙 ← center 하나는 박스 정중앙이 된다! */
            
                                                    background-position: bottom 70% right; /* 하단으로부터 70% 위 & 우단 */
                                                    background-position: right bottom 70%; /* 우단 & 하단으로부터 70% 위 */
            
                                                    background-position: bottom 70% right 30%; /* 하단으로부터 70% 위 & 우단으로부터 30% 앞 */
                                                    background-position: top 10px right 20px; /* 상단에서 10px 아래 & 우단으로부터 20px 앞 */                                   
            
                                                    /* 잘못된 사용 */
                                                    background-position: 50% left; /* 무슨 50%인지? ← 방향 키워드가 앞에 와야 한다! */
                                                    background-position: left right; /* 동일한 y축이다! */
                                                
                                            

* cf) background: 값[, 값, ..]; 형식으로 배경 스타일을 일괄 설정해줄 수도 있는데(생략된 부분은 기본값으로 간주된다!), 지켜야하는 순서와 규칙도 좀 있고, 코드 읽기에도 많이 혼란스러우니 각각의 속성별로 개별적으로 설정해주는 것을 권합니다!

배경 이미지 2

기본적으로 배경 이미지는 이미지의 (실제)너비와 높이 및 자연스러운 가로/세로 비율을 유지하면서, 이미지의 좌상단으로부터 시작하여 박스를 다 덮을 때까지 채워진다

배경 이미지 부착: background-attachment
background-attachment: fixed/local; 속성(기본값: scroll)을 사용하면 배경 레이어가 화면에 표시된 후 배경 이미지(백그라운드 레이어의 일부 이미지)의 고정 위치 동작을 수정해줄 수 있다

기본값인 scroll은 배경을 웹페이지 자체에 고정하며 해당 요소에 스크롤이 존재해도 배경은 함께 스크롤되지 않는다 - 하지만, 웹페이지가 스크롤되면 함께 스크롤된다 곧, 웹페이지의 테두리에 배경 이미지가 부착되어 있다고 보면 된다!


                                    
background-attachment: local;

기본값인 scroll에서 간혹 부정확하게 움직이던 문제를 수정하기 위하여 Css에 추가된 local 값은 요소의 배경을 실제 요소의 컨텐츠에 부착한다. 따라서 웹페이지가 스크롤될 때도 요소의 배경은 스크롤되지 않는다 곧, 요소가 스크롤되어야 배경도 함께 스크롤된다!


                                    
background-attachment: fixed;

fixed 는 배경을 뷰포트에 대해 고정한다 - 곧, 해당 요소에 스크롤이 존재해도, 또 바깥 컨테이너 요소가 스크롤되어도 배경은 함께 스크롤되지 않으면서, 항시 자신의 원래 자리를 고수한다!


                                    

배경 이미지 3

기본적으로 배경 이미지는 이미지의 (실제)너비와 높이 및 자연스러운 가로/세로 비율을 유지하면서, 이미지의 좌상단으로부터 시작하여 박스를 다 덮을 때까지 채워진다

배경 영역 설정: background-origin
기본적으로 배경 이미지는 이미지의 (실제)너비와 높이 및 자연스런 가로/세로 비율을 유지하면서, 이미지의 좌상단으로부터 시작하여 박스를 다 덮을 때까지 채워지는데, background-origin: padding-box/border-box/content-box; 속성은 해당 박스와 연결된 배경 영역(의 시작 지점)을 설정해준다(기본값: padding-box)

padding-box;

border-box;

content-box;


* cf)background-origin 속성은 또한, background-clip: border-box/padding-box/content-box; 속성과도 깊이 연관되어 있다. 곧, 위와 같이 background-origin 속성으로 배경 이미지 표시 영역을 설정해줄 수 있지만(이는 모두 background-clip 속성이 기본값인 border-box로 주어져 있는 상태에서임), 그보다 먼저 background-clip 속성에 다른 값이 주어지면; 맨 밑의 배경 렌더링 영역이 우선적으로 클리핑된다는 점에서 사용상 주의가 필요하다!


이러한 복합 설정은 너무 복잡하고 혼란스러운데다, 또 그렇게까지 깊이 들어갈 필요도 없을 듯하여 더 이상의 추가 설명은 붙이지 않습니다. 꼭 필요하다면; 위 코드들에다 background-clip: padding-box/content-box; 스타일을 추가하여 스스로 확인해보십시오 ㅡㅡ;

텍스트 클리핑: background-clip
background-clip 속성에는 컨텐츠 박스 내의 텍스트를 넘치지 않도록 배경을 자르는 text 값도 있는데, 이 효과가 적용되기 위해서는; 대상 텍스트가 부분적으로 또는 완전히 투명해야 한다!

🐱 🐶

                                    
                                        
                                    
                                
                                    
                                        .text_box_ex {
                                            background-image: url("_images/남산부석-large.jpg");
                                            background-clip: text;
                                            color: transparent; /* 텍스트는 부분적으로 또는 완전히 투명해야한다! */
                                        }
                                    
                                

위 css 코드의 transparent 속성값을 없앤 뒤에 한번 확인해보십시오..

배경 이미지 4

기본적으로 배경 이미지는 이미지의 (실제)너비와 높이 및 자연스러운 가로/세로 비율을 유지하면서, 이미지의 좌상단으로부터 시작하여 박스를 다 덮을 때까지 채워진다

백그라운드 사이징: background-size
background-size: 가로값 세로값; 속성을 이용하면; 가로 세로 크기값(단위는 px이나 %)을 주어 배경 이미지의 실제 크기를 변경할 수 있게 된다. 또는 cover/contain 키워드를 사용할 수도 있다 기본값인 auto 는 이미지의 자연스러운 가로/세로 비율을 유지하면서 필요에 따라 크기가 조정된다
원본 이미지
1. background-size: cover;는 좌상단에서 시작하여 배경 이미지로 박스를 모두 덮는다. 이미지가 더 작은 경우 비율에 따라 확대되면서 선명도를 해칠 수 있고, 이미지가 더 큰 경우 박스 영역을 채운 뒤 비율에 따라 이미지의 나머지 부분은 잘리게 된다
                                    
                                        /* 박스보다 이미지가 작은 경우 */
                                        .background-sizing_box {
                                            width: 600px; height: 300px; /* 박스 크기 */
                                            background: url('_images/목없는부처님-small.jpg'); /* 이미지 크기: 200 x 242 */
                                        }
                                    
                                
                                    
                                        /* 박스보다 이미지가 큰 경우 */
                                        .background-sizing_box-small {
                                            width: 300px; height: 200px; /* 박스 크기 */
                                            background: url('_images/목없는부처님.jpg'); /* 이미지 크기: 331 x 400 */
                                        }
                                    
                                
2. background-size: contain;은 이미지를 늘리거나 자르지 않으면서 좌상단부터 시작하여 이미지의(너비나 높이 중 어느 한쪽이 박스 크기에 딱 맞도록 하여) 가로세로 비율에 따라 채워준다
                                    
                                        /* 박스보다 이미지가 작은 경우 */
                                        .background-sizing_box {
                                            width: 600px; height: 300px; /* 박스 크기 */
                                            background: url('_images/목없는부처님-small.jpg'); /* 이미지 크기: 200 x 242 */
                                        }
                                    
                                
                                    
                                        /* 박스보다 이미지가 큰 경우 */
                                        .background-sizing_box-small {
                                            width: 300px; height: 200px; /* 박스 크기 */
                                            background: url('_images/목없는부처님.jpg'); /* 이미지 크기: 331 x 400 */
                                        }
                                    
                                

그라디언트 배경

는 배경색의 점진적인 변화를 표시하는데, 자체적인 크기는 없다(그저 적용하는 요소의 크기와 같을 뿐이다!). 그라디언트는 이미지이며 이미지를 사용할 수 있는 모든 곳에서 사용할 수 있지만, 일반 이미지와는 달리 Css로 만들어지며 색상, 숫자, 각도 등으로 구성된다 그라디언트는 크기가 없는 배경 이미지이므로 background 속성으로 작성한다!

선형 그라디언트
linear-gradient(색상1, 색상2[, ..]); 함수는 2개 이상의 색상으로 된 이미지를 점진적으로 표시하는데, 가장 간단하게는 2개 이상의 색상만 인수로 주면 자동으로 (위에서 아래로 내려가면서)균등하게 분할하면서 혼합된다 첫번째 인수로 to top/left/right/bottom 을 추가하여 진행 방향을, 숫자deg 를 추가하여 진행 각도를 지정해줄 수도 있다!
                                    
                                        
                                    
                                

색상 숫자% 는 색상 중단점을 설정한다 위 코드의 맨 끝 그라디언트는 black 색상으로 시작하여 45도 각도로 진행되는데, 30% 지점(= 색상 중단점)에서부터는 인접한 white 색상과 혼합된다!


원하는 만큼 색상과 색상 중단점을 추가할 수 있으며, 각각의 그라디언트를 ,로 구분하여 겹쳐줄 수도 있다: background: linear-gradient(45deg, darkred 20%, crimson, darkorange 60%, gold, bisque);

방사형(원 및 타원) 그라디언트
radial-gradient(); 함수는 각도를 지정하는 대신 원하는 경우 위치와 끝 모양을 지정한다. 색상만 주면 center 로 자동 선택되고 상자의 크기에 의해 원 또는 타원 모습이 결정된다
                                    
                                        
                                    
                                
방사형 그라디언트에서도 (선형 그라디언트에서의 진행방향 키워드처럼)키워드를 쓸 수 있다: 기본값인 farthest-corner는 상자의 중심에서 가장 먼 모서리를 정확하게 만나게 되며, closest-corner 는 이와 정 반대로 그라데이션 중심에서 가장 가까운 모서리를 만나게 된다. 한편, closest-side는 그라데이션의 중심에서 가장 가까운 측면과 만나게 된다
                                    
                                        
                                    
                                
원추형 그라디언트
conic-gradient(); 함수는 기본적으로 박스 정 중앙을 중심점으로 하여 12시 방향에서 시작하여 360도 원형으로 진행되는데, 키워드 및 숫자를 써서 중심점 위치를 변경해줄 수도 있다
                                    
                                        
                                    
                                
                                    
                                        .conic-el_3 {
                                            background: conic-gradient(gold 20deg, lightcoral 20deg 190deg, mediumturquoise 190deg 220deg, plum 220deg 320deg, steelblue 320deg);
                                            border: 5px solid grey; border-radius: 50%; /* 5px 굵기의 테두리를 두른 원형 박스 */
                                        }
                                    
                                

이 그라디언트는 각 색상별 각도에다, 둥근 테두리로 둘러싸서 원형 모양으로 만들었다!

그라디언트의 반복
위 각각의 그라디언트들을 반복하는 repeating-linear/radial/conic-gradient(); 함수들도 있다
                                    
                                        .linear-repeat_ex { background: repeating-linear-gradient(to top left, lightpink, lightpink 5px, white 5px, white 10px); }
                                        .radial-repeat_ex { background: repeating-radial-gradient(powderblue, powderblue 8px, white 8px, white 16px); }
                                    
                                

그라디언트를 직접 만드는 것은 재미도 없고, 수고스럽게 힘들이면서 많은 시간을 할애해야 하는 고된 작업이니,, 그라디언트를 자동으로 만들어주는 등의 그라디언트 자동생성기를 이용하는 것도 고려해보십시오 - 물론, 여유가 있다면; 폼나게 한번 만들어보셔도 좋고요 ^^

Css 변수와 함수

사용자가 정의하는 Css 속성, 곧 는 Css 코드의 값을 토큰화할 수 있는 변수 로서, 캐스케이딩의 영향도 받는다(이는 상황에 맞게 조작하거나 재정의할 수 있음을 의미한다!). 한편, 는 요청에 대한 을 반환하기 위해 특별한 데이터 처리나 계산을 수행하는 문으로서, 함수 이름으로 호출하는데, 리턴값 을 계산하기 위해 인수 를 받을 수도 있다

변수와 함수
Css 변수에는 문서 전반에 걸쳐 재사용할 임의의 (만!)을 담는데, 이를 이용하면 한 곳에 을 저장해두고서.. 다른 여러 곳에서 필요할 때마다 참조 하여 가져올 수 있는데, 이 토큰화된 var() 함수를 써서 접근할 수 있다 - 곧, Css의 var() 함수는 Css 변수의 을 다른 속성의 으로 설정해줄 때 사용된다!
[ Css 변수 작성 및 사용하기 ]
                                        
                                            :root { --default-color: green; } /* 전역 Css 변수 --default-color 선언 및 값 설정 */
                                            .def-color { /* 사용자정의 속성 .def-color 선언 */
                                                /* var(); 함수를 써서 Css 변수 --default-color에 담긴 값을 가져온다 */
                                                background-color: var(--default-color); /* 사용자정의 속성 .def-color의 배경색 설정 */
                                            }

                                            :root { --main-bg-color: pink; } /* body용 Css 변수 --main-bg-color 선언 및 값 설정 */
                                            body {
                                                /* Css 변수값을 body의 background-color에 속성값으로 넣는다 */
                                                background-color: var(--main-bg-color);
                                            }
                                        
                                    

위 코드의 var(--default-color); 함수는 값으로 반환하려는 Css 변수(--default-color)을 인수로 사용하며, 해석된 값을 요청자에게 반환한다 참고로, Css 변수명 앞에는 --를 붙여야 하며 대소문자를 구분한다!


* cf) 주어진 변수가 아직 정의되지 않았을 때, var(); 함수의 Css 변수값에 다수의 대체값들을 옵션으로 추가해줄 수 있다: var(--main-bg-color, blue, red[, ..]) 이는 사용자정의 컴포넌트 및 Shadow DOM으로 작업할 때 유용하게 활용된다!


스크립트에서는 Css에서 표준 속성을 사용하는 것과 같은 방식으로 Css 변수값을 넣어주면 된다: 대상요소.style.setProperty("--my-var", myValue + 1);

계산 함수: calc();
Css의 calc(); 함수는 모든 대상에서, 모든 값과 연산기호 사용이 가능하다. 이 함수는 단일 수학 표현식을 인자로 받는데, 이 인자는 길이 length, 숫자 number, 각도 angle 및 주파수 frequency 등.. 다양한 유형의 혼합일 수 있고, 단위 또한 혼합할 수 있다
                                    
                                        :root { --root-height: 5rem; }
                                        
                                        .my-element {
                                            height: calc(var(--root-height) * 3); /* height: 15rem; */
                                        }
                                    
                                
Css의 calc(); 함수를 쓰면 고정된 너비의 여백을 가진 블록레벨 요소를 쉽게 배치할 수 있고, 입력폼 등이 컨테이너 박스 바깥으로 나가지 않도록 너비를 제한해주는 것도 간단하다

width: calc(100% - 5em);

                                    
                                        
                                    
                                
                                    
                                        .inner_calc_box {
                                            width: calc(100% - 5em); /* 박스 너비 설정 */
                                            margin: 0 auto; /* 박스 정중앙 배치 */
                                            color: white; background-color: grey;
                                        } .inner_calc_box p { text-align: center; } /* 텍스트 정중앙 배치 */
                                    
                                

참고로, 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(); 함수는 선택한 요소의 속성값을 검색하여 스타일시트에서 사용하는 데 쓰이는데, 가상요소에서도 사용할 수 있다. 이 경우 가상요소의 원래 요소에 있던 속성값이 반환된다

World

                                    
                                        
                                    
                                
                                    
                                        [data-hello]::before { content: attr(data-hello) " "; }
                                    
                                

예컨대, a::after { content: attr(href); }라면; 여기서, attr(); 함수는 <a> 요소의 href 속성값을 가져와서 ::after 가상요소의 content로 설정한다 곧, <a> 요소의 href 속성값을 변경하려는 경우; 이 content 속성에 자동으로 반영되는 것이다!

데이터 소스 가져오기: url();
URL은 이미지나 글꼴 등 리소스를 가리키는 문자열로서 background-image, cursor, list-style 등 다양한 속성에서 사용되는데, url("데이터 소스"); 함수를 써서 URL의 데이터 소스(따옴표로 묶어야 한다!)를 불러와 이미지, 글꼴 및 컨텐츠 등을 표시할 수 있다:
                                    
                                        .container { background-image: url('/images/image.jpg'); }
                                    
                                

Css 3) MediaQuery

반응형 웹디자인은 웹페이지가 모든 화면 크기와 해상도에 즉각적으로 반응하여 렌더링되도록 하면서도 사용자 편의성을 보장하는 웹디자인 접근방식으로서, 멀티 디바이스 웹을 위한 최신 디자인 방식이다!

미디어쿼리와 반응형 웹디자인
미디어쿼리는 단말기의 유형, 화면 해상도 및 뷰포트 너비 등에 즉각적으로 반응하여 웹사이트나 앱의 스타일을 변경하도록 한다 - 곧, 미디어쿼리는 컨텐츠 자체를 변경하지 않고도 장치의 해상도나 뷰포트 너비, 미디어 유형 등에 따르는 스타일을 설정해준다
[ 미디어쿼리 선언 ]
                                        
                                            
                                        
                                    

미디어 타입,로 구분하여 복수로 나열할 수 있으며, 기본값인 all(모든 장치) 외의 다른 값으로는 screen(디바이스 화면), print(인쇄 결과물 및 결과 미리보기), speech(음성 합성장치)가 있다. (조건)and, not 등의 연산자로 이어서 작성할 수 있다: @media screen, print and (조건) not (조건) { .. }


* cf) 미디어쿼리의 (조건)에서 [min/max-]width/height: 값;은 뷰포트의 너비/높이, [min/max-]device-width/height: 값;은 단말기의 너비/높이를 지정한다. [min/max-]aspect-ratio: 가로/세로;은 뷰포트의 가로/세로 화면비, [min/max-]device-aspect-ratio: 가로/세로;은 디바이스의 가로/세로 화면비를 지정한다. orientation: landscape/portrait;는 화면의 가로/세로 방향을 지정한다 참고로, max-는 '이하'일 때, min-은 '이상'일 때를 의미한다!

미디어쿼리반응형 웹디자인을 만드는 핵심 구성요소로서, 스타일시트 내에 여러 미디어 쿼리를 추가하여 다양한 화면 크기에 가장 적합하도록 전체 레이아웃 및 일부 요소들을 조정할 수 있다
                                    
                                        @media only screen and (min-width: 80rem) { /* 스크린에서만 & 너비 80rem 이상일 때; */
                                            .container { margin: 1em 2em; }
                                        }
                                    
                                

반응형 헤더

위 헤더는 @media로 설정한 반응형이므로 뷰포트 너비 600px 을 기준으로 그 크기가 바뀝니다. 화면 너비를 늘리고 줄이면서 확인해보세요..

                                    
                                        
                                    
                                
                                    
                                        .responsiveh4 { font-size: 1rem; }

                                        @media (min-width: 600px) {
                                            .responsiveh4 { font-size: 2rem; }
                                        }
                                    
                                

미디어쿼리는 단지 페이지 레이아웃의 변경에만 사용할 수 있는 것이 아니다 - 이 예제에서처럼, 모든 html 요소를 대상으로 사용할 수 있다!


* cf) 뷰포트 크기에 반응하는 vw 단위를 사용하면; 미디어쿼리 없이도 반응형 타이포그래피로 작동된다: h1 { font-size: 2vw; } 단, 이 경우에는 사용자가 글꼴 크기를 설정할 수 없다는 단점이 있는데, 이 문제는 Css의 calc() 함수를 써서 해결할 수 있다: h1 { font-size: calc(1.5rem + 2vw); }

뷰포트 메타태그

뷰포트는 웹 컨텐츠를 볼 수 있는 창 영역이다. 이것은 렌더링된 문서 페이지와 반드시 같은 크기는 아니며, 필요 시; 웹 브라우저는 사용자가 스크롤하여 모든 컨텐츠에 액세스할 수 있도록 스크롤 바를 제공하게 된다!

뷰포트 선언
는 모바일 브라우저에 뷰포트의 너비를 기기 너비로 설정하고 문서의 크기를 의도한 크기의 100% 로 조정하여 문서를 모바일에 최적화된 크기로 표시해야 함을 알려준다. 곧, 뷰포트 선언은 데스크탑 화면과는 다른 스마트 기기(기본 뷰포트 너비: 980px)의 보이는 영역을 기기의 실제 화면 크기로 변경하여 미디어 쿼리가 기기의 화면 크기를 정확히 감지하도록 해주는 것이다
                                    <meta name="viewport" content="width=device-width, height=divice-height, initial-scale=1">
                                

여기서 width=device-width, height=device-height는 뷰포트 너비, 높이의 100%를 의미한다. initial-scale 은 페이지가 처음 로드될 때의 줌 값이다(0.1 ~ 10, 기본값: 1)

웹사이트의 성격에 맞추어 뷰포트를 특정 크기로 설정할 수도 있다 - 예컨대, width=320, initial-scale=1 은 작은 스마트기기의 디스플레이에 정확히 맞추기 위해 사용될 수 있는데, 이는 브라우저가 페이지를 더 큰 크기로 렌더링할 때 문제를 일으킬 수 있다!
                                    <meta name="viewport" content="width=320, initial-scale=1">
                                

초기 또는 최대 크기를 설정하는 페이지의 경우, 이는 width 속성이 실제로 최소 뷰포트 너비로 변환된다는 것을 의미한다 - 예컨대, 레이아웃에 최소 320px의 너비가 필요한 경우 위와 같은 옵션을 사용할 수 있다 화면이 320px보다 크면; 브라우저는 줌인 대신 화면에 맞게 뷰포트를 확장하게 된다!


* cf) 뷰포트는 웹 컨텐츠를 볼 수 있는 창 영역을 말하는데, 데스크탑의 뷰포트 영역은 [브라우저 개발자 화면]에서 확인할 수 있다(스마트 기기는 대부분 980px 크기로 설정되어 있다). 스마트폰과 같이 작은 기기는 불러온 웹 문서를 화면보다 넓은 이 가상 뷰포트에서 렌더링한 다음, 렌더링된 결과를 기기 화면 크기로 축소하고.. 이후 사용자는 페이지의 다른 영역을 더 자세히 보기 위해 확대/축소할 수 있게 된다. 그러나 이러한 메카니즘은 미디어쿼리를 사용하여 좁은 화면에 최적화된 페이지에는 적합하지 않다(예컨대, 가상 뷰포트가 980px인 경우 640px 또는 480px 이하에서 시작되는 미디어쿼리는 사용되지 않으므로 이러한 반응형 디자인 기법의 효과는 제한된다!) 뷰포트 선언은 좁은 화면 장치에서 가상 뷰포트의 이러한 문제점을 완화시켜주는 역할을 하는 것이다!

대체요소 객체

Css에서 란 자신의 표시 결과가 Css의 범위를 벗어나는, Css 서식모델과는 분리된 외부 객체 인 요소로서 <img>나 <video> 요소가 대표적이다 Css는 대체요소 객체의 배치 위치 및 크기를 조정하여 영향을 줄 수는 있지만 그 내용물 자체를 변경할 수는 없다!

대체요소 객체 배치하기
object-position: 값1 값2; 속성은 <img>나 <video> 등 대체요소 객체의 배경 박스 내 컨텐츠 배치 위치( )를 %나 키워드로 지정하는데(앞쪽 값은 좌측 면이 기준이 되고, 뒤쪽 값은 상단 면이 기준이 된다), 대체요소 객체가 덮지 않은 부분은 요소의 배경이 드러나게 된다
(* 배경 박스) 기본값
                                            
                                                
                                            
                                        
                                            
                                                .object-position_image1 { /* 대체요소 객체의 배경 박스 */
                                                    width: 200px; height: 200px; background-color: silver;
                                                    object-fit: none;
                                                }
                                            
                                        

여기서는 object-position 값을 따로 주지 않았으므로, 기본값인 50% 50%가 된다!

단위로는 %, 키워드(top, right, bottom, left) 등을 쓸 수 있다. 예컨대, 기본값인 50% 50% 는 부모박스의 정중앙에 배치되고, 키워드 right top 으로 주면; 우상단 모서리로부터 맞추어지며, left bottom 으로 주면; 좌하단 모서리로부터 맞추어진다. px 단위 또한 사용할 수 있고, 단위를 혼합할 수도 있다:
object-position: right top object-position: left bottom object-position: 100% 30px

* cf) 배경 박스보다 더 큰 값을 주어 지구 바깥으로 보내버릴 수도 있다!

object-position: 300px 300px
                                            
                                                
                                            
                                        
객체 맞춤
Object-fit: 키워드; 속성은 대체요소 객체가 부모 박스에 맞춰 채워지도록 다양한 방식으로 그 크기를 조정하는데 사용되는데, none 값은 대체 콘텐츠의 크기를 조절하지 않는다
object-fit: none;
매화
                                    
                                        
                                    
                                
                                    
                                        .object-position_image2 { /* 대체요소 객체의 배경 박스 */
                                            width: 300px; height: 200px; background-color: silver;
                                        }
                                    
                                
기본값인 fill 에서는 컨텐츠가 부모 컨테이너를 꽉 채우는데, 필요한 경우 박스에 맞게 늘어나거나 줄어들게 된다
object-fit: fill; (기본값)
매화
                                    
                                        
                                    
                                
contain 값을 주면; 대체되는 컨텐츠는 부모 컨테이너에 맞추어 종횡비를 유지하면서 크기가 조정된다. cover 값을 주면; 대체되는 컨텐츠는 부모 컨테이너에 맞추어 종횡비를 유지하면서 크기가 조정되는데, 원본 개체의 나머지 부분은 잘려나갈 수 있다
object-fit: contain;
매화
object-fit: cover;
매화
➥ Css) 이미지 쉬프트

가끔은, 이미지를 좌/우 사이드 방면으로 이동시켜야할 때가 있는데, 이미지의 부모 요소에서 .img-shifted shift-left/right 사용자정의 클래스를 추가해주면; 이미지가 컨테이너 바깥으로 빠져나가게 된다

                                                    
                                                        
                                                    
                                                
                                                    
                                                        .bg-image { position: absolute; left: 0; bottom: 0; right: 0; top: 0; }
                                                        
                                                        .bg-cover {
                                                            background-repeat: no-repeat; background-position: center center; background-size: cover;
                                                            backface-visibility: hidden;
                                                        }
                                                        
                                                        .bg-contain {
                                                            background-repeat: no-repeat; background-position: center center; background-size: contain;
                                                            backface-visibility: hidden;
                                                        }
                                                        
                                                        .img-shifted { position: relative; overflow: hidden; }
                                                        .img-shifted.shift-left { width: 100%; float: right; }
                                                        .img-shifted.shift-right { width: 100%; }
                                                    
                                                

bg-cover 값을 줄지 bg-contain 값을 줄 지는 이미지의 크기에 맞춰 적절한 값으로 선택해주면 됩니다..

Css 플로팅

사실, 최근에는 훨~씬 간편하고 더욱 유용한 플렉스박스와 그리드로 쉽게 페이지 레이아웃을 구성할 수 있기에, (이미지와 텍스트간 조화로운 배치라는 플로팅의 원초적 기능을 제외한다면)예전처럼 으로 쌩 머리 짜내면서 페이지 레이아웃을 짤 일은 없습니다만.. 그래도, 이미지와 텍스트간 조화로운 배치를 위해서는 여전히 쓸모가 있으니 간단히 알고 가기로 합니다

플로팅 및 해제
1. float: left/right; 속성은 박스의 플로팅 방향을 지정하며, clear: both; 속성은 (다음에 나오는 요소에서 사용되어)플로팅을 해제한다
눈내린불국사

웹문서에서 이미지와 텍스트를 나란히 배치하고자 할 때, 이미지에 float: 속성 값으로 right를 주면; 이미지는 우측에서부터 배치되는데.. 이 때 너비값은 이미지 표시에 필요한 만큼만 차지하고 나머지 영역은 비워지면서 이 빈 영역에 텍스트가 자리잡게 된다 float 속성을 사용할 때 플로팅 요소 다음에 오는 요소의 레이아웃이 무너질 수 있으므로, 반드시 플로팅을 해제해주어야 한다!


(* 다음에 나오는, <hr> 요소에서 <hr style="clear: both;">로 플로팅을 해제함)

                                    
                                        
                                    
                                
2. 플로팅을 해제하기 위해서는, 부모요소 자체에서 overflow: hidden;이나 overflow: auto; 속성값을 설정해주어도 되지만, 아래 예제에서와 같이 뒤에서 가상요소로 넣어주는 방식이 다른 요소의 스타일 정의와 충돌할 일도 없고, 코드 읽기도 쉬워진다
박스(1) float: left;
박스(2) float: left;
박스(3) float: right;
박스(4) 플로팅을 해제되지 않아 겹쳐서 표시된다!
박스(5) 박스5::before { content:""; display:block; clear:both; }
                                    
                                        
                                    
                                
                                    
                                        /* 여기서(곧, .ex_bxx5 요소 앞에서) 플로팅 해제함 */
                                        .ex_bxx5::before { /* 플로팅 해제용 가상요소 */
                                            content: ""; display: block; clear: both;
                                        }
                                    
                                

참고로, 예기치 않은 결과를 만들지 않으면서 (부모요소에서)플로팅을 해제하는 가장 확실한 최신 코드는 부모요소에서 display: flow-root; 값을 주는 것이다!

Css 좌표계

Css 표준 좌표계에서 위치는 특정 기준점으로부터 x, y 방향으로 떨어진 수평, 수직 오프셋 값(px)으로 지정된다 - 곧, 주어진 컨테이너 박스의 좌상단 모서리를 원점(0, 0)으로 하는 (x, y) 좌표(양수는 박스 안쪽 방향, 음수는 박스 바깥쪽 방향)이다

표준 좌표계
Css 객체모델에서 사용되는 표준 좌표계에는 스크린, 뷰포트, 문서, 오프셋을 기준으로 하는 좌표계가 있다
스크린 좌표계에서는 스크린 화면의 좌상단 모서리가 원점이 되며, 창의 좌상단 모서리 좌표는 문서의 내용이나 수행된 스크롤에 관계없이 항상 (0, 0)이다. 하지만, 창을 이동하거나 디스플레이 해상도를 변경하거나 하는 경우에는 문서 내 주어진 위치값이 변경될 수 있다!
뷰포트 좌표계는 이벤트가 발생한 뷰포트 또는 탐색 맥락의 좌상단을 기준으로 한다. 이는 문서가 보여지는 (메뉴바와 툴바, 탭 등은 제외한)전체 보기 영역으로서, 문서를 스크롤하면 문서 내 특정 위치의 뷰포트 좌표가 변경된다 - 예컨대, 아래로 스크롤한 다음, 현재 화면에 보이는 좌상단 모서리가 뷰포트 (0, 0) 좌표가 된다!

문서 좌표계는 렌더링된 전체 웹문서의 좌상단 모서리를 기준으로 한다 - 곧, 문서 내의 요소 안에 있는 점은 레이아웃이 변경되어 요소가 이동하지 않는 한; 사용자가 문서에서 수평 또는 수직으로 스크롤한 후에도 동일한 좌표를 가지게 된다 하지만, 일반적으로 웹에서 문서 좌표는 별 의미가 없다 - 왜냐하면, 웹 문서는 항상 스크롤되기에!

* 이 그림은, 뷰포트 및 문서 좌표계에 대한 이해를 돕기 위해 MDN) 표준 좌표계 문서에서 잠시 빌려온 것입니다:

표준 좌표계
오프셋 좌표계는 추적 중인 요소 또는 이벤트가 발생한 요소의 좌상단 모서리를 기준으로 하는 상대적 위치값이다 - 예컨대, 마우스 이벤트가 발생하면 이벤트의 offsetXoffsetY에 지정된 마우스 위치는 이벤트가 전달된 요소의 좌상단 모서리를 기준으로 상대적으로 주어진다 원점은 padding-leftpadding-top에 의해 지정된 거리만큼 안쪽으로 들어가게 된다!
wave