Bootstrap 5) Study

[웹코딩 가이드] 홈

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

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


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


Bootstrap Start..

여기서는 의 기본 철학을 간략히 살펴봅니다 - 잘 이해가 가지 않더라도, 한번 읽고 앞으로 나아가면 됩니다. 나중에 돌아와서 다시 읽어보면 좀 더 쉽게 와닿을겁니다..

부트스트랩의 기본 철학
부트스트랩은 크로스-브라우징을 위한 규격화 스타일인 부트스트랩 자체 재설정을 제외하고는, 모든 스타일 설정은 클래스를 선택자로 쓰고자 한다. 또한, 수정자 클래스는 복수의 속성, 혹은 복수의 값을 변경해야 하는 경우에만 사용하는 것을 권장한다 수정자가 항상 필요한 것은 아니므로, 불필요한 재정의를 한 것은 아닌지 항시 확인하는 것이 좋다!
부트스트랩은 가능하면; 속도 및 접근성, 기능성의 측면에서 자바스크립트보다는 html 및 Css로 구현하고자 하며, 따라서 자바스크립트는 html의 data- 속성을 써서 동작시킨다. 또한, 사용자정의 스타일보다는 우선적으로 부트스트랩 유틸리티를 사용할 것을 권장한다!
나아가, 부트스트랩은 브라우저에서 제공하는 일반적인 웹 요소의 기본 동작을 우선시한다. 예컨대, .btn 클래스는 모든 요소에 추가할 수 있지만, 대신에 (의미론적 측면과 브라우저에서 제공하는 기본 기능이라는 점에서)<button> 및 <a> 태그를 우선시한다!

부트스트랩은 기본적으로 UI 타입스타일링을 분리하여 적용하는데, 그로 인해 각 UI 요소와 스타일링간의 다양한 조합이 가능해진다. 따라서, 컴포넌트는 기본 클래스(UI 타입)와 속성-값(스타일링) 쌍으로 구축된다 예컨대, .btn은 모든 일반 스타일에 쓰이고, 부가적으로 .btn-primary로 색상을 입히는 방식이다: .btn btn-primary

부트스트랩의 html 규격 재조정
부트스트랩은 <body>의 기본 배경색을 background-color: #ffffff;로 초기화하고, 자체 폰트 스택을 지니면서 독자적인 Css 규격 초기화(* 예: box-sizing: boder-box; 등)와 자체 폰트 규격(* 예: font-size: 1rem;, line-height: 1.5; 등)을 통해 크로스-브라우징에 대처하며, 상황별 색상 설정 및 약간의 재정의된 태그들(<dl>, <pre>, <code>, <kbd> 등) 및 관련 클래스들(<pre> 태그에서의 .pre-scrollable, <blockquote> 태그에서의 .blockquote 클래스 등) 또한 지원한다
부트스트랩은 <body> 기본 글꼴 크기를 모든 브라우저의 기본값인 16px 크기를 고려하여 font-size: 1rem;(부트스트랩은 em 단위보다는 rem 단위를 쓸 것을 권한다!)으로 초기화하며, 또한 font-weightcolor, line-height도 자체 규격으로 재설정한다. 부트스트랩에서는 <h#>과 <p>, <li> 등에서의 margin-top은 제거되고 margin-bottom0.5rem(<h#>), 1rem(<p>, <li>에서) 등으로 주어 html 5 기본 규격과는 다소간 다른 요소간 간격을 유지한다. 한편, 부트스트랩에서는 <a> 태그의 기본 색상과 밑줄을 그대로 적용한다!

부트스트랩의 반응형 폰트사이즈 메카니즘은 marginpadding, border-radius에다, box-shadow 같은 단위 값들까지 사용하여 대부분의 Css 속성 재조정을 가능하게 한다. 이러한 메카니즘은 브라우저 뷰포트의 크기에 따라 자동으로 재조정되는데, 반응형 스케일링 동작을 가능하게 하기 위해 rem 단위와 뷰포트 단위가 혼합된 calc(); 함수로 컴파일된다!

부트스트랩의 효과 지원
부트스트랩은 모션 감소(prefers-reduced-motion) 미디어 기능에 대한 지원을 포함한다. 사용자가 모션 감소에 관한 설정을 지정할 수 있는 브라우저 환경에서, 부트스트랩의 대부분 트랜지션 효과(모달 대화상자의 여닫기, 또는 캐러셀의 슬라이딩 애니메이션 등)는 무시되고, 의미있는 애니메이션 속도(예컨대, 스피너 등)는 느려지게 된다 곧, 이 기능을 지원하는 브라우저에서, 그리고 사용자가 명시적으로 이를 좋아하지 않는다고 표시하지 않는 한, 부트스트랩은 scroll-behavior 속성을 사용하여 부드러운 스크롤을 활성화한다!
부트스트랩은 또한, 다음과 같은 효과들을 기본적으로 지원한다: .shadow는 요소에 그림자 효과를 주며, .fade는 Alerts, Navs, Modal 등에서 흐릿하게 나타나고 사라지는 페이드 효과를 준다. .show/hide는 Alerts, Toasts, Modal, Collapase, List Group 등에서 요소를 드러내고 숨기는데 사용된다. 한편, .active/disabled는 Button, Link 등에서 활성/비활성 상태를 트리거한다
부트스트랩의 z-index 개념
부트스트랩에서의 구성요소 상태는 일반적인 z-index 척도를 따르는데, 컴포넌트 내부와 오버레이 컴포넌트 구성요소의 두 가지 스케일이 있다
1. 부트스트랩의 일부 컴포넌트는 테두리 속성의 변경 없이 이중 테두리를 막기 위해 오버래핑 요소로 구축되는데(버튼 그룹, 입력 그룹, 페이지네이션 등), 이러한 구성요소는 0(초기값), 1(:hover), 2(active.active), 3(:focus)의 z-index를 공유한다 참고로, 부트스트랩 v5.3) 버전에서부터는 새로이 .z-n1/0/1/2/3의 음수 인덱스 유틸리티도 도입되었다!
2. 한편, 부트스트랩에는 일종의 오버레이 기능을 하는 몇 가지 컴포넌트들이 있는데, dropdown(1000)로부터 시작하여 sticky(1020), fixed(1030), offcanvas-backdrop(1040) & offcanvas(1045), modal-backdrop(1050) 및 modal(1055), popover(1070), tooltip(1080), toast(1090) 순으로 이어진다. 각 오버레이 컴포넌트는 공통 UI 원칙을 통해 사용자가 포커스를 주거나 가리킨 요소가 항상 표시되도록 하는 방식으로 자신의 z-index 값을 높이게 된다 예컨대, Modal은 문서 자체의 차단이므로 이를 내비게이션 바 위에 위치시키게 된다!

