Bootstrap 5

[웹코딩 가이드] 홈

이제 지~난한(ㅡㅡ;) Bootstrap 5 강좌의 긴 여정을 시작합니다.. diagram-arrow-down

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


Bootstrap 5) 강좌는 html 5)Css 3)의 대략적인 기본은 갖추고, 직접 코딩하고 검색하면서 스스로 학습하고자 하는 분들(만!)을 대상으로 합니다 ㅡㅡ;


폼 컨트롤

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

폼 스타일 설정: .form-control
부트스트랩의 .form-control 클래스는 각각의 입력폼 컨트롤에 따르는 기본 모양 및 움직임을 표시해주는데, .form-control-lg/sm 클래스를 더하여 폼 컨트롤의 크기를 변경해줄 수도 있다 그 전에 알아둘 것은, Bootstrap 5)에서는 <label>과 <input>의 관계가 완전히 재정의되었다는 점이다 - 구조적으로, <label> 안의 <input>와는 달리, 부트스트랩에서의 <input>와 <label>은 서로 분리된 형제요소이다!
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                
1. 폼 컨트롤에 disabled 속성을 더해주면; 폼 컨트롤에서의 포인터 이벤트 및 포커스가 불가능하게 된다. 한편, readonly 속성은 입력폼 선택 및 포커스는 가능하지만, 입력 필드값을 변경할 수는 없도록 한다
                                    
                                        
                                    
                                
2. 입력폼 필드를 평문 스타일로 바꾸고자 한다면; .form-control.form-control-plaintext로 대체하여 기본 스타일을 제거해주면 된다
                                    
                                        
                                    
                                
3. 입력폼 텍스트는 .form-text로 스타일을 지정하는데, 블록 레벨 요소가 사용된 경우에는 상단 여백이 추가된다
Must be 8-20 characters long.
                                    
                                        
                                    
                                

폼 텍스트는 명시적으로 aria-describedby 속성을 써서 폼 컨트롤과 연결되어야 한다 - 이렇게 하면, 사용자가 컨트롤에 포커스를 주거나 입력할 때 스크린 리더기 등의 보조 기술이 이 폼 텍스트를 확실히 알려줄 것이다!


* cf) 부트스트랩의 그리스시스템으로 작업할 때는 폼 요소를 .col 안에 넣어주어야 한다 부트스트랩은 내부적으로 고정된 높이를 설정하고, 브라우저간 약간의 불일치는 무시한다!

                                    
                                        
                                    
                                

플로팅 레이블(.form-floating)을 쓸 때는, <input> 요소가 <label> 앞으로 와야한다!

입력폼과 체크폼

입력그룹: .input-group
우선, 입력그룹 사용 시 <label>은 입력그룹의 외부에 배치해야 한다. 다음, .input-group input-group-sm/lg 클래스로 입력그룹의 크기를 변경해줄 수 있는데, 내부 각 요소들의 크기는 .input-group에서 지정한 크기에 맞춰 자동으로 적절히 조정되며, 입력그룹 내부 개별 요소들에서의 독자적 크기 변경은 지원되지 않는다!
@
.form-text
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                
체크박스와 라디오버튼: .form-check
Bootstrap 5)에서 브라우저 기본 체크박스라디오 버튼은 완전히 재정의되었다! 기본적으로 체크박스나 라디오 버튼의 <input>와 <label>은 직계 형제요소이므로, 얼마든지 .form-check 클래스를 써서 쌓고 적절하게 간격을 줄 수 있다
                                    
                                        
                                    
                                

Default checkbox 를 제외한 나머지 컨트롤들은 스스로 작성해서 추가해주십시오.. 그저 위 <input> 요소에다 각각 checked, disabled, checked disabled 속성 키워드를 추가해주기만 하면 됩니다 ^^

                                    
                                        
                                    
                                

라디오 버튼의 이름(name= "exampleRadios")은 모두 같아야 한다!


* cf) <label>에서 .form-check-label 대신, .btn 스타일을 사용하여 버튼 비슷한 체크박스나 라디오 버튼을 만들 수도 있다 이러한 토글 버튼은 필요 시, 버튼 그룹으로 추가로 그룹화할 수 있다!

                                    
                                        
                                    
                                
리버스 체크폼: .form-check form-check-reverse
.form-check에다 .form-check-reverse 클래스를 더하면 레이블과 체크 버튼의 순서를 바꾸어 뒤쪽서부터 배치한다
                                    
                                        
                                    
                                
스위치 컨트롤: .form-check form-switch
폼에는 기본적인 체크박스 마크업이 있지만, 부트스트랩에서는 독자적으로 .form-check 클래스에 .form-switch 클래스를 더하여 토글 스위치를 렌더링한다
                                    
                                        
                                    
                                

