html 5) Study 2

[웹코딩 가이드] 홈

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

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


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


Css Stylesheets

html은 컨텐츠의 모양을 정의하는 것이 아니라 의미를 담은 컨텐츠를 구축하는데 사용되며, 웹페이지의 모양 꾸미기는 Css Stylesheet의 영역이다!

웹문서에 스타일 적용하기
Css 스타일시트는 html 문서에 있는 특정 부분들에 원하는 스타일을 적용하는데.. 아래 코드는 특정 요소(여기서는, 현재 문서 내의 모든 <p> 요소)에 대한 스타일을 설정하고 있다
[ Css Stylesheet 선언 및 정의 ]
                                        
                                            p { /* 스타일을 적용할 태그 선택자 p 선언 */
                                                color: red; /* p 태그 내 모든 글자들을 red 색상으로 표시한다 */
                                                width: 400px; /* p 문단의 가로 너비는 400px로 설정한다 */
                                            }
                                        
                                    

스타일 선언은 선택자 { 속성: 값; 속성: 값; .. }으로 이루어지는데, 속성명속성값 모두 대/소문자를 구분한다!

1. 외부 스타일시트 파일 링크하기: Css 코드를 별도의 파일로 작성하고(예컨대, my-style.css), html 문서에서 <link>하여 사용한다
[ 외부 Css 파일 불러오기 ]
                                        
                                            /* my-style.css 파일 */
                                            h1 { color: red; }
                                            p { color: green; }
                                        
                                    
                                        
                                            
                                        
                                    

이제 이 html 문서의 <h1>과 <p> 태그는 불러온 스타일시트 파일에 작성된 코드에 맞추어 스타일이 적용됩니다 - 직접 위 my-style.css 파일을 만들어 적당한 위치에 저장하고, 이 html 문서도 작성하여 확인해보십시오 외부 Css 파일의 href 접근 경로는 웹코딩 시작하기파일접근 상대경로 관련 부분을 참조하십시오..

2. 현재 문서 내부에서 스타일 정의하기: 아래 코드처럼, <link> 부분은 제거하고, 외부 css 파일의 내용을 그대로 <style> .. </style> 안으로 옮겨주면 됩니다
[ 현재 문서 내부에서 스타일 작성하기 ]
                                        
                                            
                                        
                                    

한 문서에서 바로 Css 스타일시트 내용을 확인할 수 있어, 웹코딩 실습 때는 이게 편합니다만.. 이 내부 스타일은 현재 문서에서만 사용 가능하고, 연결된 딴 문서들에서도 사용하고자 하면 또 각각 따로 넣어줘야 하니 손품 고생은 좀 해야할 듯합니다. 또한, Css Stylesheet를 한곳에 넣어두고 불러다 쓴다면; 사이트 내부 다른 페이지들을 탐색할 때마다 (브라우저가 외부 파일을 캐시할 수 있기에)재차 다운로드할 필요가 없어지므로 웹서핑 속도 측면에서도 훨씬 유익합니다 덧붙여, 위 코드의 <body> 안에 있는 인라인 스타일 관련 내용도 꼭 읽어보고 넘어가십시오..


본격적인 학습을 시작하기 전에, MDN에 있는 을 찬찬히 한번 읽어보시길 권합니다 - 브라우저가 웹문서를 불러올 때, 웹문서의 컨텐츠와 Css 스타일을 어떻게 결합하여 나타내는지 간결히 잘 설명해주고 있습니다..

스타일시트 작성 가이드
아래는, 스타일시트 코드 작성 시 표준으로 삼을만한 입니다. 본인에게 편한 것이 우선이지만, 생판 모르는 남이 와서 코드를 읽어볼 때도 혼잡하지 않도록 작성하시길 권합니다 - 머, 강제는 아닙니다 ^^
1. 스타일시트 작성 시 클래스 이름 작명규칙, 색상 표기방식 등에서의 일관성을 유지하고, 코드를 알아보기 쉽도록 작성한다:
                                    
                                        .box-bg {
                                            color: white; /* 글자색 */
                                            background-color: black; /* 배경색 */
                                        }
                                    
                                