디스플레이 .d-

부트스트랩은 Mobile First 반응형이며, 기본 클래스로 구축되고 뷰포트가 커짐에 따라 클래스를 더하면서 확장되는데, 이러한 반응형 접근 방식은 뷰포트가 커짐에 따라 스타일을 추가하도록 하여 css 재정의를 줄이는 효과가 있다!

부트스트랩의 브레이크 포인트
부트스트랩의 모든 컨텐츠는 Mobile First를 빌딩 블록으로 하여 최소한의 스타일을 적용한 다음(즉, 이 스타일은 그 위의 모든 브레이크 포인트에 다 적용된다!), 점차적으로 위쪽으로 올라가면서 (사용자 지정 브레이크 포인트에 맞추어)적층 구조로 스타일을 쌓으면서 올라간다: 예컨대, .d-nonemin-width: 0;으로부터 시작하여 무한대까지 적용되는 반면, .d-md-nonemd 브레이크 포인트에서부터 적용이 시작되는 것이다

.d-none d-md-block ← 숨긴채 시작하여, md서부터 보인다

.d-md-none ← 보이면서 시작하여, md서부터 숨긴다

                                    
                                        
                                    
                                
기본값(.d-xs) // ~576(뷰포트 및 컨테이너 540)
.d-sm-none // ~768(720)부터 안보임
.d-md-none // ~992(960)부터 안보임
.d-lg-none // ~1200(1140)부터 안보임
.d-xl-none // ~1400(1320)부터 안보임
.d-xxl-none // 1400px~을 넘어가면 안보임
                                    
                                        
                                    
                                

부트스트랩 브레이크포인트 문서를 열어 폰 화면 너비부터 시작하여 점차적으로 화면 크기를 늘려가면서 움직임을 확인해보십시오..

블록레벨 요소 대 인라인 요소간 전환
.d-[*-]inline은 블록레벨 요소를 인라인으로 배치하며, .d-[*-]block은 인라인 요소를 블록레벨로 배치한다
div .d-inline
div .d-md-inline
                                    
                                        
                                    
                                
span .d-md-block span .d-block
                                    
                                        
                                    
                                
프린트에서는 숨긴다
스크린에서는 숨기고, 프린트에서는 보인다
화면에서는 숨긴 채 시작하되 lg 브레이크포인트서부터 보이고, 프린터에서는 항상 보인다
                                    
                                        
                                    
                                

그외에도.. 프린트, 테이블, 그리드, 플렉스박스 등과 관련된 많은 .d- 클래스들이 있는데, 필요해지면; 부트스트랩 공식사이트로 가서 더 살펴보십시오..

Visible 대 invisible
.d- 클래스와는 좀 다르게, .visible은 요소를 보이고, .invisible은 (요소가 자리잡던 공간은 그대로 비워둔 채, 화면상으로만)요소를 숨긴다

.invisible → ()

                                    
                                        
                                    
                                

너비/높이, 간격

부트스트랩에서는 블록레벨 요소의 마진에는 rem 단위를 사용할 것, 마진 사용 시 가능하면 .margin-top은 피할 것(Css 마진병합 현상과의 충돌 문제!)을 권장한다!

너비/높이
1. 부트스트랩에서 너비는 .w-0/25/50/75/100, 높이는 .h-0/25/50/75/100 클래스로 설정한다. 한편, .w-auto.h-auto는 안의 컨텐츠에 맞추어 너비나 높이가 자동 조절된다
w-25
w-50
w-75
w-100
h-25
h-50
h-75
h-100
2. .mw-[*-]100, .mh-[*-]100은 최대 너비, 높이로 설정한다. 한편, .vw-[*-]100, .vh-[*-]100은 (뷰포트 기준)최대 너비, 높이로 설정하며, .min-vw-[*-]100, .min-vh-[*-]100은 (뷰포트 기준)최하 너비, 높이로 설정한다
눈내린 불국사
                                    
                                        
                                    
                                

이미지(실제 크기: 600 x 174)의 높이는 120px, 너비는 이미지의 최대 크기(.mw-100 곧, 600px)로 설정하였다

마진/패딩
Bootstrap 5)의 마진/패딩: .p-|.m-[*-]1/2/3/4/5 4방향 패딩, 마진 *브레이크 포인트
  • .pt-|ps-|pb-|pe-[*-]1/2/3/4/5, .mt-|ms-|mb-|me-[*-]1/2/3/4/5는 각 방향별 패딩, 마진 top / start / bottom / end
  • .px-|.py-[*-]1/2/3/4/5, .mx-|.my-[*-]1/2/3/4/5 가로/세로 양방향 패딩, 마진

* cf) 숫자 1/2/3/4/5 는 각각 0.25/0.5/1(기준 spacer)/1.5/3의 비율이 되는데, 숫자에 0 값을 주면; 해당 요소에 부트스트랩 기본 규격으로 주어져 있던 마진이나 패딩이 제거된다!

음수 마진
부트스트랩 5) 기본 제공 음수 마진: .mt|.ms|.mb|.me-[*-]n1/n2/n3/n4/n5

코드 1.

코드 2. 음수 마진 없음

코드 1.

코드 2. (음수 마진 있음: .mt-n10)

                                    
                                        
                                    
                                

참고로, [코드 2]에 음수 마진이 주어져 위로 올라가 자리잡으면; [코드 1]의 위치는 그만큼 물리적으로 아래로 밀려나게 된다!

➥ Css) 음수마진의 확장

Bootstrap에서 5단계의 각 방향별 음수 마진을 기본 제공하지만, 필요하다면; 그 이상의 사용자정의 음수 마진도 직접 만들어 쓸 수 있다

                                        
                                            /* 음수 마진의 확장 */
                                            .mt-n10 { margin-top: -6rem; }
                                            .mt-n15 { margin-top: -9rem; }
                                        
                                    
형제요소간 자동 마진
형제요소간 앞/뒤 자동 마진에는 플렉스박스의 .me-auto.ms-auto 유틸리티 클래스를 사용할 수 있다
.me-auto
Flex item 2
Flex item 3
Flex item 1
Flex item 2
.ms-auto
                                    
                                        
                                    
                                
수평/수직 센터링
수평/수직 정중앙 배치를 위한 .mx/my-auto 클래스는 너비(width)가 설정되어 있는 블록레벨 요소 자신에 대해 사용할 수 있다

(너비를 지닌 블록레벨 요소 p 자신)
.mx-auto & .my-auto

                                    
                                        
                                    
                                

