Bootstrap 5

[웹코딩 가이드] 홈

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

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


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


드롭다운 메뉴

드롭다운 메뉴.dropdown으로 선언된 <div> 블록 또는, position: relative;로 선언된 요소 안에서 <button>(및 <a> 요소)를 써서 드롭다운 토글로 전환하고, 이어서 <ul> 및 <ol>로 드롭다운 목록을 만들어주면 된다

드롭다운 메뉴 만들기
아래는 드롭다운 메뉴 작성의 기본 형식인데, 드롭다운 토글러로 <button> 대신 <a> 요소를 사용할 수도 있지만, <button>을 쓰면; 버튼의 색상 변경(.btn-danger)이나 크기 변경(.btn-lg/sm) 등이 쉬워진다는 장점이 있다!
                                    
                                        
                                    
                                

ul .dropdown-menu dropdown-menu-end

드롭다운 래퍼 <div>에 주어지는 .dropdown dropup/dropend/dropstart는 드롭다운 목록을 래퍼 전체의 위쪽/뒤쪽/앞쪽 (아래쪽은 기본값임!) 방향으로 펼치는데, 드롭다운 메뉴를 펼치려는 방향의 공간 여분이 드롭다운의 크기보다 작다면; 반대 방향으로 펼쳐진다!

div .dropdown dropup/dropend/dropstart

버튼그룹 드롭다운
드롭다운 버튼에서 텍스트와 아이콘을 분할하려는 경우, 드롭다운 바깥 <div> 래퍼에서 .dropdown 클래스 대신 .btn-group 클래스로 주고 각각의 버튼을 만들어주면 된다
                                    
                                        
                                    
                                

.btn-group btn-group-lg/sm 클래스는 그룹 내 모든 버튼의 크기를 더 크게/작게 설정한다!

드롭다운 아이템 오프셋
1. data-bs-offset= "x, y"start, top 으로부터 x, y 거리만큼 떨어져서 드롭다운 목록을 배치한다
                                    
                                        
                                    
                                
2. 한편, 버튼그룹에서는 data-bs-reference= "parent"를 추가해주면; 분할 버튼의 위치가 아닌 (부모 요소인)버튼 그룹의 위치를 기준으로 배치된다
                                    
                                        
                                    
                                
반응형 드롭다운 정렬
반응형 정렬을 하고자 한다면; 먼저 버튼에서 data-bs-display= "static" 값을 주어 동적 포지셔닝 기능을 비활성화해주어야 한다
                                    
                                        
                                    
                                

위 드롭다운 메뉴는 기본적으로 앞쪽에서부터 맞추어지지만, md 브레이크포인트에서부터는(.dropdown-menu dropdown-menu-lg-end) 뒤쪽에 맞추어진다 화면 크기 늘이고 줄이면서 확인해보세요..

페이드업 애니메이션

사용자정의 스타일: .fadeUp-Ani 드롭다운

페이드업 애니메이션: .fadeUp-Ani
.fadeUp-Ani 드롭다운은 부트스트랩 기본 드롭다운 메뉴의 밋밋한 동작에 약간의 사용자정의 Css 스타일 정의를 덧붙여 좀 더 부드럽고 폼나게 움직이도록 한 것입니다:
                                    
                                        
                                    
                                

.dropdown 버튼에서 .btn mb-0 식으로 마진을 없애주는 것이 좋다. 아니라면; 마우스 커서가 버튼에서 중간의 빈 공간을 거쳐 아래 .dropdown-menu로 내려갈 때 아래 드롭다운 메뉴가 사라져버리는 상황과 마주칠 수도 있다!

                                    
                                        /* 페이드업 애니메이션 사용자정의 Css */
                                        .fadeUp-Ani {
                                            animation-name: fadeUp; animation-duration: 700ms;
                                            animation-timing-function: margin cubic-bezier(0.18, 1.25, 0.4, 1), opacity cubic-bezier(0, 1, 0.4, 1);
                                        } @keyframes fadeUp {
                                            0% { opacity: 0; margin-top: 1rem; }
                                            100% { opacity: 1; margin-top: 0; }
                                        }
                                    
                                

여기서는 margin-top: 0; 값으로 .dropdown 내부의 버튼과 .dropdown-menu 사이의 간격을 없애주었습니다만.. 마진병합 현상 등의 예기치 못한 문제까지도 고려할 필요가 있기에 위 html 코드에서 다시 한번, 드롭다운 버튼에 부트스트랩의 .mb-0 클래스를 더해준 것입니다!

리스트그룹

리스트그룹은 주로 가로 및 세로 탐색 메뉴바 및 컨텐츠창을 만드는데 쓰이는데, <ul>(이나 <ol>) 및 <li> 요소로 작성한다

리스트그룹 작성하기
1. 리스트그룹은 <ul>에서의 .list-group(<ol>에서는 .list-group list-group-numbered) 클래스와 <li> 리스트에서의 .list-group-item 클래스로 작성한다
  1. li .list-group-item list-group-item-action
  2. li .list-group-item active
  3. li .list-group-item disabled
                                    
                                        
                                    
                                

.list-group list-group-flush는 상위 컨테이너(예컨대, 카드 등)에서 목록 아이템들을 가장자리에서 가장자리로 렌더링하기 위해 일부 테두리와 둥근 모서리를 제거해준다

2. ul > li 조합 대신 ul > a(나 button) 조합으로 리스트 그룹을 작성할 수도 있는데, 이 경우 .list-group-item list-group-item-action 클래스를 써서 호버, 비활성화 및 활성 상태가 있는 실행가능한 리스트그룹 아이템들을 생성할 수 있다
                                    
                                        
                                    
                                

참고로, <a> 태그가 아닌 <button> 태그를 사용할 때라면; .disabled 클래스 대신 disabled 속성을 사용할 수 있다 <a> 태그에서는 disabled 속성을 지원하지 않는다!


.list-group list-group-flush에다 카드에서의 둥근 모서리(.card border border-5 rounded-5)를 보태니, 굳이 애 안써도 이 자체만으로 꽤 멋진 카드 테두리 모양이 만들어지는군요 - 어떤 식으로 붙여도 응용이 가능한, 이것이 바로 부트스트랩의 커다란 유익함입니다 ^^

수평 리스트그룹
.list-group list-group-horizontal[-*]은 수평 리스트그룹을 만든다 -*는 반응형임
  • 아이템 1
  • 아이템 2
  • 아이템 3
                                    
                                        
                                    
                                