2. 너무 구체적인 선택자를 만드는 것은 코드를 혼란스럽게 하므로, 보편적으로 사용할 선택자를 만드는 것이 좋다:
                                    
                                        /* article 내부 p 요소들 중 .box 클래스를 지닌 요소 */
                                        article p.box { border: 1px solid #ccc; } /* 별로임 ! */

                                        /* .box 클래스를 지닌 요소 */
                                        .box { border: 1px solid #ccc; } /* 좋아요 ~ */
                                    
                                
3. 모든 페이지에 걸쳐 일반적으로 적용되는 스타일과 각각 부분적으로만 사용되는 스타일을 분리하여 작성하면 스타일의 유지/보수에 유용하다:
                                    
                                        /* || 일반 스타일: 일반적으로 적용되는 기본 스타일들에 대한 규칙들 */
                                        body { .. }
                                        h1, h2, h3, h4 { .. }
                                        ul { .. }
                                        blockquote { .. }

                                        /* || 유틸리티: 다양한 요소에 따로 적용하고자 하는 스타일링 옵션들 */
                                        .no-bullets {
                                            list-style: none; margin: 0; padding: 0;
                                        }

                                        /* || 내비게이션 관련: 페이지 레이아웃, 페이지 헤더 및 로고, 푸터, 사이드바 등의 내비게이션 스타일링 등.. */
                                        .main-nav { .. }
                                        .logo { .. }

                                        /* || 컨텐츠, 페이지 및 구성 요소에 따라 세분화된 특정 섹션 항목에 대한 설정들.. */
                                        .product-listing { .. }
                                        .product-box { .. }
                                    
                                
4. 필요한 곳에서 적절히 주석을 달아준다 - 논리 섹션으로 주석들을 분리하고, 코드에 나타나지 않는 문자열(예컨대, ||)을 써서 검색 시 바로 점프할 수 있도록 하는 것도 유용하다:
                                    
                                        /* || General styles */
                                        ..
                                        
                                        /* || Typography */
                                        ..
                                        
                                        /* || Main Navigation */
                                        ..
                                    
                                

에는 모든 프로젝트에 사용할만한 일련의 기본 스타일을 작성해두고 있습니다 - 가져와서 기본 스타일로 넣어주고, 자신에게 필요한 스타일만 추가로 작성(및 수정)하여 사용하면 편합니다 참고로, 부트스트랩을 사용한다면; 부트스트랩에 기본 설정된 스타일을 사용하면 됩니다 - 물론, 이 또한 자신의 사용자 정의 스타일을 추가하고 수정하여 사용할 수 있습니다!

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>와 관련해서는 부모 가 된다. 이 <p> 요소들은 서로 형제간 이며, , 동생들막내 가 된다 이러한 관계는 각각에 대해 서로 상대적이다!

[ 요소 관계(위치) 선택자 ]
                                        
                                            div p { .. } /* div에 속한 모든 p 요소들(후손들: 자식, 손자, ..) */
                                            div > p { .. } /* div 내부 바로 밑 단계에 위치한 p 요소들(자식들) */
                                            h1 ~ p { .. } /* h1과 같은 단계에서 뒤에 나오는 모든 p 요소들(모든 형제들) */
                                            h1 + p { .. } /* h1과 같은 단계에서 바로 뒤에 나오는 p 요소 하나(바로 아래 형제) */
                                        
                                    

Css 선택자는 위쪽을 대상으로 선택할 수는 없고, 하위 요소를 대상으로 하여 아래쪽으로만 선택할 수 있다 는 점은 기억해둘만한 가치가 있다 참고로, <table> 태그에서는 계층구조상 브라우저 차원에서 <thead>, <tbody>, <tfoot>가 자동으로 추가되므로, 사용시 주의할 필요가 있다!


* cf) 전체 선택자 *는 모든 하위 요소를 대상으로 한 스타일 적용에 사용되는데, 보통 문서의 기본 스타일 초기화에 사용된다:

                                    
                                        * { 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+클릭이 있으니 굳이 더 어렵게 기억하며 다 배워야할 필요는 없다는 생각입니다 에밋코딩 기법들 다 배우자면 두뇌 훈련에는 상당히 유용할 듯하지만.. 그런 목적이 아니라면; 코딩 시의 단순 손노동을 줄여주는데 필요한 정도로만 익혀두시면 될 듯합니다 ^^

html Scripts

는 웹문서에 동적인 움직임을 주기위해 만들어진 프로그래밍 언어로서, 자바스크립트로 작성한 프로그램이 스크립트인데, 브라우저에 내장된 자바스크립트 엔진은 스크립트 코드를 읽어들여서 분석하고(= 파싱), 컴퓨터가 알 수 있는 기계어로 번역하여(= 컴파일), 그 코드 내용을 실행해나가게 된다

웹문서에 스크립트 적용하기
스크립트는 html 문서 내부에서 작성해주거나, 또는 외부 스크립트 파일을 불러올 수도 있는데.. 스크립트 코드는 우선, 예제 연습용으로 간단한 html 파일을 만든 후(예컨대, _js.html), 다음 2가지 방법으로 웹문서에 적용할 수 있다
1. _js.html 문서의 </body> 바로 위 <script> .. </script> 내부에서 인라인 스크립트 코드로 작성해준다:
[ 인라인 스크립트 작성하기 ]
                                        
                                            <body>
                                                인라인 스크립트 작성하기
                                            
                                                <script>
                                                    console.log("이스케이프 문자: \u03c0") // 이스케이프 문자: π
                                                    console.log("웃는 얼굴 이모지: \u{1F600}") // 웃는 얼굴 이모지: 😀
                                                </script>
                                            </body>
                                        
                                    

위 스크립트 코드를 실행한 결과는 [브라우저 개발자화면][콘솔] 탭에서 확인할 수 있습니다 _js.html 파일을 실행한 뒤 마우스 우측버튼 단축메뉴의 <검사> 를 클릭하면; [브라우저 개발자화면]으로 들어가게 되고, 거기서 다시 [콘솔] 탭으로 찾아가면 됩니다..

2. *.js 스크립트 파일을 만들어(예: _js.js) 그 안에서 스크립트 코드를 작성한 뒤, _js.html 문서에서 <script>의 src 속성으로 _js.js 파일을 불러온다:
[ 외부 스크립트 파일 불러오기 ]
                                        
                                            /* _js.js 파일 */
                                            console.log("이스케이프 문자: \u03c0") // 이스케이프 문자: π
                                            console.log("웃는 얼굴 이모지: \u{1F600}") // 웃는 얼굴 이모지: 😀
                                        
                                    
                                        
                                            <!-- _js.html 문서 -->
                                            <body>
                                                스크립트 불러오기
    
                                                <script src= "_js.js"></script>
                                            </body>
                                        
                                    

* cf) 웹문서의 html 코드는 일반적으로 위에서 아래로 순서대로 로드되고 실행된다. 따라서, 적용하려는 html 및 Css 코드보다 스크립트가 먼저 불려지면 오류가 발생할 수 있다. 그런 이유로 인라인 스크립트 코드는 </body> 직전에 넣어주어야 한다!

                                    
                                        <body>
                                            ..
                                        
                                            <!-- 1. html 코드 내부에 넣는 스크립트 코드는
                                                이벤트 리스너에서 'DOMContentLoaded' 속성을 사용해주어야 한다
                                            -->
                                            <script>
                                                document.addEventListener("DOMContentLoaded", () => { // DOM이 다 로드된 이후.. ← 이는 defer와 같다!
                                                    // 스크립트 코드 실행
                                                })
                                            </script>
                                        
                                            <!-- 2. </body> 바로 직전에 넣어준 스크립트 코드는
                                                'DOMContentLoaded'를 사용하지 않아도 defer와 같은 방식으로 작동한다!
                                            -->
                                            <script>
                                                const buttons= document.querySelectorAll("button")
                                        
                                                for(const button of buttons) {
                                                    button.addEventListener("click", createParagraph);
                                                }
                                            </script>
                                        </body>
                                    
                                

이 경우, 모든 html 코드를 읽어온 이후 스크립트를 불러오게 되지만, 문제는 DOM을 모두 불러오기 전에는 스크립트의 로딩과 분석 또한 완전히 중단된다는 점이다!

➥ async 대 defer

asyncdefer는 모두 브라우저가 페이지의 다른 내용을 불러오는 동안 스크립트를 별도 쓰레드에서 불러오므로 스크립트를 가져오는 동안에도 페이지 로딩은 중단되지 않는다 - 단, 양자간에는 미묘한 차이점이 존재한다 HTML 명세서 스크립트 로딩 비교표 참조

                                        
                                            <!-- 1. 외부 스크립트 파일 불러오기: 'defer' -->
                                            <script src="js/default-js.js" defer></script>
                                        
                                    

defer 스크립트는 순서를 유지한 채로 모든 컨텐츠를 다 불러온 이후에 실행된다. 따라서, 다른 스크립트에 의존하거나 DOM 로딩을 필요로 하는 경우에 사용된다 이는 </body> 바로 직전에 스크립트 코드를 넣어주는 경우와 같다!

                                        
                                            <!-- 2. 외부 스크립트 파일 불러오기: 'async' -->
                                            <script src="js/default-js.js" async></script>
                                        
                                    

async 스크립트는 다운로드가 끝나는 즉시 '비동기적'으로 실행된다. 그 동안 현재 페이지의 문서 분석은 계속 해나가되, 페이지 렌더링은 일시적으로 중단된다 - 따라서, 스크립트를 즉시 실행해야 하고 종속성이 없는 경우에 적당하다!

스크립트 코딩 가이드라인
자바스크립트는 html 문서에 적용될 때, 사용자와의 상호작용을 제공하는데.. 자바스크립트의 가장 일반적인 용도는 웹브라우저의 DOM을 통해 html과 Css를 동적으로 변경하는 것이다!
1. 자바스크립트는 기본적으로 대/소문자를 구분하며, 여러 칸 공백(   )은 하나의 공백 문자로 간주하고( ) 여러 줄 뉴라인이나 캐리지 리턴, 라인피드 모두 하나의 줄바꿈으로 간주한다. 한편, 세미콜론(;)은 하나의 문이 끝났음을 알리는데, 줄바꿈이 있다면; 생략할 수 있다!
                                    
                                        a= 1 // 줄바꿈이 있어 세미콜론 생략 가능
                                        b= 10
                                        x= 1; y= 10 // 한 라인에 작성할 때는 앞쪽 세미콜론은 생략할 수 없다!
                                    
                                

자바스크립트가 줄바꿈을 세미콜론으로 취급하는 경우는 묵시적인 세미콜론을 추가하지 않고서는 코드를 분석할 수 없을 때, 곧 줄바꿈 다음에 오는 공백 아닌 문자를 현재 문에 이어진다고 판단할 수 없을 때이다 예컨대, ([로 시작하는 문이 이어질 때 세미콜론으로 구분되지 않는다면; 하나의 연결된 문으로 해석될 소지가 있다!

2. 자바스크립트 코드는 (사람이 읽을 수 있는)유니코드 문자셋으로 작성되지만, ASCII 문자만으로 유니코드 문자를 표현하는 이스케이프 시퀀스 또한 사용할 수 있다:
                                    
                                        console.log("이스케이프 문자: \u03c0") // π
                                        console.log("웃는 얼굴 이모지: \u{1F600}") // 😀
                                    
                                

이스케이프 시퀀스는 주로 문자열 리터럴이나 정규식 리터럴에서 사용되는데.. \u로 시작하여 4개의 16진수 숫자를 적거나, 또는 (16비트 이상이 필요한 이모지를 표시하기 위하여)1~6자리의 숫자를 넣어주는 중괄호({}) 문법으로 작성한다

➥ 스크립트의 '식별자'

자바스크립트에서 식별자는 변수, 속성, 함수 등에 쓰인 이름 을 말하는데, 알파벳 대/소문자나 _, $로 시작되어야 한다. 이름은 숫자로 시작할 수 없으며, 공백이나 기호 등도 들어갈 수 없다. 또한, 스크립트 자체에서 쓰는 예약어도 이름으로 쓸 수 없다 덧붙여서, 일반적인 변수 이름의 맨 앞에 _은 사용하지 않는 것이 좋다 - 이는 자바스크립트의 코딩 철학에서 특별한 의미를 나타내는 데 사용되므로 코드를 읽을 때 불필요한 혼동을 불러올 수 있다!


여러 단어로 이루어진 이름을 지을 때는 보통 camelCasesnake_case 표기법이 사용되는데, (예컨대, 사용자정의 변수 이름에는)kebab-case 표기법을 사용하고, (예컨대, 사용자정의 함수 이름에는)PascalCase 표기법을 사용하는 식으로 일관성을 유지하는 것도 코드 작성 및 읽기에 도움이 될 수 있다!

Console API

은 JavaScript 웹 애플리케이션을 테스트하고 디버그하는 도구로서, 그 결과물은 웹브라우저의 [브라우저 개발자 화면](F12 키)으로 들어가서 [콘솔] 탭을 찾아가서 확인할 수 있다

콘솔 API
console.log(..);는 스크립트의 로그값(곧, 코드 실행의 결과물)을 [브라우저 개발자 화면]의 [콘솔] 탭에 표시해준다 참고로, console.debug/info/warn/error(); 등은 모두 console.log();의 별칭에 다름 아니다!
                                    
                                        const a= [2, 4, 6];
                                        console.log("길이", a.length, "임"); // 길이 3 임 ← ,는 공백으로 연결한다!
                                        console.log("길이" + a.length + "임"); // 길이3임 ← +는 공백없이 붙여서 연결한다!
                                    
                                        const name= 'Lee', height= 170;
                                        console.log("이름은 %s, 키는 %d임", name, height); // 이름은 Lee 키는 170 ← 서식 문자열 변수 지정!
                                    
                                

서식 문자열이 주어지면; %s, %f, %d, %o는 각각 문자열, 실수, 정수, 객체로 변환하여 표시해준다!

➥ document.write();

[브라우저 개발자 화면]의 [콘솔]에 실행 결과를 표시해주는 console.log();와는 달리, document.write();는 '살아있는' html DOM에 (실제로! 스크립트 코드를 삽입하여)내용 을 출력한다:

                                        
                                            document.write("<h5>String</h5>"); // 문자열에 html 태그 적용
                                            document.write(`10 + 2 = ${10 + 2}`); // 템플릿 안에서 수식 계산
                                        
                                    

document.write();는 브라우저가 html 문서를 해석하는 중에 실행되어 (실시간으로)현재 문서를 변경하므로 단지 코딩 중의 임시 확인용으로만 써야 하며, 실제 웹문서 작성에 사용해서는 안된다!

콘솔 메시지창
alert("알림 메시지");는 콘솔창에 알림 메시지 를 보여주며, confirm("확인 메시지");확인 메시지 (와 함께 [확인/취소] 버튼)을 표시한다(리턴 값: true/false). 한편, prompt("입력 프롬프트"[, "초기값"]);는 사용자 입력 프롬프트 (및 초기값 )를 나타낸다:
                                    
                                        
                                    
                                
                                    
                                        /* 스크립트 코드 */
                                        let weatherPic= document.querySelector('#today-weathers') // 이벤트 대상 ← 위 질문 버튼

                                        function cPic() { // 이벤트 처리함수
                                            const res= prompt("오늘 날씨 질문: ", "좋아요? 나빠요?") // 질문, 초기값 ← [확인] 시는 입력한 값이, [취소] 시는 null이 res에 들어간다

                                            if (res) alert(`음~ ${res}`) // 대답한 경우; 답한 내용을 표시한다
                                            else confirm("엥~ 그냥 나가나요?") // 취소를 누른 경우
                                        }

                                        weatherPic.onclick= cPic // 이벤트 대상(pic)에서 클릭 이벤트가 발생하면; 이벤트 처리함수 cPic()을 호출한다
                                    
                                

html의 data- 속성

html은 특정 요소와 연관되어야 하지만, 정의된 의미를 갖지 않는 데이터에 대한 확장성을 고려하여 설계되었다. html의 은 DOM과 같은 다른 조작을 하지 않고도, 의미론적 표준 html 요소에 추가 정보를 저장할 수 있게 도와준다!

태그에 정보 담기
html 태그에 data-이름= "값" 속성(이름 에 대문자는 들어갈 수 없다!)을 사용하면 해당 태그에 특정 정보를 추가할 수 있는데, 이 정보는 Css 및 JavaScript에서 읽어들여 조작할 수 있다!

(* 아래 리스트의 짐승들에 관한 질문에 미리 답변을 적어두고서 각각 한번씩 클릭하면서 정답을 확인해보세요..)

  • 새는 영어로?
  • 물고기는 영어로?
  • 인간은 한글로?
                                    
                                        
                                    
                                
                                    
                                        /* [data- 속성 사용하기] */
                                        function showDetails(list) { // 클릭한 li 요소를 인자로 받는다
                                            let animalType= list.dataset.animal; // 변수 animalType에 data-animal의 "값"을 가져와서 넣어준다
                                            // let animalType= list.getAttribute("data-animal"); 와 같다!

                                            alert(list.textContent + " " + animalType); // li에 들어있는 텍스트 + " " + data-animal의 "값"
                                        }
                                    
                                

사용자가 위 <li> 중 하나인 인간은 한글로?를 클릭하면(onclick); showDetails로 이름붙여진 스크립트 함수를 호출하면서(함수명 뒤에 붙은 괄호는 함수를 호출한다는 의미이다!) 이 this(= 호출한 li 요소)를 인자로 전달하고, 호출받은 함수에서는; 이 인자를 매개변수로 받아 함수 내부에 정의된대로 적절한 처리를 하여 다시 호출자(= 사용자가 클릭한 <li> 요소)에게 돌려보내게 됩니다만, 음~ 좀 어렵군요 ㅡㅡ;


자바스크립트 및 이벤트, html-DOM 등에 관해서는; 나중에 관련 강좌들에서 따로 공부하기로 하고, 여기서는 html 학습 과정상 간단히라도 이해하고 넘어가야 할 내용만 간략히 살펴봤습니다..

Web Colors

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

웹문서에서의 색상 표기법
html 기본 색상명: black, gray(= grey), white, aqua, cyan, blue, fuchsia, green, lime, maroon, navy, olive, orange, purple, red, silver, teal, yellow
1. RGB 색상 모델에서는 기본적으로 red, green, blue 삼원색을 조합한 16진수 표기법으로 특정 색상을 표현한다: #rrggbb(#000000 =black, #ffffff =white) 또는, #rgb(#000 =black, #fff =white)

코딩 중 색상을 설정해줄 경우, 같은 곳을 찾아가서 적절한 색을 클릭하여 그 표시되는 16진수 색상값을 가져와서 넣어주시면 됩니다: 글자색 넣기 <span style="color: #d6a64c;">글자색 넣기</span>

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)
3. 최근에는 모든 브라우저에서 rgb();hsl();alpha, 곧 불투명도를 추가할 수 있게 되었고, 이것이 표준 표기법이다 - 각 값들을 빈칸으로 구분하여 넣어주면 되는데, alpha 값은 /로 구분해서 넣어주는 것이 알기쉽다: color: rgb(255 255 255 / 50%); 불투명도에는 % 단위나 . 단위 모두 사용할 수 있다

* cf 1) 색상명에는 뒷 배경이 그대로 보이는, 즉 완전한 투명을 의미하는 transparent 키워드도 사용할 수 있다. 한편, Background(바탕화면 배경색), Highlight(선택한 항목에 대한 강조 색상) 등은 시스템 운영체제에 의해 정의되는 색상명 키워드이다 대/소문자를 구분한다!

* cf 2) currentColor 키워드는 color 속성의 계산된 동적 값이다 예컨대, currentColor 를 정의하는 요소에 정의된 색상값이 없는 경우; 대신 상위 부모요소의 색상을 물려받게 된다!