컨트롤의 특성을 보조기술에 더 정확하게 전달하고자 한다면; role= "switch" 속성을 넣어주는 것이 좋다!

선택 상자: .form-select
.form-select form-select-lg/sm 클래스는 <select> 선택상자의 크기를 변경하며, <option>에서의 .selected 클래스는 미리 선택된 항목으로 설정한다:
                                    
                                        
                                    
                                
처음에 펼쳐질 <option> 항목의 개수를 지정하려면; <select> 요소에서 size= "개수" 속성을 추가해주면 되는데, 옵션 항목 모두를 펼친 채 시작하려면; 대신에 multiple 속성을 추가해주면 된다

multiple 속성을 주면; CtrlShift 키와의 조합으로 복수 선택을 가능하게 한다!

html 5)에서 새로 도입된 <datalist>(& <option>) 요소는 <select>와 유사하지만, <select>(& <option>)과는 달리 메뉴 스타일링상의 더 많은 제약과 차이점이 있다!

                                                
                                                    
                                                
                                            

플로팅 레이블

플로팅 레이블
부트스트랩의 텍스트 폼 필드로 플로팅 레이블을 가능하게 하려면; .form-floating 내부에 <input class="form-control">과 <label> 요소를 필요로 하는데(플로팅 레이블에는 ~ 등의 형제 선택자를 사용하므로, <input>가 앞에 와야 한다!), 이때 ::placeholder-shown 가상요소 선택자가 사용되므로, 각 <input>에는 플레이스홀더 또한 필요하다!
                                    
                                        
                                    
                                
<input>에서 value= 속성값이 이미 정의되어 있는 경우, <label>은 그에 맞춰 자동으로 위치를 조정하며, 양식 유효성 검사(.form-control is-invalid) 또한 예상대로 작동한다!
                                    
                                        
                                    
                                
1. 부트스트랩의 .form-control에서 <textarea>는 기본적으로 <input>와 같은 높이를 갖는다. 따라서, 사용자정의 높이를 사용하고자 한다면; rows= 속성 대신, 명시적으로 인라인 style이나 css를 사용해야 한다!
                                    
                                        
                                    
                                
2. <select> 컨트롤에서도 .form-select 클래스를 주어 플로팅 레이블 기능을 사용할 수 있지만, 여기서는 <label>이 항상 떠있는 상태로 되며, sizemultiple 속성은 사용할 수 없다!
                                    
                                        
                                    
                                
3. 입력그룹(.input-group)과 .form-floating을 폼 유효성 검사와 함께 사용할 때는; 폼 피드백을 .form-floating 바깥에 배치해야 한다 이는 피드백이 자바스크립트를 사용하여 표시되어야 함을 의미한다!
@
Please choose a username
                                    
                                        
                                    
                                

폼의 유효성 검증

폼 유효성 검증
입력 폼에서 required 속성을 주면; 브라우저에서 기본 제공하는 폼 유효성 검증을 사용할 수 있다: <input class="form-control" type="text" id="" value="" required>
@
                                                    
                                                        
                                                    
                                                
사용자지정 폼 검증 메시지를 사용하고자 한다면; <form>에 novalidate 속성을 넣어주면 된다(이 경우 브라우저 기본 피드백은 비활성화되지만, 여전히 자바스크립트의 폼 검증 API에 대한 액세스는 제공된다!) 한편, 폼 레이아웃에서 허용하는 경우, 폼 유효성 검증에 valid/invalid-feedback 클래스를 .valid/invalid-tooltip 클래스로 바꿀 수 있다!
Looks good!
Looks good!
@
Please choose a unique and valid username.
                                                    
                                                        
                                                    
                                                

툴팁의 포지셔닝을 위해, 부모요소에서 position:relative; 설정이 있어야 한다!

폼 레이아웃

부트스트랩에서 폼 필드의 모든 그룹은 <form> 안에 상주해야 한다. 부트스트랩은 대부분의 폼 컨트롤에서 display: block;, width: 100%;를 적용하므로, 폼은 기본적으로 세로로 쌓이게 된다!

폼 레이아웃
부트스트랩은 <form> 요소에 대한 기본 스타일링을 제공하지는 않지만, 기본적으로 제공되는 몇 가지 브라우징 기능이 있다. 예컨대, 폼 내부의 <button>들은 기본적으로 type= "submit"이므로, 항상 type 속성을 포함하여 구체적으로 지정하여야 한다. 또한, 폼 전체의 일관성을 위해서, 마진은 margin-bottom을 사용할 것을 권장한다
Radios
                                                    
                                                        
                                                    
                                                

