부트스트랩 캐러셀 · 모달 · 스크롤스파이 완전 정리
캐러셀, 모달, 스크롤스파이를 Bootstrap 3 JavaScript 컴포넌트 흐름으로 정리합니다.
<div id="carousel-example-generic" class="carousel slide">...</div>
<button class="btn btn-primary" data-toggle="modal" data-target="#myModal">모달 열기</button>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog">...</div>
<div data-spy="scroll" data-target="#navbar-example2" data-offset="0" class="scrollspy-example">
<h4 id="fat">@fat</h4>
</div>
<script>$('.carousel').carousel()</script>
캐러셀, 모달, 스크롤스파이는 모두 Bootstrap JavaScript 플러그인이 필요합니다. CSS 클래스만으로 외형 일부는 보일 수 있지만, 슬라이드 전환, 모달 열기, 스크롤 위치 감지는 jQuery와 bootstrap.min.js가 있어야 동작합니다.
- jQuery를 먼저 로드합니다.
- bootstrap.min.js를 그 다음 로드합니다.
- data-toggle, data-target, data-spy 같은 속성이 동작을 연결합니다.
- id와 href/data-target 선택자가 정확히 일치해야 합니다.
| 클래스/속성 | 역할 | 주의 |
|---|---|---|
| carousel slide | 캐러셀 전체 | id가 컨트롤 href와 연결됩니다. |
| carousel-indicators | 슬라이드 점 | data-slide-to 번호가 item 순서와 맞아야 합니다. |
| carousel-inner | 슬라이드 묶음 | item들을 감쌉니다. |
| item active | 첫 슬라이드 | active가 없으면 처음 화면이 비어 보일 수 있습니다. |
left carousel-control과 right carousel-control은 이전/다음 슬라이드 이동 버튼입니다. href는 캐러셀 id를 가리키고 data-slide는 prev 또는 next입니다.
- 캐러셀 전체에 고유 id를 붙입니다.
- 왼쪽 컨트롤 href를 그 id로 맞춥니다.
- data-slide="prev"를 둡니다.
- 오른쪽 컨트롤은 data-slide="next"를 둡니다.
- icon-prev와 icon-next로 방향 아이콘을 표시합니다.
원문은 slide1.jpg, slide2.jpg, slide3.jpg를 item 안에 배치합니다. 이미지 경로가 틀리면 캐러셀 구조는 보이지만 화면이 비어 보일 수 있습니다.
- 모든 이미지 경로가 HTML 파일 기준으로 맞는지 확인합니다.
- alt에는 First slide 같은 대체 문구를 넣습니다.
- 이미지 비율이 다르면 슬라이드 높이가 흔들릴 수 있습니다.
- 첫 item에는 active를 반드시 둡니다.
원문은 $('.carousel').carousel()로 캐러셀을 초기화합니다. data 속성만으로도 동작할 수 있지만, 명시 초기화는 플러그인 연결 여부를 확인하기 좋습니다.
| 클래스/속성 | 역할 | 주의 |
|---|---|---|
| $('.carousel').carousel() | 캐러셀 초기화 | jQuery 필요 |
| data-slide-to | 특정 슬라이드 번호 | 0부터 시작 |
| data-slide | prev/next 이동 | 컨트롤에 사용 |
| active | 현재 슬라이드 | item과 indicator에 사용 |
모달은 버튼이나 링크에 data-toggle="modal"과 data-target="#myModal"을 붙여 엽니다. a 태그는 href="#myModal"과 data-toggle="modal" 조합도 가능합니다.
| 클래스/속성 | 역할 | 주의 |
|---|---|---|
| data-toggle=modal | 모달 동작 연결 | Bootstrap JS 필요 |
| data-target=#myModal | 열 모달 id | id와 정확히 일치 |
| btn btn-primary | 버튼 외형 | 트리거 요소 |
| href=#myModal | 링크 트리거 | a 태그 방식 |
modal fade 안에 modal-dialog, modal-content, modal-header, modal-body, modal-footer가 순서대로 들어갑니다. 각 영역을 나누면 제목, 본문, 버튼을 명확히 관리할 수 있습니다.
- div.modal.fade에 id를 지정합니다.
- modal-dialog로 창 영역을 만듭니다.
- modal-content 안에 실제 콘텐츠를 넣습니다.
- modal-header에는 제목과 닫기 버튼을 둡니다.
- modal-body에는 본문을 둡니다.
- modal-footer에는 닫기와 저장 버튼을 둡니다.
원문은 role="dialog", aria-labelledby, aria-hidden, sr-only Close를 사용합니다. 모달은 포커스와 닫기 동작이 중요하므로 접근성 속성을 함께 확인해야 합니다.
| 클래스/속성 | 역할 | 주의 |
|---|---|---|
| role=dialog | 대화상자 의미 | 보조기술에 구조 전달 |
| aria-labelledby | 제목 연결 | modal-title id와 연결 |
| tabindex=-1 | 포커스 제어 | 모달 열림 시 포커스 이동 |
| data-dismiss=modal | 닫기 버튼 | Bootstrap JS가 처리 |
스크롤스파이는 nav 링크의 href와 본문 섹션 id를 연결합니다. data-spy="scroll"이 붙은 스크롤 영역은 data-target으로 nav를 가리킵니다.
| 클래스/속성 | 역할 | 주의 |
|---|---|---|
| data-spy=scroll | 스크롤 감지 | 스크롤 영역에 붙임 |
| data-target=#navbar-example2 | 대상 nav | nav id와 일치 |
| data-offset | 활성화 보정값 | 고정 헤더 높이 보정 |
| href=#fat | 섹션 링크 | 본문 id와 일치 |
원문은 navbar 안에 @fat, @mdo 링크와 dropdown 내부 one, two, three 링크를 둡니다. 각 href는 본문 h4의 id와 연결됩니다.
- nav 링크 href="#fat"은 h4 id="fat"과 연결됩니다.
- dropdown 내부 링크도 스크롤스파이 대상이 될 수 있습니다.
- 스크롤 영역에는 충분한 높이와 overflow가 필요합니다.
- 외부 doc.css가 스크롤 영역 스타일을 담당할 수 있습니다.
scrollspy-example 영역 안에는 여러 h4와 p가 이어집니다. 스크롤 위치가 바뀔 때 가장 가까운 섹션에 해당하는 nav 항목이 active로 바뀝니다.
- 스크롤 가능한 컨테이너를 만듭니다.
- 각 섹션 제목에 id를 붙입니다.
- nav 링크 href를 같은 id로 맞춥니다.
- data-spy와 data-target을 설정합니다.
- 스크롤하면서 active 변화가 맞는지 확인합니다.
세 예제 모두 문서 하단에 jQuery와 bootstrap.min.js를 로드합니다. 이 순서가 바뀌면 Bootstrap 플러그인이 jQuery를 찾지 못해 동작하지 않습니다.
| 클래스/속성 | 역할 | 주의 |
|---|---|---|
| jQuery | 먼저 로드 | Bootstrap 3 플러그인의 기반 |
| bootstrap.min.js | 나중 로드 | 모달, 캐러셀, 스크롤스파이 제공 |
| 초기화 스크립트 | 마지막 | 플러그인 로드 후 실행 |
| 콘솔 확인 | 오류 확인 | $ is not defined 등 확인 |
원문은 Bootstrap 3 문법입니다. Bootstrap 5에서는 data-toggle이 data-bs-toggle로 바뀌고, item은 carousel-item으로 바뀌는 등 차이가 큽니다.
| 클래스/속성 | 역할 | 주의 |
|---|---|---|
| item | Bootstrap 3 캐러셀 항목 | Bootstrap 4/5는 carousel-item |
| data-toggle | Bootstrap 3/4 방식 | Bootstrap 5는 data-bs-toggle |
| left/right control | Bootstrap 3 컨트롤 | 최신 버전은 carousel-control-prev/next |
| jQuery 의존 | Bootstrap 3 필요 | Bootstrap 5는 jQuery 불필요 |
| 목표 | 컴포넌트 | 이유 |
|---|---|---|
| 이미지 홍보 영역 | carousel | 여러 이미지를 좁은 공간에 순차 표시합니다. |
| 확인 대화상자 | modal | 현재 화면 위에서 중요한 결정을 받습니다. |
| 긴 문서 목차 | scrollspy | 현재 읽는 섹션을 nav에 표시합니다. |
| 드롭다운 포함 목차 | scrollspy + dropdown | 하위 섹션까지 연결할 수 있습니다. |
- 캐러셀 id와 indicator data-target, control href가 모두 일치합니다.
- 첫 carousel item과 indicator에 active가 있습니다.
- 모달 trigger의 data-target과 modal id가 일치합니다.
- 모달 닫기 버튼에 data-dismiss="modal"이 있습니다.
- 스크롤스파이 nav href와 본문 id가 일치합니다.
- jQuery, bootstrap.min.js, 초기화 스크립트 순서가 맞습니다.
- 캐러셀 이미지는 의미 있는 alt를 갖습니다.
- 자동 슬라이드가 사용자를 방해하지 않는지 확인합니다.
- 모달 제목은 aria-labelledby와 연결합니다.
- 모달 닫기 버튼은 키보드와 스크린리더에서 이해 가능해야 합니다.
- 스크롤스파이 링크 텍스트는 섹션 제목을 충분히 설명해야 합니다.
| 컴포넌트 | 증상 | 확인할 것 |
|---|---|---|
| carousel | 슬라이드가 넘어가지 않음 | bootstrap.min.js 로드와 carousel id 연결 |
| carousel | 첫 이미지가 안 보임 | 첫 item에 active가 있는지 확인 |
| modal | 버튼 클릭 후 아무 반응 없음 | data-target과 modal id 일치 여부 |
| modal | 닫기 버튼이 동작하지 않음 | data-dismiss="modal"과 스크립트 로드 |
| scrollspy | active가 바뀌지 않음 | 스크롤 영역 높이, data-target, 섹션 id |
| dropdown | 스크롤스파이 하위 메뉴가 안 열림 | dropdown-toggle과 Bootstrap JS |
- 구조 작성: id, class, data 속성을 먼저 맞춥니다.
- 리소스 확인: 이미지 파일, CSS, jQuery, bootstrap.min.js 경로를 확인합니다.
- 초기 상태 확인: active 항목, 모달 제목, 스크롤 영역을 점검합니다.
- 동작 테스트: 클릭, 닫기, 이전/다음, 스크롤 이동을 실제로 실행합니다.
- 접근성 보완: alt, aria, sr-only, 키보드 조작을 확인합니다.
- Bootstrap 5에서는 data-toggle 대신 data-bs-toggle을 사용합니다.
- carousel의 item 클래스는 carousel-item으로 바뀐 버전이 있습니다.
- 모달 닫기 속성도 data-dismiss에서 data-bs-dismiss로 바뀔 수 있습니다.
- Bootstrap 5는 jQuery 의존성이 없으므로 초기화 방식이 달라집니다.
- 스크롤스파이는 offset 처리와 target 설정을 버전 문서에 맞춰 다시 확인해야 합니다.
- 마이그레이션 전에는 원본 예제의 Bootstrap 버전을 파일 주석이나 문서에 남깁니다.
- 동작이 있는 컴포넌트는 클래스 변환 후 반드시 실제 클릭과 스크롤 테스트를 다시 합니다.
- 이미지나 긴 본문 같은 샘플 데이터도 실제 서비스 데이터 길이로 바꿔 레이아웃을 확인합니다.
- 접근성 속성은 버전 변경 후에도 삭제하지 말고 최신 권장 방식으로 갱신합니다.
- 캐러셀 자동 전환 시간은 사용자가 내용을 읽을 수 있을 만큼 충분한지 확인합니다.
- 모달 안의 저장 버튼은 실제 저장 로직과 닫기 동작을 분리해서 설계합니다.
- 스크롤스파이 대상 영역은 높이와 overflow 설정이 실제 스크롤을 만들고 있는지 확인합니다.
- 드롭다운이 포함된 nav는 작은 화면에서 collapse와 함께 정상 동작하는지 확인합니다.
| 실수 | 문제 | 해결 |
|---|---|---|
| 스크립트 로드 순서 오류 | 컴포넌트가 동작하지 않습니다. | jQuery 다음 bootstrap.min.js를 로드합니다. |
| 캐러셀 active 누락 | 첫 화면이 비어 보일 수 있습니다. | 첫 item과 indicator에 active를 둡니다. |
| 모달 id 불일치 | 버튼을 눌러도 모달이 열리지 않습니다. | data-target과 modal id를 맞춥니다. |
| 스크롤스파이 id 불일치 | active가 바뀌지 않습니다. | nav href와 섹션 id를 맞춥니다. |
| Bootstrap 5 문법과 혼동 | data-toggle이 동작하지 않을 수 있습니다. | 원문은 Bootstrap 3 기준으로 읽습니다. |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| 부트스트랩 이벤트 · jQuery 초기화 완전 정리 (0) | 2026.07.18 |
|---|---|
| 부트스트랩 어코디언 · 툴팁 · 팝오버 · 어픽스 완전 정리 (0) | 2026.07.18 |
| 부트스트랩 라벨 · 배지 · 알림 · 목록그룹 완전 정리 (0) | 2026.07.18 |
| 부트스트랩 드롭다운 · 점보트론 · 내비게이션바 · 진행바 완전 정리 (0) | 2026.07.18 |
| 부트스트랩 네비게이션 · 페이지네이션 · 패널 완전 정리 (0) | 2026.07.17 |
왕진 블로그

댓글