웹문서에서 Css 색상 설정하기
아래는 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); /* 박스 그림자 색상*/
                                        }
                                    
                                

참고로, 강조를 위해 색상에만 의존하는 것은 좋지않다. 색상 외에도 텍스트 설명 및 아이콘을 적절하게 활용해주는 것이 접근성 측면에서 유익하다 특히, 적색과 녹색은 색맹인 사용자가 상태 변화를 보는 데 어려움을 겪거나 심지어 완전히 놓칠 수도 있다!

요소 및 배경의 불투명도
1. Css의 opacity 속성은 요소의 불투명도를 설정하는데, 0 (요소가 완전히 투명해져 안보이고, 뒷 배경만 드러남) ~ 1 (요소가 온전히 표시되어 뒷 배경이 가려짐) 사이의 값을 쓸 수 있다:
opacity: 1; // 요소가 온전히 드러남
opacity: 0.5; // 요소가 반투명해짐
opacity: 0; // 요소가 완전히 투명해짐
                                    
                                        
                                    
                                
2. 요소의 불투명도 설정 시 자식요소는 온전히 유지하고자 한다면; background-color: rgb(0 0 0 / 0.3); 방식으로 사용하여 부모요소를 투명하게 해주면 된다:

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

                                    
                                        
                                    
                                

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

