Веб-стандарты
13.8K subscribers
6.42K photos
1 file
3.21K links
Новости фронтенда и еженедельный подкаст.

Простой способ сказать спасибо и попасть в закрытый чат:

— Патреон https://www.patreon.com/webstandards_ru
— Бусти https://boosty.to/webstandards_ru
Download Telegram
Пять практик, чтобы не превратить Tailwind CSS в хаос. Нина Торгунакова напоминает, что utility-first подход масштабируется только вместе с дизайн-системой и компонентами. Сокращайте наборы классов до вида py-4, задавайте семантические токены через @theme или tailwind.config.js, а порядок классов доверьте официальному плагину для Prettier. Вместо произвольных классов из пропсов описывайте готовые варианты. Tailwind 4 минифицирует сам, а 3 требует --minify. #css #tools

https://evilmartians.com/chronicles/5-best-practices-for-preventing-chaos-in-tailwind-css
👍11🔥3❤2
Могут ли письма поддерживать светлую и тёмную темы? Мэтью Гуэй объясняет, что @media (prefers-color-scheme) работает примерно в 42% почтовых клиентов: Apple Mail, Outlook и Fastmail. Причём только на Apple Mail приходится около 65% открытий. Gmail, Outlook под Windows, Yahoo Mail и Thunderbird правило игнорируют, а мобильный Gmail инвертирует цвета сам. Не используйте чистый чёрный и чистый белый: некоторые клиенты из-за них инвертируют цвета. #email #css

https://buttondown.com/blog/dark-mode-emails
👍6🔥4❤1
Балансируем флекс-элементы свойством flex-wrap: balance. Ахмад Шадид начинает с вёрстки на сайте Buffer, где в последней строке остаётся один элемент, и показывает пять способов это исправить: выражения от контейнера, условный clamp() для max-width, display: contents, разделитель на псевдоэлементе и, наконец, flex-wrap: balance из Chrome 150 — всего одно объявление. Свойство flex-line-count задаёт минимальное число строк. #css #layout

https://ishadeed.com/article/flex-wrap-balance/
👍14❤9
Как ускорить длинный список: content-visibility или виртуализация. Агустин Барриентос сравнивает список из 50 тысяч карточек, отрисованный тремя способами. Свойство content-visibility: auto вместе с contain-intrinsic-size оставляет все строки в DOM и пропускает рендеринг за пределами экрана, а виртуализация выкидывает строки из DOM и заодно забирает у браузера поиск по странице, ссылки-якоря, сохранение фокуса и состояние карточек. #performance #css

https://agustinbarrientos.com/writing/senior-eye/content-visibility-vs-virtualization/
🔥31👍8❤4
Как заставить агентов писать хороший CSS. Брехт Де Рюйте пробует Modern Web Guidance от Google — набор навыков, который передаёт агентам для кодинга экспертные рекомендации по платформе вместе с данными Baseline. Поиск через CLI подгружает только нужные руководства из 103 фич, а фолбеки каждую ночь проверяют тесты на Playwright. Набор не привязан к проекту, поэтому автор добавил три своих навыка: уровни токенов, темы и состояния компонентов. #ai #css

https://utilitybend.com/blog/modern-web-guidance-antigravity-and-my-own-design-token-skills/
👍25🔥6❤2
Как определить неопределяемые возможности CSS через @​supports named-feature(). Брамус Ван Дамм рассказывает о функции, которую рабочая группа CSS приняла для проверки того, что иначе не проверить. Запись @​supports (display: flex) and (gap: 1em) подтверждает только парсинг, но не то, что gap работает во флексах. Пока в спецификации два ключевых слова: anchor-position-follows-transforms и single-axis-scroll-container. #css #interop