위 코드에서 .mx-auto my-auto는 너비(style="width: 400px;)를 지닌 <p> 요소 자신을 (자신의 부모요소 기준)수평/수직 중앙에 놓고, .text-center는 <p> 내부 컨텐츠를 수평 중앙으로 배치시키는 것이다!

포지셔닝

Css 박스모델의 포지셔닝 관련 상세 설명은 본 강좌의 부분을 참조하십시오..

포지셔닝
Web 문서에서 모든 요소는 기본적으로 작성된 순서대로 배치되지만(.position-static), 필요에 따라 다르게 배치해줄 수 있다: .position-relative는 문서의 흐름대로 배치하되, 좌표값을 써서 (요소 자신이 배치될)시작 지점을 변경해줄 수 있다. .position-absolute는 (문서의 흐름과 무관하게)<body> 기준 좌표값을 써서 원하는 위치에 배치할 수 있다. 한편, .position-fixed는 (화면 스크롤과 무관하게) 뷰포트의 현재 위치에 고정한다.

포지셔닝상의 좌표는 .top-#, .bottom-#(수직 위치) 및 .start-#, .end-#(수평 위치)으로 줄 수 있는데, #은 가장자리로부터 % 지점이다. 나아가, .translate-middle 클래스를 추가하면; 요소를 절대 중앙(translateX(50%) & translateY(50%))에 위치시키며, .translate-middle-x/y는 x/y 어느 한 방향으로 절대 중앙에 위치시킨다

top-0 start-0
top-0 start-50 translate-middle-x
top-0 end-0
top-50 start-0
translate-middle-y
top-50 start-50 translate-middle
top-50 end-0
translate-middle-y
bottom-0 start-0
bottom-0 start-50 translate-middle-x
bottom-0 end-0
상하단 고정바
.fixed[-*]-top/bottom은 뷰포트의 상/하단에 (가장자리서 가장자리까지)요소를 배치하며(), .sticky[-*]-top/bottom은 뷰포트의 상/하단에 (가장자리서 가장자리까지)요소를 (스크롤한 이후에)배치한다()

* cf) 이러한 부트스트랩 고정바는 정상적인 DOM의 흐름으로부터 가져오는 것이기에 다른 요소와 겹치는 것을 방지하기 위해 사용자 정의 Css가 필요할 수도 있다 예컨대, 톱 내비게이션 메뉴바를 가리지 않기 위한 <body> 태그 최상단에서의 패딩 설정 등..

플로팅
.float-*-start/end 클래스는 요소를 좌/우로 플로팅한다. 플로팅 해제는 (다음에 나오는 요소에서).float-*-none을 써서 (직전 요소의 플로팅을)해제하거나, 부모요소에서 .clearfix 클래스를 써서 (내부 자식요소에서 사용된 플로팅을)해제해주거나 할 수 있다:

(* 플로팅이 해제되었나요?)

                                    
                                        
                                    
                                

플로팅된 요소는 인라인 요소일지라도 블록 박스가 된다 곧, display: inline-block;을 선언한 것과 같다!

그리드 시스템

부트스트랩은 화면 가운데 고정된 960px 12컬럼 컨테이너를 기본 지원하는데, 이 컨테이너는 브라우저 해상도에 맞추어 반응형으로 동작한다!

그리드 시스템
부트스트랩에서 Container는 화면 가운데 고정된 반응형으로 동작하면서 RowCol과는 달리, 독자적으로 다른 요소들(예컨대, <h1> 등)이나 컨텐츠를 포함할 수 있다. 반면에, Row는 단지 Col만 포함할 수 있고, Col은 오직 Row 안에서만 존재한다:
[ 부트스트랩의 컨테이너 구조 ]
                                        
                                            
                                        
                                    

참고로, 전체 너비 단일 컬럼에는 .row.col 없이 .container만 사용해도 된다!


* cf) 컨테이너(.container)는 부트스트랩의 가장 기본적인 레이아웃 요소로서, (컨텐츠를 포함하고, 패딩을 주는 등)페이지 레이아웃을 제어하면서 또한 컨텐츠들을 좌우로 정렬하는 데에도 사용된다 컨테이너는 좌우 각각 15px(= 0.75rem)씩의 패딩을 가지면서 Row의 음수 마진(좌/우 각각 -15px)에 대비한다!

1. Row는 언제나 컨테이너 안에 배치되어야 하며, 오로지 Col 단위만 포함할 수 있다. 또한, Row는 기본적으로 플렉스박스 속성을 가지며, 플렉스 박스의 속성들을 사용할 수 있다 - 곧, Col의 크기를 균등하게 배분하거나 Col간 간격(= Gutter)을 변경하는 클래스들이 있다!
2. Col은 플렉스박스의 자식 요소들로서 Row와 동일한 높이값을 갖게 되며, 덕분에 부트스트랩의 컬럼은 자동 레이아웃을 이용할 수 있게 된다. 또한, 컨테이너와 마찬가지로, 각 Col간에는 30px(= 1.5rem)의 갭이 있는데, 각 컬럼은 기본적으로 좌우 15px(= 0.75rem)씩의 패딩값으로 음수 마진에 대비하도록 설계되어 있다 나아가, 컬럼은 자신의 내부에 또 다른 Row(및 Col)을 포함할 수도 있다!

부트스트랩의 그리드내비게이션 바는 기본적으로 Mobile First 반응형으로 설계되어 있기에, 확장 클래스로 덮어 씌우지 않는 한 개별 요소들이 상하로 쌓이는 적층 구조로 된다. 곧, 브레이크 포인트보다 작아지면; 적층 구조로 변경되며, 12 컬럼을 넘으면 자동으로 다음 행으로 넘어가서 좌우 및 상하로 쌓이게 된다(반응형에 대응하는 컬럼 래핑). 그로 인해 추가적인 Css 작성이나 미디어쿼리 없이도 반응형으로 동작시킬 수 있게 된다!

html에서 Mobile 페이지는 기본적으로 미디어쿼리 없이 Css로 작성하되(세로 방향일 때; 너비 320px, 가로 방향일 때; 너비 480px 이상), 화면 크기가 768px 이상이면; 태블릿, 1024px 이상이면; 데스크톱으로 지정한다 참고로, Bootstrap 5)에서는 이를 좀 더 세분화하여 6단계의 브레이크 포인트를 사용한다!

                                                
                                                    @media only screen and (min-width:1024px) and (orientation:landscape) { .. }
                                                
                                            

min-('이상'의 의미)은 크기가 작은 것부터, max-('이하'의 의미)는 크기가 큰 것부터 순차적으로 작성한다 미디어쿼리 사용 시 크기의 기준은 뷰포트 영역이 된다!