이미지 다루기

여기서는 웹문서에 이미지를 삽입하는 기본 방식을 간략히 살펴봅니다. 이미지 전반에 관련된 포괄적, 심층적 이해가 필요하신 분은 문서를 참조하십시오..

이미지 삽입하기
1. <img> 태그는 문서에 이미지 소스를 삽입하는데(src= "이미지"), 닫는 태그는 없다. 여기서 alt= 속성은 이미지 설명 인데, 스크린리더기는 이 값을 읽어 사용자에게 이미지에 관해 알려주기에 항시 넣어주는 것이 좋다!

이미지 소스가 없음 ㅡㅡ;

                                    
                                        
                                    
                                

위 코드에서는 src=에 적합한 이미지 소스가 없으므로 alt= 속성에 주어진 값으로 대신 표시해주고 있다 아니라면; 없는 이미지를 찾는다고 몇 분간 더 버벅댈 수도 있습니다 ㅡㅡ;


alt= 속성값에 빈 문자열("")이라도 넣어주는 것은; 예컨대, 단순한 장식용 이미지인 경우, 스크린리더기 등의 비시각적 브라우저에게는 이미지가 컨텐츠의 중요 부분이 아니므로 렌더링을 하지 않아도 된다는 의미로 전달되며, 나아가 이미지를 복사 & 붙여넣기 할 때나 이미지 링크를 나열할 때도 alt= 속성에 들어있는 값을 사용하므로 SEO 차원에서도 유익하다!

2. 이미지의 너비(width)와 높이(height)를 (실제 크기로)넣어주고, alt= 속성으로 (공란일지라도)대체 텍스트를 설정해주면; 브라우저는 네트워크 오류나 컨텐츠 차단, 죽은 링크 등의 이유로 이미지를 표시할 수 없는 경우 등에 툴팁으로 표시해준다 이는 브라우저가 좀 더 빠르게 내려받도록 하는데도 도움이 되므로 웹사이트 최적화를 위해서도 유익하다!

꼭 넣어주세요 ^^

                                    
                                        
                                    
                                

title= 속성은 대부분의 태그에서 사용할 수 있지만, <img> 태그의 alt= 속성을 대체하여 사용하는 것은 좋지 않다 - 이 속성으로 추가 정보를 제공할 수는 있겠지만, 꼭 알려야하는 중요한 정보라면; alt= 속성을 사용해야 한다!


width=height= 속성을 써서 이미지의 크기를 지정해주는 것은 좋은 일이지만, 이미지의 크기를 조정하는 데 사용하는 것은 좋지 않다 - 이미지 편집도구를 써서 미리 올바른 크기로 조정하여 삽입해주는 것이 (다운로드 속도를 높이고 이미지 왜곡을 방지한다는 점에서)최선이고, 불가피하게 이미지의 크기를 조정해야 한다면; Css 스타일시트를 써서 설정해주는 것이 좋다!

➥ 더미 이미지 삽입하기

코딩 중 임시로 Lorem으로 더미 문장을 넣어주는 것처럼, 더미 이미지를 넣어서 확인하면서 코딩해나가야 할 경우가 있는데.. 이런 경우에는, 에서 빌려올 수 있습니다. 간단히, 가로x세로 크기만 넣어주면 됩니다:

꼭 넣어주세요 ^^ 꼭 넣어주세요 ^^

                                        
                                            
                                        
                                    

