Сегодня мы рассмотрим еще один вариант создания аккордеона при помощи CSS3, в этом примере мы немного поэкспериментируем с обобщенным родственным комбинатором (the general sibling selector) и псевдо-классом :checked. Используя скрытые input-ы и теги label, мы создадим аккордеон, который будет скрывать/открывать содержимое при клике на заголовок.
Есть много вариантов создания аккордеона на CSS, большинство из которых реализуется с помощью псевдо-класса :target. Проблема с использованием псевдо-класса :target в том, что мы не можем закрыть содержимое области при повторном клике по заголовку или открыть несколько разделов одновременно. С помощью скрытых чекбоксов, мы можем контролировать открытие и закрытие отдельных областей. Кроме того, мы можем также использовать радио-кнопки, если только один раздел должен быть открыт в одно и тоже время.
Итак, давайте начнем!
Пожалуйста, обратите внимание: результат этого урока будет работать только в браузерах, которые поддерживают свойства CSS3.
Разметка
Мы приведем здесь разметку примера, который использует чекбоксы, где содержание раздела открыто по умолчанию (input должен быть "отмечен"). Все это будет обернуто в контейнер с классом ac-container. Для каждого элемента аккордеона, мы будем иметь чекбокс, лэйбл и блок article, в котором будет содержание этого элемента:
Обратите внимание, что мы должны дать каждому input-у ID, который мы будем затем использовать в атрибуте for для лэйбла. Нам нужно это для того, чтобы "отметить" соответствующий флажок при нажатии на тег label.
Каждый блок article будет иметь класс, который поможет нам определить, на какую высоту мы его должны раскрывать. (Оптимально, мы могли бы использовать "auto", как значение высоты, но, к сожалению, оно не анимируется, как надо.)
Теперь давайте перейдем к стилям.
CSS
Я опущу все префиксы браузеров, но вы их можете найти в исходниках.
Давайте определим ширину аккордеона и разместим его в центре:
Далее, мы сделаем лэйблы похожими на интерактивные кнопки, задав им некоторый градиент фона. Зададим им также множественные тени и тонкие границы. Мы также установим z-index равный 20, чтобы убедиться, что он будет выше содержания раздела:
Когда мы нажимаем на тег label, чекбокс становится "отмеченным" и, когда это произойдет, мы хотим чтобы соответствующий лэйбл немного отличался от остальных:
Как видите, мы используем обобщенный родственный комбинатор (+), чтобы выбрать нужный нам тег label, так как он находится в коде непосредственно после чекбокса.
Давайте добавим небольшой значок со стрелкой, который появляется при наведении курсора мыши. Для этого мы просто будем использовать псевдо-класс :after, так что нам не нужно добавлять дополнительную разметку:
И так как мы не хотим, чтобы input-ы были видны, мы спрячем их:
.ac-container input{ display:none; }
Область содержания будет иметь начальную высоту 0px и любое его переполнение будет скрыто (overflow: hidden). Определим transition для выбранного элемента. Как вы можете видеть, мы сделаем закрытие немного быстрее, чем открытие.
Как уже упоминалось, высота "авто", конечно, будет наилучшим вариантом здесь, но так как мы не можем анимировать её, нам нужно установить точную высоту для перехода.
Пожалуйста, обратите внимание, что в некоторых мобильных браузерах, при нажатии на лэйбл может не выбраться соответствующий чекбокс.