1. .list-group-item 모두에 .list-group-item-action 클래스를 더해주니; 마우스 호버 시의 모양이야 머 그런 것인데, 위쪽 예제와는 좀 다르게, 모두 똑같은 공간을 차지하면서 전체 너비를 채우는군요(무슨 사연인지, 저도 많이 헷갈립니다?)
  • 아이템 1
  • 아이템 2
  • 아이템 3
                                    
                                        
                                    
                                
2. .list-group-item-action 클래스를 첫번째 아이템에만 주니; 또 달라집니다만, 이 값을 가운데, 또는 마지막 아이템으로도 옮겨보십시오..
  • 아이템 1
  • 아이템 2
  • 아이템 3
                                    
                                        
                                    
                                

결과는? 플렉스박스의 아이템 밀어내기(.me/ms-auto)와 정확히 같은 방식으로 움직입니다 1번째와 3번째 아이템에 함께 넣어주면? 스스로 확인해보십시오 ㅡㅡ;

3. 반응형 수평 리스트그룹
  • First item
  • Second item
  • Third item
                                    
                                        
                                    
                                

반응형 수평 리스트그룹은 md 브레이크포인트서부터 수평 리스크그룹이 되며, .flex-fill 클래스는 각 항목의 길이를 똑같게 해서 전체 너비를 채워준다

리스트그룹 컨텐츠창
1. 리스트그룹의 아이템에서 data-bs-toggle= "list" 속성을 주는 것만으로 자바스크립트 코드 없이도 간단히 리스트그룹 탐색을 활성화할 수 있다:
.list-group의 각 list-group-item에 설정된 href= 값과 .tab-content의 각 .tab-pane에 설정된 id= 값으로 서로 연결된다!
.list-group의 첫번째 .list-group-item에는 .active를 넣어주고, .tab-content의 첫번째 .tab-pane에는 .show active를 넣어주어야 한다!
.tap-content의 각 .tab-pane.fade 클래스를 더하면 페이드인 효과가 주어진다!
                                    
                                        
                                    
                                
2. 수평 리스트그룹 탐색창은 부트스트랩의 그리드 시스템인 .row(& .col) 클래스로 작성해주면 된다:
                                    
                                        
                                    
                                

이동경로 탐색

는 보통 페이지 상단에 배치되어 탐색 계층구조 내에서 현재 페이지의 위치를 나타내는데, 시작 페이지로부터 현재 지점까지의 이동경로 추적을 제공함으로써 사용자가 웹사이트 내 현재 위치를 알 수 있도록 도와준다. 반면, 은 주로 게시판의 게시물이나 이미지 갤러리의 이미지들이 너무 많아 여러 페이지로 나누어진 경우, 하단에 배치하여 쉽게 페이지를 이동하도록 도와주는데 사용된다

이동경로 탐색 .breadcrumb
1. 부트스트랩에서 Breadcrumb는 <ul>이나 <ol> 리스트에서 .breadcrumb 클래스를 주고, 각 <li>에서 .breadcrumb-item을 주어 작성하는데, 내비게이션용 태그인 <nav> 요소 안에 배치하는 경우도 많다. 구분선은 Css의 ::beforecontent를 통해 자동으로 들어간다
                                    
                                        
                                    
                                

위에서 보이는 구분선(»)은 이 강좌사이트를 위해 마련한 사용자정의 Css를 쓴 것이라 이 예제 코드대로의 모습은 아닙니다 - 부트스트랩 기본값은 /입니다!

2. Css에서 Breadcrumb 항목은 일반적으로 인라인 링크로 작성하며, 각 항목 사이에 구분기호가 있어 개별 페이지간의 계층구조를 나타내는데, 보통 <nav> 태그와 <ul> 태그(& <li> 안의 <a> 태그도 함께)를 조합하여 플렉스박스로 작성한다
                                    
                                        
                                    
                                
                                    
                                        .breadcrumb_ex ul {
                                            display: flex; flex-wrap: wrap; justify-content: center;
                                            list-style: none;
                                        } .breadcrumb_ex li:not(:last-child)::after {
                                            display: inline-block;
                                            margin: 0 0.5rem;
                                            content: "→"; /* 이 구분기호는 필요하다면 언제든 변경해주면 된다! */
                                        }
                                    
                                

Css에서 Breadcrumb는 플렉스박스를 써서 배치한다: justify-content 속성을 사용하여 <ul> 컨테이너를 내부 중앙에 배치하며, <li> 리스트 자체도 인라인 방향으로 배치된 플렉스 아이템이 된다!

쪽수 매기기: .pagenation
1. 부트스트랩에서 페이지내이션은 일련의 관련 컨텐츠가 여러 페이지에 걸쳐 있음을 나타내는데, 보통 <ul>이나 <ol> 안에서 .pagenation 클래스를 주어 작성한다: .pagenation pagenation-lg/sm로 그 크기를 지정해줄 수 있고, 페이지네이션의 수평 배치는 플렉스박스의 .pagenation justify-content-start/center/end 유틸리티를 쓰면 된다:
  1. Prev
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. Next
                                    
                                        
                                    
                                

각 번호들은 이 웹문서를 위해 사용자정의 클래스를 써서 꾸며준 것입니다 - 부트스트랩에서의 기본 모양은 « 1 2 3 4 » 형태입니다

2. Css에서 페이지내이션은 사용자가 게시물 검색 결과 등의 컨텐츠 페이지 사이를 이동할 수 있는 페이지 매김을 표시하는데, 그 사용 방식은 Breadcrumb에서와 거의 비슷하다:
  1. 이전«
  2. Page11
  3. Page12
  4. 현재 Page13
  5. Page14
  6. Page15
  7. 다음»
                                    
                                        
                                    
                                
                                    
                                        .pagination_ex {
                                            display: flex; flex-wrap: wrap; justify-content: center;
                                            list-style: none;
                                        } .pagination_ex li { margin: 1em; }
                                    
                                

Css에서 Pagination은 플렉스박스를 써서 배치한다. justify-content: center; 속성을 사용하여 <ol> 컨테이너를 내부 중앙에 배치하며, <li> 리스트 자체도 인라인 방향으로 배치된 플렉스 아이템이 된다!


Pagenation은, 일반적으로 페이지 맨 위 헤더 영역에 배치되는 Breadcrumb와는 달리, 대개 컨텐츠 항목들 아래 가로 정중앙에 한 행으로 배치한다!

NAV 탐색창

부트스트랩의 Nav 구성요소는 플렉스박스로 구축되며, 모든 유형의 탐색 구성요소를 구축하기 위한 유연하고도 강력한 기반을 제공한다!