<legend>에는 관련 양식 컨트롤과 함께 수직 중앙에 위치하도록 .col-form-label 클래스를 추가해주어야 한다!

@
                                                    
                                                        
                                                    
                                                
버튼그룹을 써서 드롭다운 폼 레이아웃을 작성할 수도 있다:
                                    
                                        
                                    
                                

(* 이 샘플은 에서 가져온 것입니다..)

Focus & Tab

폼 컨트롤, 버튼, 링크과 같은 상호작용 요소는 포커스를 주거나 탭을 통해 이동하는 것이 가능한데, 탐색 포커스 순서는 기본적으로 소스 코드의 눈에 보이는 흐름과 동일하다 html의 tabindex 속성을 써서 실제 탭 순서를 변경하거나 Css의 order 속성 등을 써서 시각적 렌더링 순서를 변경하는 것은 사용자의 접근성에 악영향을 끼칠 수 있으므로 주의해서 사용해야 한다!

탭 인덱스
html 전역 속성인 속성은 어떤 요소에든 추가할 수 있고, 그 요소에 Tab 키를 써서 포커스를 맞출 수 있도록 해준다 - 곧, 기본값인 0 은 요소를 포커스 및 탭 가능하게 만들어 소스코드 순서에 따르는 순차탐색 순서에 추가한다
-1 같은 음수값은 요소에 포커스를 맞출 수는 있지만, 탭할 수는 없다 예컨데, 버튼이나 링크 같은 상호작용 요소에 tabindex 값으로 -1 을 주면; 더 이상 Tab 키는 사용할 수 없게된다!
1 이상 값을 주면; 요소에 포커스 가능하고 탭할 수 있게 되지만, 우선 순위가 지정된 탭 시퀀스에 추가되어 혼란을 줄 수 있으므로 가능하면 피하는 것이 좋다 다시 말해, tabindex를 써서 html 문서의 DOM 트리 순서를 변경하는 것은 좋지 않다!

* cf) 자바스크립트 탭 플러그인이 초기화될 때, 모든 비활성 탭은 tabindex= "-1";로 설정되고, 현재 활성화된 탭만 키보드 포커스를 받게된다. 현재 활성화된 탭에 포커스가 있으면 커서 키가 이전/다음 탭을 활성화하고, HomeEnd 키는 각각 첫 번째 탭과 마지막 탭을 활성화하게 된다. 그에 따라 탭 플러그인이 tabindex 순서를 변경하는데, 커서 키 상호작용과 관련하여 수평/수직 탭 목록을 구분하지는 않는다 탭 목록의 방향에 관계없이 위쪽 및 왼쪽 커서는 모두 이전 탭으로 이동하고, 아래쪽 및 오른쪽 커서는 다음 탭으로 이동한다!

웹 전근성을 위하여 항상 사용자가 포커스가 있는 요소를 알 수 있도록 하고, 모든 뷰포트 크기에서 컨텐츠의 탭 배치 순서가 논리적으로 유지되도록 해야한다 참고로, html DOM의 탭 탐색 순서는 키보드의 Tab(및 Shift+Tab) 키로 확인할 수 있다!

탐색 포커스
요소가 를 받을 때 기본 브라우저 동작은 포커스 링을 표시하는 것인데, 이 포커스 링은 브라우저와 운영체제에 따라 제각각이다. 따라서, 요점은 요소의 기본 스타일과 대비되는 포커스 스타일을 따로 설정해주어야 한다는 것인데, 이를 위해서는 요소에 윤곽선이나 그림자를 설정해주는 것이 일반적이다

여기 마우스를 올리세요.. 그리고 클릭해보세요..

                                    
                                        a:focus {
                                            outline: 3px dotted gray; /* 외곽선 */
                                            outline-offset: 5px; /* 요소로부터 5px만큼 오프셋 거리를 준다 */
                                        }
                                    
                                

이 동작은 Css의 :focus, :focus-within, :focus-visible 등의 의사클래스를 써서 변경해줄 수 있다!

요소의 autofocus 속성 및 스크립트의 요소.focus(); 메서드는 페이지가 로드될 때 포커스 가능한 요소에 초점을 맞춰주며, 뷰는 그 위치로 스크롤하여 표시된다 단, 이것이 순차 포커스 탐색 순서를 변경하는 것은 아니다!
                                    
                                        
                                    
                                

이러한 자동 포커스 맞추기는, 일반적으로는 사용자를 혼란스럽게 할 수 있기에 권장되지 않지만, <dialog> 대화상자(예컨대, 모달 대화상자 등) 안에서는 유용하게 사용될 수 있다 - 곧, 대화상자가 열릴 때 곧장 특정 포커서블 요소로 바로 초점을 옮겨주고자할 때이다!