위에서 보듯이, 텍스트 로 표시해줄 수도 있습니다만, 아쉽게도 한글은 지원되지 않는군요 ㅡㅡ; 그외에도 몇가지 추가적인 사용법들이 있지만, 그건 스스로 찾아가서 확인해보십시오..


* cf) 진짜 이미지가 필요하시면; 등 무료(및 유료) 이미지들을 제공하는 사이트들을 들러 보십시오.. 한편, 구글 에서는 사용자 인터페이스 디자인의 표준을 제시하는 동시에 폰트, 아이콘, 이미지 등 수많은 오픈소스(및 코드)를 제공하고 있으니 한번 들러 보십시오..

Webp 이미지
는 웹에서 이미지에 우수한 무손실 및 손실 압축, 알파 채널을 제공하는 최신 이미지 형식인데, Webp 이미지는 기본적으로 <picture>(& <source>) 태그와 함께 사용한다:
                                    
                                        
                                    
                                

최신 브라우저들은 대부분 Webp 이미지를 기본 지원하고 있으니, 일반 이미지를 넣어줄 때와 같은 방식으로 사용해도 됩니다: <img src="image.webp" width="400" height="200" alt="Webp image">


bmp, jpgpng 등의 이미지 파일을 Webp로 변환하면; 이미지 왜곡도 거의 없이, 최대 10분지 1 정도까지도 용량이 줄어듭니다. 많은 Webp 변환기가 있으니 적당한거 찾아서 Webp로 변환하여 사용하면 됩니다. 제가 권한다면; 가 사용하기 편합니다 온라인 변환기들도 많지만.. 이넘은 그냥 다운받아 실행파일 클릭하고, 이미지(들) 선택하여 넣어준 뒤 클릭 두번이면 곧바로 일 끝납니다 ^^

이미지맵 작성하기
<map>(& <area>) 태그는 을 정의한다. 이미지 맵을 작성하려면; 먼저, <img> 태그에서 이미지 소스 와 함께 사용할 맵이름 을 지정해주고, 이어서 <map> 태그 안에서 그 맵이름 을 써서 <area> 태그로 이미지맵 영역들을 만들어주면 된다:
                                    
                                        
                                    
                                

<area> 태그에서는 맵의 모양(shape)과 좌표 영역(cords)을 지정한다

  • shape="rect" cords="x1,y1, x2,y2" 사각형의 좌상단 모서리 (x1, y1) 좌표와 우하단 모서리 (x2, y2) 좌표
  • shape="circle" cords="x,y,r" 원의 중심점 좌표(x, y)와 반지름(r)
  • shape="poly" cords="x1,y1, x2,y2, .., xn,yn[, x1,y1]" 다각형의 각 꼭지점 좌표들 좌표값은 이미지의 좌상단 꼭지점을 기준으로 하는 px 단위임
400x200 이미지
                                    
                                        
                                    
                                

마우스 포인터를 위 그림 위에서 움직이면서 풍선 도움말을 확인하십시오. 위 코드에서는 href 속성값을 비워두었지만, 필요하다면; 저 각각의 영역들에 웹문서 등을 링크해줄 수 있습니다 여기서는 이미 알고 있는 사각형의 크기를 기준으로 각 영역의 범위를 지정해주었지만, 이미지 편집 프로그램을 이용하면 특정(모양에 맞추어진) 영역 좌표를 확인하여 설정해줄 수도 있습니다!

반응형 이미지

고해상도 이미지는 다운로드 시 시간상 지체 문제가 있을 수 있고, 기기간 화면 크기 및 가로/세로 방향에 따른 편차나 (텍스트를 포함한 이미지의 경우)축소 시 텍스트 내용을 알아보기 어려울 수 있다는 점 등의 문제가 발생할 수 있다 - 이러한 문제들을 해결하기 위해 나온 것이 바로 기법이다!

반응형 이미지
1. 동일한 이미지를 기기에 따라 더 크게 또는 더 작게 표시하고 싶을 때, <img> 태그의 srcsetsizes 속성을 이용하면; 화면 너비에 맞추어 서로 다른 이미지 파일을 지정해줄 수 있다: 이미지는 콤마로 구분하여 실제 크기별로(480w, 800w 등) 복수로 나열하는데, 브라우저는 먼저 기기 너비를 확인한 뒤, sizes의 미디어 조건에 맞는 srcset 이미지 파일을 찾아서 불러온다:
[ img 요소의 srcset 속성 (1) ]
                                        
                                            <img
                                                srcset="img-480w.jpg 480w, img-800w.jpg 800w" ← 480w, 800w는 이미지의 (렌더링을 변경하기 위해 Css를 적용하지 않은)실제 px 너비를 의미한다
                                                sizes="(max-width: 600px) 480px, 800px" ← (뷰포트 너비가 600px 이하면); 480px 크기로, 그 이상이면; 800px 크기로 표시하라
                                                src="img-800w.jpg" ← 브라우저에서 위 코드들이 지원되지 않는다면; 여기로 온다!
                                                alt=""
                                            />
                                        
                                    

sizes의 슬롯 너비에서, 절대너비(480px)를 제공하는 대신 뷰포트에 대한 상대너비(예컨대, 50vw)로 제공할 수는 있지만 %는 사용할 수 없다!

2. 다른 방식으로는, <picture>(와 <source>) 태그를 써서 이미지를 삽입할 수도 있다: 가령, 데스크톱에는 전체 장면을 보여주는 가로 이미지를, 모바일에는 주요 부분만 확대하여 보여주는 세로 이미지를 제공하는 등 다양한 기기 및 레이아웃에 맞게 잘린 이미지를 제공하려는 경우이다:
[ picture(& source) 사용하기 ]
                                        
                                            
                                        
                                    

위에서 <img> 요소는 맨 밑에 배치되어야 하며, 해상도를 더 세분화하고자 한다면; <source> 태그를 필요한만큼 추가해주면 된다!

➥ 이미지 '지연 로딩' ?

웹브라우저가 시작되면 Css와 JavaScript가 해석되기 전에 이미지가 먼저 로딩되는데, 이러한 작동 메커니즘은 반응형 이미지에는 도움이 되지 않고, 도리어 역효과가 날 수도 있기에 반응형 이미지를 위해서는 Css나 JavaScript보다는 html을 활용할 필요성이 생겨난다!

웹페이지 중간에 너무 큰 이미지가 포함된 경우, <img> 요소에서 지연로딩 속성값(loading= "lazy")을 주면; 이미지가 뷰포트에 들어올 '가능성'(이는 브라우저가 알아서 판단한다!)이 있을 때까지 이미지 로딩이 지연되며, 이는 다른 급한 작업에 먼저 자원을 할당하게 하여 성능상의 이점을 가져올 수 있다 이제 사용자가 화면을 스크롤하기 시작하면; 그 거리가 좁혀지고, 자바스크립트가 비활성화되면; 이 속성값은 자동으로 기본값으로 되돌려진다!

Svg 이미지

Svg 이미지는 XML 텍스트 파일로 정의하기에 손실이나 품질 저하 없이 모든 크기에서 렌더링이 가능하며, 검색과 색인 및 압축도 가능하다. 또한, Svg 파일은 브라우저에서 캐시할 수 있으므로 페이지 내 여러 곳에서 사용하는 경우라면; 로딩 속도 측면에서도 유리하다!