탭 탐색창 구성하기: .nav
부트스트랩의 Nav 구성요소는 보통 <ul>(및 <li>) 태그로 작성하는데, <ul>(및 <li>) 대신 <nav>(및 <a>) 태그를 쓸 수도 있다. Nav 배치는 플렉스박스 유틸리티를 써서 .nav justify-content-start/center/end와 같이 사용해주면 된다
                                    
                                        
                                    
                                

스크린리더기 등에 현재 페이지임을 알리기 위해서는; aria-current= "page" 속성을 넣어주면 된다

                                    
                                        
                                    
                                

여기서는 <ul>(및 <li>) 대신 <nav>(및 <a>)를 사용하였는데, 필요하다면; .nav nav-underline으로 active 상태의 링크에 밑줄을 표시해줄 수도 있다

탭 탐색 컨텐츠창
탭 탐색창을 사용하면 부트스트랩의 자바스크립트 내장 탐색 구성요소를 사용하여 탭 창 사이를 전환하여 내용을 표시 할 수 있는데, 부트스트랩의 개별 UI 컴포넌트 옵션은 항상 data- 속성과 함께 연결되어 있기에 자동으로 html의 data-bs-toggle= 같은 속성이나 부트스트랩의 클래스와 연결된다
                                    
                                        
                                    
                                

위 <ul> 탐색 탭(.nav nav-tabs) 대 아래 <div> 컨텐츠창(.tab-content)의 내부 구조 및 이름들을 비교하면서 세세히 살펴보십시오.. 특히, 각 탭의 href= 속성은 컨텐츠창의 id= 속성으로 연결되어 있습니다!

                                                    
                                                        
                                                    
                                                
탭 탐색 수직 컨텐츠창
수직 필 탐색창은 부트스트랩의 그리드시스템 및 플렉스박스를 써서 작성하되, 탭 리스트 컨테이너(예컨대, <div> 요소의 .nav)에서 aria-orientation= "vertical" 속성을 추가해주어야 한다
플렉스 수직 필 탐색창
<div class="d-flex align-items-start">
<div class="nav nav-pills flex-column me-3" aria-orientation= "vertical">
                                                    
                                                        
                                                    
                                                

부트스트랩의 자바스크립트 탭 플러그인은 원칙적으로 드롭다운 메뉴가 포함된 탭 인터페이스를 지원하지 않는다 - 이는 사용성과 접근성 문제를 모두 유발하기 때문인데..

먼저, 사용성 측면에서 볼 때, 현재 표시된 탭의 트리거 요소가 (닫힌 드롭다운 메뉴 내부에 있기에)즉시 표시되지 않는다는 사실은 혼란을 야기할 수 있다

나아가, 접근성 측면에서 볼 때도, 현재 웹 표준상으로는 이러한 종류의 구성을 보조기술 사용자에게 알기쉽게 전달하기에 어려운 점이 있다는 점에서 문제가 있다!

                                                    
                                                        
                                                    
                                                

* cf) 동적 탭 내비게이션에서 탭 요소는 새 페이지나 위치로 이동하는 링크가 아니라 동적 변경을 트리거하는 컨트롤이므로, 탭을 위해서는 <button> 요소를 사용하는 것이 가장 표준적이다!

Collapse

Collapse는 컨텐츠를 표시하거나 숨기는데 사용되는데, 버튼이나 앵커가 전환 대상요소로 매핑되는 트리거로 쓰인다

접는 버튼: .collapse
1. Collapse는 컨트롤 버튼에서 data-bs-target= "#대상요소" 속성으로 참조하는 경우 해당 대상요소(id= "대상요소"인 요소)를 표시하거나 숨겨준다

(* 접근성을 위해서, aria-expanded= "true/false" 속성값을 추가하여 대상요소의 현재 상태를 스크린리더기 등에 명시적으로 알려주는 것이 좋다!)

                                    
                                        
                                    
                                

컨트롤 버튼에서 .data-bs-toggle= "collapse" 속성을 주어야 하며, 펼쳐질 대상요소에서 .collapse 클래스를 주는 것 또한 필수이다!

2. 일반적으로는 <button> 요소에서 data-bs-target= "#축소대상"으로 사용하는 것이 권장되지만, <a> 요소에서 href= "#축소대상"(& role= "button" 추가)를 사용할 수도 있다
A 링크

(* 대상요소에서 .collapse showshow 값을 더해주면; 펼쳐진 상태(aria-expanded= "true" 상태)로 시작하게된다)

                                    
                                        
                                    
                                

Collapse의 대상이 되는 요소는 축소될 때 height: 0;으로 애니메이션되는데, (Css가 애니메이션을 처리하는 방식을 고려할 때)대상이 되는 요소에서 padding은 사용할 수 없다!

수평 축소
Collapse는 수평 축소 또한 지원하는데, .collapse collapse-horizontal 클래스를 주고, 직계 자식요소에서 width 값을 주어야 한다
수평 방향으로의 축소는 직계 자식요소에서 너비를 지정해주어야 한다!
                                    
                                        
                                    
                                

참고로, 위 코드에서 굳이 바깥 <div>를 만들어 min-height: 120px; 값을 준 것은 문서에서 과도한 다시 그리기를 방지하기 위해 미리 공간을 확보해둔 것일뿐, 반드시 필요한 것은 아닙니다 문제되지 않는다면; 저 바깥 <div>를 제거하시면 됩니다..

멀티 토글링
컨트롤 버튼에서 data-bs-target= "#multi-collapse"를 써서 한번에 여러 요소(.collapse multi-collapse로 설정된 대상요소들)를 참조하여 동시에 표시하거나 숨겨줄 수도 있다

내용 1) .collapse multi-collapse

내용 2) .collapse multi-collapse

                                    
                                        
                                    
                                
➥ 헤더클릭 접는 카드

아래 사용자정의 .card-collapsable 클래스는 부트스트랩에 내장된 Collapse 기능을 사용하여 만든 접는 카드로서, 사용자정의 스타일을 추가한 것이다:

                                    
                                        
                                    
                                
                                                
                                                    /* 사용자정의 헤더클릭 접는 카드 Css 스타일 */
                                                    .card-collapsable .card-header[data-bs-toggle=collapse] {
                                                        position: relative;
                                                        display: flex; align-items: center; justify-content: space-between;
                                                        text-decoration: none;
                                                    }
                                                    
                                                    .card-collapsable .card-header[data-bs-toggle=collapse] .card-collapsable-arrow {
                                                        display: inline-flex;
                                                        height: 0.9rem; width: 0.9rem; font-size: 0.9rem;
                                                        transition: transform 0.1s ease-in-out;
                                                    }
                                                    
                                                    .card-collapsable .card-header[data-bs-toggle=collapse].collapsed .card-collapsable-arrow {
                                                        transform: rotate(-90deg);
                                                    }
                                                
                                            

