Адаптивная многоколоночная верстка
Сегодня я хочу поделиться очень простым CSS-трюком, о том как создать адаптивный многоколоночный макет с использованием псевдо-класса nth-of-type. Он не требует использования никаких классов в первой или последней колонке и количество колонок может быть изменено в зависимости от ширины экрана. Иными словами, макет может быть переключен с 4-колоночного, на 3-колоночный или 2-колоночный и т.д.
Неудобство использования классов для первой и последней колонки
Обычно мы добавляем классы .first или .last, чтобы очистить края и создать “плавающую” сетку. Добавление первого и последнего класса для большой сетки является довольно утомительным и скучным процессом, не говоря уже о том, что он становится еще более сложным, если вам нужно сделать макет адаптивным.
Использование nth-of-type
Выражение :nth-of-type(An+B) делает очень легким процес очистки float и margin без необходимости добавлять классы .first или .last. Например:
- .grid4 .col:nth-of-type(4n+1)= ссылка на каждый 4-й элемент с классом .col, начиная с первого
- .grid3 .col:nth-of-type(3n+1)= ссылка на каждый 3-й элемент с классом .col, начиная с первого
- .grid2 .col:nth-of-type(2n+1)= выбирает каждый 2-й элемент с классом .col, начиная с первого
.grid4 .col:nth-of-type(4n+1), .grid3 .col:nth-of-type(3n+1), .grid2 .col:nth-of-type(2n+1) { margin-left: 0; clear: left; }
Создание адаптивности с применением Media Queries
Чтобы сделать макет адаптивным и “плавающим”, используем значения в процентах, вместо пикселей.
/* col */ .col { background: #eee; float: left; margin-left: 3.2%; margin-bottom: 30px; } /* grid4 col */ .grid4 .col { width: 22.6%; } /* grid3 col */ .grid3 .col { width: 31.2%; } /* grid2 col */ .grid2 .col { width: 48.4%; }
Переход с 4-колоночного на 3-колоночный макет
Чтобы изменить 4-колоночный макет на 3-колоночный для окна, ширина которого меньше 740px, необходимо:
- Изменить ширину для класса .grid4 .col до 31,2% (одна треть от ширины экрана)
- Сбросить левый отступ и свойство clear
- Затем повторно установить левый отступ и свойство clear с помощью nth-of-type(3n+1), создав таким образом 3-колоночную сетку
@media screen and (max-width: 740px) { .grid4 .col { width: 31.2%; } .grid4 .col:nth-of-type(4n+1) { margin-left: 3.2%; clear: none; } .grid4 .col:nth-of-type(3n+1) { margin-left: 0; clear: left; } }
Изменение 4-колоночного и 3-колоночного макета на 2-колоночный
Для переключения с 4-колоночного и 3-колоночного макета на 2-колоночный при ширине окна менее, чем 600px: в целом используется тот же трюк, что и выше, сбрасываем ширину для класса .col и свойство float.
@media screen and (max-width: 600px) { /* change grid4 to 2-column */ .grid4 .col { width: 48.4%; } .grid4 .col:nth-of-type(3n+1) { margin-left: 3.2%; clear: none; } .grid4 .col:nth-of-type(2n+1) { margin-left: 0; clear: left; } /* change grid3 to 2-column */ .grid3 .col { width: 48.4%; } .grid3 .col:nth-of-type(3n+1) { margin-left: 3.2%; clear: none; } .grid3 .col:nth-of-type(2n+1) { margin-left: 0; clear: left; } }
Делаем столбцы на всю ширину экрана
Чтобы сделать все столбцы растягивающиеся на всю ширину окна, которое меньше, чем 400px, необходимо: установить ширину 100% и сбросить margin и float.
@media screen and (max-width: 400px) { .col { width: 100% !important; margin-left: 0 !important; clear: none !important; } }
Проблемы с Internet Explorer
Свойства media queries and nth-of-type не поддерживаются Internet Explorer 6, 7, 8. Вы можете использовать скрипт selectivizr.js, чтобы обеспечить поддержку свойства nth-of-type в IE и скрипт respond.js для поддержки media queries. К сожалению, selectivizr.js и respond.js не работают хорошо вместе (т.е. nth-of-type не работают в media queries).
Источник