Привет, Хабр!Я интересуюсь вёрсткой с момента появления первых версий браузера Google Chrome. Конечно, современному фронтендеру тяжело понять то, что я испытывал с коллегами. Мы именно те разработчики, которые знали кучу рецептов, как починить определённый баг в конкретном браузере.Но тогда были не только плохие моменты. В этом легаси осталось много хороших возможностей. Только они затерялись с течением времени. Мне же от этого грустно.По этой причине сегодня пришёл к вам исправлять эту ситуацию. Мы рассмотрим старые возможности HTML и CSS, которые сегодня всё так же полезны.Давайте посмотрим, что я подготовил. Читать далее
Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели100K
Обзор

Привет, Хабр!
Я интересуюсь вёрсткой с момента появления первых версий браузера Google Chrome. Конечно, современному фронтендеру тяжело понять то, что я испытывал с коллегами. Мы именно те разработчики, которые знали кучу рецептов, как починить определённый баг в конкретном браузере.
Но тогда были не только плохие моменты. В этом легаси осталось много хороших возможностей. Только они затерялись с течением времени. Мне же от этого грустно.
По этой причине сегодня пришёл к вам исправлять эту ситуацию. Мы рассмотрим старые возможности HTML и CSS, которые сегодня всё так же полезны.
Давайте посмотрим, что я подготовил.
Множество фонов для свойства backgroundКогда я начал заниматься вёрсткой, фоновые изображения были элементарными. Можно было применять только одно, а дизайнеры придумывали разные сложные фоны. Приходилось выкручиваться наложением элементов друг на друга.
А потом появилась возможность добавлять множество фонов для одного элемента. Для демонстрации добавим несколько изображений.
.awesome-block {
/* здесь стили для позиционирования текста */
min-height: 100dvh;
position: relative;
background-repeat: no-repeat;
background-position: 50% 50%;
background-image: url("sun.svg"), url("background.webp");
}Современное свойство background может поддерживать неограниченное количество фонов. Браузеры будут применять первое значение самым верхним, а последнее окажется ниже всех. Таким образом, в нашем примере изображение sun.svg будет отображено поверх изображения background.webp.
Если же вам нужно добавить градиент, то они тоже отлично дружат с множественными фонами. Просто укажите его первым, чтобы случайно не потерять.
.awesome-block {
/* здесь стили для позиционирования текста */
min-height: 100dvh;
position: relative;
background-repeat: no-repeat;
background-position: 50% 50%;
background-image: linear-gradient(to top, rgba(15, 63, 122, 0.5), rgba(15, 63, 122, 0.5)), url("sun.svg"), url("background.webp");
}Немножко пожалуюсь. Как думаете, какой браузер сдерживал всех от использования множества фонов для свойства background?
Конечно, Internet Explorer 8. Помню, все тогда просто плюнули и сказали дизайнерам, что в нём фоны будут обычными. Хорошо, что тогда это прокатило.
Стилизация подчёркивания текста с помощью свойства text-decorationОчень долгое время я причислял свойство text-decoration к самым простым. Для меня оно просто подчёркивало текст, да и делало это, мягко говоря, некрасиво. А оказывается, оно уже давно изменилось!
Современное свойство text-decoration включает в себя свойства: text-decoration-line, text-decoration-thickness, text-decoration-style и text-decoration-color.
Для демонстрации создам под текстом сплошную линию толщиной 5px и цветом tomato.
.awesome-link {
text-decoration: underline 5px solid tomato;
}Мне особенно нравится возможность менять толщину линии. Именно из-за неё мне приходилось использовать свойство border.
Представьте, фронтендеры делили способы создать линию по толщине. Если требовалось использовать стандартную линию, например у ссылок, то можно было использовать свойство text-decoration. Если же линия была чуть толще или отличалась цветом от текста, то уже добавляли свойство border.
В последний год часто продаю старые вещи. Приходится фотографировать и выкладывать на сайт с объявлениями. Я человек, у которого всегда куча разных файлов на компьютере. По этой причине я всегда трачу много времени, чтобы найти нужные фотографии.
А на сайте с объявлениями этого нет. При загрузке фотографии мне отображаются только изображения. Среди них мне легче найти нужные фотографии для своего объявления.

Я полез смотреть, как же это реализовано, и увидел атрибут accept для элемента input с типом file.

<body>
<!-- другие элементы -->
<input accept="image/gif,image/png,image/jpeg,image/bmp,image/tiff,image/heic,.gif,.png,.jpg,.jpeg,.jfif,.pjpeg,.pjp,.bmp,.tiff,.tif,.heic" id="js-messenger-attachment-file-input" type="file" multiple="" data-marker="reply/imageInput">
<!-- другие элементы -->
</body>Вот про какую фичу HTML я точно забыл. Признаю, это моя ошибка.
Атрибут accept уже работал в большинстве браузеров в 2015 году. Его задача очень простая — помочь вам более просто выбрать нужный файл для загрузки. Происходит это за счёт того, что разработчик указывает форматы файлов, которые отобразятся пользователю в диалоговом окне.
В нашем примере перечислены большинство форматов и расширений для изображений.
Значение атрибута может содержать конкретное расширение файла вместе с точкой, а может — строку типа MIME без расширений.
<body>
<!-- используются MIME-типы --->
<input type="file" accept="image/png, image/jpeg">
<!-- используются расширения файлов --->
<input type="file" accept=".pdf,.doc,.docx">
</body>Важное уточнение. Атрибут accept не запрещает выбирать файлы другого типа. Пользователь может переключить тип файлов в диалоговом окне.
Например, я переключился на «Все файлы», и браузер стал отображать абсолютно все файлы в директории.

