Bootstrap 5) Navigation

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

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

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

리스트그룹

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

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

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


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

수평 리스트그룹
.list-group list-group-horizontal[-*]은 수평 리스트그룹을 만든다(-*는 반응형):
  • First item
  • Second item
  • Third item
                                    
                                        
                                    
                                
  • First item
  • Second item
  • Third item
                                    
                                        
                                    
                                
  • First item
  • Second item
  • Third item
                                    
                                        
                                    
                                

반응형 수평 리스트그룹은 md 브레이크포인트서부터 수평 리스크그룹이 되며, 각 항목의 길이를 똑같게 해서 채워진다(.flex-fill)

리스트그룹 컨텐츠창
단순히 리스트그룹의 아이템에서 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 클래스를 더하면 페이드인 효과가 주어진다!
                                    
                                        
                                    
                                
                                    
                                        
                                    
                                

이동경로 탐색

Breadcrumb는 보통 페이지 상단에 배치되어 탐색 계층구조 내에서 현재 페이지의 위치를 나타내는데, 시작 페이지로부터 현재 지점까지의 이동경로 추적을 제공함으로써 사용자가 웹사이트 내 현재 위치를 알 수 있도록 도와준다!

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

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


Css에서 항목은 일반적으로 인라인 링크로 작성하며, 각 항목 사이에 구분기호가 있어 개별 페이지간의 계층구조를 나타내는데, 보통 <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> 리스트 자체도 인라인 방향으로 배치된 플렉스 아이템이 된다!

쪽수 매기기

Pagination은 주로 게시판의 게시물이나 이미지 갤러리의 이미지들이 너무 많아 여러 페이지로 나누어진 경우, 하단에 배치하여 쉽게 페이지를 이동하도록 도와주는데 사용된다 일반적으로 페이지 맨 위 헤더 영역에 배치되는 Breadcrumb와는 달리, 대개 컨텐츠 항목들 아래 가로 정중앙에 한 행으로 배치한다!

쪽수 매기기: .pagenation
페이지내이션은 일련의 관련 컨텐츠가 여러 페이지에 걸쳐 있음을 나타내는데, 보통 <ul>이나 <ol> 안에서 .pagenation 클래스를 주어 작성한다. .pagenation pagenation-lg/sm로 그 크기를 지정해줄 수 있다:
  1. Prev
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. Next
                                    
                                        
                                    
                                

페이지네이션의 수평 배치는 플렉스박스의 .justify-content-start/center/end 유틸리티를 쓰면 된다!


Css에서 은 사용자가 게시물 검색 결과 등의 컨텐츠 페이지 사이를 이동할 수 있는 페이지 매김을 표시하는데, 그 사용 방식은 Breadcrumb에서와 거의 비슷하다:

                                                    
                                                        
                                                    
                                                
                                                    
                                                        .pagination_ex {
                                                            display: flex; flex-wrap: wrap; justify-content: center;
                                                            list-style: none;
                                                        } .pagination_ex li { margin: 1em; }
                                                    
                                                

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

탭 탐색창

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

탭 NAV
부트스트랩의 Nav 구성요소에는 일부 스타일 재정의, 더 큰 히트 영역을 위한 일부 링크 패딩 및 기본 비활성화 스타일이 포함된다. 예컨대, 항목의 순서가 중요한 경우 <ul> 대신 <ol>을 사용하거나, <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= 같은 속성이나 부트스트랩의 클래스와 연결되어 있다:
                                                    
                                                        
                                                    
                                                
                                                    
                                                        
                                                    
                                                

.nav nav-justified는 수평 공간 전부를 차지하면서 각 아이템들의 너비가 같도록 채운다!

