2 added
2 removed
Original
2026-01-01
Modified
2026-02-26
1
-
<p>Как и в любой сфере деятельности человека, в вёрстке можно выделить несколько антипаттернов - действий, котор��е возможны, но приводят к неприятным ситуациям в будущем или являются неэффективными. Применительно к вёрстке, антипаттерны не позволяют удобно расширять проект и работать другим разработчикам. В этой статье я рассмотрю те антипаттерны, с которыми сталкивался сам. Их знание и умение избегать поможет вам быстро вырасти как верстальщику.</p>
1
+
<p>Как и в любой сфере деятельности человека, в вёрстке можно выделить несколько антипаттернов - действий, которые возможны, но приводят к неприятным ситуациям в будущем или являются неэффективными. Применительно к вёрстке, антипаттерны не позволяют удобно расширять проект и работать другим разработчикам. В этой статье я рассмотрю те антипаттерны, с которыми сталкивался сам. Их знание и умение избегать поможет вам быстро вырасти как верстальщику.</p>
2
<p>Этот список неполный. Для полного списка нужна не просто статья, а целый обучающий курс. Поэтому будут выделены только основные, которые чаще всего встречаются на практике и портят жизнь разработчикам.</p>
2
<p>Этот список неполный. Для полного списка нужна не просто статья, а целый обучающий курс. Поэтому будут выделены только основные, которые чаще всего встречаются на практике и портят жизнь разработчикам.</p>
3
<h2>Содержание</h2>
3
<h2>Содержание</h2>
4
<ul><li><a>Антипаттерн №1. Единицы rem и базовый размер шрифта</a></li>
4
<ul><li><a>Антипаттерн №1. Единицы rem и базовый размер шрифта</a></li>
5
<li><a>Антипаттерн №2. Фиксированная высота блоков</a></li>
5
<li><a>Антипаттерн №2. Фиксированная высота блоков</a></li>
6
<li><a>Антипаттерн №3. Абсолютное позиционирование как способ подгона макета</a></li>
6
<li><a>Антипаттерн №3. Абсолютное позиционирование как способ подгона макета</a></li>
7
<li><a>Антипаттерн №4. Pixel Perfect</a></li>
7
<li><a>Антипаттерн №4. Pixel Perfect</a></li>
8
<li><a>Антипаттерн №5. Игнорирование методологий</a></li>
8
<li><a>Антипаттерн №5. Игнорирование методологий</a></li>
9
<li><a>Антипаттерн №6. Сокращённые свойства</a></li>
9
<li><a>Антипаттерн №6. Сокращённые свойства</a></li>
10
</ul><h2>Антипаттерн №1. Единицы rem и базовый размер шрифта</h2>
10
</ul><h2>Антипаттерн №1. Единицы rem и базовый размер шрифта</h2>
11
<blockquote><p><strong>Проблема:</strong>использование единиц измерения rem с базовым размером шрифта в 10 пикселей.</p>
11
<blockquote><p><strong>Проблема:</strong>использование единиц измерения rem с базовым размером шрифта в 10 пикселей.</p>
12
</blockquote><p>Нет, речь не о том, что размер шрифта в 10 пикселей - это плохо. С познанием единицы измерения rem разработчики придумали хитрый способ удобного перевода px → rem - выставление для селектора html размер шрифта в 10 пикселей. Действительно, теперь перевод значений становится очень простым:</p>
12
</blockquote><p>Нет, речь не о том, что размер шрифта в 10 пикселей - это плохо. С познанием единицы измерения rem разработчики придумали хитрый способ удобного перевода px → rem - выставление для селектора html размер шрифта в 10 пикселей. Действительно, теперь перевод значений становится очень простым:</p>
13
<ul><li>15px = 1.5rem</li>
13
<ul><li>15px = 1.5rem</li>
14
<li>27px = 2.7rem</li>
14
<li>27px = 2.7rem</li>
15
</ul><p>и так далее. Здесь кроется одна большая проблема: пользователи не могут задать минимальный размер шрифта в настройках браузера. Это серьёзно влияет на доступность проектов. Например, слабовидящие люди или люди, у которых монитор находится далеко, увеличивают минимальный размер шрифта. Устанавливая минимальный размер в 18 пикселей, они ожидают, что большинство шрифтов не будут иметь меньший размер. Что будет, если установить такое значение:</p>
15
</ul><p>и так далее. Здесь кроется одна большая проблема: пользователи не могут задать минимальный размер шрифта в настройках браузера. Это серьёзно влияет на доступность проектов. Например, слабовидящие люди или люди, у которых монитор находится далеко, увеличивают минимальный размер шрифта. Устанавливая минимальный размер в 18 пикселей, они ожидают, что большинство шрифтов не будут иметь меньший размер. Что будет, если установить такое значение:</p>
16
<p>Браузер перезапишет пользовательскую настройку.</p>
16
<p>Браузер перезапишет пользовательскую настройку.</p>
17
<blockquote><p><strong>Решение:</strong>не используйте базовый размер шрифта в 10 пикселей. При необходимости установите этот размер не менее 16 пикселей. Для удобного перевода из px и rem можно написать функцию в любом препроцессоре.</p>
17
<blockquote><p><strong>Решение:</strong>не используйте базовый размер шрифта в 10 пикселей. При необходимости установите этот размер не менее 16 пикселей. Для удобного перевода из px и rem можно написать функцию в любом препроцессоре.</p>
18
</blockquote><h2>Антипаттерн №2. Фиксированная высота блоков</h2>
18
</blockquote><h2>Антипаттерн №2. Фиксированная высота блоков</h2>
19
<blockquote><p><strong>Проблема:</strong>повсеместное использование фиксированной высоты блоков</p>
19
<blockquote><p><strong>Проблема:</strong>повсеместное использование фиксированной высоты блоков</p>
20
</blockquote><p>Начинающие верстальщики в целях экономии собственного времени выставляют фиксированную высоту секциям и другим блокам в проектах. С одной стороны, это позволяет очень быстро привести вёрстку к макету, а с другой стороны, накладывает множество ограничений на будущее развитие.</p>
20
</blockquote><p>Начинающие верстальщики в целях экономии собственного времени выставляют фиксированную высоту секциям и другим блокам в проектах. С одной стороны, это позволяет очень быстро привести вёрстку к макету, а с другой стороны, накладывает множество ограничений на будущее развитие.</p>
21
<p>При развитии страницы и добавления туда новых блоков всегда нужно будет считаться с тем, что в стилях указана чёткая высота. Нужен новый контент внутри блока? Идём в CSS и увеличиваем размер. Удаляется контент? Идём в CSS и уменьшаем размер. Не самая интересная работа.</p>
21
<p>При развитии страницы и добавления туда новых блоков всегда нужно будет считаться с тем, что в стилях указана чёткая высота. Нужен новый контент внутри блока? Идём в CSS и увеличиваем размер. Удаляется контент? Идём в CSS и уменьшаем размер. Не самая интересная работа.</p>
22
<p>Зачастую такое решение используется для того, чтобы избавиться от внутренних отступов и не высчитывать их по макету. Поэтому вся суть проблемы сводится к обычной лени разработчика - стараясь сделать меньше телодвижений сейчас, он обрекает себя на дополнительные телодвижения потом.</p>
22
<p>Зачастую такое решение используется для того, чтобы избавиться от внутренних отступов и не высчитывать их по макету. Поэтому вся суть проблемы сводится к обычной лени разработчика - стараясь сделать меньше телодвижений сейчас, он обрекает себя на дополнительные телодвижения потом.</p>
23
-
<p>Вторая причина такого действия: непонимание работы блочной модели. При добавлении внутренних отступов размер секции может увеличиться, а может не сделать этого. Если упустить этот теоретический момент, то можно наткнутся на непонимание происходящего. В этом случае куда проще задействовать свойство height и избавиться от головной боли.</p>
23
+
<p>Вторая причина такого действия: непонимание работы блочной модели. При добавлении внутренних отступов размер секции может увеличиться, а может не сделать этого. Если упустить этот те��ретический момент, то можно наткнутся на непонимание происходящего. В этом случае куда проще задействовать свойство height и избавиться от головной боли.</p>
24
<blockquote><p><strong>Решение:</strong>используйте фиксированную высоту только там, где это уместно. Если вам точно необходима какая-то минимальная высота, то используйте свойство min-height. Во всех остальных случаях обходитесь без высоты, а используйте другие средства CSS: отступы, межстрочные интервалы и так далее.</p>
24
<blockquote><p><strong>Решение:</strong>используйте фиксированную высоту только там, где это уместно. Если вам точно необходима какая-то минимальная высота, то используйте свойство min-height. Во всех остальных случаях обходитесь без высоты, а используйте другие средства CSS: отступы, межстрочные интервалы и так далее.</p>
25
</blockquote><h2>Антипаттерн №3. Абсолютное позиционирование как способ подгона макета</h2>
25
</blockquote><h2>Антипаттерн №3. Абсолютное позиционирование как способ подгона макета</h2>
26
<blockquote><p><strong>Проблема:</strong>использование абсолютного позиционирования без необходимости в нём.</p>
26
<blockquote><p><strong>Проблема:</strong>использование абсолютного позиционирования без необходимости в нём.</p>
27
</blockquote><p>Этот пункт является прямым продолжение пункта про фиксированную высоту. Как и там, использование абсолютного позиционирования для контента чаще всего является решением следствия проблемы, а не её причины.</p>
27
</blockquote><p>Этот пункт является прямым продолжение пункта про фиксированную высоту. Как и там, использование абсолютного позиционирования для контента чаще всего является решением следствия проблемы, а не её причины.</p>
28
<p>Здесь снова вступает в силу размышление про подгон вёрстки под макет. В желании выровнять вёрстку разработчики идут на хитрости. Иногда от нехватки знаний, иногда от дотошности заказчика, который может с линейкой высматривать все расстояния между блоками. Это реальная история из практики автора. Не пытайтесь повторить её дома.</p>
28
<p>Здесь снова вступает в силу размышление про подгон вёрстки под макет. В желании выровнять вёрстку разработчики идут на хитрости. Иногда от нехватки знаний, иногда от дотошности заказчика, который может с линейкой высматривать все расстояния между блоками. Это реальная история из практики автора. Не пытайтесь повторить её дома.</p>
29
<p>Какой бы ни была причина, но такая вёрстка абсолютно неподдерживаемая, она не имеет ничего общего с работой верстальщика.</p>
29
<p>Какой бы ни была причина, но такая вёрстка абсолютно неподдерживаемая, она не имеет ничего общего с работой верстальщика.</p>
30
<blockquote><p><strong>Решение:</strong>используйте абсолютное позиционирование только в оправданных случаях. Это может быть создание анимаций, нестандартных секций, взаимодействие с пользователем. Само использование позиционирования не является антипаттерном, но его использование для подгона макета является.</p>
30
<blockquote><p><strong>Решение:</strong>используйте абсолютное позиционирование только в оправданных случаях. Это может быть создание анимаций, нестандартных секций, взаимодействие с пользователем. Само использование позиционирования не является антипаттерном, но его использование для подгона макета является.</p>
31
</blockquote><h2>Антипаттерн №4. Pixel Perfect</h2>
31
</blockquote><h2>Антипаттерн №4. Pixel Perfect</h2>
32
<blockquote><p><strong>Проблема:</strong>излишние переживания по поводу Pixel Perfect</p>
32
<blockquote><p><strong>Проблема:</strong>излишние переживания по поводу Pixel Perfect</p>
33
</blockquote><p>Так, спокойно. Не стоит сразу думать о том, что автор этой статьи нехороший и ленивый человек.</p>
33
</blockquote><p>Так, спокойно. Не стоит сразу думать о том, что автор этой статьи нехороший и ленивый человек.</p>
34
<p>Pixel Perfect - подход, при котором макет верстается с точностью до пикселя. Это кажется здравой идеей, ведь макет будет перенесён ровно так, как этого хотел заказчик, дизайнер или ваш кот.</p>
34
<p>Pixel Perfect - подход, при котором макет верстается с точностью до пикселя. Это кажется здравой идеей, ведь макет будет перенесён ровно так, как этого хотел заказчик, дизайнер или ваш кот.</p>
35
<p>Такой подход был максимально актуален во времена небольшого распространения различных устройств, операционных систем, браузеров. Сейчас же каждое новое окружение пользователя может немного по-разному воспроизводить одну и ту же вёрстку. Яркий пример - шрифты. Алгоритмы их отрисовки могут сильно отличаться, что сводит практический смысл Pixel Perfect к нулю. Подстроив макет к одной системе, вы получите расхождения в другой.</p>
35
<p>Такой подход был максимально актуален во времена небольшого распространения различных устройств, операционных систем, браузеров. Сейчас же каждое новое окружение пользователя может немного по-разному воспроизводить одну и ту же вёрстку. Яркий пример - шрифты. Алгоритмы их отрисовки могут сильно отличаться, что сводит практический смысл Pixel Perfect к нулю. Подстроив макет к одной системе, вы получите расхождения в другой.</p>
36
<p>Помимо этого, Pixel Perfect часто приводит к проблемам из прошлых пунктов. Именно для соблюдения макета при таком подходе начинаются танцы с бубном в виде фиксированной высоты и странным позиционированием.</p>
36
<p>Помимо этого, Pixel Perfect часто приводит к проблемам из прошлых пунктов. Именно для соблюдения макета при таком подходе начинаются танцы с бубном в виде фиксированной высоты и странным позиционированием.</p>
37
<p>Но не стоит думать, что настало время верстать как попало или на глаз. Вёрстка всё так же предполагает воспроизведение макета, но различия в несколько пикселей не должны являться критической ошибкой, из-за которой стоит всё переделывать. Ведь чистая и аккуратная вёрстка принесёт больше пользы, чем попиксельная точность в вёрстке двух кнопок, которые отличаются в один-два пикселя по ширине.</p>
37
<p>Но не стоит думать, что настало время верстать как попало или на глаз. Вёрстка всё так же предполагает воспроизведение макета, но различия в несколько пикселей не должны являться критической ошибкой, из-за которой стоит всё переделывать. Ведь чистая и аккуратная вёрстка принесёт больше пользы, чем попиксельная точность в вёрстке двух кнопок, которые отличаются в один-два пикселя по ширине.</p>
38
<blockquote><p><strong>Решение:</strong>отведите допуски под небольшие различия между макетом и его вёрсткой. Отдайте предпочтение чистоте и корректной структуре, а не попиксельному воспроизведению макета.</p>
38
<blockquote><p><strong>Решение:</strong>отведите допуски под небольшие различия между макетом и его вёрсткой. Отдайте предпочтение чистоте и корректной структуре, а не попиксельному воспроизведению макета.</p>
39
</blockquote><h2>Антипаттерн №5. Игнорирование методологий</h2>
39
</blockquote><h2>Антипаттерн №5. Игнорирование методологий</h2>
40
<blockquote><p><strong>Проблема:</strong>написание стилей без использования любой методологии.</p>
40
<blockquote><p><strong>Проблема:</strong>написание стилей без использования любой методологии.</p>
41
</blockquote><p>Методология - набор правил и решений, которые используются при вёрстке макета. Часто они описывают взаимосвязь блоков между собой и поддержку специфичности внутри таблицы стилей.</p>
41
</blockquote><p>Методология - набор правил и решений, которые используются при вёрстке макета. Часто они описывают взаимосвязь блоков между собой и поддержку специфичности внутри таблицы стилей.</p>
42
<p>Существует несколько популярных методологий, которые используются в проектах по всему миру: БЭМ, OOCSS, Atomic CSS, SMACSS. Все они созданы для поддержания единства написания стилей различными разработчиками. С точки зрения самих стилей методологии позволяют снизить специфичность селекторов, разделить блоки на компоненты и сделать их переиспользуемыми. Часто методологии определяют и архитектуру проекта.</p>
42
<p>Существует несколько популярных методологий, которые используются в проектах по всему миру: БЭМ, OOCSS, Atomic CSS, SMACSS. Все они созданы для поддержания единства написания стилей различными разработчиками. С точки зрения самих стилей методологии позволяют снизить специфичность селекторов, разделить блоки на компоненты и сделать их переиспользуемыми. Часто методологии определяют и архитектуру проекта.</p>
43
<p>Если не использовать методологии при написании стилей, то можно столкнуться со следующими проблемами:</p>
43
<p>Если не использовать методологии при написании стилей, то можно столкнуться со следующими проблемами:</p>
44
<ol><li>Разработчики с трудом будут ориентироваться в стилях друг друга.</li>
44
<ol><li>Разработчики с трудом будут ориентироваться в стилях друг друга.</li>
45
<li>Использование сложных селекторов, которые будут "перебивать" стили других селекторов, применяемые к блоку.</li>
45
<li>Использование сложных селекторов, которые будут "перебивать" стили других селекторов, применяемые к блоку.</li>
46
<li>Разброс стилей по всему проекту. Это осложнит доработку проекта. Часто это выражается в виде наличия одних и тех же селекторов в разных частях CSS-файла.</li>
46
<li>Разброс стилей по всему проекту. Это осложнит доработку проекта. Часто это выражается в виде наличия одних и тех же селекторов в разных частях CSS-файла.</li>
47
<li>Отсутствие согласованности в именовании классов. Вы больше любите сокращённо .btn, а другой разработчик .button. Классы говорят об одном и том же, но имеют разные названия.</li>
47
<li>Отсутствие согласованности в именовании классов. Вы больше любите сокращённо .btn, а другой разработчик .button. Классы говорят об одном и том же, но имеют разные названия.</li>
48
</ol><blockquote><p><strong>Решение:</strong>изучите методологии и используйте ту, которая вам больше нравится. Придерживайтесь методологии, которая принята в компании.</p>
48
</ol><blockquote><p><strong>Решение:</strong>изучите методологии и используйте ту, которая вам больше нравится. Придерживайтесь методологии, которая принята в компании.</p>
49
</blockquote><h2>Антипаттерн №6. Сокращённые свойства</h2>
49
</blockquote><h2>Антипаттерн №6. Сокращённые свойства</h2>
50
<p><strong>Проблема:</strong>использование сокращённых записей свойств по всему проекту.</p>
50
<p><strong>Проблема:</strong>использование сокращённых записей свойств по всему проекту.</p>
51
<p>Изучив сокращённые записи многих свойств, верстальщики начинают использовать их везде. Это не является антипаттерном само по себе, ведь сокращённые свойства действительно помогают сократить количество кода и иногда сделать его удобнее. Взгляните на пример:</p>
51
<p>Изучив сокращённые записи многих свойств, верстальщики начинают использовать их везде. Это не является антипаттерном само по себе, ведь сокращённые свойства действительно помогают сократить количество кода и иногда сделать его удобнее. Взгляните на пример:</p>
52
<p>Меньше кода - меньше телодвижений. И это отлично, но за использованием сокращённых свойств стоит одна особенность - они перезаписывают все значения до их написания. Например:</p>
52
<p>Меньше кода - меньше телодвижений. И это отлично, но за использованием сокращённых свойств стоит одна особенность - они перезаписывают все значения до их написания. Например:</p>
53
<p>Определите, какие свойства будут у секции? Возможно, вы ожидаете, что в секции будет фоновое изображение и зелёная подложка в виде просто цвета. Но на самом деле это не так - свойство background у селектора .section-green перезапишет все свойства фона. И секция будет иметь только зелёный фон, а картинка пропадёт.</p>
53
<p>Определите, какие свойства будут у секции? Возможно, вы ожидаете, что в секции будет фоновое изображение и зелёная подложка в виде просто цвета. Но на самом деле это не так - свойство background у селектора .section-green перезапишет все свойства фона. И секция будет иметь только зелёный фон, а картинка пропадёт.</p>
54
<p>Такое поведение может как помочь разработчику, так и подпортить ему нервы.</p>
54
<p>Такое поведение может как помочь разработчику, так и подпортить ему нервы.</p>
55
<blockquote><p><strong>Решение:</strong>определяйте сокращённые свойства в начале документа. Если нужно перезаписать правило, то используйте только необходимое свойство, а не его сокращённую запись.</p>
55
<blockquote><p><strong>Решение:</strong>определяйте сокращённые свойства в начале документа. Если нужно перезаписать правило, то используйте только необходимое свойство, а не его сокращённую запись.</p>
56
</blockquote>
56
</blockquote>