Bootstrap 5) Study

[웹코딩 가이드] 홈

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

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


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


리스트그룹

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

리스트그룹 작성의 기본
리스트그룹은 <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
                                    
                                        
                                    
                                
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
                                    
                                        
                                    
                                

리스트그룹 아이템들에 대해 .list-group-item-action 클래스를 주니.. 마우스 호버 시의 움직임이야 머 그런 것인데, 위쪽 예제와는 다르게 전체 너비를 차지하는군요(무슨 사연인지, 저도 좀 헷갈립니다?) .list-group-item-action 클래스를 어느 한 아이템에만 주면; 또 달라집니다 - 코드 바꿔가며 스스로 확인해보세요 ㅡㅡ;

  • 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를 쓴 것이라 이 예제 코드대로의 모습은 아닙니다 - 부트스트랩 기본값은 /입니다!


* cf) 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로 그 크기를 지정해줄 수 있고, 페이지네이션의 수평 배치는 플렉스박스의 .pagenation justify-content-start/center/end 유틸리티를 쓰면 된다
  1. Prev
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. Next
                                    
                                        
                                    
                                

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


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

                                                    
                                                        
                                                    
                                                
                                                    
                                                        .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> 리스트 자체도 인라인 방향으로 배치된 플렉스 아이템이 된다!

탭 탐색창

부트스트랩의 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= 같은 속성이나 부트스트랩의 클래스와 연결된다
                                                    
                                                        
                                                    
                                                

위 <ul> 탐색 탭(.nav nav-tabs) 대 아래 <div> 컨텐츠창(.tab-content)의 내부 구조 및 이름들을 비교하면서 세세히 살펴보십시오..

                                                    
                                                        
                                                    
                                                

.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">
                                                    
                                                        
                                                    
                                                

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

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

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

                                                    
                                                        
                                                    
                                                

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

Collapse

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

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

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

                                    
                                        
                                    
                                

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

일반적으로는 <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

                                    
                                        
                                    
                                
접는 박스: .accordion
아코디언은 FAQ 게시판 등에서 흔히 볼 수 있는, 사용자 클릭에 의해 펼쳐지고 접혀지는 목록인데, 내부적으로 .collapse 클래스를 사용한다. 아코디언은 먼저, 바깥 래퍼(.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 속성을 생략하면; 다른 항목을 열 때 이전에 연 아코디언 항목(들)이 열린 상태로 유지된다!

                                                        
                                                            
                                                        
                                                    

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

부트스트랩에 내장된 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);
                                                    }
                                                
                                            

이 사용자정의 .card-collapsable 클래스는 Collapse 기능을 사용하여 접을수 있도록 만든 카드로서, 사용자정의 스타일을 추가한 것입니다

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

내비게이션 바 기본
내비게이션 바는 기본적으로 Mobile First 적층구조 일반형 메뉴바로 작성하는데, 여기에는 로고 및 브랜드, 탐색 링크, 버튼 및 드롭다운 메뉴, 인라인 폼 등이 포함될 수 있다. 이 내비게이션 바는 먼저, 반응형 축소/확장(.navbar-expand-*) 및 색 구성 등(.navbar)을 위한 래핑이 필요한데, 보통 <nav> 태그로 묶어준다: ,

* cf) 내비게이션 바를 사용하려면; 전체 내비게이션 바 주위를 <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;으로 설정되므로, 이 기본 동작을 조정하려면; 필요에 맞춰 플렉스박스 유틸리티를 적절히 사용해주면 된다
                                    
                                        
                                    
                                

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

정중앙 내비게이션바: 내비게이션 바 전체(<nav .navbar>)를 .container로 둘러싸서 페이지 정중앙에 배치할 수도 있는데, 이 경우에도, 내부 컨테이너는 여전히 필요하다!
                                    
                                        
                                    
                                
내비게이션바 토글러
내비게이션 바의 링크 버튼은 적절한 반응형 스타일링을 위해 toggler를 필요로 하며(주로, <button> 태그에서 .navbar-toggler 스타일을 사용한다), 내비게이션 바는 컨텐츠를 안전하게 정렬하기 위해 가능한 한 많은 수평 공간을 차지하도록 커지게 된다
내비게이션 바.navbar-toggler.navbar-collapse, .navbar-expand-* 클래스를 사용하여 컨텐츠가 버튼 뒤에서 축소/확장되는 시기를 결정할 수 있는데, 여타 유틸리티들과 함께 조합하면 특정 요소를 표시하고 숨길 시기를 쉽게 선택할 수 있다:

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

                                    
                                        
                                    
                                
다크 내비게이션바
네비게이션 바의 기본 색상은 light 계열인데, dark 계열 색상은 data-bs-theme= "dark" 속성과 .bg-색상 클래스를 조합하여 사용하면 된다 내비게이션 바의 테마 색상이 지정되면, 텍스트 색상은 그에 대비되는 색상으로 자동 설정되고, 이는 내부 드롭다운 메뉴에서도 마찬가지이다!
                                    
                                        
                                    
                                

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


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