탭탐색 수직 컨텐츠창
수직 필 탐색창은 부트스트랩의 그리드시스템 및 플렉스박스를 써서 작성하되, 탭 리스트 컨테이너(예컨대, <div> 요소의 .nav)에서 aria-orientation= "vertical" 속성을 추가해주어야 한다:
플렉스 수직 필 탐색창
<div class="d-flex align-items-start">
<div class="nav nav-pills flex-column me-3" aria-orientation= "vertical">
                                                    
                                                        
                                                    
                                                
부트스트랩의 자바스크립트 탭 플러그인은 원칙적으로 드롭다운 메뉴가 포함된 탭 인터페이스를 지원하지 않는다 - 이는 사용성과 접근성 문제를 모두 유발하기 때문인데..
먼저, 사용성 측면에서 볼 때, 현재 표시된 탭의 트리거 요소가 (닫힌 드롭다운 메뉴 내부에 있기에)즉시 표시되지 않는다는 사실은 혼란을 야기할 수 있다
나아가, 접근성 측면에서 볼 때도, 현재 웹 표준상으로는 이러한 종류의 구성을 보조기술 사용자에게 알기쉽게 전달하기에 어려운 점이 있다는 점에서 문제가 있다!
                                                    
                                                        
                                                    
                                                

동적 탭 내비게이션에서는 구조, 기능 및 현재 상태를 스크린리더기 등의 보조기술에 전달하기 위해 role= "tab"role= "tablist", role= "tabpanel" 및 추가적으로 aria- 속성을 필요로 한다. 한편, JavaScript는 활성 탭에 aria-selected= "true"를 추가하여 선택된 상태를 처리하므로, 동적 탭 인터페이스에서는 aria-current 속성이 필요하지 않다!


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

Collapse

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

접는 버튼: .collapse
1. Collapse는 컨트롤 버튼에서 data-bs-target= "#대상요소" 속성으로 참조하는 경우 해당 대상요소(id= "대상요소"인 요소)를 표시하거나 숨겨준다 컨트롤 버튼에서 .data-bs-toggle= "collapse" 속성을 주어야 하며, 펼쳐질 대상요소에서 .collapse 클래스를 주는 것 또한 필수이다!

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

                                    
                                        
                                    
                                
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; 값을 준 것은 문서에서 과도한 다시 그리기를 방지하기 위해 설정해준 것일뿐, 반드시 필요한 것은 아니다 저 코드를 제거한 뒤에 한번 확인해보십시오..

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

내용 1) .collapse multi-collapse

내용 2) .collapse multi-collapse

                                    
                                        
                                    
                                
➥ 헤더 클릭 접는 카드

부트스트랩에 내장된 Collapse 기능을 사용하면 머리글을 클릭하여 접을수 있는 사용자정의 카드를 만들어쓸 수 있다. 아래, 사용자정의 .card-collapsable 클래스는 Collapse 기능을 사용하여 접을수 있도록 만든 카드로서 일부 사용자정의 스타일이 추가되어 있다 - 카드 머리글을 클릭하면 카드 본문이 접히고 펼쳐진다:

                                                
                                                    
                                                
                                            
                                                
                                                    /* 헤더클릭 접는 카드 */
                                                    .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 클래스를 더해주면; 기본 배경색을 없애고, 약간의 테두리 및 둥근 모서리를 제거해준다

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

                                                                    
                                                                        
                                                                    
                                                                

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

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

                                                                    
                                                                        
                                                                    
                                                                

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

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

                                                    
                                                        
                                                    
                                                

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

내비게이션 바 1

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

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

내비게이션 바 작성 예 1)

2. 또는, 부트스트랩의 .navbar-nav(내비게이션 바의 메뉴 영역) 스타일을 적용한 <ul> 태그로 메뉴 항목을 넣을 수도 있다. <li> 메뉴 항목은 .nav-item으로 스타일 지정하고, 메뉴에 사용한 <a> 태그에는 .nav-link 스타일을 사용한다:

내비게이션 바 작성 예 2)


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


✓   내비게이션 바는, 비록 .nav-tabs 클래스를 가진 탭으로 스타일이 지정된 경우라도, role= "tablist", role= "tab", role= "tabpannel" 속성을 주어서는 안된다 - 이는 동적 탭 인터페이스에만 적합하다!

내비게이션 바 브랜드
사이트 로고(텍스트 및 이미지)는 대부분의 요소에 적용할 수 있지만, 보통은 <a> 요소 안에서 .navbar-brand 스타일을 사용한다:
                                    
                                        
                                    
                                