Accordion

아코디언은 FAQ 게시판 등에서 흔히 볼 수 있는, 사용자 클릭에 의해 펼쳐지고 접혀지는 목록인데, 내부적으로 .collapse 클래스를 사용한다

접는 박스: .accordion
아코디언은 먼저, 바깥 래퍼(.accordion) 내부에서 각각의 .accordion-item들을 배치해주어야 한다
[ Accordian 래퍼 ]
                                        
                                            
                                        
                                    

바깥 래퍼 .accordion에다 .accordion-flush 클래스를 더해주면; 기본 배경색을 없애고, 약간의 테두리 및 둥근 모서리를 제거해준다 아래 예제와 같은 모습입니다

이 접는 박스 예제는 사용자정의 Css를 쓴 것이라 부트스트랩 기본 아코디언과는 모양이나 움직임이 좀 다릅니다 원본 아코디언을 보고싶으시면; 이 html 코드를 순수 부트스트랩 시작페이지에 넣어 확인해보시면 됩니다..

먼저, 각각의 아이템들에서는 <h#>(.accordion-header) 코드를 넣고, 내부에 <button>(.accordion-button)을 만들어 제목을 적어준다

                                                    
                                                        
                                                    
                                                

특정 아이템의 펼쳐질 대상에서 .show 클래스를 주면; 해당 목록을 펼친 채로 시작하는데, .accordion-button 요소에서도 .collapsed 클래스를 제거하고 aria-expanded= "true"로 설정해주어야 한다

이어서, .accordion-collapse collapse 클래스를 준 <div> 요소 안에 .accordion-body 요소를 만들어 그 안에 보여질 내용을 넣어주면 된다

                                                    
                                                        
                                                    
                                                

.accordion-collapsedata-bs-parent 속성을 생략하면; 다른 항목을 열 때 이전에 연 아코디언 항목(들)이 열린 상태로 유지된다!

                                                    
                                                        
                                                    
                                                

한글로 된 각각의 이름들도 서로 비교하면서 세세히 살펴보십시오.. 알기 쉽도록, 한글명을 썼습니다만, 실제 문서 작성시는 영문으로 작명하십시오!

Dialog Modal

html에서 는 라이트박스와 알림상자, 컨텐츠에 대한 대화상자 등을 만드는데 쓰이는데, 현재 문서 내의 다른 모든 항목들 위에 배치되어 (자신을 제외한)body 내의 모든 컨텐츠를 비활성화하고, (자신의 컨텐츠만 스크롤되도록)<body> 내의 모든 스크롤을 제거한다!

모달창 작성하기
모달창이 열리면; 페이지 전체 컨텐츠 위에 표시되는데, 모달창 외의 나머지 부분은 비활성화되고 backdrop반투명 배경 으로 가려진다. 또한, 포커스는 (기본적으로)해당 모달창 내에서 순차적 키보드 탐색 순서의 첫번째 요소에 놓여지게 된다

이 모달창 내부는 그라디언트 백드롭이 적용되어 있다!

Bootstrap Modal로 내려가기


( 다시 올라가기 )
[ Modal Dialog 작성의 기본 ]
                                        
                                            
                                        
                                    

여기서는, [모달창 닫기] 버튼에 자동으로 포커스를 놓는 autofocus 값이 주어져 있기에, (앞에 위치한 a 링크가 아닌)이 버튼에 포커스가 주어진다(따라서, 모달창이 열린 후 곧바로 Enter 키만 누르면 이 모달창이 닫힌다!). 반대로, 닫기 버튼의 autofocus 값을 제거하면; 포커스는 맨 앞에 위치한 a 링크에 주어진다(이제, Enter 키를 누르면; 링크된 곳으로 스크롤해서 내려간다!) 참고로, <dialog> 요소나 그 내부에서 tabindex 속성을 사용해서는 안된다!

