<div class="carousel">
<input type="radio" id="slide1" name="slide" checked>
<input type="radio" id="slide2" name="slide">
<input type="radio" id="slide3" name="slide">
<div class="slider">
<div class="slide" id="slide-content-1">
<img src="image1.jpg" alt="Slide 1">
</div>
<div class="slide" id="slide-content-2">
<img src="image2.jpg" alt="Slide 2">
</div>
<div class="slide" id="slide-content-3">
<img src="image3.jpg" alt="Slide 3">
</div>
</div>
<div class="controls">
<label for="slide1"></label>
<label for="slide2"></label>
<label for="slide3"></label>
</div>
</div>
.carousel {
position: relative;
width: 300px;
height: 200px;
overflow: hidden;
}
.slider {
display: flex;
transition: transform 0.3s;
}
.slide {
min-width: 100%;
height: 200px;
transition: opacity 0.3s;
opacity: 0;
}
/* 표시되어야 할 슬라이드 표시 */
#slide1:checked ~ .slider #slide-content-1,
#slide2:checked ~ .slider #slide-content-2,
#slide3:checked ~ .slider #slide-content-3 {
opacity: 1;
}
/* 슬라이드 위치 조정 */
#slide1:checked ~ .slider {
transform: translateX(0%);
}
#slide2:checked ~ .slider {
transform: translateX(-100%);
}
#slide3:checked ~ .slider {
transform: translateX(-200%);
}
.controls {
position: absolute;
bottom: 10px;
width: 100%;
text-align: center;
}
.controls label {
display: inline-block;
width: 10px;
height: 10px;
margin: 0 5px;
background-color: #ddd;
border-radius: 50%;
cursor: pointer;
}
#slide1:checked ~ .controls label:nth-child(1),
#slide2:checked ~ .controls label:nth-child(2),
#slide3:checked ~ .controls label:nth-child(3) {
background-color: #555;
}
A~B와 같은 형태로 사용될 때, A와 같은 부모를 공유하는 B요소들에 스타일을 적용한다. 다만, A요소 뒤에 나오는 B요소만 해당된다.
#slide1:checked ~ .slider #slide-content-1
#slide1:checked
slide1이라는 id를 가진 요소가 체크된 상태를 의미한다.
#slide1:checked ~ .slider
체크된 #slide1과 같은 부모를 공유하는 .slider 클래스를 가진 요소를 선택한다. 그러니까 #slide1 뒤에 나오는 .slider 요소만 해당된다.
#slide1:checked ~ .slider #slide-content-1
위에서 선택된 .slider 요소 내부의 slide-content-1을 id로 가진 요소를 최종적으로 선택한다.
가상선택자는 특정 상태나 조건에 따라 요소를 선택할 때 사용되는 선택자이다. 가상 클래스는 대표적으로 아래와 같은 것들이 있다.
<html>
요소가 된다.