브랜드(= 사이트 로고)에는 텍스트나 이미지 모두 사용할 수 있다!

내비게이션 바 아이템 정렬
.navbar의 직계 자식요소는 기본적으로 justify-content: space-between;으로 설정되므로, 이 기본 동작을 조정하려면; 필요에 맞춰 플렉스박스 유틸리티를 적절히 사용해주면 된다:
                                    
                                        
                                    
                                
정중앙 내비게이션 바
내비게이션 바 전체(<nav>)를 .container로 둘러싸서 페이지 정중앙에 배치할 수도 있는데, 이 경우에도, 내부 컨테이너는 여전히 필요하다:
                                    
                                        
                                    
                                
내비게이션 바 토글러
내비게이션 바의 링크 버튼은 적절한 반응형 스타일링을 위해 toggler 를 필요로 하며(주로, <button> 태그에서 .navbar-toggler 스타일을 사용한다), 내비게이션 바는 컨텐츠를 안전하게 정렬하기 위해 가능한 한 많은 수평 공간을 차지하도록 커지게 된다:

내비게이션 바 토글러


내비게이션 바의 토글러 아이콘은 기본적으로 내비게이션 바의 배경에 맞추어 정의되어 있으며(단, 내비게이션 바와 토글러 모두 사용자 지정에 의한 색상 변경도 가능하다!), 내비게이션 바의 렌더링 높이(기본값: ~ 54px)는 기본적으로 안의 내용 크기에 의해 제어된다!


                                    
                                        
                                    
                                

내비게이션 바 2

내비게이션 바.navbar-toggler.navbar-collapse, .navbar-expand-* 클래스를 사용하여 컨텐츠가 버튼 뒤에서 축소/확장되는 시기를 결정할 수 있는데, 여타 유틸리티들과 함께 조합하면 특정 요소를 표시하고 숨길 시기를 쉽게 선택할 수 있다!

다크 내비게이션 바
네비게이션 바의 기본 색상은 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" 클래스를 사용하면 된다!

스크롤링 내비게이션 바
축소된 내비게이션 바의 토글 가능한 컨텐츠 내에서 수직 스크롤을 가능하게 하려면; .navbar-nav에서 .navbar-nav-scroll 클래스를 추가해준다 .navbar-nav-scrollmax-height를 설정하여 내비게이션 바 컨텐츠를 확장하여 스크롤링한다!

스크롤링 내비게이션 바


스크롤은 기본적으로 75vh(혹은, 뷰포트 높이의 75%)에서 시작하지만, 사용자정의 스타일로 재정의해줄 수도 있다 참고로, 더 큰 뷰포트에서 내비게이션 바가 확장될 때, 컨텐츠는 기본 내비게이션 바에서와 같은 모양으로 나타난다!

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

고정 내비게이션 바

2. <nav>에 .navbar sticky-top 클래스를 주면; 해당 요소는 설정된 (뷰포트 기준)오프셋에 도달할 때까지는 일반 흐름으로 스크롤되다가, 설정된 오프셋 지점에 이르면 position: fixed; 값을 준 것처럼 그 위치에 고정된다 - 곧, 뷰포트가 해당 요소를 지나쳐가며 스크롤할 때에도 요소 자체는 설정된 오프셋 값에 맞춰 자기 자리를 고수하는 것이다!

스티키 내비게이션 바


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

스티키 고정 사이드바
부트스트랩의 그리드 시스템과 플렉스박스, 내비게이션 바에다, 사용자정의 Css 및 JavaScript를 써서 스티키 고정 우측 및 좌/우측면 사이드바를 작성할 수 있다:

스티키 고정 사이드바 예 1

스티키 고정 사이드바 예 2


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

오프캔버스 서랍

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