1. Dialog 모달창을 만들려면; 먼저, dialog 요소 관련 스크립트를 작성해주어야 한다:
[ Modal Dialog 스크립트 ]
                                        
                                            const dialog= document.querySelector("#dialog-ids") // Dialog 요소
                                            const showButton= document.querySelector(".dialog_button_open") // 모달창 열기 버튼(dialog 외부)
                                            const closeButton= document.querySelector(".dialog_button_close") // 모달창 닫기 버튼(dialog 내부)
                                        
                                            showButton.addEventListener("click", () => { dialog.showModal() // 모달창 열기 });
                                            closeButton.addEventListener("click", () => { dialog.close() // 모달창 닫기 });
                                        
                                    

기본적으로 모든 브라우저에서 Esc 키를 누르면 모달창을 닫을 수 있지만(하지만, 키보드에 액세스할 수 없는 터치 스크린 사용자도 존재한다!), 스크립트의 요소.close(); 메서드로 설정해주는 모달창 내부 [닫기] 버튼으로도 모달창을 닫을 수 있다. 또는, 모달창 내부는 대개 폼으로 작성되고, 따라서 폼 내부의 [확인][취소] 버튼을 이용하여 모달을 닫는 수단들도 있다 이렇게 모달창 내부에서 창을 닫을 수 있는 수단을 명시적으로 만들어주는 것이 사용자 편의성 측면에서 유익하다!

2. 한편, 모달 대화창 이외의 모든 것을 가리는 백드롭은 Css의 ::backdrop 가상요소를 써서 스타일링해줄 수 있다:
[ Modal Dialog 백드롭 가상요소 ]
                                        
                                            #dialog-ids::backdrop {
                                                background-image: linear-gradient(
                                                    90deg, black, gray, black
                                                );
                                    
                                                opacity: 0.75;
                                            }
                                        
                                    
부트스트랩 모달
모달data- 속성(또는, JavaScript를 통한 요청)에 따라 숨겨진 컨텐츠를 토글한다. 그것은 또한 기본 스크롤 동작을 재정의하고, 모달 외부(= modal-backdrop)를 클릭할 때 표시된 모달을 해제하기 위한 a 클릭 영역을 생성한다
1. 예컨대, data- 속성을 사용한다면; 버튼과 같은 컨트롤 요소에서 data-bs-toggle= "modal" 속성과 함께 data-bs-target= "#대상모달"로 열어줄 모달창을 지정해주고, 대상이 되는 모달 컨테이너에서 class="modal" 속성값과 함께 해당 id(id= "대상모달")를 넣어주면 된다:
[ 모달 작성의 기본 ]
                                        
                                            
                                        
                                    

모달의 해제 작업은 모달 내의 버튼을 통해 수행하는 것이 표준이다 - 모달 외부에 있는 버튼에서 해제할 수도 있지만, 이 방식은 그다지 권장되지 않는다!


모달은 position: fixed;를 사용한다. 따라서, 가능하면 모달 코드를 최상위 위치에 배치하여 다른 요소의 잠재적인 간섭을 배제하도록 해야한다 특히 모바일 장치에서 사용할 때, 그리고 다른 고정된 요소 내에서 모달을 중첩할 때는 문제가 발생할 소지가 있다!

2. Modal에는 header, body(패딩을 주어야 한다!) 및 (옵션 사항인)footer가 포함되는데, 가능하면 해제 작업이 있는 모달 헤더를 포함하거나, 또는 다른 명시적 해제 작업을 제공해주는 것이 좋다:
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                

.modal fade fade-in은 모달에 페이드인 효과를 준다!


* cf) 구조적으로 모달 대화상자는 자신만의 별도 문서/컨텍스트를 나타내므로 .modal-title은 (이상적으로는)<h1> 태그를 써야 한다 - 필요한 경우, 폰트 사이즈 관련 클래스를 써서 제목의 모양을 스타일링해주면 된다. 또한, .modalaria-labelledby 속성을 추가하여 (모달 헤더를 참조하여)모달 대화상자에 대한 설명을 제공해주어야 한다 참고로, role= "dialog" 속성은 (이미 부트스트랩의 JavaScript를 통해 추가되어 있으므로)따로 추가할 필요는 없다!

3. data-bs-targetdata-bs-toggle 속성의 적절한 배치로 여러 모달 사이를 토글할 수 있다. 예컨대, 이미 열려 있는 로그인 모달 내에서 암호 재설정 모달로 전환하는 경우인데, 이는 단순히 두 개별 모달 사이를 전환할 뿐, 여러 모달을 동시에 여는 것은 아니다:
                                    
                                        
                                    
                                

모달은 기본적으로 max-width: 500px; 크기로서(md 브레이크포인트에 해당한다), 이는 좁은 뷰포트에서 가로 스크롤바를 피하기 위한 것인데, .modal-dialog에서 .modal-sm/lg/xl 등의 옵션을 주어 변경해줄 수 있다

                                                
                                                    
                                                
                                            

* cf) 모달이 뷰포트에 비해 너무 길어지면 페이지 자체 영역으로부터 벗어나게 된다. 이를 막기 위해서는 .modal-dialog에서 modal-dialog-scrollable 클래스를 더해주면 페이지 높이 내에서 스크롤 가능한 모달이 된다. 한편, modal-dialog-centered 클래스를 더해주면 모달은 수직 중앙에 나타난다 필요에 따라 툴팁이나 팝오버를 모달 내에 배치할 수도 있는데, 모달이 닫히면; 내부의 모든 툴팁과 팝오버도 자동으로 해제된다!

내비게이션 바에는 부트스트랩이 지원하는 컨턴츠만을 사용해야 하며, 내비게이션 바 내에 그리드 기반 Row와 Col 규격을 따로 사용해서는 안된다. 내비게이션 바의 컨텐츠는 플렉스박스와 간격, 너비/높이 관련 유틸리티 등을 사용하여 배치할 수 있다. 곧, 내비게이션 바에는 내비게이션만을 위한 자체 규격이 있다!

내비게이션 바 기본
내비게이션 바는 기본적으로 Mobile First 적층구조 일반형 메뉴바로 작성하는데, 여기에는 로고 및 브랜드, 탐색 링크, 버튼 및 드롭다운 메뉴, 인라인 폼 등이 포함될 수 있다. 이 내비게이션 바는 먼저, 반응형 축소/확장(.navbar-expand-*) 및 색 구성 등을 위한 래핑(.navbar)이 필요한데, 보통 <nav> 태그로 묶어준다: <nav class= "navbar navbar-expand-lg"> .. </nav>
1. 메뉴바 중 나타났다 사라졌다 할 부분은 .navbar-collapse.collapse로 스타일을 적용하며, 그 안에 부트스트랩의 .navbar-nav(내비게이션 바의 메뉴 영역) 스타일을 적용한 <div> 블록에 메뉴로 사용할 각각의 <a> 요소(.nav-link)를 넣어주면 된다:
2. 또는, 부트스트랩의 .navbar-nav(내비게이션 바의 메뉴 영역) 스타일을 적용한 <ul> 태그로 메뉴 항목을 넣을 수도 있다. <li> 메뉴 항목은 .nav-item으로 스타일 지정하고, 메뉴에 사용한 <a> 태그에는 .nav-link 스타일을 사용한다:

* cf) 내비게이션 바를 사용하려면; 전체 내비게이션 바 주위를 <nav> 요소로 둘러싸주어야 한다. 만약, <nav> 대신 <div>와 같은 보다 일반적인 요소를 사용하는 경우라면; <ul>의 부모요소에서 role= "navigation" 속성을 추가하여 스크린리더기 등에 명시적으로 알리도록 해야한다 곧, <ul> 자체에서 role= "navigation"으로 설정해서는 안된다!

내비게이션바 브랜드 로고: 사이트 로고는 대부분의 요소에 적용할 수 있지만, 보통은 <a> 요소 안에서 .navbar-brand 스타일을 사용한다 텍스트 및 이미지 모두 가능하다!
                                    
                                        
                                    
                                
내비게이션 바 아이템 정렬: .navbar의 직계 자식요소는 기본적으로 justify-content: space-between;으로 설정되므로, 이 기본 동작을 조정하려면; 필요에 맞춰 플렉스박스 유틸리티를 적절히 사용해주면 된다
                                    
                                        
                                    
                                

위 코드에서 class= "d-flex"를 제거한 뒤의 모습과 비교해보십시오..