https://www.bram.us/2026/08/27/feature-detecting-undetectable-css-features-with-supports-named-feature/
👍10🔥1
Выражения от контейнера со style() и продвинутый attr(): новый способ связывать компоненты в CSS. Брехт Де Рюйте превращает HTML-атрибуты в типизированные значения CSS: data-gap="2" на гриде становится attr(data-gap cqi, 2cqi) вместо утилитарного класса. Родитель задаёт data-density="compact", а выражения @​container style() пересчитывают отступы, аватарки и типографику через один множитель --density-scale. Без классов-модификаторов, пропсов и JavaScript. #css #component

https://utilitybend.com/blog/container-style-queries-and-advanced-attr-rethinking-how-to-wire-up-my-components-in-css/
🔥10👍7❤2
Новинки WebKit в Safari 27. Вышли релиз-ноуты от Apple: кастомизируемый <select>, scroll anchoring, WebAssembly JSPI, ariaNotify(), псевдокласс :heading, ключевые слова revert-rule и stretch, sizes="auto", import defer, субпиксельная строчная раскладка и статический роутинг для сервис-воркеров — всего 83 новые возможности и 844 исправления. #safari #css

https://developer.apple.com/documentation/safari-release-notes/safari-27-release-notes
❤7👍4
Сноски на полях с помощью CSS anchor positioning. Венсан Берна связывает знак сноски и саму заметку через anchor-name и position-anchor, оба значения берутся из дата-атрибутов типизированным attr(). Каждая заметка встаёт напротив своего знака сноски, а если мешает предыдущая, то max() из двух значений anchor() опускает её строкой ниже. На узких экранах и в старых браузерах сноски остаются под абзацем приглушённым цветом. #css #anchor

https://vincent.bernat.ch/en/blog/2026-css-sidenotes
❤19👍10
Выравниваем иконки и подписи. Ахмад Шадид начинает со списка, где align-items: center сбивается, стоит подписи перенестись на вторую строку, а align-items: start поднимает иконку слишком высоко из-за строчного бокса. Помогает единица lh: половина разницы между строкой и размером иконки задаётся как смещение через translateY и работает при любом размере шрифта. Фоновым иконкам на псевдоэлементах нужна пара дополнительных объявлений. #css #layout

https://ishadeed.com/article/aligning-list-icons/
❤37👍2🔥2
Адаптивные iframe в Chrome 154. Себастьян Бенц и Брамус Ван Дамм рассказывают о свойстве frame-sizing: встроенный фрейм сам растёт под свой контент, без передачи высоты через postMessage. Встраивающая страница задаёт frame-sizing: content-height, а встроенный документ разрешает это элементом <meta>, где можно ограничить список источников. После изменения контента новый замер запрашивают через window.requestResize(). Пока за флагами в Chrome и Edge. #html #css

https://developer.chrome.com/blog/responsive-iframes
👍25❤4
Корневой скроллер и как его не потерять. Килиан Валкхоф объясняет, что умеет главный скролл-контейнер страницы: восстанавливает позицию скролла, слушает пробел и стрелки, а на мобильных прячет адресную строку и даёт pull-to-refresh. Обёртка с фиксированной высотой и overflow его подменяет, и это выдаёт window.scrollY, застрявший на нуле. У полноэкранных макетов, стики-шапок и блокировки прокрутки есть решения, сохраняющие скролл страницы. #css #scroll

https://polypane.app/blog/the-root-scroller-and-how-not-to-lose-it/
👍16❤7
Один SVG, девять постеров: свойство link-parameters. Вадим Макеев пробует новую спецификацию CSS Linked Parameters: она работает в Firefox Nightly и за флагом в Safari TP. В SVG-файле вместо значения env(--color, фолбек), а страница передаёт своё через link-parameters: param(--color, coral). Постер Уорхола в SVG, вставленный девять раз как <img>, раскрашивается по-разному из одного закешированного файла. #css #svg