* cf) 폼 컨트롤 요소에 주어지는 속성인 disabled 키워드는 폼 컨트롤에서 포커스와 탭을 비활성화하며, 클릭 이벤트 또한 받지 않는다(더하여, 해당 폼 컨트롤에 강조 색상이 설정되어 있어도 그레이 색상으로 재설정된다!). 한편, 모든 요소에 적용할 수 있는 전역 속성인 inert 키워드는 해당 요소 및 모든 중첩된 컨텐츠에서 포커스를 비활성화하며, 접근성 트리에서도 삭제한다 - 주로 오프스크린 및 숨겨진 컨텐츠 섹션(예컨대, 오프캔버스 서랍 등)에서 사용된다!

브라우저는 로드될 때, 포커스가 맞춰진 요소를 뷰 안으로 스크롤한다. 따라서, 숨겨진 요소에 포커스를 주는 것은 좋지 않다. 포커스가 주어질 때 자동으로 표시되지 않는, 오프스크린에서 렌더링되는 모든 영역은 비활성으로 만들어야 한다!

툴팁/팝오버

원칙적으로 툴팁팝오버는 키보드로 초점을 맞출 수 있고, 대화형인 html 요소(예컨대, 링크 또는 폼 컨트롤)에만 사용해야 한다. 그렇지 않으면 키보드 및 스크린리더기 사용자들에게 불편하고 혼란스러운 상황을 야기시킬 수 있다!

툴팁/팝오버 작성하기
툴팁과 팝오버는 직접 초기화해야 하며, 숨겨진 요소나 길이가 0인 요소에서는 작동되지 않는다. 또한, .disabled 클래스(및 disabled 속성)인 요소에 대한 설명은 래퍼 요소에서 트리거되어야 하며, 해당 요소가 DOM에서 제거되기 전에 숨겨야 한다 페이지 내 모든 툴팁을 초기화하는 한 가지 방법은 data-bs-toggle 속성을 이용하는 것이다!
[ 툴팁/팝오버 초기화 스크립트 ]
                                        
                                            <body>
                                                ...
                                            
                                                <!-- 툴팁/팝오버를 위한 스크립트 코드 -->
                                                <script>
                                                    const tooltipTriggerList= document.querySelectorAll('[data-bs-toggle="tooltip"]')
                                                    const tooltipList= [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))
                                            
                                                    const popoverTriggerList= document.querySelectorAll('[data-bs-toggle="popover"]')
                                                    const popoverList= [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
                                                </script>
                                            </body>
                                        
                                    
1. 툴팁/팝오버에 필요한 html 마크업은 단지 data-bs-toggle= "tooltip/popover"data-bs-title= "툴팁/팝오버 설명" 속성 정도이다. 팝오버에서는 data-bs-content= "본문 내용" 속성도 사용할 수 있다

                                    
                                        
                                    
                                

data-bs-title= "툴팁 설명" 대신 title= "툴팁 설명"으로 해도 같다 title은 Tooltip 및 Popover에 의해 자동으로 data-bs-title로 렌더링된다!

2. 툴팁과 팝오버 모두 data-bs-placement= "right/bottom/left"(기본값: top)로 나타날 위치를 지정해줄 수 있고, html 코드를 삽입하는 것도 가능하다(data-bs-html= "true")

                                    
                                        
                                    
                                
3. disabled 속성이 있는 요소는 사용자가 툴팁 및 팝오버를 트리거하기 위해 포커스를 맞추거나 클릭할 수가 없다. 이런 경우에는, <div>나 <span>으로 둘러싸고 키보드 포커서블이 가능하도록 tabindex= "0" 속성을 주면 된다

                                    
                                        
                                    
                                

disabled 팝오버 트리거의 경우에는, 사용자가 이 요소를 클릭하지 않고 지나칠 것으로 예상할 수 있으므로 (팝오버가 사용자에게 즉각적인 시각적 피드백으로 나타나도록)data-bs-trigger= "hover focus"를 제공해주는 것도 좋다!


* cf) 토글 버튼이 아닌 다른 지점을 클릭할 때 팝오버가 해제되도록 하려면; 포커스 트리거를 사용할 수 있는데, 올바른 동작을 위해서는 <button> 태그가 아닌 <a> 태그를 써야하며, tabindex 속성도 포함해야 한다!

data-bs-trigger="focus" & tabindex="0"

                                    
                                        
                                    
                                
➥ 사용자정의 툴팁/팝오버

사용자정의 팝오버 사용 예:

                                        
                                            
                                        
                                    