정중앙 내비게이션바: 내비게이션 바 전체(<nav .navbar>)를 .container로 둘러싸서 페이지 정중앙에 배치할 수도 있다 이 경우에도, 내부 컨테이너는 여전히 필요하다!
                                    
                                        
                                    
                                
다크 내비게이션바
네비게이션 바의 기본 색상은 light 계열인데, dark 계열 색상은 data-bs-theme= "dark" 속성과 .bg-색상 클래스를 조합하여 사용하면 된다 내비게이션 바의 테마 색상이 지정되면, 텍스트 색상은 그에 대비되는 색으로 자동 설정되고, 이는 내부 드롭다운 메뉴에서도 마찬가지이다!
                                    
                                        
                                    
                                

여기서는 <nav> 요소에서 data-bs-theme= "dark" 값을 주었지만, 내부 드롭다운 메뉴에서 줄 수도 있다 이 경우, 드롭다운 메뉴에서만 다크모드로 된다!


부트스트랩 v5.3)에서 새 컬러모드가 도입되면서, <nav> 요소에서의 .navbar-light/dark 클래스는 더 이상 사용되지 않는다. 드롭다운 메뉴에서의 .dropdown-menu-dark 클래스도 또한 제거되었다. 대신, 루트 요소나 부모 래퍼, 또는 드롭다운 요소 자체에서 data-bs-theme= "dark" 클래스를 사용하면 된다!

내비게이션 바의 토글 버튼은 적절한 반응형 스타일링을 위해 toggler를 필요로 하며(주로, <button> 태그에서 .navbar-toggler 스타일을 사용한다), .navbar-collapse.navbar-expand-* 클래스를 사용하여 컨텐츠가 버튼 뒤에서 축소/확장되는 시기를 결정할 수 있는데, 여타 유틸리티들과 함께 조합하면 특정 요소를 표시하고 숨길 시기를 쉽게 선택할 수 있다

내비게이션바 토글러
내비게이션 바의 토글러 아이콘은 기본적으로 내비게이션 바의 배경에 맞추어 정의되어 있으며(단, 내비게이션 바와 토글러 모두 사용자 지정에 의한 색상 변경도 가능하다!), 내비게이션 바의 렌더링 높이(기본값: ~ 54px)는 기본적으로 안의 내용 크기에 의해 제어된다. 내비게이션 바 내부에는 <ul>(및 <li>, <a>)만 아니라 인라인 폼 또한 넣을 수 있다:
                                    
                                        
                                    
                                

축소 시 내비게이션바 토글 버튼은 기본적으로 왼쪽 정렬되지만, <a> 요소와 같은 형제요소의 뒤에 나오는 경우에는 자동적으로 오른쪽으로 배치된다!


* cf) 때로는 내비게이션 바 외부에 위치한 컨테이너 요소의 컨텐츠를 트리거해야 할 때가 있는데, 부트스트랩 플러그인은 iddata-bs-target= 속성의 매칭으로 작동하기에 이 또한 간단하다!

                                    
                                        
                                    
                                

상단 고정 내비게이션바, 스티키 고정 내비게이션바, 좌/우측 스티키 사이드바

고정 내비게이션바
상단 고정바: 정적 내비게이션바는 스크롤링 시 내비게이션바가 위로 숨어드는데, .navbar.fixed-top을 추가해주면; 상단 고정바 가 된다. 이 경우, 다음에 나오는 최상위 컨테이너에서 적절한 상단 패딩을 주어 내비게이션바에 의해 가려지지 않도록 설정해줄 필요가 있다 아니라면; 이 부분들은 상단 고정 메뉴바에 가려져 보이지않게 될 수도 있다!
                                    
                                        
                                    
                                

고정 내비게이션바는 Css의 position: fixed; 속성을 사용하는데, 이는 DOM의 정상적인 흐름으로부터 가져오는 것이기에 다른 요소와의 겹침을 방지하기 위해 사용자정의 Css(예컨대, padding-top)가 필요할 수도 있음을 의미한다!

하단 고정바: .navbar.fixed-bottom 값을 주면; 바닥에 고정된 하단 고정바 로 되는데, 여기서도 또한 위쪽 컨테이너에서 적절한 아래쪽 패딩을 주어야 한다:
                                    
                                        
                                    
                                

여기서는 내비게이션 바를 하단으로 내린게 아니라, .fixed-bottom으로 하단 바닥글을 배치한 것입니다 - 물론, 상단 메뉴바를 없애고 이 곳으로 내릴 수도 있지만.. 그 경우에는 좀 피곤한 문제들이 생길 수도 있기에(예컨대, 메뉴바 드롭다운의 펼침 방향 등..), 저로서는 하단 내비게이션 바는 그다지 권장하지 않습니다..

스티키 내비게이션바
<nav>에 .navbar sticky-top 클래스를 주면; 스티키 고정바 로 되는데, 해당 요소는 설정된 (뷰포트 기준)오프셋에 도달할 때까지는 일반 흐름으로 스크롤되다가, 설정된 오프셋 지점에 이르면; position: fixed; 값을 준 것처럼 그 위치에 고정된다

(* 아래로 천천히 스크롤해서 내려가보십시오..)

뷰포트가 스크롤해 내려가는 동안에도 [Sticky top] 자체는 뷰포트 하단에 이를 때까지 위에서 고고하게 내려다보며.. 여전히 자기 자리를 고수하고 있습니다 - 곧, 뷰포트가 해당 요소를 지나쳐가며 스크롤해 내려갈 때에도 요소 자체는 애초에 설정된 오프셋 값에 맞춰 자기 자리를 고수하는 것입니다!

스티키 내비게이션바 <nav> 요소의 .navbar sticky-top

                                        
                                            
                                        
                                    

(* 여기까지 내려왔으면; 이제, 반대로 천천히 스크롤해서 위로 올라가보십시오..)

내려올 때와는 반대로, 뷰포트가 스크롤해 올라가는 동안에도 [Sticky bottom] 자체는 밑에서 위를 올려다보면서.. 애초의 뷰포트 상단에 이를 때까지 굳건히 자기 자리를 고수합니다!

Sticky bottom
스티키 고정 사이드바
부트스트랩의 그리드 시스템과 플렉스박스, 내비게이션 바에다 사용자정의 Css(및 JavaScript)를 사용하여 스티키 고정 사이드바를 작성할 수 있다
[ 스티키 사이드바를 위한 사용자정의 Css ]
                                        
                                            html { overflow-y: scroll; }

                                            @media (min-width: 992px) { /* 너비가 992px를 넘어서면 */
                                                .sidebar {
                                                    position: fixed; top: 0; bottom: 0; overflow-y: auto;
                                                }
                                                .sidebar.sidebar-left { left: 0; } /* 좌측 사이드바 */
                                                .sidebar.sidebar-right { right: 0; } /* 우측 사이드바 */
                                            }
                                        
                                    