✓   미디어쿼리에 의해 페이지 레이아웃이 변경되는 지점이 바로 브레이크포인트인데, 미디어쿼리를 사용할 때는; 먼저, 모바일 기기를 위한 단일 열 레이아웃을 만들고, 현재 기기가 그보다 화면이 더 넓은지를 확인하여 다중 열 레이아웃으로 전환하는 방식이 일반적이다!

그리드 레이아웃

부트스트랩은 화면 가운데 고정된 960px 12컬럼 컨테이너를 기본 지원하는데, 이 컨테이너는 브라우저 해상도에 맞추어 반응형으로 동작한다!

그리드 컨테이너
부트스트랩에서 .container는 각 브레이크 포인트에 반응하면서 각각의 최대 크기(max-width)로 변경되는 고정 너비 12컬럼 컨테이너이며, .container-fluid는 항시적으로 width: 100%;가 유지되는 전체 너비 12컬럼 컨테이너이다
.col
.col
.col
.col-6
.col
.col
                                    
                                        
                                    
                                

컬럼 수를 적지 않으면 모두 같은 크기의 컬럼으로 나뉘어지며, 하나의 컬럼에서만 개수를 지정하면 나머지 컬럼들은 같은 비율로 자동 조정된다!

.col-md-2
.col-md-5
.col-md-5
                                    
                                        
                                    
                                

.col-md-#md 브레이크 포인트서부터 #만큼의 크기를 차지한다 곧, md 브레이크 포인트 이전까지는 적층구조로 쌓이게 된다!

.col-sm-12 col-lg-8
                                    
                                        
                                    
                                

하나의 Col 안에서 이중 브레이크 포인트 설정 시, 예컨대 col-sm-12 col-lg-8과 같이 주어지면; sm에서는 12 컬럼, lg에서는 8 컬럼을 사용한다 곧, 더 큰 브레이크 포인트는 화면 너비가 커질 때 작은 브레이크 포인트의 레이아웃을 덮는다!

Col: .col-sm-3
Col: .col-sm-9 (Row 중첩)
Row: .col-8 .col-sm-6
Row: .col-4 .col-sm-6
                                    
                                        
                                    
                                

이렇게 Col 안에 Row를 중첩할 수도 있다!

컬럼 자동 축소/확장
특정 Col에서 .col-auto를 쓰면 안에 있는 컨텐츠의 양에 따라 마치 <span> 값처럼 너비가 자동 조절된다
.col col-lg-3
.col col-auto (여긴 좀 더 길군요 ~)
.col col-lg-3
                                    
                                        
                                    
                                
.col-3
.col grow (자동 확장)
.col-3
.col-auto shrink (자동 축소)
                                    
                                        
                                    
                                

한쪽은 .col grow, 다른 한쪽은 .col-auto shrink라서 좀 헷갈리긴 합니다만.. 어쨌건, 부트스트랩에서 규정해둔 이름이니 그냥 따르는 수밖에 없군요 ㅡㅡ;

컬럼 레이아웃
개별 Col이 아니라 Row에서 컨텐츠와 레이아웃을 위한 최적의 컬럼 개수를 지정해줄 수도 있다
.col
.col
.col
.col
                                    
                                        
                                    
                                

Row에 3개의 컬럼이 배치되고 남는 컬럼은 다음 행으로 내려간다!

.col
.col
.col
.col
                                    
                                        
                                    
                                

전체 너비 Col 적층구조로부터 시작하여 sm 브레이크 포인트에서는 Row 내 Col이 2 개로 되며(나머지 2개의 Col은 아래 행으로 내려가서 재배치된다!), md 브레이크 포인트에서는 Col 4 개가 하나의 Row 행에서 나란히 배치된다

[Row 내부의 컬럼 1] .col
[Row 내부의 컬럼 2] .col
[Row 내부의 컬럼 3] .col
[Row 내부의 컬럼 4] .col
                                    
                                        
                                    
                                

.row-cols-auto는 Row에 자연스런 너비를 설정해준다. 곧, 한 행에 Col 4개를 다 채울 수 있다면; 다 채우고, 아니라면; 남는 Col은 다음 행으로 래핑하는 것이다!


예제는 에서 가져와(약간 손질한) 것입니다. 다른 샘플 예제들도 많으니 한번 찾아가서 살펴보십시오..

컬럼 배치/이동

컬럼 이동 배치
특정 Col에서 .offset[-*]-# 클래스를 추가해주면; 앞쪽에 # 컬럼 단위만큼 비운 지점에서부터 해당 Col이 배치된다
.col-md-4
.col-md-4 offset-md-4
                                    
                                        
                                    
                                
마진 유틸리티인 .me-auto.ms-auto 클래스를 써서 컬럼 오프셋을 설정할 수도 있다
.col-md-4
.col-md-4 ms-md-auto
                                    
                                        
                                    
                                

위 코드의 .col-md-4 ms-md-automd 브레이크 포인트에 도달하게 되면; 앞쪽 형제 Col()을 앞쪽으로 밀어낸다!

컬럼 수평/수직 센터링
그리드시스템에서는, 부모 요소인 Row에서만 .mx-auto로 주면; 내부 자식 요소인 Col들은(플렉스박스로 작동되기에) 자연스레 정중앙에 배치된다
자식 요소인 col 자동 배치
자식 요소인 col 자동 배치
                                    
                                        
                                    
                                
.col my-auto
& div .mx-auto
                                    
                                        
                                    
                                

카드(.card)에서는 내부 자식요소들(위 <h5>와 <h6>)은 기본적으로 적층 구조로 쌓인다!

Row 안에서 <div class="w-100"></div>이라는 작은 트릭을 써서 새 줄을 나눌 위치를 삽입하면 여러 줄에 걸쳐있는 동일한 구조의 컬럼 열을 만들 수 있다

.col-6 .col-sm-4
.col-6 .col-sm-4
.col-6 .col-sm-4
.col-6 .col-sm-4
                                                
                                                    
                                                
                                            

컬럼 Gap 설정

Gap Gutters 는 컬럼의 수평 패딩(컬럼간 정렬을 위한 좌/우 패딩과 음수 마진 등)에 의해 생성된 컨텐츠간 간격인데, 1.5rem(= 24px)으로 시작한다 이는 그리드를 패딩과 마진 스페이서 크기(= 1rem)에 (반응형으로)일치시킬 수 있도록 한다!

컬럼간 갭 설정 및 제거하기
.g-*-#(갭 설정)나 .gx-*-#.gy-*-#(각각 수평, 수직 갭 설정) 클래스를 사용할 수 있다. 한편, .g-0는 설정된 갭을 제거하는데, Row의 모든 음수 마진과 (직계 하위 요소들의)수평 패딩을 모두 제거한다

(* 컬럼간에 갭이 존재한다)

Custom column padding
Custom column padding
                                    
                                        
                                    
                                