팝오버가 표시될 위치를 지정해주었더라도(data-bs-placement= "right"), 실제로는 주변 공간 상황에 의해 제약됩니다!

Alert 경고창

Alert 경고창은 사용자에게 알림 경고 메시지 및 일반적인 작업 상황에 맞는 피드백 메시지 등을 제공한다

Alert 기본
시각적 색상만을 통한 의미 전달은 스크린리더 사용자들에게는 제대로 인식되지 않을 수 있다. 이를 고려한다면, .visually-hidden 클래스 등을 추가하여 (숨겨진 텍스트를 써서)의미 전달을 명확히 해줄 필요가 있다!
                                    
                                        
                                    
                                
경고를 해제하고 닫아두는 것도 가능한데, 단지 닫기 버튼을 만들어주기만 하면 된다. 우선, Alert 컨테이너(.alert)에서 .alert-dismissible 클래스(이는 .me-auto와 같은 역할을 한다)로 닫기 버튼을 위한 우측 마진을 확보해준 다음, 컨테이너 내부에서 Alert 해제를 위한 [닫기]() 버튼을 만들어 배치해준다
                                    
                                        
                                    
                                

이 닫기 버튼에는 스크립트 기능을 트리거하는 data-bs-dismiss= "alert" 속성을 추가해주어야 하며, 상자 해제 시 애니메이션을 적용하려면; .fade(흐릿하게) 및 .show(보이도록) 클래스를 더해주어야 한다

                                                    
                                                        
                                                    
                                                
                                                    
                                                        
                                                    
                                                

Toast 메시지

Toast 메시지는 푸시 메시지를 모방하도록 설계된 가벼운 알림 메시지로서, 플렉스박스로 제작되어 쉽게 정렬하고 배치할 수 있다!

Toast 메시지
Toast는 아래 방식과 같이 직접 초기화해야 하며, 달리 autohide: false;로 지정해준 것이 아니라면; 자동으로 숨겨진다 만약 토스트에 포커스 및 실행 가능한 컨트롤이 꼭 들어가야 한다면; autohide: false;로 설정해주어야 하며, 닫기 버튼도 반드시 넣어주어야 한다!
[ Toast 초기화 ]
                                        
                                            const toastTrigger= document.getElementById('liveToastBtn')
                                            const toastLiveExample= document.getElementById('liveToast')
                                    
                                            if (toastTrigger) {
                                                const toastBootstrap= bootstrap.Toast.getOrCreateInstance(toastLiveExample)
                                                toastTrigger.addEventListener('click', () => {
                                                    toastBootstrap.show();
                                                })
                                            }
                                        
                                    
1. 확장성과 예측 가능성을 고려한다면; 토스트는 toast-headertoast-body로 구성하는 것이 권장된다. 토스트 헤더는 플렉스박스를 사용하며, (자동으로 사라지기는 하지만)닫기 버튼도 넣어주는 것이 권장된다:
                                    
                                        
                                    
                                
2. 스크린리더기 등의 보조 기술에 대한 접근성을 고려한다면; 토스트가 나타나기 전에 .toast에서 aria-live= "polite", aria-atomic= "true" 값을 설정하여 aria-live를 둘러싸도록 한다. 나아가, 토스트 컨텐츠를 읽을 충분한 시간 지연도 설정해주는 것이 좋다(예컨대, data-bs-delay= "10000"):
[ 보조 기술을 위한 toast 코딩 ]
                                        
                                            
                                        
                                    

아래 코드들은 기본 샘플에서 색상 및 모양들을 조금씩 바꾸어준 것들인데, 필요 시 살펴보십시오..

                                                
                                                    
                                                
                                            
                                                
                                                    
                                                
                                            
                                                
                                                    
                                                
                                            
                                                
                                                    
                                                
                                            
                                                
                                                    
                                                
                                            
                                    
                                        
                                    
                                

타이핑 텍스트

플러그인은

타이핑 텍스트
Typed.js 플러그인을 사용하려면; 먼저, CDN 링크가 필요하고, 타이핑칠 내용은 <span data-typed-text= "['내용 1', '내용 2', ..]"></span> 식으로 넣어주면 된다
                                    
                                        <!-- Typed.js 스크립트 CDN 링크 -->
                                        <script src="https://unpkg.com/typed.js@3.0.0/dist/typed.umd.js"></script>
                                    
                                
                                    
                                        
                                    
                                

기본 설정된 초기값은 다음과 같다: "startDelay":1000, "typeSpeed":100, "backSpeed":50, "backDelay":1000, "loop":true