По этой причине необходимо реализовать проверку типов файлов на стороне сервера для обеспечения безопасности и корректной работы приложения.
Разнообразное отображение текста с помощью свойств writing-mode и text-orientationВ моей практике дизайнеры всегда любили отображать текст с изюминкой. Посмотришь на макет и думаешь: «Да, как тебя сверстать-то?» У меня отдельная депрессия была от вертикального текста.
И, конечно, когда я перестал активно верстать, появились свойства writing-mode и text-decoration, которые сводят мою нелюбимую задачу до двух строк кода! Представляете, как мне было обидно?
Свойство writing-mode управляет направлением расположения элементов и текста. Для него мы можем использовать значения horizontal-tb, vertical-rl, vertical-lr, sideways-rl и sideways-lr.
Давайте попробуем применить значение vertical-lr к элементу с текстом.
<body>
<div class="awesome-block">
<p>Великолепный текст</p>
</div>
</body>.awesome-block {
writing-mode: vertical-lr;
}
Браузеры перестроили текст, и теперь он отображён вертикально. Но буквы не подстроились под новое направление. Их нужно также повернуть.
Именно для этой задачи существует свойство text-decoration. Значение upright исправит отображение букв в нашем примере.
.awesome-block {
writing-mode: vertical-lr;
text-orientation: upright;
}
Теперь текст отображён вертикально, и он идёт сверху вниз и слева направо. Даже перенос строки работает. Браузеры отобразили слово «Текст» во второй колонке.
Единицы измерения em для декоративной стилизации текстаКогда только появлялась резиновая вёрстка, а потом и адаптивная, в CSS очень популярны были единицы измерения em. Я помню, как пытался с помощью них оптимизировать количество кода, избавляясь от пикселей.
Это потом появились единицы rem. Мне кажется, что современные фронтендеры уже в основном используют их. Я редко встречаю в коде крупных проектов единицы измерения em. Хотя они могут быть полезны в определённой задаче.
Для демонстрации я буду использовать пример из книги Леа Веру «Секреты CSS».
/**
* Glowing text
*/
body {
background: #203;
font: bold 500%/1 Rockwell, serif;
}
a {
color: #ffc;
text-decoration: none;
transition: 1s;
}
a:hover {
text-shadow: 0 0 0.1em, 0 0 0.3em;
}Мы видим, что есть стили для добавления тени к тексту при срабатывании псевдокласса :hover на ссылке. Автор использует единицы измерения em для установки значения. Почему они, а не единицы измерения px?
Для ответа на этот вопрос нужно задуматься над тем, насколько гибким вы хотите получить код. Например, в теории текст, к которому применяется тень, может отобразиться более крупным или меньшим размером.
/**
* Glowing text
*/
body {
background: #203;
font: bold 500%/1 Rockwell, serif;
}
a {
color: #ffc;
text-decoration: none;
transition: 1s;
font-size: 0.5rem;
}
a:hover {
text-shadow: 0 0 0 8px, 0 0 24px;
}Если в этом случае используются пиксели, то браузеры не станут изменять тень, чтобы она соответствовала новому значению свойства font-size. Следовательно, нам нужно будет устанавливать новое значение для свойства text-shadow, чтобы визуальный результат был корректным. А в случае с единицами измерения em браузеры сами рассчитают новое значение для свойства text-shadow.
Подведу итог. В этой статье мы рассмотрели:
возможность использовать множество фонов вместе со свойством background;
атрибут accept, упрощающий выбор нужного файла при его загрузке;
как можно отобразить текст вертикально, используя свойства writing-mode и text-orientation;
какие есть возможности для разнообразного подчёркивания текста свойством text-decoration;
использование единиц измерения em для декоративных задач по стилизации текста.
Надеюсь, вам было полезно. Коллеги, ещё есть просьба к вам. Пожалуйста, расскажите в комментариях, какие старые возможности HTML и CSS всё ещё полезны, по вашему мнению. С удовольствием прочитаю.
На этом у меня всё. Спасибо за чтение!
P. S. Помогаю больше узнать про CSS и дружелюбные интерфейсы в своих ТГ‑каналах CSS isn't magic и UX + Dev = a11y. Присоединяйтесь. Как вступить, написано в профиле.
© 2026 ООО «МТ ФИНАНС»
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Вы не знаете CSS. Мои вопросы о CSS с ответами. Версия 2026 года | 5 | 6 | 14-07-2026 |
| 2 | Частые ошибки в вёрстке, которые встречаются даже на крупных проектах | -1 | 7.06 | 04-08-2026 |
| 3 | Пожалуйста, используйте эти CSS медиа-фукции | 5 | 7 | 07-07-2026 |
| 4 | [Перевод] Как всегда, (почти) во всём виноват Internet Explorer: древности и артефакты в HTML | 0 | 8.74 | 14-09-2026 |
| 5 | Почему баги кроссбраузерности до сих пор никуда не исчезли | 0 | 9.81 | 15-09-2026 |
| 6 | CSS Anchor Positioning в картинках | 0 | 7.97 | 09-10-2026 |
| 7 | Баги на диком западе: топ-10 ошибок в C и C++ проектах за 2025 год | 0 | 8.06 | 30-12-2025 |
| 8 | Фронтенд никогда не умрёт | 0 | 6.54 | 26-07-2026 |
| 9 | Хронология языков программирования — и открытый редактор хронологий Хочу представить ... | 0 | 6.04 | 18-10-2026 |
| 10 | Делюсь большой крутой дизайн-системой, которую мы используем на реальных проектах | 0 | 11.24 | 19-05-2026 |