(* 컬럼간 갭을 제거하였다!)

Custom column padding
Custom column padding
                                    
                                        
                                    
                                

더 큰 수평 여백에 의해 원치않는 오버플로가 발생하지 않도록, 컨테이너 안에서 여백을 늘려주어야 하는 경우가 있을 수 있다. 위 코드의 Row에서의 .gx-5에 대응한 Container에서의 .px-4가 그렇고, 또는 Container에서 .overflow-hidden 클래스를 주어도 좋다: <div class="container overflow-hidden"></div>

갭의 오버플로에 대처하기
아래는 Row의 좌/우 음수 마진 합계(-30px)가 Col간 좌/우 갭 합계(30px)를 흡수하는 완충 역할을 할 수 있기에, Container에서의 .overflow-hidden은 필요하지 않다
Custom column padding
Custom column padding
                                    
                                        
                                    
                                
혹시나 모를 오버플로를 막기 위해 Row에서 .g-0 값을 줌으로써 갭을 없애줄 수도 있다

.col-sm-6 .col-md-8
.col-6 .col-md-4
                                    
                                        
                                    
                                

참고로, 바깥의 컨테이닝 블록인 .container 자체를 없애고, Row에서 .g-0 값을 줌으로써 완벽히 빈 공간없는 디자인을 만들 수도 있다!

Masonry 레이아웃

는 필터링과 정렬을 위한 그리드 기반 레이아웃 라이브러리로서, 사용 가능한 수직 공간의 최적 위치에 요소를 배치해주는데, 이는 포트폴리오 페이지 및 이미지 갤러리 등에서 놀랍도록 잘 작동된다!

메이슨리 레이아웃
부트스트랩에서 Masonry 필터를 사용하려면; 먼저, 아래 CDN 링크를 넣어주고, 그리드시스템 및 카드의 .row 래퍼에서 data-masonry= '{"percentPosition":true}' 속성을 더해주면 부트스트랩의 반응형 그리드시스템 및 카드 컴포넌트와 메이슨리의 포지셔닝이 결합된다
[ 부트스트랩과 메이슨리의 결합을 위한 CDN 링크 ]
                                        
                                            <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
                                            <script src="https://cdn.jsdelivr.net/npm/masonry-layout@4.2.2/dist/masonry.pkgd.min.js" integrity="sha384-GNFwBvfVxBkLMJpYMOABq3c+d3KnQxudP/mGPkzpZSTYykLBNsZEnG2D9G/X/+7D" crossorigin="anonymous" async></script>
                                        
                                    
Css의 은 한 축은 일반적인 엄격한 Grid 레이아웃(대부분 열)을 사용하고, 다른 축은 Masonry 레이아웃을 사용하는데, Masonry 축에서는 짧은 항목 뒤에 틈이 남는 엄격한 그리드를 고수하는 대신 다음 행의 항목이 위로 올라가 틈을 완전히 채우게 된다!
[ Masonry 그리드 레이아웃 ]
                                        
                                            .Masonry-grid { /* 일반적인 Masonry 레이아웃 */
                                                display: grid;
                                                grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); /* 그리드 축 */
                                                grid-template-rows: masonry; /* 메이슨리 축 */
                                                gap: 10px;
                                            }
                                        
                                    

일반적인 Masonry 레이아웃에서.. 이 컨테이너의 자식요소들은 일반 그리드 레이아웃 자동배치와 마찬가지로 행을 따라 항목별로 배치되지만, 새 행으로 이동하면; 항목이 Masonry 알고리즘에 따라 표시된다. 곧, 항목은 가장 많은 공간이 있는 열에 로드되어 엄격한 행 트랙 없이 빽빽하게 채워진 레이아웃을 만들게 되는 것이다!

Masonry 필터링

메이슨리 레이아웃은 멀티 컬럼, 동적 그리드 레이아웃을 만들 수 있는 자바스크립트 플러그인인 를 사용하여 만들어졌는데, 이는 완벽히 갭 없는 레이아웃을 허용하는 첫 번째 스크립트이다!

메이슨리 필터링
웹 문서에서 Masonry Filter를 사용하기 위해서는, 먼저 Isotope 스크립트 코드를 불러와야 한다. 이어서 data-isotope= 속성을 추가하여 컴포넌트를 초기화하고, layoutMode=, itemSelector= 등의 속성으로 다양한 설정을 해줄 수 있다. 한편, data-filter= 속성으로 모든 요소들을 필터링할 수 있다
[ Masonry Filter 스크립트 소스 ]
                                        
                                            <script src="vendors/isotope-layout/isotope.pkgd.min.js"></script>
                                            <script src="vendors/isotope-packery/packery-mode.pkgd.min.js"></script>
                                        
                                    
                                                    
                                                        
                                                    
                                                

Isotope는 유사한 자식 아이템들을 지닌 컨테이너 요소에서 작동하며, 각 항목들의 크기 조정은 Css로 설정한다

                                                
                                                    
                                                
                                            
                                                
                                                    .grid-item { width: 25%; }
                                                    .grid-item--width2 { width: 50%; }
                                                
                                            

Isotope(); 생성자는 컨테이너 요소Options 두 인수를 받는다:

                                                
                                                    var elem = document.querySelector('.grid');
                                                    var iso = new Isotope(elem, { // 컨테이너 요소 elem
                                                        itemSelector: '.grid-item',
                                                        layoutMode: 'fitRows'
                                                    });
                                                
                                            

자바스크립트 없이 html만으로 Isotope를 초기화 할 수도 있다 - 컨테이너 요소에 data-isotope= 속성을 추가하고, 옵션은 해당 값에서 설정해줄 수 있다

                                                
                                                    <div class="grid" data-isotope='{"itemSelector": ".grid-item", "layoutMode": "fitRows" }'></div>
                                                
                                            

플렉스박스

Css 플렉스박스 관련 상세 설명은 본 강좌의 부분을 참조하십시오..

플렉스박스 선언과 정의
부트스트랩에서 .d-[*-]flex플렉스박스임을 선언하는데, Css의 flexbox 속성과 마찬가지로 (아이템을 행 라인상에 나란히 배치하는).flex-row 및 (아이템이 넘쳐나도 다음 행으로 내려가지 않는).flex-nowrap이 기본값이다. 한편, .d-[*-]inline-flex는 인라인 플렉스박스로 선언한다
.d-flex flex-row는 플렉스 아이템을 가로로(= 쓰기모드의 인라인 방향) 배치하는데, .d-flex flex-row-reverse는 뒤쪽서부터 배치하면서 앞으로 나아간다. 또한, .d-flex flex-column은 플렉스 아이템을 세로로(= 쓰기모드의 블록방향) 배치하는데, .d-flex flex-column-reverse는 밑에서부터 배치하면서 위로 올라가게 된다
.d-flex
플렉스 2
플렉스 3
.d-flex flex-row-reverse
플렉스 2
플렉스 3
                                    
                                        
                                    
                                

