Логово верстальщиков: HTML, CSS, JavaScript, практики современной верстки, вайбкодинг и использование ИИ в разработке.
Личный блог автора - @just_genych
По вопросам рекламы или разработки: @g_abashkin
Post #4605
296
ЛО @webdevlair
Showing posts older than #4607 · Back to latest
content-visibility: auto говорит: пока элемент не «релевантен пользователю», пропускай style/layout/paint его поддерева. DOM, a11y-дерево и поиск по странице при этом работают - в отличие от content-visibility: hidden.scrollHeight врёт, anchor-ссылки и scroll-restore уезжают.contain-intrinsic-size - placeholder-размер, который подставляется вместо настоящего, пока секция не отрендерена:.feed > article {
content-visibility: auto;
/* 420px - оценка; после первого рендера запомнится реальная высота */
contain-intrinsic-size: auto 420px;
}auto. Без него placeholder всегда будет тем, что вы написали. С ним браузер запоминает последний отрендеренный размер и дальше использует его как placeholder - при повторном выезде элемента скролл уже не дёргается. Поэтому оценку берите близкой к реальности: от неё зависит длина скроллбара и позиция скролла до первого рендера.width height) или логические contain-intrinsic-block-size / contain-intrinsic-inline-size.content-visibility: auto неявно включает contain: layout style paint. Элемент становится containing block для absolute/fixed потомков, а overflow обрезается. position: fixed внутри секции перестаёт цепляться к вьюпорту, sticky ведёт себя иначе, выносы отрицательными margin обрезаются.



header, main, nav, footer. Бывает, что и button затешется — правда, пореже остальных, но всё-таки.:user-invalid и :user-valid: отложенная валидация без JS и без мигания ошибокinput:invalid срабатывает сразу при рендере. Пользователь ещё ничего не вводил, а поле уже красное. Дальше - три костыля на выбор: :not(:placeholder-shown), класс .touched из JS или novalidate + ручная валидация.:user-invalid матчится, только если элемент одновременно:user interacted).:user-valid - зеркало: валидно и было взаимодействие. Полезно, чтобы не красить зелёным пустые нетронутые поля./* Плохо: красное с первого кадра рендера */
input:invalid { border-color: #e5484d; }
/* Ок: ошибка - только после взаимодействия */
input:user-invalid { border-color: #e5484d; }
input:user-valid { border-color: #30a46c; }
/* сообщение без JS: заранее в разметке, показ через CSS */
.field .msg { visibility: hidden; }
.field:has(:user-invalid) .msg { visibility: visible; }
.field:has(:user-invalid) .msg::before { content: attr(data-msg); }
<div class="field">
<input type="email" required>
<span class="msg" data-msg="Похоже, в адресе опечатка"></span>
</div>
input, select, textarea, любым типом и любым ограничением: required, pattern, minlength, type="email". Реагирует и на «ввёл - стёр», и на попытку сабмита.:where()-фолбэке или @supports selector(:user-invalid).required никуда не делся. :user-invalid меняет момент показа, а не правила валидации.aria-invalid - скринридер про ошибку не узнает. Либо дублируйте состояние атрибутом, либо полагайтесь на нативную браузерную валидацию при сабмите.:invalid вообще в формах с ранним показом - иначе правила конфликтуют и «мигание» возвращается.:user-invalid убирает целый слой JS-состояния: флаг «тронуто/не тронуто» больше не нужно тащить в классы и стейт-менеджер. Разметка описывает намерение, CSS - момент показа. Классический кейс, где платформа догнала практику.