고정 내비게이션바
정적 내비게이션바는 스크롤링 시 내비게이션바가 위로 숨어드는데, .navbar.fixed-top을 추가해주면; 상단 고정바 로 된다. 이 경우, 다음에 나오는 최상위 컨테이너에서 적절한 상단 패딩을 주어 내비게이션 바에 의해 가려지지 않도록 설정해줄 필요가 있다 아니라면; 이 부분들은 상단 고정 메뉴바에 가려져 보이지않게 될 수도 있다!
<nav>에 .navbar sticky-top 클래스를 주면; 스티키 고정바 로 되는데, 해당 요소는 설정된 (뷰포트 기준)오프셋에 도달할 때까지는 일반 흐름으로 스크롤되다가, 설정된 오프셋 지점에 이르면 position: fixed; 값을 준 것처럼 그 위치에 고정된다 - 곧, 뷰포트가 해당 요소를 지나쳐가며 스크롤할 때에도 요소 자체는 설정된 오프셋 값에 맞춰 자기 자리를 고수하는 것이다!

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

Sticky-JS

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

스티키 고정 사이드바
Sticky-JS 플러그인을 사용하려면; 먼저, 스크립트 소스를 불러온 뒤 초기화하면서 스티키 요소를 지정해주어야 한다. 다음, Sticky 요소.sticky 클래스를 추가하여 컴포넌트를 초기화하고, 가장 가까운 부모요소(보통, <body>)에서 data-sticky-container 속성을 준다
[ Sticky-JS 사용하기 ]
                                        
                                            <script src="vendors/sticky-js/sticky.min.js"></script>

                                            <!-- 스티키 요소 초기화 -->
                                            <script>
                                                var sticky= new Sticky('.sticky') // 스티키 요소: .sticky
                                            </script>
                                        
                                    
                                        
                                            
                                        
                                    

특정 뷰포트 크기에서부터 스티키를 활성화하기 위해 data-sticky-for= '값' 속성으로 브레이크 포인트를 설정해줄 수 있다(곧, 스티키는 설정된 브레이크포인트 너비보다 작을 때 해제된다). 또한, 스크롤 시 페이지와 스티키 요소 사이에 마진을 주기위해 data-margin-top= '값' 속성을 추가해줄 수도 있다


* cf) 나아가, data-sticky-wrap= "true" 속성을 사용하면; 그것은 스티키 요소를 가진 <span> .. </span>으로 래핑되는 진정한 스티키 요소이다 - 이는 컨텐츠가 점핑하는 것을 방지한다! 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

                                    
                                        
                                    
                                
오프캔버스 제목

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

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

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


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

스크롤 스파이

스크롤 스파이는 스크롤 위치를 기반으로 하여 뷰포트에서 현재 활성화된 링크를 나타내기 위하여 내비게이션이나 리스트그룹을 자동으로 업데이트한다. 곧, 스크롤 스파이는 <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은 라이트박스와 알림상자, 컨텐츠에 대한 대화상자를 만드는데 쓰이는데, 현재 문서의 다른 모든 항목 위에 배치되어 (자신의 컨텐츠가 스크롤되도록)<body> 내의 모든 스크롤을 제거한다!

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

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


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

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

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


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

모달이 뷰포트에 비해 너무 길어지면 페이지 자체 영역으로부터 벗어나게 된다. 이를 막기 위해서는 .modal-dialog에서 modal-dialog-scrollable 클래스를 더해주면 페이지 높이 내에서 스크롤 가능한 모달이 된다. 한편, modal-dialog-centered 클래스를 더해주면 모달은 수직 중앙에 나타난다:
                                    
                                        
                                    
                                

필요에 따라 툴팁이나 팝오버를 모달 내에 배치할 수도 있는데, 모달이 닫히면; 내부의 모든 툴팁과 팝오버도 자동으로 해제된다!

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

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

                                                
                                                    
                                                
                                            

html 5) Modal

html에서 는 라이트박스와 알림상자, 컨텐츠에 대한 대화상자 등을 만드는데 쓰이는데, 문서의 다른 모든 항목 위에 배치되어 (자신을 제외한)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;
                                            }
                                        
                                    

폼 컨트롤

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

폼 스타일 설정: .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 클래스를 추가해주어야 한다!

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

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

툴팁/팝오버

원칙적으로 툴팁팝오버는 키보드로 초점을 맞출 수 있고, 대화형인 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 코딩 ]
                                        
                                            
                                        
                                    

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

                                                
                                                    
                                                
                                            
                                                
                                                    
                                                
                                            
                                                
                                                    
                                                
                                            
                                                
                                                    
                                                
                                            
                                                
                                                    
                                                
                                            

플러그인은 방문한 사용자에게 쿠키가 사용됨을 알려주는 가벼운 쿠키 동의 메시지 플러그인 라이브러리이다

wave