이상은(이하로도) .d-flex flex-row(기본값)를 기준으로 한 것인데, .d-flex flex-column에서 어떻게 될지는 그냥 머리로만 유추해보십시오 시작점은 같되, 가로 끝에서 세로 끝으로 종착점 방향이 바뀌는만치 다른 모든 속성값들이 움직이는 방향도 그에 맞추어 정확하게 90도만큼씩 달라지게 됩니다!

아래 예제는 기본값인 .flex-nowrap인데, 여기서는 모든 아이템들이 한 라인상에 배치된다 - 공간이 부족해지면? 나머지가 짤리는 오버플로가 발생한다! 반면, .d-flex flex-wrap에서는 한 라인상에 채울만큼만 채우고, 나머지 아이템들은 아래로 내려가서 새로운 플렉스박스로 작동된다(= '래핑')
.d-flex
플렉스박스 2
플렉스박스 3
플렉스박스 4
플렉스박스 5
                                    
                                        
                                    
                                

화면 너비를 줄이고 늘리면서 확인해보세요..

플렉스박스 아이템 정렬
부트스트랩의 플렉스박스 아이템 정렬
  • .justify-content-start/center/end/between/around/evenly 아이템 가로 배치 기준점 기준축 방향으로
  • .align-content-start/end/center/between/around/stretch (아이템이 넘쳐서 다음 줄로 내려갈 때)아이템 세로 정렬 기준점 교차축 방향으로
  • .align-items-stretch/start/end/center/baseline 아이템 세로 배치 기준점 교차축 방향으로
  • .align-self-stretch/start/end/center/baseline (개별 아이템의)세로 배치 기준점 교차축 방향으로
.align-self-start
.align-self-center
.align-self-end
align-self-stretch
아이템 밀어내기 .me/ms-auto
.me/ms-auto는 나머지 아이템들을 뒤/앞으로 밀어내고, .mb/mt-auto는 나머지 아이템들을 아래/위로 밀어낸다
.me-auto
Flex item
Flex item
                                    
                                        
                                    
                                
Flex item
Flex item
.ms-auto
                                    
                                        
                                    
                                

참고로, 좌우로 아이템 밀어내기는 별 문제 없지만,, 상하로는 생각대로만 움직이지 않습니다. 마진병합 현상 등.. 여러 고려할 점이 있으니 충분히 시험해보고 확인해서 사용하십시오 ㅡㅡ;

아이템 공간배분

화면 너비를 변경해가면서 각 아이템들간 공간 배분이 어떻게 변동되는지 확인해보십시오..

아이템 공간배분: .flex-fill
(형제 요소들과의 관계에서)사용 가능한 남는 영역 전부를 차지한다. 곧, 형제 요소들의 컨텐츠를 다 채워준 뒤, 남는 영역은 모두 자신이 차지한다:
.flex-fill
아이템 2
아이템 3
                                    
                                        
                                    
                                

모두의 컨텐츠를 채우기에 모자라면; 모두 똑같은 크기의 영역으로 배분된다!

아이템 공간배분: .flex-grow-0/1
주변 아이템을 채운 뒤 남는 공간이 있으면; 어떻게 할 것인인가?
.flex[-*]-grow-0 (기본값: 자기 컨텐츠만큼만 채운다)
2nd
3rd
.flex[-*]-grow-1 (남는 공간을 자기가 차지한다)
2nd
3rd
                                    
                                        
                                    
                                
아이템 공간배분: .flex-shrink-1/0
주변 아이템을 챙겨주다 자신을 위한 공간이 부족해진다면; 어떻게 할 것인가?
.w-100
.flex-shrink-1 (기본값: 자신을 줄여간다 곧, 자신을 밑으로 늘이게 된다!)
.flex-shrink-0 (자기 너비는 그대로 유지하면서..)
.w-100 (나머지 아이템을 줄여간다 곧, 나머지 아이템들을 밑으로 늘이게 된다!)
                                    
                                        
                                    
                                
175x175
이미지는 항시 자신의 공간을 유지하고(.flex-shrink-0), 남는 공간은 모두 내가 차지한다(.flex-grow-1)
                                                    
                                                        
                                                    
                                                

스택 레이아웃

Stack은 부트스트랩의 플렉스박스 유틸리티로 구축되어 사용자 컴포넌트를 쉽고 빠르게 만들 수 있도록 도와준다!

스택: .vstack.hstack
.hstack은 수평 레이아웃을 만들고(각 아이템들은 수평 중앙에서 컨텐츠만큼의 너비를 차지한다), .vstack은 수직 레이아웃을 만든다(각 아이템들은 전체 너비를 차지한다),
[ .hstack 및 .vstack 정의 ]
                                        
                                            .hstack {
                                                display: flex; flex-direction: row; align-items: center; align-self: stretch;
                                            }
    
                                            .vstack {
                                                display: flex; flex-direction: column; align-self: stretch;
                                                flex: 1 1 auto;
                                            }
                                        
                                    

아이템간 간격을 주려면; .gap-[*-]# 클래스를 더해주면 된다!

                                                    
                                                        
                                                    
                                                
                                                    
                                                        
                                                    
                                                

그리드(.d-grid)나 플렉스박스(.d-flex)에서 각 아이템간 간격을 줄 때, (하위 요소들에서 개별적으로 마진 유틸리티를 쓰는 대신에)부모요소에서 .gap-0/1/2/3/4/5 클래스를 쓰는 것이 보다 간편할 수 있다. .gap-#은 아이템간 간격을 설정하는데, 주변 가장자리는 열외로 하고 각 아이템 사이에만 여백을 준다. 한편, .row/column-gap-#으로 수직/수평 각 방향으로 설정해줄 수도 있다 .gap 클래스는 기본적으로 반응형이다!

카드 작성 기본

부트스트랩의 카드는 기본적으로 플렉스박스로 작동하면서, 다양한 변형과 옵션이 있는 유연하고 확장가능한 컨텐츠 컨테이너이다!

카드 작성의 기본
부트스트랩 카드.card 클래스로 작성하는데, 이 카드는 내부 요소들은 세로로 배치되고(.d-flex flex-column) 부모요소의 너비를 가득 채우면서 마진은 0 으로 설정된다. 아래는 가장 기본적인 카드 박스(.card) 형태이다
카드 header
카드 제목
- 부제목

카드 텍스트 및 링크 등..

[ 카드 작성의 기본 ]
                                        
                                            
                                        
                                    