https://pepelsbey.dev/articles/svg-link-params/
🔥19👍7❤3
Как ускорить сайт, отправляя больше CSS. В блоге GitHub Джош Блэк и Мари Лукка рассказывают, как дизайн-система Primer перешла с CSS-in-JS на CSS-модули. Пропс sx создавал рантайм-нагрузку, которая росла с числом компонентов на странице, поэтому команда выкатывала обе версии за флагами и сравнивала скриншоты визуальных тестов. Итог: серверный рендеринг страницы стал быстрее на 55%, а инициализация компонентов — на 25%. #css #performance

https://github.blog/engineering/architecture-optimization/improving-site-performance-by-shipping-more-css/
🔥21❤3👍3
Передаём sibling-count() родительскому элементу. Темани Афиф показывает, как родителю узнать, сколько у него детей. Функция sibling-count() считает соседей, а не детей, поэтому он добавляет лишний элемент шириной в sibling-count() и с помощью анимаций по скроллу, view-timeline и timeline-scope превращает её в переменную --n на родителе. Пригодится для счётчиков, почти квадратных сеток с sqrt() и круговых раскладок. Пока только в Chrome и Edge. #css #scroll

https://blog.master.dev/transferring-sibling-count-to-a-parent-element/
🔥11👍5
iPhone Duo: удвоенное разочарование в Safari. Майк Пионтек проверил свои сайты в симуляторе iPhone Duo и выяснил, что Safari не считает боковую панель безопасной зоной, так что отступы через env() не помогают. Вместо этого Safari подбирает её цвет по пикселям в 5–10 px от края страницы — недокументированно, без учёта theme-color и всего, что не fixed или sticky. А его трюк для других устройств, фиксированная полоса сверху, теперь обрезана справа. #safari #css

https://mikepiontek.com/journal/iphone-duo-safari.html
🎉12❤4🔥2👍1
Фреймы, которые наконец подстраиваются под контент. Ахмад Альфи показывает, как frame-sizing: content-height в Chromium подгоняет <iframe> под содержимое без postMessage. Встроенная страница разрешает это мета-элементом responsive-embedded-sizing прямо в HTML, а после изменений вызывает window.requestResize(). В других браузерах пригодятся @supports и фолбек на postMessage. #html #css

https://alfy.blog/2026/10/09/iframe-that-finally-fit-their-content.html
👍21🎉7🔥4
Подгоняем высоту под размер фонового паттерна с помощью calc-size(). Ахмад Шадид начинает с секции, где паттерн, повторяющийся по обеим осям, обрезается снизу. С background-repeat: round обрезки нет, но плитки растягиваются или сжимаются. А вот height: calc-size(auto, round(up, size, var(--tile-height))) берёт высоту контента и округляет её вверх до ближайшего кратного высоте плитки. Тот же round() подгоняет под паттерн и padding-block. Пока только в Chrome. #css #layout

https://ishadeed.com/article/fit-height-background-pattern-calc-size/
🔥8👍5❤1
Что iPhone Duo значит для веб-разработки (и Video.js). Дариус Чепулис изучил симулятор iPhone Duo и нашёл в Safari два экспериментальных флага: Device Posture API сообщает, сложен экран или нет, а Viewport Segments API описывает обе половины экрана через медиавыражения и переменные env(). С их помощью он собрал плеер в стиле Netflix: видео сверху, управление снизу. А в эмуляторе Pixel Fold полноэкранный режим занимает только верхнюю половину. #video #css

https://videojs.org/blog/iphone-duo-web-development
❤18
Игривое несовершенство с CSS-функцией random(). Брехт Де Рюйте показывает, как random() с минимумом, максимумом и шагом наклоняет буквы, покачивает карточки и меняет скорость бегущей строки без JavaScript. Свойства с общим ключом получают одно и то же значение, а если привязать ключ к элементу, у каждого оно будет своё. Функция есть в Safari, Chrome и за флагом в Firefox, так что оборачивайте её в @supports и используйте для декоративных эффектов. #css #design

https://www.smashingmagazine.com/2026/10/embracing-playful-imperfection-css-random-function/
🔥13❤2👍1