Вёрстка mobile-first — Примеры
Пример 1 — Настольная раскладка, снятая запросами max-width
Таблица стилей начинается с широкой двухколоночной раскладки и убирает её на маленьких экранах, причём оба узких правила требуют !important. Скажите, почему файл растёт, затем перестройте тот же дизайн от узкого случая.
/* база — это настольная раскладка */
.article { display: grid; grid-template-columns: 2fr 1fr; gap: 2rem; padding: 2rem 3rem; }
@media (max-width: 40rem) {
.article { grid-template-columns: 1fr !important; padding: 1rem !important; }
}
Решение
.article { display: grid; grid-template-columns: 1fr; gap: 1rem; padding: 1rem; }
/* два столбца перестают помещаться ниже 40rem */
@media (min-width: 40rem) {
.article { grid-template-columns: 2fr 1fr; }
}
/* более широкий отступ оправдан, только когда есть запас места */
@media (min-width: 70rem) {
.article { padding: 2rem 3rem; }
}
Запрос max-width обязан отменять объявление, сделанное раньше, поэтому специфичность подрастает, пока победить не сможет только !important. Если же базовый слой написан как одноколоночная раскладка, каждый запрос только добавляет, порядок исходника совпадает с порядком роста раскладки, и ничего не переопределяется; база при этом остаётся запасным вариантом на случай, когда запрос не применился, и потому должна быть полной сама по себе. Каждая точка перелома поставлена там, где содержимое действительно перестаёт работать, и несёт комментарий о том, какой элемент её вызвал.
Пример 2 — Визуальный порядок, расходящийся с DOM
На мобильном рекламная врезка появляется раньше статьи, которую она прерывает, и порядок клавиатуры совпадает с разметкой, а не с экраном. CSS-свойство order ставит статью первой на широких экранах. Объясните, какой порядок испытывает пользователь, затем исправьте это в разметке.
<div class="row">
<aside class="promo">Предложение</aside>
<main class="article">Статья</main>
</div>
.row { display: grid; grid-template-columns: 1fr; }
@media (min-width: 60rem) {
.row { grid-template-columns: 2fr 1fr; }
.article { order: -1; } /* статья слева, промо справа */
}
Решение
<div class="row">
<main class="article">Статья</main>
<aside class="promo">Предложение</aside>
</div>
.row { display: grid; grid-template-columns: 1fr; }
@media (min-width: 60rem) {
.row { grid-template-columns: 2fr 1fr; }
}
Порядок табуляции следует за порядком документа, поэтому переупорядочивание через CSS заставляет визуальную последовательность и последовательность клавиатуры расходиться: пользователь клавиатуры проходит страницу в том, что выглядит случайным порядком, а скринридер читает врезку раньше содержимого, рядом с которым она стоит. Однако свойство order здесь ещё и сохраняло мобильную проблему: на телефоне промо по-прежнему шло первым, а это никогда не задумывалось. Перестановка разметки исправляет порядок чтения при любой ширине и не требует CSS вообще, потому что grid и так помещает первого потомка в первую дорожку.