* cf) 웹페이지 안에 직접 내용을 배치하는 위 방식과는 달리, 곧바로 스크립트에서 문자열 형태로 넣어주거나, 또는, 문자열의 배열 형태로 넣어줄 수도 있다: 타이핑 텍스트


Css 애니메이션은 Javascript에서 초기화할 때 빌드된다. 그러나 다음과 같이 사용자 정의해줄 수도 있다:

                                    
                                        /* Cursor */
                                        .typed-cursor { .. }

                                        /* If fade out option is set */
                                        .typed-fade-out { .. }
                                    
                                

Quill Editor

는 최신 웹용으로 제작된 무료 오픈 소스 WYSIWYG 텍스트 편집기로서, 모듈식 아키텍처와 표현력 있는 API를 통해 모든 요구 사항에 맞게 완벽하게 사용자 지정할 수 있다!

퀼 에디터
1. 퀼 에디터를 사용하려면; 먼저 Quill Css 및 스크립트를 CDN으로 링크하고 스크립트를 초기화해주어야 한다:
[ Quill Editor CDN 링크 및 스크립트 초기화 ]
                                        
                                            <link href="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.snow.css" rel="stylesheet" />

                                            <script src="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.js"></script>
                                            <script>
                                                const quille= new Quill('#editor', {
                                                    theme: 'snow' // 'snow' 테마로 초기화 ← 부동 도구모음 테마인 'bubble'도 있음
                                                });
                                            </script>
                                        
                                    
2. 다음, 퀼 에디터용 컨테이너만 만들어주면 된다:
                                    
                                        <div id="editor">
                                            마음껏 적어보세요.. 끝입니다, 간단하지요?
                                        </div>
                                    
                                
마음껏 적어보세요.. 끝입니다, 간단하지요? 하지만, 실제로는.. Quill 에디터는 이보다 훨씬 더 풍부하고 방대하니.. 관련 상세 내용들은 Quill-js 공식사이트로 가서 살펴보십시오..

Flatpickr

는 가볍고 강력한 순수 자바스크립트 날짜/시간 피커이다 여기서는 간단한 기본 예만 들지만, 그밖에 다양한 고급 사용법들은 공식 사이트로 가서 살펴보십시오..

날짜/시간 피커: Flatpickr
Flatpickr를 사용하기 위해서는; 먼저, Css 링크 및 스크립트 소스를 불러와야 한다. 이어서, 스크립트 초기화 작업 또한 필요하다:
[ Flatpickr CDN 링크 및 스크립트 소스 ]
                                        
                                            <link href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css" rel="stylesheet">

                                            <script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
                                        
                                    
                                    
                                        
                                    
                                
                                    
                                        /* 기본 플랫피커 초기화 */
                                        const fp= flatpickr("#FlatpickrInput", {}); // flatpickr
                                    
                                
                                    
                                        
                                    
                                
                                    
                                        /* 시간 피커 옵션 설정 */
                                        const fp1= flatpickr("#FlatpickrInput1", {
                                            enableTime: true, noCalendar: true, dateFormat: "H:i"
                                        });
                                    
                                
                                    
                                        
                                    
                                
                                    
                                        /* 날짜 & 시간 피커 옵션 설정 */
                                        const fp2= document.querySelector(".myFlatpickrs");
                                        const fp3= flatpickr(fp2, {
                                            enableTime: true, dateFormat: "Y-m-d H:i"
                                        });
                                    
                                

DropZone 업로더

는 웹사이트에서 드롭된 파일을 쉽게 처리할 수 있도록 해주는 순수 자바스크립트 라이브러리이다

드롭죤 업로더
1. 드롭죤 업로더 플러그인을 사용하려면; 먼저 Dropzone Css 및 스크립트를 CDN으로 링크한 뒤 스크립트를 초기화해주어야 한다:
[ Dropzone Css 및 스크립트 CDN 링크 ]
                                        
                                            <link href="https://unpkg.com/dropzone@6.0.0-beta.1/dist/dropzone.css" rel="stylesheet" type="text/css" />

                                            <script src="https://unpkg.com/dropzone@6.0.0-beta.1/dist/dropzone-min.js"></script>
                                        
                                    
2. 이어서 사용할 form 요소를 만들어주면; Dropzone은 .dropzone 클래스가 있는 모든 양식요소를 찾아 자동으로 첨부하고 드롭한 파일을 지정된 속성에 업로드한다:
                                    
                                        
                                    
                                

* cf) 다음과 같이, Dropzone에 옵션을 추가해줄 수도 있다

                                    
                                        <form action="/target" class="dropzone" id="my-dropzone"></form>

                                        <script>
                                            Dropzone.options.myDropzone= { // id명은 camelCase 방식으로 작성해주어야 한다!
                                                // 설정하려는 옵션들..
                                            }
                                        </script>
                                    
                                