.card border-5 border-grey rounded-5는 카드 테두리(& 색상, 둥근 모서리)를 설정해준 것이며, .w-75 mx-auto는 카드의 크기를 지정하고 가로 정중앙에 배치해준 것입니다

카드 색상 설정
카드 박스(.card)에서 설정해준 배경색 및 텍스트 색상은 카드 전체(card-header, card-body, card-footer 모두)로 확장된다
Header
카드박스 색상

- 이 카드박스 색상은 카드 전체로 확장된다!

                                    
                                        
                                    
                                

.card-header.card-footer에서 .bg-transparent 클래스를 더하여 (부트스트랩에서)카드에 기본 설정해준 배경색을 없애줄 수 있다. 하지만, 위와 같이 .card에서 자체 설정한 배경색(.card text-bg-secondary)에는 적용되지 않는다 이는, 부트스트랩에 기본 설정된 색상이 덮여지는 때문이다!

Header
.card-body text-body-secondary

.card-text

.card-text text-success

                                    
                                        
                                    
                                

단, 위에서처럼, 카드 내부에서 달리 설정해줄 수 있다. 곧, .card text-warning 색상은 카드 헤더와 푸터에는 적용되지만, 카드 바디(및 그 내부 요소들)에서는 새로 설정해준 색상들이 적용되는 것이다!

카드, 뱃지 등에서는 .text-bg-색상 클래스로 배경색을 설정해줄 수 있는데, 이 경우 텍스트색은 배경색에 대비되는 색으로 자동 설정된다
카드 헤더
뱃지, 카드에서의 배경색 설정에 따르는 텍스트 색상
                                    
                                        
                                    
                                
카드 내 이미지 배치
카드에 이미지를 배치할 때, .card-body 바깥에서는; .card-img-top/bottom 클래스로 위/아래에 이미지를 넣어주면 된다
꼭 넣어주세요 ^^
Card body
꼭 넣어주세요 ^^
                                    
                                        
                                    
                                

카드 고급

카드 작성 고급
카드 작성 예제
남산부석정사각
Card title

md 브레이크 포인트에서 카드 이미지를 꽉 채우기 위해 .row g-0(그리드 여백 제거)와 .col-md-* 클래스를 사용하였다

                                                    
                                                        
                                                    
                                                

md 브레이크 포인트에서 카드 이미지를 꽉 채우기 위해 .row g-0(그리드 여백 제거)와 .col-md-* 클래스를 사용하였다!

Card title

카드 본문..

Card title

카드 본문..

Card title

카드 본문..

Card title

카드 본문..

                                                    
                                                        
                                                    
                                                

참고로, 각 카드에 있는 .h-100 클래스는 각 카드의 높이를 똑같이 맞추기 위한 것이다!

스크롤링 카드

.card-body에서.. style="max-height: 8rem;"

¶ 사용자 정의 스크롤 가능 카드를 사용하면; .card-body 요소의 최대 높이를 설정하고 카드 안의 내용이 그 높이를 넘어가는 경우 카드 본체의 내용을 스크롤할 수 있다!

¶ 또는, 인라인 css 또는 다른 카드에 대한 css 재정의를 사용하여 카드 본체의 최대 높이를 설정할 수도 있다!

                                                    
                                                        
                                                    
                                                
                                                    
                                                        .card-scrollable .card-body {
                                                            max-height: 45rem; overflow-y: auto;
                                                        }
                                                    
                                                

여기서는.. 공간을 줄이기 위해, 이 예제 카드의 최대 높이를 인라인 css(style="max-height: 8rem")로 설정해주었지만, 실제 사용 시는 위 사용자정의 Css를 적절한 높이로 수정하여 사용하면 됩니다..

오버레이 카드 이미지

경주 남산 천동탑

                                                    
                                                        
                                                    
                                                
                                                    
                                                        .card-img, .card-img-top, .card-img-bottom { width: 100%; }
                                                        
                                                        .card-img-overlay {
                                                            position: absolute; top: 0; right: 0; bottom: 0; left: 0; /* 카드 전체 */
                                                            padding: 1rem; border-radius: 0.33rem;
                                                        }
                                                    
                                                

이 사용자정의 오버레이 카드는 배경 이미지를 텍스트 오버레이가 있는 카드 이미지로 사용하는데, 이미지 오버레이 시 카드 내부 컨텐츠가 이미지보다 높아서는 안된다 - 아니라면; 컨텐츠가 이미지 외부로까지 펼쳐지게 된다!

버튼 작성하기

아래 버튼들은 부트스트랩의 기본 규격과는 좀 다릅니다 - Css 사용자정의를 통해 색상과 모양 및 크기 등에 약간의 변형을 준 것이니 참고 바랍니다..

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

                                    
                                        
                                    
                                
부트스트랩 5)의 .btn 클래스는 기본적으로 <button> 태그에서 사용되도록 디자인되었지만, <a>나 <input> 태그에서도 사용할 수 있다

a .btn

                                    
                                        
                                    
                                

보통 <a> 태그가 새 페이지나 섹션을 여는 대신 (컨텐츠 축소 등의)페이지 내 기능을 트리거하는데 사용될 때 .btn 클래스를 쓸 수 있는데, 이 경우 role= "button" 속성을 통해 스크린리더기 등에 그 의미를 충분히 전달해주어야 한다!

button .btn btn-*

button .btn btn-outline-*

비활성 버튼
<button>(및 <a>, <input>) 태그에서 사용하는 .disabled 클래스는 Css의 pointer-events: none;user-select: none; 속성이 적용되어 마우스 오버 및 활성 상태가 트리거되는 것을 막는다:
                                    
                                        
                                    
                                

이 경우, 위 코드의 title= "disabled" 속성 또한 작동되지 않는다!

<Button> 태그에서와는 달리, <a> 태그를 쓰는 버튼에서는 위 트리거 속성들이 지원되지 않으므로 추가적으로 role= "button" 속성이 필요하며, 또한 href 속성을 포함하지 말아야 한다: <a>
                                    
                                        
                                    
                                

단, 여전히 (위 코드처럼)href 속성을 유지해야만 하는 경우에는; (키보드 입력을 받지 않도록)tabindex= "-1"aria-disabled= "true" 속성 또한 필요로 한다!

토글 버튼
부트스트랩의 data-bs-toggle= "button" 속성은 버튼의 on/off 상태를 나타내는데, 미리 On 상태를 만들기 위해서는; .active 클래스와 함께 aria-pressed= "true" 속성도 추가해주어야 한다
                                    
                                        
                                    
                                
닫기 버튼
부트스트랩의 .btn-close 클래스는 닫기(x) 버튼을 만든다
                                    
                                        
                                    
                                
버튼 그룹과 버튼 툴바
부트스트랩의 .btn-group.btn-group-vertical 클래스는 일련의 버튼을 한 줄로 그룹화하거나 세로로 쌓는다. 나아가, .btn-toolbar 클래스는 .btn-group 및 여타 부트스트랩 클래스들을 조합하여 작은 툴바를 만든다
                                    
                                        
                                    
                                

