web
20210601 Bootstrap01 : CDN 연결, Buttons & Buttons group, Dropdown, List Group, Form, Modal, Tootips, NPM연결, 테마 색상 커스텀, 성능최적화(트리 쉐이킹, Optimize, 단일 번들)
Bootstrap01
- Bootstrap official site
- 여러가지 CSS, JS로 이미 만들어 져있는 UI(Components)를 가져다 사용 가능케 해주는 UI Framework
- 5버전 : SCSS , 트리쉐이킹을 지원함
- 트리 쉐이킹 (Tree Shaking) : 단일 번들을 최적화 할때 사용되는 필요하지 않은 코드를 제거하는 기술
연결하기
- CDN CSS, JS 연결하기
- Bootstrap : Quick Start
- JS CDN의 경우 Bootstrap에서는 Popper js에 의존하고 있어서, 묶여져 있는 Bundle이 있고 분리되어 있는 Seperate가 있음
- Bundle : Bootstrap + Popper
- Seperate : Bootstrap , Popper (Popper를 따로 사용하는 경우 seperate 로 연결)
- Popper : 팝업을 쉽게 만들게 해주는 JS 패키지
버튼과 버튼 그룹
Buttons
- 여러가지 버튼 스타일의 요소들을 제공
btn-키워드
- Outline buttons : 배경색이 없는 버튼 제공
- (기존 button 클래스 이름에
outline
추가함 ->btn-outline-키워드
)
- (기존 button 클래스 이름에
- size :
btn-lg
btn-sm
-> large , small의 약어로 기본값의 사이즈보다 크거나 작게 만들수 있음- classList에 추가함
- Disabled state : button 요소에 disabled 태그를 추가하면 됨 (div 요소에는 안됨)
Button group
- 버튼들 간의 경계를 없앰
<div class="btn-group">
<button type="button" class="btn btn-primary">Primary</button>
<button type="button" class="btn btn-secondary">Secondary</button>
<button type="button" class="btn btn-success" disabled>Success</button>
<button type="button" class="btn btn-outline-success" disabled>
Success
</button>
</div>
<div class="btn btn-outline-primary btn-lg">btn-lg</div>
<div class="btn btn-outline-primary">default</div>
<div class="btn btn-outline-primary btn-sm">btn-sm</div>
드롭다운 (Dropdowns)
Dropdowns
- 버튼을 눌러 하위 메뉴를 여는 Component
- button, a 요소에서 지원함으로 필요함
- button 요소
dropdown-toggle
classList에 추가- data-bs-toggle 속성을
"dropdown"
- a 링크 요소
dropdown-toggle
classList에 추가- role 속성
button
- id 속성
dropdownMenuLink
- data-bs-toggle 속성을
"dropdown"
- data-bs-toggle 속성을
"dropdown"
- 하위 메뉴
- ul(
dropdown-menu
) , li(dropdown-item
) 태그를 통해 구성함 - 항목 간의 구분 선은 li 태그안에 hr태그(
dropdown-divider
)로 작성
- ul(
<button
type="button"
class="btn btn-danger dropdown-toggle"
data-bs-toggle="dropdown"
aria-expanded="false"
>
Action
</button>
<!-- <a class="btn btn-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown link
</a> -->
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider" /></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
Split button (button , drop)
- 버튼 영역과 드롭다운 영역을 분리
- 버튼 요소를 두개를 만들어야 함 (일반 버튼 + 드롭다운 버튼)
- 드롭 다운하는 버튼의 경우
dropdown-toggle-split
를 classList에 추가함
<div class="btn-group">
<button type="button" class="btn btn-danger">Action</button>
<button
type="button"
class="btn btn-danger dropdown-toggle dropdown-toggle-split"
data-bs-toggle="dropdown"
aria-expanded="false"
>
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider" /></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
</div>
리스트 그룹 (List Group)
List Group
- 단순히 리스트를 표현하는데 사용됨
- 기본적으로는 ul(
list-group
), li(list-group-item
) 요소 형태로 사용됨 - 리스트 항목을 Active 효과를 주고 싶은 경우 item 요소에
active
클래스를 추가해주면됨 (aria-current 속성의 경우 웹 접근성을 위함임) - Disabled 효과
- -> button이 아닌 요소는
disabled
클래스 추가 - -> button 요소는 disabled 속성을 추가
- -> button이 아닌 요소는
- button, a 요소를 통해서 item이 만들어 진다면,
list-group-item-action
클래스를 추가하면 hover 효과를 줄수 있음
<div class="list-group">
<a
href="#"
class="list-group-item list-group-item-action active"
aria-current="true"
>
The current link item
</a>
<a href="#" class="list-group-item list-group-item-action"
>A second link item</a
>
<a href="#" class="list-group-item list-group-item-action"
>A third link item</a
>
<a href="#" class="list-group-item list-group-item-action"
>A fourth link item</a
>
<a
href="#"
class="list-group-item list-group-item-action disabled"
tabindex="-1"
aria-disabled="true"
>A disabled link item</a
>
</div>
Forms (양식)
기본적으로 form, input 요소로 사용됨
Sizing :
form-control-lg
,form-control-sm
클래스 추가Disabled :
disabled
속성 추가Readonly :
readonly
속성 추가file input UI
모달
- 화면을 덮는 알림창과 같은 역할
Tooltips (툴팁)
- popper처럼 요소에 팝업을 제공함
- 툴립 component의 경우에는 성능상의 이유로, 포함되어 있지 않아 명시적으로 초기화를 시켜줘야 동작함
<button
type="button"
class="btn btn-secondary"
data-bs-toggle="tooltip"
data-bs-placement="top"
title="Tooltip on top"
>
Tooltip on top
</button>
<button
type="button"
class="btn btn-secondary"
data-bs-toggle="tooltip"
data-bs-placement="right"
title="Tooltip on right"
>
Tooltip on right
</button>
<button
type="button"
class="btn btn-secondary"
data-bs-toggle="tooltip"
data-bs-placement="bottom"
title="Tooltip on bottom"
>
Tooltip on bottom
</button>
<button
type="button"
class="btn btn-secondary"
data-bs-toggle="tooltip"
data-bs-placement="left"
title="Tooltip on left"
>
Tooltip on left
</button>
JS 초기화
var tooltipTriggerList = [].slice.call(
document.querySelectorAll('[data-bs-toggle="tooltip"]')
);
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
NPM으로 관리
- NPM을 통해서 bootstrap을 연결하여 관리하면, custom도 가능하고 필요 한것만 가져다 쓸수 있음
- CDN방식의 경우 색상 및 자신이 원하는 것으로 커스텀이 불가능함
- CDN에서 NPM 으로 관리
- npm init을 통해서 프로젝트를 npm으로 관리시작하고
npm i bootstrap@next
명령어로 일반 의존성으로 설치 함 (실제로 화면에서 사용되는 것이기 때문에)- 부트스트랩을 사용하기 위해서 스타일 파일과, JS파일에 nodemodules에 들어 있는 부트스트랩 파일을 연결해야함 - SCSS 파일 :
@import '../node_modules/bootstrap/scss/bootstrap.scss';
- JS 파일 :import bootstrap from 'bootstrap/dist/js/bootstrap.bundle';
- JS 파일의 경우 import시 바로 nodemodules 폴더에서 찾기 때문에 상세 경로를 적을 필요가 없음
테마 색상 커스터마이징
- Bootstrap customize
- 기본적인 bootstrap에서 이미 지정해 놓은 SCSS형태의 여러 파일을 수정해서 전체적인 bootstrap을 들고 올수 있도록 해야함
- 기본으로 지정해 놓은 functions, variables, mixins 를 import하고 거기서 theme-clors라는 변수에 맵 형태의 값을 수정해 주면 반영이 됨
// 덮어쓰기 초기화 과정
@import "../node_modules/bootstrap/scss/functions";
@import "../node_modules/bootstrap/scss/variables";
@import "../node_modules/bootstrap/scss/mixins";
$theme-colors: (
"primary": $primary,
// 'secondary': $secondary (기본 값) -> yellowgreen 변경
"secondary": yellowgreen,
"success": $success,
"info": $info,
"warning": $warning,
"danger": $danger,
"light": $light,
"dark": $dark,
);
// 전체 가져오기
@import "../node_modules/bootstrap/scss/bootstrap.scss";
성능 최적화 (트리 쉐이킹)
Optimize
- Bootstrap: Optimize
- CDN에서는 모두 가져왔지만 npm을 사용해서 관리함으로 써 nodemodules에서 가져올 것만 가져와서 사용함
- 즉, 여러 components 및 기능들을 모두 SCSS, JS import를 통해서 명시해서 써야 해당 기능만 사용함을서 자원을 아낌
- 단, JS에서 기능을 사용할때 해당 기능을 new라는 키워드로 JSclass를 초기화 시켜서 사용해야함
스타일 가져오기
- SCSS에서도 전체 기능의 스타일을 가져오지 않고 사용하는 기능에 대한 특정 스타일만 가져와 사용할 수 있지만,
- 아직 5버전 성숙도가 떨어져서 일단은 전체를 들고와 사용함 (JS가 아니라 CSS이다보니 전체적인 성능에는 크게 영향을 주지 않음)
JS 가져오기
- 성능적으로 개별적으로 가져와서 사용하는 것이 좋다. (bundle -> 전체임)
- JS 파일이 있고 사용시 초기화가 필요한 컴포넌트가 있기도 하고 없는 것도 있음
- 초기화는 각 bootstrap component
via javascript
부분을 참고하면 됨
드롭다운 예시
- dropdowns JS초기화 사용법
- bundle 사용시에 썻던 bootstrap 전역변수 사용 안함을 주의!
- bootstrap의 경우 popper에 의존성이 있었기 때문에 전체를 가져오는게 아니면 따로 popper를 의존성으로 npm에 설치해줘야 함
npm i @popperjs/core
import Dropdown from "bootstrap/js/dist/dropdown";
const dropdownElementList = [].slice.call(
document.querySelectorAll(".dropdown-toggle")
);
dropdownElementList.map(function (dropdownToggleEl) {
return new Dropdown(dropdownToggleEl); // bootstrap 전역변수 사용 안함을 주의!
});
- button과 sppiner의 경우 JS는 없어 초기화가 필요 없는 컴포넌트가 있으므로 bootstrap 문서를 잘 살펴 봐야함
모달 예시
- 뒤에 객체인자 부분은 option에 해당함
- backdrop은 모달 활성화시 배경 클릭하면 모달이 꺼질지 설정하는 옵션임 (static이 배경 클릭 막는 것임)
import Modal from "bootstrap/js/dist/modal";
new Modal(document.querySelector("#exampleModal"), {
backdrop: "static",
});