스크립트에서는 html에서의 id명(id= "my-dropzone")을 (-이 있다면; 제거하고)camelCase 방식으로 변경해주어야 한다!

카운트 업/다운

순수 Javascript 라이브러인 는 카운트업 애니메이션을 신속히 만들 수 있도록 해준다

카운트 Up
Count Up 플러그인을 사용하기 위해서는 먼저, 스크립트 소스를 필요로 하며, data-countup= 속성을 가진 요소가 뷰포트에 보여진 이후 카운팅을 시작한다:
[ CountUp.js 스크립트 소스 ]
                                        
                                            <script src="vendors/countup/countUp.umd.js"></script>                                    
                                        
                                    

0

                                    
                                        
                                    
                                
                                    
                                        var countupInit = function countupInit() {
                                            if (window.countUp) {
                                                var countups = document.querySelectorAll('[data-countup]');
                                                countups.forEach(function (node) {
                                                    var _utils$getData = utils.getData(node, 'countup'),
                                                        endValue = _utils$getData.endValue,
                                                        options = _objectWithoutProperties(_utils$getData, _excluded);
                                            
                                                    var playCountUpTriggerd = false;
                                            
                                                    var countUP = function countUP() {
                                                        if (utils.isElementIntoView(node) && !playCountUpTriggerd) {
                                                            var countUp = new window.countUp.CountUp(node, endValue, _objectSpread({
                                                                duration: 3,
                                                                useEasing: false
                                                            }, options));
                                                
                                                            if (!countUp.error) {
                                                                countUp.start();
                                                            } else {
                                                                console.error(countUp.error);
                                                            }
                                                
                                                            playCountUpTriggerd = true;
                                                        }
                                                    };
                                            
                                                    countUP();
                                                        window.addEventListener('scroll', function () {
                                                        return countUP();
                                                    });
                                                });
                                            }
                                        };                                                          
                                    
                                
카운트 Down
아래 사용자정의 Count Down 스크립트는 data-countdown= 속성을 가진 요소가 뷰포트에 보여진 이후, 현재로부터 남은 시간을 카운팅한다:

                                    
                                        
                                    
                                
                                    
                                        
                                    
                                

List-JS 테이블

플러그인은 작고 보이지 않으며 단순하지만 일반 HTML 목록, 표 또는 기타 항목에 검색, 정렬, 필터 및 유연성을 추가하는 강력하고 빠른 순수 자바스크립트 라이브러리이다

