Spinners
Spinners (스피너)
HTML과 CSS만으로 자바스크립트 없이 만들어진 Bootstrap 스피너로 컴포넌트나 페이지의 로딩 상태를 나타내는 방법을 다룹니다.
출처: 문서
본문
소개 (About)
Bootstrap "스피너"는 프로젝트에서 로딩 상태를 보여주는 데 쓸 수 있습니다. HTML과 CSS만으로 만들어지므로 만들 때 자바스크립트가 필요하지 않습니다. 다만 표시 여부를 토글하려면 약간의 커스텀 JavaScript가 필요합니다. 모양, 정렬, 크기는 멋진 유틸리티 클래스들로 쉽게 커스터마이즈할 수 있습니다.
접근성을 위해 여기 있는 각 로더에는 role="status"와 중첩된 <span class="visually-hidden">Loading...</span>이 포함되어 있습니다.
이 컴포넌트의 애니메이션 효과는
prefers-reduced-motion미디어 쿼리에 의존합니다. 접근성 문서의 reduced motion 섹션을 참고하세요.
Border spinner
가벼운 로딩 표시기에는 border spinner를 사용하세요.
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
색상 (Colors)
border spinner는 border-color에 currentColor를 사용하므로 텍스트 색상 유틸리티로 색을 커스터마이즈할 수 있습니다. 표준 스피너에 어떤 텍스트 색상 유틸리티든 사용할 수 있습니다.
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-border text-secondary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-border text-success" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-border text-danger" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-border text-warning" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-border text-info" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-border text-light" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-border text-dark" role="status">
<span class="visually-hidden">Loading...</span>
</div>
왜 border-color 유틸리티를 쓰지 않을까요? 각 border spinner는 적어도 한 면에 transparent border를 지정하므로, .border-{color} 유틸리티를 쓰면 그 부분이 덮어써집니다.
Growing spinner
border spinner가 마음에 들지 않는다면 grow spinner로 전환하세요. 엄밀히 말하면 회전하지는 않지만, 반복적으로 커집니다!
<div class="spinner-grow" role="status">
<span class="visually-hidden">Loading...</span>
</div>
이 스피너도 currentColor로 만들어졌으므로 텍스트 색상 유틸리티로 모양을 쉽게 바꿀 수 있습니다. 여기 파란색과 지원되는 변형들이 있습니다.
<div class="spinner-grow text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow text-secondary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow text-success" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow text-danger" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow text-warning" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow text-info" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow text-light" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow text-dark" role="status">
<span class="visually-hidden">Loading...</span>
</div>
정렬 (Alignment)
Bootstrap의 스피너는 rems, currentColor, display: inline-flex로 만들어집니다. 즉 크기를 쉽게 바꾸고, 색을 다시 칠하고, 빠르게 정렬할 수 있습니다.
마진 (Margin)
쉽게 간격을 주려면 .m-5 같은 마진 유틸리티를 사용하세요.
<div class="spinner-border m-5" role="status">
<span class="visually-hidden">Loading...</span>
</div>
배치 (Placement)
어떤 상황에서든 스피너를 필요한 위치에 정확히 두려면 flexbox 유틸리티, float 유틸리티, 또는 텍스트 정렬 유틸리티를 사용하세요.
Flex
<div class="d-flex justify-content-center">
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<div class="d-flex align-items-center">
<strong role="status">Loading...</strong>
<div class="spinner-border ms-auto" aria-hidden="true"></div>
</div>
Floats
<div class="clearfix">
<div class="spinner-border float-end" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
텍스트 정렬 (Text align)
<div class="text-center">
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
크기 (Size)
.spinner-border-sm과 .spinner-grow-sm을 추가하면 다른 컴포넌트 안에서 빠르게 쓸 수 있는 더 작은 스피너를 만들 수 있습니다.
<div class="spinner-border spinner-border-sm" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow spinner-grow-sm" role="status">
<span class="visually-hidden">Loading...</span>
</div>
또는 필요에 따라 커스텀 CSS나 인라인 스타일로 크기를 바꿀 수도 있습니다.
<div class="spinner-border" style="width: 3rem; height: 3rem;" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div class="spinner-grow" style="width: 3rem; height: 3rem;" role="status">
<span class="visually-hidden">Loading...</span>
</div>
버튼 (Buttons)
버튼 안에 스피너를 사용해 어떤 동작이 처리 중이거나 진행 중임을 나타낼 수 있습니다. 스피너 요소에서 텍스트를 빼고 필요에 따라 버튼 텍스트를 활용할 수도 있습니다.
<button class="btn btn-primary" type="button" disabled>
<span class="spinner-border spinner-border-sm" aria-hidden="true"></span>
<span class="visually-hidden" role="status">Loading...</span>
</button>
<button class="btn btn-primary" type="button" disabled>
<span class="spinner-border spinner-border-sm" aria-hidden="true"></span>
<span role="status">Loading...</span>
</button>
<button class="btn btn-primary" type="button" disabled>
<span class="spinner-grow spinner-grow-sm" aria-hidden="true"></span>
<span class="visually-hidden" role="status">Loading...</span>
</button>
<button class="btn btn-primary" type="button" disabled>
<span class="spinner-grow spinner-grow-sm" aria-hidden="true"></span>
<span role="status">Loading...</span>
</button>
CSS
변수 (Variables)
v5.2.0에서 추가됨
Bootstrap의 진화하는 CSS 변수 접근 방식의 일부로, 스피너는 이제 향상된 실시간 커스터마이즈를 위해 .spinner-border와 .spinner-grow에 로컬 CSS 변수를 사용합니다. CSS 변수의 값은 Sass로 설정되므로 Sass 커스터마이즈도 여전히 지원됩니다.
Border spinner 변수:
--#{$prefix}spinner-width: #{$spinner-width};
--#{$prefix}spinner-height: #{$spinner-height};
--#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};
--#{$prefix}spinner-border-width: #{$spinner-border-width};
--#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};
--#{$prefix}spinner-animation-name: spinner-border;
Growing spinner 변수:
--#{$prefix}spinner-width: #{$spinner-width};
--#{$prefix}spinner-height: #{$spinner-height};
--#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};
--#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};
--#{$prefix}spinner-animation-name: spinner-grow;
두 스피너 모두에서 작은 스피너 modifier 클래스가 필요에 따라 이 CSS 변수들의 값을 업데이트하는 데 사용됩니다. 예를 들어 .spinner-border-sm 클래스는 다음과 같은 일을 합니다:
--#{$prefix}spinner-width: #{$spinner-width-sm};
--#{$prefix}spinner-height: #{$spinner-height-sm};
--#{$prefix}spinner-border-width: #{$spinner-border-width-sm};
Sass 변수
$spinner-width: 2rem;
$spinner-height: $spinner-width;
$spinner-vertical-align: -.125em;
$spinner-border-width: .25em;
$spinner-animation-speed: .75s;
$spinner-width-sm: 1rem;
$spinner-height-sm: $spinner-width-sm;
$spinner-border-width-sm: .2em;
Keyframes
스피너의 CSS 애니메이션을 만드는 데 사용됩니다. scss/_spinners.scss에 포함되어 있습니다.
@keyframes spinner-border {
to { transform: rotate(360deg) #{"/* rtl:ignore */"}; }
}
@keyframes spinner-grow {
0% {
transform: scale(0);
}
50% {
opacity: 1;
transform: none;
}
}