부트스트랩은 억지로 외우려 애쓰지 말고 그냥 이런게 있다 하면서 자연스레 눈에 익혀가면 됩니다 - 대충 기능과 주의점들만 알아뒀다 필요해지면 그때 소스 찾아서 붙여넣고 자신의 요구에 맞게 수정하여 쓰시면 됩니다. 부트스트랩은 모든 기능들이 마치 레고 블록과 같아서 이것, 저것,, 여기, 저기,, 막 갇다붙여도 그럭저럭, 말 잘 알아듣는 똑똑한 장난감입니다 - 다만, 원칙없이 마구 갇다 붙였다가는 나중에 코드 수정하거나 할 때 작성한 본인도 한~참 헤맬 수 있습니다!

➥ 마우스 호버 효과

사용자정의 클래스 .lifthoverfocus 시, 해당 요소를 들썩이는데, 이는 카드, 버튼 및 링크만 아니라 여타 html 요소들에서도 또한 사용할 수 있다!

안뇽~

* 이 호버 효과는 카드, 버튼만 아니라 <a>, <p>, <div> 등 다른 요소들에도 역시 적용할 수 있다!

                                        
                                            
                                        
                                    
                                        
                                            .lift {
                                                transition: box-shadow 0.3s ease, transform 0.3s ease;
                                            } .lift:hover, .lift:focus {
                                                box-shadow: 0 0.8125rem 1rem rgba(35, 35, 35, 0.15);
                                                transform: translate3d(0, -3px, 0);
                                            }
                                        
                                    

뱃지 달아주기

뱃지는 버튼이나 링크의 일부분으로 사용되어 카운터를 제공할 수도 있고(예컨대, 게시글 개수 등..), 나아가 모든 컨텐츠에 추가 정보를 덧붙이는데(예컨대, 모자에 폼나게 별 4개 박은 장군, 가슴에 출렁이는 훈장들 ^^) 사용할 수도 있다!

뱃지 작성의 기본
기본적으로 뱃지의 배경색은 버튼의 배경색과 같은데, Bootstrap 5) 버전에서는 뱃지의 배경색만 설정하면(예컨대, .badge text-bg-secondary); 텍스트는 그에 대비되는 색상으로 자동으로 맞추어진다. 한편, 뱃지는 em 단위를 사용하므로 그 크기는 기본적으로 부모 요소의 글꼴 크기에 맞추어진다
                                    
                                        
                                    
                                
뱃지는 기본적으로 정원으로 그려지지만 .badge rounded-pill로 주면 내부 컨텐츠에 맞추어 최대한 둥글게 표시된다
                                    
                                        
                                    
                                

위 <button>에서의 .position-relative 및 <span>에서의 position-absolute top-0 start-100 translate-middle는 버튼 내 뱃지의 위치를 지정해주기 위한 것이다!


뱃지는 유용한 시각적 정보를 제공하지만, 이것이 스크린리더기 등에는 혼란을 줄 수도 있다. 따라서, 컨텍스트가 명확하지 않은 경우, 숨겨진 텍스트를 통해 부가적으로 정보를 제공해주는 것이 좋다: <span class="visually-hidden">뱃지 설명..</span>

목없는 부처님
목없는 부처님
                                                    
                                                        
                                                    
                                                

이 기울어진 뱃지는 배지를 요소의 맨 위에 고정하기 위해 부모 래퍼에서 overflow-hiddenposition-relative 값을 주고, 내부 .badge에서 .badge-rotate 사용자정의 클래스를 부가한 것이다!

                                                    
                                                        .badge-rotate {
                                                            position: absolute; left: 0; top: 1.8rem;
                                                            padding: 0.25rem; padding-left: 3rem; padding-right: 3rem;
                                                            transform: rotate(-45deg) translate(-30%, -50%);
                                                            z-index: 1;
                                                        }
                                                    
                                                

수평/수직선

여기서는 부트스트랩의 수평선수직선 관련 클래스들을 간략히 살펴봅니다..

가로선: <hr> 태그
부트스트랩에서 <hr> 태그는 ( 브라우저 기본값과 유사하게)border-top 으로 스타일링되고, 불투명도는 opacity: 0.25;로 설정되며, (따로 지정하지 않은 경우)부모요소로부터 상속받은 색상을 사용한다 부트스트랩의 <hr> 태그에서는 .text-색상, .border, .opacity-# 등의 클래스들 또한 사용할 수 있다!

(* 아래 가로선은 부트스트랩 기본 <hr> 태그입니다 - 단, 이 문서에서의 사용자정의 스타일에 의해 부트스트랩의 기본 모양과는 약간 다를 수도 있습니다..)


(* 아래 가로선들은 부트스트랩 클래스들로 스타일링한 <hr> 태그들입니다)




                                    
                                        
                                    
                                
➥ 짧은 hr 태그

html 기본 태그인 <hr>을 사용자 정의하여, 아래와 같은 짧은 <hr> 가로선을 만들어쓸 수도 있다


                                        
                                            
                                        
                                    
                                        
                                            .hr-short_50 { width: 50%; margin: 0 auto; }
                                        
                                    

margin: 0 auto;는 가로선을 수평 중앙에 배치한 것인데, 이 코드를 없애주면 앞에서부터 배치된다!

수직선: .vr 클래스
부트스트랩의 .vr 클래스는 width: 1px;min-height: 1em; 값을 가지며(), 부모 요소의 색상 및 불투명도를 상속받는다 필요하다면; 선의 굵기 및 높이는 변경해줄 수 있다!
스택에 사용된 .vr 클래스
아이템 1
아이템 2
                                    
                                        
                                    
                                

수직선에 font: 1.5/1.5; 값을 줌으로써, font-sizeline-height 값이 같아져 1.5 배 더 커진 수직선이 세로 중앙에 자리잡게 된다!

드롭다운 메뉴

드롭다운 메뉴.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 클래스는 그룹 내 모든 버튼의 크기를 더 크게/작게 설정한다!

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

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

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


* cf) 이러한 종류의 애니메이션 움직임에는 플러그인을 쓸 수도 있지만, 이렇게 직접 Css 스타일 정의를 통해 만들어쓸 수도 있습니다

                                                    
                                                        
                                                    
                                                

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

                                                    
                                                        .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 사이의 간격을 없애주었습니다!

wave