Svg 이미지 삽입하기
html 5)에서는 <img> 태그로 Svg 이미지를 불러들일 수 있는데, src=, alt= 속성과 함께 width=height= 속성도 반드시 필요하다: 부트스트랩 로고
                                    
                                        
                                    
                                

<img> 요소에서 Svg 이미지를 사용할 때; 스크린리더기 등이 Svg 이미지를 인식하지 못하고 건너뛸수 있기에 role= "img" 속성을 넣어줄 필요가 있다. 반면, 단순한 장식용 이미지일 뿐이라면; (그냥 건너뛰라고)role= "none" 속성을 넣어줄 수도 있다!


* cf) Svg 이미지를 지원하지 못하는 브라우저에 대응하기 위해서 srcset 속성을 추가해줄 수도 있다:

                                    
                                        
                                    
                                

Svg를 지원하는 브라우저에서는 image.svg 파일을 불러오고, 미지원 브라우저에서는 기본 image.png 파일을 불러와서 보여주게 된다!

➥ Raster 대 Vector 이미지

위치와 색상을 구성하는 픽셀 격자들로 이루어지는 Raster 이미지(JPEG, PNG, GIF)와는 달리, 알고리즘으로 꼭지점과 선, 색을 구성하는 Vector 이미지(SVG)는 용량이 작고 확대 시에도 화질이 떨어지지 않아 반응형 웹사이트에 적합하며, Css로 스타일을 지정하고 DOM이나 JavaScript에서 조작하는 것이 가능하기에 다양하게 활용할 수 있다!

인라인 SVG 작성하기
인라인 를 쓰면; Css 스타일 설정이 가능하고, 소스 코드 자체를 수정할 수도 있다. 나아가, <a> .. </a> 요소로 감싸서 간단히 하이퍼링크를 만들 수도 있다
<svg> 태그로 인라인 Svg 이미지를 작성할 수 있는데(내부 컨텐츠는 위에서 아래로 순차적으로 렌더링된다), width=height=, xmlns= 속성도 반드시 필요하다. fill=stroke= 속성은 SVG 도형이나 텍스트, 그라디언트 및 패턴의 색을 설정한다:
                                    
                                        
                                    
                                

Svg 문서의 좌상단 모서리는 x, y 좌표 (0, 0)이 되며, 한 지점의 위치는 좌상단 모서리에서 시작하는 px 단위(x축 양수는 오른쪽 방향, y축 양수는 아래쪽 방향)이다: <rect x="0" y="0" width="200" height="100" fill="red"> 좌상단 모서리에서 시작하는 너비 200px, 높이 100px의 사각형을 그리고, 내부는 red 색으로 채워라

                                    
                                        
                                    
                                
                                    
                                        
                                    
                                
➥ SVG 뷰박스

기본적으로 Svg 문서의 1px 은 출력장치의 1px 에 매핑된다. - 곧, 사용자 단위와 화면 단위는 1:1의 비율로 동작한다. 지금 SVG 캔버스 전체 크기는 200 x 200 (px)이다. 그러나 viewBox= 속성을 사용하여 (0, 0) 좌표에서 시작하는 100 x 100 Svg 이미지를 200 x 200 화면에 표시하고, 100 x 100 영역을 효과적으로 확대하여 이미지를 두 배 크기로 표시할 수 있게 된다!

[ 사용자 좌표계: 사용자 단위와 뷰포트 단위의 매핑 ]
                                            
                                                
                                            
                                        

viewBox= 속성은 사용자 공간에서 SVG 뷰포트의 시작 위치(min-x min-y)와 크기(width height)를 정의한다(값은 쉼표나 콤마로 구분한다) 그 결과, SVG 요소의 뷰포트(브라우저의 뷰포트가 아니다!) 경계에 매핑된 사각형의 사용자 공간이 생성되는 것이다!

아래에서 Svg 기본 도형들을 간단히 살펴봅니다만.. Svg 이미지는 직접 만들기보다는(너무 어렵고 힘듭니다 ㅡㅡ;), 대개 같은 벡터그래픽 프로그램으로 만들어씁니다

<rect> 요소는 시작 지점(x, y), 너비와 높이(width, height) 및 사각형 둥근 꼭지점의 x, y 방향으로의 반지름(rx, ry)으로 정의된 Svg 사각형을 그려준다:

                                                    
                                                        
                                                    
                                                

시작 지점(x, y), 너비와 높이(width, height) 등을 바꾸어가면서 감을 잡아보십시오..

<circle> 요소는 원의 중심 좌표(cx, cy)와 반지름 길이(r)로 정의된 Svg 원을 그려준다:

                                                    
                                                        
                                                    
                                                

시작 지점 및 반지름 값을 바꿔줌으로써 간단히 반달 모양으로도 되고, 구멍난 원도 만들어지는군요 ^^

<ellipse> 요소는 원의 중심 좌표(cx, cy)와 x, y 방면으로의 길이(rx, ry)로 정의된 Svg 타원을 그려준다:

                                                    
                                                        
                                                    
                                                

여기서는, 두 타원을 같은 지점에서 출발시킴으로써 겹쳐봤습니다 <svg> 요소의 내부 컨텐츠는 위에서 아래로 순차적으로 렌더링된다는 점 기억하세요!

<line> 요소는 선의 시작점(x1, y1)과 종단점(x2, y2) 좌표로 정의된 Svg 직선을 그려준다:

                                                    
                                                        
                                                    
                                                

<polyline> 요소는 연결된 직선들의 그룹으로서, 그 직선들의 모든 포인트는 points= 속성 하나에 포함된다. 한편, 닫힌 다각형은 그저 첫 포인트와 마지막 포인트 지점을 같은 값으로 설정해주는 것만으로 만들어진다:

                                                    
                                                        
                                                    
                                                

각 포인트는 반드시 (x, y) 좌표를 가져야하며 공백이나 쉼표, 줄바꿈 등으로 서로 구분된다 곧, 포인트 목록 (0, 0), (1, 1)은 0 0 1 1이나 0 0, 1 1로 표기해준다!

미디어 다루기

미디어 삽입 시 보통 오디오 파일에는 <audio>, 비디오 파일에는 <video> 태그를 사용하는데, <source> 태그와 함께 사용하여 여러 미디어 파일을 지정해줌으로써 다양한 브라우저에 대응하도록 해주는 것이 바람직하다!

미디어 삽입하기
1. 아래 코드는 비디오 삽입의 기본 예인데, (위에서 아래로 순차적으로 내려가면서)<video> 태그 안의 어느 한 <source> 태그 및 맨 아래 배치한 대체 텍스트가 실행되면 나머지는 실행되지 않는다:
[ 비디오 삽입 기본 사용법 ]
                                        
                                            
                                        
                                    

type= "video/mp4" 정보를 지정하는데, 이 미디어타입 정보는 항시 넣어주는 것이 좋다!

여타 비디오 옵션들

<video> 요소의 속성에서 controls 옵션은 컨트롤 막대를 표시하는데, 그 모양은 각각의 브라우저별 규격에 따라 서로 다르다