오프캔버스 기본
오프캔버스 서랍이 나타날 위치는 .offcanvas offcanvas-start/end/top/bottom으로 지정해주며, 펼친 채 시작하려면; .show 클래스를 추가해주면 된다. Offcanvas에는 닫기 버튼이 들어있는 헤더(.offcanvas-header)가 필요하며, 초기 패딩을 위한 선택적 본문(.offcanvas-body) 또한 포함할 수 있다. 또한, 오프캔버스 해제 버튼은 모든 디바이스에서의 적절한 동작을 위해 오프캔버스 내 <button> 요소에서 사용하는 것이 좋다!
[ 오프캔버스 작성 예 ]
                                        
                                            
                                        
                                    

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


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

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

Link with href

                                    
                                        
                                    
                                
오프캔버스 제목

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

                                    
                                        
                                    
                                

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

반응형 오프캔버스

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

다크모드에 적절한 스타일링을 위해 내부 닫기 버튼에서도 또한 .btn-close btn-close-white로 주었다

오프캔버스가 표시되면 데이터 백드롭과 함께 body 스크롤링이 비활성화되는데, data-bs-scroll= "true" 값을 주면 body 스크롤링이 활성화된다 배경창에서 스크롤해보세요..

추가적으로, .data-bs-backdrop= "false" 값을 주면; 배경 화면이 흐릿해지지 않으며, .data-bs-backdrop= "static" 값을 주면; 닫기 버튼을 클릭할 때만 오프캔버스를 닫아준다!

                                    
                                        
                                    
                                

다크 오프캔버스는 그에 맞추어 타이틀 색상에도 밝은 계통 색상으로 적절히 변경해줄 필요가 있다: .offcanvas-title text-bg-dark

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

오프캔버스 내비게이션 바


참고로, , , 는 이 강좌 사이트를 만들기 위해 GSAP)의 z-Animation스티키 고정, 오프 캔버스스크롤 스파이 등을 써서 만든, 가칭 fancy Navigation Bar인데.. 세부 내용은 좀 복잡하여 생략하니 간단히 모양만 살펴보십시오..

스크롤 스파이

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

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

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

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

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


(* 이 샘플은 에서 가져와(약간 손질한)것입니다..)

Dialog Modal

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

모달의 기본
모달은 data- 속성(또는, JavaScript를 통한 요청)에 따라 숨겨진 컨텐츠를 토글한다. 그것은 또한 기본 스크롤 동작을 재정의하고, 모달 외부(= modal-backdrop)를 클릭할 때 표시된 모달을 해제하기 위한 a 클릭 영역을 생성한다. 예컨대, data- 속성을 사용한다면; 버튼과 같은 컨트롤 요소에서 data-bs-toggle= "modal" 속성과 함께 data-bs-target= "#대상모달"로 열어줄 모달창을 지정해주고, 대상이 되는 모달 컨테이너에서 class="modal" 속성값과 함께 해당 id(id= "대상모달")를 넣어주면 된다:
[ 모달 작성의 기본 ]
                                        
                                            
                                        
                                    

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


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

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

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


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

2. 모달은 기본적으로 max-width: 500px; 크기로서(md 브레이크포인트에 해당한다), 이는 좁은 뷰포트에서 가로 스크롤바를 피하기 위한 것인데, .modal-dialog에서 .modal-sm/lg/xl 등의 옵션을 주어 변경해줄 수도 있다:
[ 모달 창 크기 설정 ]
                                        
                                            
                                        
                                    
정중앙 스크롤링 모달
모달이 뷰포트에 비해 너무 길어지면 페이지 자체 영역으로부터 벗어나게 된다. 이를 막기 위해서는 .modal-dialog에서 modal-dialog-scrollable 클래스를 더해주면 페이지 높이 내에서 스크롤 가능한 모달이 된다. 한편, modal-dialog-centered 클래스를 더해주면 모달은 수직 중앙에 나타난다:

정중앙 스크롤링 모달

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

멀티 토글링 모달

html 5) Dialog Modal

html에서 Dialog Modal은 라이트박스와 알림상자, 컨텐츠에 대한 대화상자 등을 만드는데 쓰이는데, 문서의 다른 모든 항목 위에 배치되어 (자신을 제외한)body 내의 모든 컨텐츠를 비활성화한다!

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

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

( 폼 컨트롤로 가기 )


[ 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;
                                            }
                                        
                                    
wave