Карусели, несмотря на всю свою ущербность, продолжают отсаватся очень востребованным компонентом на тысячах сайтов. Чаще всего для из создания используется Javascript. В этой статье я попробую описать технику создания отзывчивой (резиновой, responsive) карусели на чистом CSS.

Для начала ДЕМО.

А теперь давайте разберемся как это работает. Для начала создадим структуру будущей карусели.

HTML:

<div class="carousel-wrapper">
    <input type="radio" checked="checked" id="slide1" class="carousel-selector" name="carousel-selector" />
    <input type="radio" id="slide2" class="carousel-selector" name="carousel-selector" />
    <input type="radio" id="slide3" class="carousel-selector" name="carousel-selector" />

    <ul class="carousel-items">
        <li class="carousel-item carousel-item-blue">
            Текст 1
        </li>

        <li class="carousel-item carousel-item-red">
            Текст 2
        </li>

        <li class="carousel-item carousel-item-green">
            Текст 3
        </li>
    </ul>

    <ul class="carousel-labels">
        <li class="carousel-label">
            <label for="slide1"></label>
        </li>
        <li class="carousel-label">
            <label for="slide2"></label>
        </li>
        <li class="carousel-label">
            <label for="slide3"></label>
        </li>
    </ul>
</div>

CSS:

.carousel-wrapper {
    width: 100%;
    position: relative;
    padding-bottom: 30%;
    background-color: #eee;
    overflow: hidden;
}

Параметр padding-bottom: 30%; задает высоту нашей карусели, в данном случае 30 процентов от ширины.

Радио-баттаны в этом примере предназначены для переключения элементов карусели. Они должны быть невидимыми.

HTML:

<input type="radio" checked="checked" id="slide1" class="carousel-selector" name="carousel-selector" />
<input type="radio" id="slide2" class="carousel-selector" name="carousel-selector" />
<input type="radio" id="slide3" class="carousel-selector" name="carousel-selector" />

CSS:

.carousel-selector {
    display: none;
}

Сами элементы карусели находятся в списке carousel-items. В этом примере я сделал их всего три, от этого зависят и их параметры. Классы carousel-item-blue, carousel-item-red и carousel-item-green необходимы лишь для стилизации каждого элемента и обязательными не являются. Так же присутствуют анимации, чтобы переключение между элементами выглядело красиво.

HTML:

<ul class="carousel-items">
    <li class="carousel-item carousel-item-blue">
        Текст 1
    </li>

    <li class="carousel-item carousel-item-red">
        Текст 2
    </li>

    <li class="carousel-item carousel-item-green">
        Текст 3
    </li>
</ul>

CSS:

.carousel-items {
    margin: 0;
    padding: 0;
    list-style: none;
    display: block;
    width: 300%;
    height: 100%;
    position: absolute;
    left: 0;
    top: 0;
    z-index: 1;
    transition: left .5s ease-out;
    -o-transition: left .5s ease-out;
    -ms-transition: left .5s ease-out;
    -moz-transition: left .5s ease-out;
    -webkit-transition: left .5s ease-out;
}
.carousel-item {
    width: 33.33333333%;
    height: 100%;
    color: white;
}
.carousel-item-blue {
    background-color: blue;
}
.carousel-item-red {
    background-color: red;
}
.carousel-item-green {
    background-color: green;
}

В самом конце располагаем наши кнопки переключения слайдов.

HTML:

<ul class="carousel-labels">
    <li class="carousel-label">
        <label for="slide1"></label>
    </li>
    <li class="carousel-label">
        <label for="slide2"></label>
    </li>
    <li class="carousel-label">
        <label for="slide3"></label>
    </li>
</ul>

CSS:

.carousel-labels {
    margin: 0;
    padding: 0;
    list-style: none;
    display: block;
    position: absolute;
    z-index: 2;
    left: 0;
    bottom: 0;
    height: 20px;
    width: 100%;
    padding: 10px 0;
    text-align: center;
}
.carousel-selector {
    display: none;
}
.carousel-label {
    display: inline-block;
}
.carousel-label label {
    width: 20px;
    height: 20px;
    border-radius: 10px;
    background-color: white;
    display: block;
    cursor: pointer;
}

А теперь подробнее про саму смену слайдов. С помощью CSS-селекторов мы задаем смену позиции для слайдов в зависимости от выбраного радио-баттана: #slide1:checked ~ .carousel-items. Так же в CSS меняем наши кнопки переключения.

CSS:

#slide1:checked ~ .carousel-items {
    left: 0;
}
#slide1:checked ~ .carousel-labels .carousel-label:nth-child(1) label {
    background-color: black;
}
#slide2:checked ~ .carousel-items {
    left: -100%;
}
#slide2:checked ~ .carousel-labels .carousel-label:nth-child(2) label {
    background-color: black;
}
#slide3:checked ~ .carousel-items {
    left: -200%;
}
#slide3:checked ~ .carousel-labels .carousel-label:nth-child(3) label {
    background-color: black;
}

Еще раз ДЕМО.

Данный пример написан лишь для того, чтобы показать, что многие «модные» вещи можно делать и без Javascript. Многое здесь можно улучшить, но как базис использовать вполне можно.