그밖에 autoplay(자동재생), loop(반복재생), muted(음소거) 등이 있는데.. 꼭 필요한 경우가 아니라면; 기본값(자동재생 안함, 반복재생 안함, 음소거 상태)으로 두는 것이 좋다!

나아가, (재생 직전 표시하는)스플래시 화면이나 광고 화면으로 쓸 수 있는 poster= "포스터 이미지", 대용량 파일의 버퍼링 여부를 설정하는 preload= "none/metadata"(기본값인 auto 는 미리 다운로드하며, metadata 는 메타 데이터만 미리 다운로드한다) 속성도 설정해줄 수 있다

2. <audio> 태그는 width=height=, poster= 속성이 없다는 점만 제외하면, <video> 태그와 비슷하게 사용한다 - 그저 controls 속성을 넣어주는 것만으로 충분하다:
                                    
                                        
                                    
                                
자막 및 캡션 넣기
html 5)에서는 기본적으로 .srt 자막 파일을 지원하지만 모든 브라우저에서 공통적으로 지원하는 자막 파일은 .vtt인데, 안에 자막 내용과 시간을 담고 있다. 자막 파일(.vtt)을 연결할 때는 태그를 쓰는데, kind= 속성에서 subtitles(자막) 및 captions(캡션) 여부를 지정해줄 수 있다
                                    
                                        
                                    
                                

kind= 속성의 captions 값은 주로 음향효과 및 기타 관련 오디오 정보가 포함된 스크립트 작성 및 번역에 사용한다!

[ WebVTT 자막 작성하기 ]
                                        
                                            
                                        
                                    
                                        
                                            00:11.000 --> 00:13.000 vertical:rl // 시작시간 --> 종료시간
                                            <v Roger Bingham>We are in New York City

                                            00:13.000 --> 00:16.000
                                            <v Roger Bingham>We're actually at the Lucern Hotel, just down the street

                                            00:16.000 --> 00:18.000
                                            <v Roger Bingham>from the American Museum of Natural History

                                            .. 
                                        
                                    

폼 작성하기

에 입력한 정보는 웹서버로 보내지고, 웹서버에서는 웹프로그램을 통해 폼을 처리한 뒤 그 결과를 받아 다시 브라우저로 돌려주게 된다

입력폼 작성하기
<form> 태그 안에서 <fieldset> 태그는 폼 요소를 하나의 구역으로 묶고 외곽선을 그려주는데, 바로 아래서 <legend> 태그로 제목을 붙여주면 스크린리더기 등에 도움이 된다
상품 크기 선택
                                                    
                                                        
                                                    
                                                

라디오 버튼은 항시 <fieldset> 요소로 묶어주는 것이 좋습니다!

<label>과 <input>를 함께 사용하여 입력 항목을 만들면 화면 낭독기 등을 위해서도 도움이 되고, 라디오 버튼이나 체크박스 등에서 텍스트 터치로 선택이 가능해지며, 나아가 Css로 꾸며줄 수도 있다

                                    
                                        
                                    
                                

<input> 입력필드의 모양은 브라우저마다 각각 차별성이 있고, 그래서 <input>만 아니라 폼 관련 태그들은 대개 스타일시트를 통해 (각 사이트에 맞추어 미리 설정해둔)독자적인 초기값을 사용하게 된다. 또한, input type="타입"에서는 브라우저 차원에서 각 타입 에 따르는 유효성 체크도 함께 이루어진다!

hidden 필드는 주로 (화면상의 폼에는 보이지 않되)폼을 서버로 전송할 때 서버로 함께 전송되는 요소(예컨대, 사용자에게 굳이 보여줄 필요가 없지만 관리자가 알아야 하는 것 - id 중복여부 확인 등의 처리 정보)에 사용된다

텍스트 입력필드 value초기값 으로 보여줄 내용이며, size보여줄 문자 수, minlength/maxlength입력 문자 수의 최소/최대 제한이다

password 필드는 입력하는 내용이 화면에 표시되지 않고 *표 등으로 보여진다는 점만 제외하면 text 타입과 같다 당연지사지만.. password 필드에서 value 속성은 사용할 수 없다!

검색상자 등 정보에 맞게 분화된 텍스트 필드들 multiple 옵션은 복수 입력을 가능하도록 한다

숫자 입력상자/슬라이드 숫자막대: min/max 옵션으로 최소/최대값 을 제한해줄 수 있고, step 옵션으로 값 사이의 간격을 설정해줄 수 있다 브라우저에 따라서 각기 다른 모습으로 표시되기도 한다!

라디오 버튼(하나만 선택 가능), 체크박스(복수 선택 가능) 각 항목들 중 하나에 checked 옵션값을 주어 기본값으로 선택해둘 수도 있고, 함께 묶인 라디오 버튼들의 이름은 반드시 같아야 한다!

색상 선택상자 기본색상 값은 16진수여야 하며 색이름은 사용할 수 없다!

날짜 입력필드

날짜(및 시각) 입력필드 time(23:59), datetime(2019-01-01T23:59), datetime-local(2019-01-01T23:59)

파일 다운로드 대화상자 창을 만드는데, multiple 옵션은 복수 선택을 가능하도록 한다 참고로, 브라우저에서 파일 선택이나 찾아보기 등의 버튼이 표시되는데.. 클릭하여 파일을 선택하면 파일이 첨부된다!

폼 전송버튼/리셋버튼/이미지버튼

단순버튼 자체 기능은 없고, 단지 스크립트로 연결해주는 역할만 수행한다. 하지만, 이보다는 <button> 태그를 쓰는 것이 좋다!

                                                    
                                                        
                                                    
                                                

<button> 태그를 사용하는 경우에는 화면낭독기에 이 곳에 버튼이 있다는 것이 명확히 전달되고, 또한 이 버튼에는 컨텐츠를 포함할 수도 있기에 아이콘을 추가하거나 Css를 이용해 원하는 형태로 꾸미는 것도 가능해진다!

  • autofocus // 해당 필드로 입력 커서를 옮겨줌
  • placeholder= "입력 메시지" // 입력란에 힌트를 표시하고 있다가 그 필드를 클릭하면 내용이 사라지고 입력이 시작된다
  • autocomplete // 입력시 자동완성 기능 사용
  • size= "크기" // 해당 필드의 물리적 크기, 또는 보여줄 글자수 지정
  • readonly // 읽기 전용 필드로 지정
  • required // 필수 입력 필드로 지정
  • disabled // 입력 필드로의 진입을 불가하게 한다 textarea 필드에 약관 등을 넣어 읽기만 하도록 할 때 등..
텍스트 입력영역
<textarea>는 (게시판에서 게시물을 입력하거나 회원가입 양식에서 사용자 약관을 표시하는 등의)텍스트 입력 영역을 만드는데, 옵션으로 지정한 글자수라인수 보다 더 커지면 스크롤 막대가 생겨난다
                                    
                                        
                                    
                                

이 영역 안은 <pre> .. </pre>에서와 같은 방식으로 작동된다!

드롭다운 목록
<select>(목록 범위) 및 <option>(목록 항목들)은 드롭다운 목록을 만드는데, <option> 항목들은 <optgroup label="그룹명"> .. </optgroup> 식으로 서로 다른 그룹별로 묶어줄 수도 있다
                                    
                                        
                                    
                                