리스트 테이블: List.js
List.js 플러그인을 사용하기 위해서는; 먼저, 스크립트 소스를 불러온 뒤, 매우 간단한 템플릿으로 리스트 목록을 만들어줄 수 있다:
[ List.js CDN 링크 ]
                                        
                                            <script src="plugins/listjs.js"></script>

                                            <script>
                                                .. 테이블 작성 코드
                                            </script>
                                        
                                    
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                
                                        
                                            
                                        
                                    
                                        
                                            
                                        
                                    
    • Kim

      경주


    여기서는 간단한 기본 예만 들었지만.. 그밖에 검색, 정렬, 필터 등의 다양한 고급 사용법들은 공식 사이트로 가서 살펴보십시오 ㅡㅡ;

    부트스트랩 스크립트

    거의 모든 부트스트랩 플러그인은 html의 data- 속성만으로 활성화하고 구성할 수 있는데, 하나의 요소에는 단지 하나의 데이터 속성 세트만 사용해야 한다 - 예컨대, 하나의 버튼으로 툴팁과 모달을 한번에 트리거할 수는 없다!

    부트스트랩에서 스크립트 사용하기
    모든 플러그인은 첫번째 인수로 Css 선택자를 받아들일 수 있게 되었는데, DOM 요소 또는 적절한 Css 선택자를 전달하여 플러그인의 새 인스턴스를 만들 수 있다. 스크립트 옵션은 data-bs- 속성이나 자바스크립트를 통해 전달할 수 있으므로, data-bs-animation= "값";과 같은 방식으로 줄 수 있다
                                        
                                            const modal= new bootstrap.Modal('#myModal')
                                            const dropdown= new bootstrap.Dropdown('[data-bs-toggle="dropdown"]')
                                        
                                    

    * cf) Bootstrap 5) 버전에서부터 모든 자바스크립트 플러그인의 data- 속성은 기존의 data-*에서 data-bs-*로 이름이 변경되었는데, 옵션 이름은 camalCase 방식에서 kebab-case 방식으로 변경해주어야 한다! 한편, 부트스트랩에서 드롭다운, 팝오버 및 툴팁 등은 Popper 플러그인을 사용한다!

    스크립트에서 DOM 요소를 쿼리할 때, 기본적으로 querySelectorquerySelectorAll 속성을 사용한다. 부트스트랩은 대부분의 플러그인 고유 작업에 대한 사용자정의 이벤트를 제공하는데, 일반적으로 show 같은 동사 형태는 이벤트가 시작될 때 트리거되고, shown 같은 과거분사 형태는 작업 완료 시 트리거된다
                                        
                                            const myModal= document.querySelector('#myModal')
        
                                            myModal.addEventListener('show.bs.modal', event => {
                                                if (!data) {
                                                    return event.preventDefault() // stops modal from being shown
                                                }
                                            })
                                        
                                    

    모든 동사 형태 이벤트는 preventDefault(); 메서드를 제공하는데, 이는 작업이 시작되기 전에 실행을 중지하는 기능을 제공한다 이벤트 핸들러에서 false 를 반환하면 자동으로 호출된다!

    플러그인 인스턴스
    특정 플러그인의 인스턴스를 얻고자 한다면; 각 플러그인은 getInstance(); 메서드를 노출하므로, 요소로부터 직접 인스턴스를 검색하려면 다음과 같이 하면 된다: bootstrap.Popover.getInstance(myPopoverE1); 요청된 요소에 대해 인스턴스가 시작되지 않은 경우 null 이 리턴된다!
    한편, getOrCreateInstance(); 메서드는 DOM 요소와 연결된 인스턴스를 가져오거나, (없다면;)새로이 인스턴스를 만들어 반환한다: bootstrap.Popover.getOrCreateInstance(myPopoverE1, configObject); 인스턴스가 초기화되지 않은 경우, 두번째 인수를 받아 선택적 구성 객체로 사용한다!
                                        
                                            const modal= new bootstrap.Modal('#myModal')
                                            const dropdown= new bootstrap.Dropdown('[data-bs-toggle="dropdown"]')
                                            const offcanvas= bootstrap.Offcanvas.getInstance('#myOffcanvas')
                                            const alert= bootstrap.Alert.getOrCreateInstance('#myAlert')
                                        
                                    

    모든 플러그인 생성자는 DOM 요소 또는 적절한 Css 선택자를 첫번째 인수로 받을 수 있는데, 부트스트랩은 단일 요소만 지원하므로 플러그인 요소들은 querySelector(); 메서드로 찾을 수 있다!

    비동기식 API
    모든 프로그래밍 방식 API 메서드는 비동기식이며, 따라서 일단 트랜지션이 시작되면; 종료하기 전에 곧바로 호출자에게 반환되고, 트랜지션이 완성되면; 액션을 실행하기 위해 해당 이벤트를 수신할 수 있다. 한편, 트랜지션 컴포넌트에 대한 메서드 호출은 무시된다
                                        
                                            const myCollapseEl= document.querySelector('#myCollapse')
    
                                            myCollapseEl.addEventListener('shown.bs.collapse', event => {
                                                // Action to execute once the collapsible area is expanded
                                            })
                                        
                                    
                                        
                                            const myCarouselEl= document.querySelector('#myCarousel')
                                            const carousel= bootstrap.Carousel.getInstance(myCarouselEl) // Retrieve a Carousel instance
    
                                            myCarouselEl.addEventListener('slid.bs.carousel', event => {
                                                carousel.to('2') // Will slide to the slide 2 as soon as the transition to slide 1 is finished
                                            })
    
                                            carousel.to('1') // Will start sliding to the slide 1 and returns to the caller
                                            carousel.to('2') // !! Will be ignored, as the transition to the slide 1 is not finished !!
                                        
                                    
    버튼 인스턴스 만들기
    부트스트랩의 .btn 생성자를 써서 버튼 인스턴스를 만들 수 있는데, dispose();, getInstance();, getOrCreateInstance(); 외에 toggle();(버튼 활성화 상태를 토글한다) 메서드를 사용할 수 있다
                                        
                                            const bsButton= new bootstrap.Button('#myButton');
                                    
                                            // 모든 버튼을 토글한다
                                            document.querySelectorAll('.btn').forEach(buttonElement => {
                                                const button= bootstrap.Button.getOrCreateInstance(buttonElement)
                                                button.toggle()
                                            });
                                        
                                    

    스크립트 API는 Javascript를 모르는 상태에서는 이해하기에 어렵고, 또 당장 쓸 일도 없을 터이니.. 대충, 대충,, 보시고 나중에 Javascript를 배우게 된다면; 그때 한번 다시 살펴보십시오 ㅡㅡ;

    wave