1. 스티키 고정 사이드바
                                    
                                        
                                    
                                
2. 스티키 고정 좌/우 사이드바
                                    
                                        
                                    
                                

찬찬히 두 예제의 코드를 비교해가면서, 그 차이를 확인하십시오..


* cf) 순수 자바스크립트로 작성된 반응형 Sticky 요소 라이브러리인 Sticky-JS ↓ 플러그인을 쓰면; 웹사이트에서 (추가적인 Css 없이도)Sticky 요소를 쉽게 고정시킬 수 있다

는 순수 자바스크립트로 작성된 반응형 Sticky 요소 라이브러리로서, 이를 이용하면 웹사이트에서 (추가적인 Css 없이도)Sticky 요소를 쉽게 고정시킬 수 있다!

스티키 고정바
1. Sticky-JS 플러그인을 사용하려면; 먼저, 스크립트 소스를 불러온 뒤 초기화하면서 스티키 요소를 지정해주어야 한다:
[ Sticky.js 스크립트 소스 ]
                                        
                                            <script src="vendors/sticky-js/sticky.min.js"></script>

                                            <!-- 스티키 요소 초기화 -->
                                            <script>
                                                var sticky= new Sticky('.sticky') // 스티키 요소: .sticky
                                            </script>
                                        
                                    
2. 다음, Sticky 요소.sticky 클래스를 추가하여 컴포넌트를 초기화하고, 가장 가까운 부모요소(보통, <body>)에서 data-sticky-container 속성을 준다:
                                    
                                        
                                    
                                

특정 뷰포트 크기에서부터 스티키를 활성화하기 위해 data-sticky-for= '값' 속성으로 브레이크 포인트를 설정해줄 수 있다 - 곧, 스티키는 설정된 브레이크포인트 너비보다 작을 때 해제된다. 또한, 스크롤 시 페이지와 스티키 요소 사이에 마진을 주기위해 data-margin-top= '값' 속성을 추가해줄 수도 있다. 나아가, data-sticky-wrap= "true" 속성을 사용해주면; 컨텐츠가 점핑하는 것을 방지한다!

오프캔버스 서랍

오프캔버스는 뷰포트의 좌/우/상/하 가장자리에서 나타나도록 자바스크립트를 통해 토글할 수 있는 사이드바 컴포넌트로서, 버튼이나 앵커가 특정 요소로 연결하는 트리거로 사용되며, data- 속성을 써서 자바스크립트를 호출한다

오프캔버스 기본
1. 오프캔버스 서랍이 나타날 위치는 .offcanvas offcanvas-start/end/top/bottom으로 지정해주며, 펼친 채 시작하려면; .show 클래스를 추가해주면 된다. Offcanvas에는 닫기 버튼이 들어있는 헤더(.offcanvas-header)가 필요하며, 초기 패딩을 위한 선택적 본문(.offcanvas-body) 또한 포함할 수 있다:
[ 오프캔버스 작성의 기본 ]
                                        
                                            
                                        
                                    

Css가 애니메이션을 처리하는 방식상, .offcanvas 요소에서 margin이나 translate는 사용할 수 없다 대신에, 바깥 래퍼를 사용하면 된다!


오프캔버스 패널은 개념적으로 모달 대화상자이므로 aria-labelledby= "제목참조"를 추가해주어야 한다 참고로, role= "dialog"는 이미 부트스트랩 자바스크립트에 내재되어 있으므로 필요하지 않다!

2. <a> 링크나 <button>을 사용하여 .offcanvas 요소에서 .show/hide 상태를 토글하는 부트스트랩 내장 스크립트를 통해 오프캔버스 요소를 표시하거나 숨길 수 있다. 곧, 오프캔버스 요소에 대한 제어는 href= 속성이 있는 <a> 요소나 data-bs-target= 속성이 있는 <button> 태그를 사용할 수 있는데, 두 경우 모두 data-bs-toggle= "offcanvas" 속성값을 주어야 한다:

Link with href

                                    
                                        
                                    
                                
오프캔버스 제목

오프캔버스 내부 컨텐츠들은 이 안에 배치된다 - 여기에 거의 대부분의 부트스트랩 컴포넌트나 사용자지정 요소를 배치할 수 있다..

오프캔버스 해제 버튼은 모든 디바이스에서의 적절한 동작을 위해 오프캔버스 내 <button> 요소에서 사용하는 것이 좋다!

오프캔버스 제목

오프캔버스 내부 컨텐츠들은 이 안에 배치된다 - 여기에 거의 대부분의 부트스트랩 컴포넌트나 사용자지정 요소를 배치할 수 있다..

오프캔버스 해제 버튼은 모든 디바이스에서의 적절한 동작을 위해 오프캔버스 내 <button> 요소에서 사용하는 것이 좋다!

                                    
                                        
                                    
                                

.offcanvas-header 내부에서도 자바스크립트 기능을 트리거하는 해제 버튼을 추가해주어야 한다: data-bs-dismiss= "offcanvas"

3. 반응형 오프캔버스 는 설정된 브레이크포인트 아래에서만 오프캔버스로 작동되고 설정된 브레이크포인트서부터는 일반적인 코드로 작동한다: div .offcanvas-lg offcanvas-end

* cf) 확장/축소되는 내비게이션 바를 .offcanvas 컴포넌트를 써서 오프캔버스 서랍으로 변환할 수도 있는데, Offcanvas 기본 스타일을 모두 확장하고, .navbar-expand-* 클래스를 사용하면; 동적이고 유연한 오프캔버스 내비게이션바 를 만들 수 있다. 반면, .navbar-expand-* 클래스를 제거하면; 항시 축소되어 있는 오프캔버스 내비게이션바 가 된다


부트스트랩 v5.3)의 새로운 색상모드 도입으로 인해 이전의 -dark/light 색상 전환은 더 이상 사용되지 않는다. 대신 부모 래퍼 또는 컴포넌트에서 data-bs-theme= "dark"로 설정하고, .offcanvas text-bg-dark 클래스를 조합해주면 된다!

스크롤 스파이

스크롤 스파이는 스크롤 위치를 기반으로 하여 뷰포트에서 현재 활성화된 링크를 나타내기 위하여 내비게이션이나 리스트그룹을 자동으로 업데이트한다. 곧, 스크롤 스파이는 <a> 요소의 href= 속성에 의해 참조되는 요소가 뷰로 스크롤될 때, 대상 앵커 요소의 .active 클래스를 토글하는 것이다!