multiple 옵션값은 [Ctrl] 키와의 조합으로 복수 선택이 가능하도록 한다!

상태 표시바
<progress> 태그는 작업의 현재 진척 정도를 보여주는 색상 막대를, <meter> 태그는 전체에서 차지하는 비중을 나타내는 색상 막대를 만든다
                                    
                                        
                                    
                                

html에서의 은 이 정도만 알아도 됩니다. 다 다루자면 열배 정도의 분량은 더 필요하지먄; 실제로는 대개 부트스트랩 폼을 쓰거나, 폼 관련 플러그인 라이브러리를 가져다 쓰는 것이 일반적입니다 - html 테이블 또한 마찬가지입니다

테이블 작성하기

행/열 로 구성된 데이터 집합으로서 표 형식의 데이터인데, 열/행이라는 형식 면에서는 Microsoft Excel을 생각하시면 됩니다 - 모양 면에서는, Word나 Hwp에서 '표 작성'하는 것과 같군요..

표 작성의 기본
<table> 태그 안에서 <tr> 태그로 각 을 만들고, <th>(제목 셀: 셀 중앙에 굵게 표시된다) 및 <td> 태그(<tbody> 영역)로 을 만들어 그 안에 내용을 넣어준다. 나아가, <table> 태그 안에서 <thead>, <tbody>, <tfoot>로 테이블을 구성하면 화면 낭독기 등에 표의 구조를 알려줄 수 있으며, Css를 써서 서로 다른 스타일을 적용시키거나 스크립트를 써서 본문 부분만 스크롤되도록 하는 등의 활용이 가능해진다!
1. <td>나 <th> 태그(가로 행) 안에서는 colspan= "개수" 속성으로 열 방향으로, rowspan= "개수" 속성으로 행 방향으로 열 및 행을 합쳐줄 수 있다 제목이 길어 축약이 필요하다면; 제목 행인 <th> 태그에서 abbr 속성을 사용하면 된다!
2. <colgroup>(과 <col>) 태그(세로 열)는 열 스타일을 정의하는데, <caption> 태그 뒤, <tr> 및 <td> 태그 전에 사용되어 <col> 태그를 넣은 순서대로 한 열에 있는 모든 셀에 같은 스타일을 적용하는데, 하나의 <col>만 넣으면 첫번째 열에만 적용되며, <col> 태그의 span 속성을 이용해 둘 이상의 열을 함께 묶어줄 수도 있다 단, <thead>와 <tfoot>는 제외한 <tbody>에만 적용된다!
3. 표에 제목을 달아주려면; <table> 태그 시작 부분에 작성해주면 되고, <figure> 태그로 <table> 태그를 둘러싼 뒤 <figcaption> 태그로 <table> 태그의 바깥쪽 바로 위나 밑에 표 설명을 배치해줄 수도 있다
표 제목: <caption>은 table 태그 시작 부분에 넣어준다
thead: th 1 thead: th 2 thead: th 3 thead: th 4
tbody 1행 td 2->행 방향으로 합침: rowspan=2 td 3 td 4
tbody 2행 td 3->열 방향으로 합침: colspan=2
tbody 3행 td 2 td 3 td 4
tfoot: th 1 tfoot: th 2 tfoot: th 3 tfoot: th 4
* 표 설명: <figcaption>은 <figure> 태그 안에서 맨 위나 맨 밑에 붙여줄 수 있다
                                                    
                                                        
                                                    
                                                

위 코드에서 <thead>나 <tfoot> 내부 <th scope="row/col"> .. </th> 부분은 이 th가 행의 제목(row)인지, 열의 제목(col)인지를 스크린리더기 등에 알려주는 역할을 합니다

                                                    
                                                        table, th, td {
                                                            padding: 15px;
                                                            border: 1px solid #000000; border-collapse: collapse;
                                                        } th, td { width: 120px; }

                                                        thead, tfoot { background: #eeeeee; }
                                                    
                                                

부트스트랩의 Css를 사용하는 경우; html 기본 표 스타일과 그 모양 및 형태에서 많은 부분 다르니 참고하십시오 - 부트스트랩에서는 부트스트랩 자체 규격으로 표 스타일을 재정의해서 사용하는 때문입니다(이 테이블 또한 그렇습니다!)

테이블에서 셀의 너비나 높이는 표의 크기 및 셀 안의 내용에 맞추어 자동 설정된다. 하지만, Css의 width, height, padding 속성을 써서 셀의 너비와 높이, 여백을 수동으로 지정해줄 수도 있다

  • caption-side: top/bottom; // 캡션의 배치위치 - 캡션은 <table> 바로 아래서 쓰여 표 위(top)나 아래(bottom) 중앙에 표 제목을 달아준다 캡션은 접근성을 위해 달아주는 것이 좋지만, 외관상 문제가 된다면; Css를 써서 보이지않게 해줄 수도 있다!
  • border-collapse: separate/collapse; // Css로 표의 테두리를 표시하는 경우 표 테두리와 셀 테두리를 각각 지정하게 되는데, 이 때 collapse 값을 넣어서 표와 셀의 테두리간 겹치는 부분을 하나로 합쳐줄 수 있다
  • border-spacing: 수평거리[ 수직거리]; // 테이블 테두리와 셀 테두리가 분리되어 있는 경우; 인접한 셀 테두리간 거리를 지정한다 수평/수직 같은 값으로 하나만 주거나 수평거리 수직거리 각각 줄 수도 있다
  • empty-cells: show/hide; // 빈 셀의 테두리를 그리지 않고 비워줄 때 사용한다
  • text-align: left/center/right; // 셀 안에서 내용물의 수평 정렬을 지정한다
  • vertical-align: top/middle/bottom/baseline; // 셀 안에서 내용물의 수직 정렬을 지정한다 baseline은 셀의 기준선에 내용의 기준선을 맞춘다
  • table-layout: fixed; // 셀의 너비를 고정한다

Full Calendar

플러그인 라이브러리는 모듈식으로 구성된, 풀사이즈의 드래그 & 드롭 순수 자바스크립트 이벤트 달력이다

풀 카렌다
Full Calendar 플러그인을 사용하기 위해서는; 먼저, 스크립트 소스 및 초기화가 필요하고, 다음에는 그저 간단한 코드 한 줄이면 달력을 삽입할 수 있다: <div id= "calendar"></div>
[ 풀 카렌다 작성하기 ]
                                        
                                            <body>
                                                <div id="calendar"></div>

                                                ..

                                                <script src='https://cdn.jsdelivr.net/npm/fullcalendar@6.1.4/index.global.min.js'></script>
                                                <script>
                                                    document.addEventListener('DOMContentLoaded', function() {
                                                        var calendarEl= document.getElementById('calendar')
                                                        var calendar= new FullCalendar.Calendar(calendarEl, {
                                                            initialView: 'dayGridMonth'
                                                        });
                                                        calendar.render()
                                                    });
                                                </script>
                                            </body>
                                        
                                    

이 달력은 달리 꾸며주지 않은, 가장 기본적인 형태입니다. 더 필요하시면; 공식사이트 매뉴얼을 참고하여 자신만의 멋진 달력을 만들어 쓰십시오..

wave