1. Зебра в списке: классы на каждой строке → :nth-child
Старый подход. Чтобы подсветить чётные строки, верстальщик вручную проставлял класс на каждой нужной строке. Добавил строку — пересчитывай и переставляй классы.
<li>Grid</li>
<li class="alt">Responsive</li>
<li>Animation</li>
<li class="alt">Pseudo</li>
.alt { background: #f1f5f9; }
Современный подход. Один селектор, HTML чистый, новые строки раскрашиваются автоматически.
<li>Grid</li>
<li>Responsive</li>
<li>Animation</li>
<li>Pseudo</li>
li:nth-child(even) { background: #f1f5f9; }
2. Декоративная линия: лишний тег → ::after
Старый подход. Под заголовок добавляли пустой <span> только ради чёрточки — мусорный элемент в разметке.
<h2>Заголовок<span class="title-line"></span></h2>
.title-line { display: block; width: 48px; height: 4px; background: #2563eb; }
Современный подход. Линию дорисовывает псевдоэлемент — HTML остаётся семантичным.
.title::after {
content: '';
display: block;
width: 48px;
height: 4px;
background: #2563eb;
}
3. Фокус: outline: none → :focus-visible
Старый подход. Рамку фокуса просто убирали «ради красоты» — и ломали клавиатурную навигацию.
.button:focus { outline: none; } /* недоступно с клавиатуры */
Современный подход. Фокус не убирают, а делают аккуратным — и только когда он реально нужен (Tab), не мешая клику мышью.
.button:focus-visible {
outline: 3px solid var(--color-accent, #2563eb);
outline-offset: 3px;
}