스크롤 스파이의 작동방식
1. 스크롤 스파이를 시작하려면; 스크롤 스파이에 연결된 내비게이션, 리스트그룹, 혹은 간단한 링크셋과 함께 스크롤 가능한 컨테이너가 필요하다 스크롤 스파이는 부트스트랩의 Nav 컴포넌트나 ListGroup과 함께 사용하는 것이 가장 바람직하지만, 현재 페이지의 어떤 앵커 요소와도 잘 작동된다!
[ 스크롤 대상 컨테이너 Css ]
                                        
                                            스크롤대상 컨테이너 { 
                                                position: relative; height: auto; margin-top: 0.5rem; overflow: scroll;
                                            }
                                        
                                    

스크롤대상 컨테이너position: relative;heightoverflow: scroll; 값을 가진 <body>(또는, 사용자정의 컴포넌트)이다!

2. 스크롤 대상 컨테이너에는 data-bs-spy= "scroll" 속성과 함께 data-bs-target= "#navId"(navId는 연결된 내비게이션의 고유한 위치이다!) 속성을 더해주어야 하며, 키보드 액세스를 보장하기 위해 tabindex= "0" 속성도 추가해주는 것이 좋다. 예컨대, 상단 톱 내비게이션 바에 스크롤 스파이 동작을 추가하려면; 감시하려는 요소(대개는 <body>가 된다)에서 data-bs-spy= "scroll" data-bs-target= "#navId" 속성을 설정해주고, .nav 컴포넌트 부모 요소의 id명(또는, class명)으로 연결해준다:
                                    
                                        
                                    
                                

'스파이드' 컨테이너를 스크롤하면; 해당 영역에 새로이 .active 클래스가 추가되고, 기존에 연결되어 있던 내비게이션의 앵커 링크는 제거된다!


그리 만만치는 않지만, 순수 자바스크립트로 작성된 반응형 Sticky 요소 라이브러리인 Sticky-JS ↑ 및 전문가를 위해 설계된 매우 강력한 JavaScript 라이브러리인 z-Animation ↓ 과 결합된 Fancy 내비게이션바 , 스크롤스파이 가로/세로 내비게이션인 세로 스크롤 스파이 가로 스크롤 스파이 예제를 찬찬히 뜯어보면서.. 스크롤 스파이의 사용법을 익히십시오 - 오늘 숙제입니다 ㅡㅡ;

z-Animation

GSAP)의 은 전문가를 위해 설계된 매우 강력한 JavaScript 애니메이션 라이브러리이다

Fancy 내비게이션바
z-Animation은 이 강좌 사이트 전반에 걸쳐 적용되고 있는 내비게이션 및 애니메이션을 위한 전문가급 라이브러리로서, 스크립트 소스는 </body> 앞과 사용자지정 GSAP 코드 앞에 넣어준다:
[ GSAP 스크립트 소스 ]
                                        
                                            <body>
                                                <div className="animateMe"></div>
                                                <h1>Hello GSAP!</h1>

                                                ..

                                                <!-- GSAP 스크립트 소스 -->
                                                <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>

                                                <!-- 사용자정의 스크립트 코드 -->
                                                <script src="./myCustomCode.js"></script>
                                                <script>
                                                    // use a script tag or an external JS file
                                                    document.addEventListener("DOMContentLoaded", (event) => {
                                                        gsap.registerPlugin(Flip) // 다른 플러그인들도 각각 같은 플러그인 이름으로 넣어주면 됩니다!
                                                        // gsap code here!
                                                    });
                                                </script>
                                            </body>
                                        
                                    
1. 내비게이션바 작성 및 배치하기:
                                    
                                        
                                    
                                
2. 내비게이션바 색상은 Css 변수를 사용하여 사용자 지정해줄 수 있다:
                                    
                                        --bs-fancynav-togglerbar-bg: #ffffff;
                                        --bs-fancynav-collapse-bg: #ffffff;
                                        --bs-fancynav-link-color: #000000;
                                    
                                
3. 모바일/탭 장치에서 스크롤 시 배경 페이드인 효과를 준다:
                                    
                                        
                                    
                                

✓   그외에도 GSAP에는 다양한 플러그인이 포함되어 있는데, 필요하면; 예제 샘플들을 살펴보십시오..

                                    
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/gsap.min.js"></script>

                                        <!-- 각 플러그인 스크립트 소스 -->
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/Flip.min.js"></script>
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/ScrollToPlugin.min.js"></script>
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/ScrollTrigger.min.js"></script>
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/Draggable.min.js"></script>
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/Observer.min.js"></script>
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/MotionPathPlugin.min.js"></script>
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/EaselPlugin.min.js"></script>
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/PixiPlugin.min.js"></script>
                                        <script src="https://cdn.jsdelivr.net/npm/gsap@3.12.7/dist/TextPlugin.min.js"></script>

                                        <script>
                                            // use a script tag or an external JS file
                                            document.addEventListener("DOMContentLoaded", (event) => {
                                                gsap.registerPlugin(Flip) // 다른 플러그인들도 각각 같은 플러그인 이름으로 넣어주면 됩니다!
                                                ..
                                                // gsap code here!
                                            });
                                        </script>
                                    
                                
사용자정의 z-Animation 설정
애니메이션의 트리거에는 data-zanim-trigger= 'scroll' 속성이 사용되는데, 이는 대상 DOM 요소가 뷰포트에 있는지 여부를 확인하여 요소가 돔에 있으면 애니메이션을 트리거한다:
                                    
                                        
                                    
                                
slide-downjs/custom/zanimation.js 파일의 변수에 미리 정의된 애니메이션을 사용할 수도 있는데, 미리 정의된 변수들에는 다음과 같은 것들이 있다: default, slide-down, slide-left/right, zoom-in/out, zoom-out-slide-right/left, blur-in
                                    
                                        
                                    
                                
다른 애니메이션 요소 내의 요소에 애니메이션을 적용하려면; 부모 요소에서 data-zanim-timelinedata-zanim-trigger= 'scroll'을 사용한다:
                                    
                                        
                                    
                                
GreenSock 설정과 함께 Css 속성을 사용하여 요소에 애니메이션을 적용할 수 있다:
                                    
                                        
                                    
                                
애니메이션을 반응형으로 만들기 위해 Bootstrap의 반응형 중단점을 써서 data-zanim-{size} 속성을 사용한다:
                                    
                                        
                                    
                                
wave