Нюансы CSS


Многие используют CSS для оформления сайтов и веб-страниц, знают основные приёмы вёрстки, а если и нет, то быстро найдут решение в интернете, или им подскажут в тематических сообществах. Тем не менее многие широко используемые решения не оптимальны, и если ознакомиться со спецификациями чуть глубже, можно написать лучший код.
К примеру многие знают, что цвет в шестнадцатеричной нотации вида #RRGGBBможно писать сокращённо как #RGB, если каждый старший разряд совпадает с младшим, или что нуль можно писать без единиц измерения, таких как «px» или «em», так как нуль — в любой системе измерения нуль.

Что считает браузер

Также широко известно, что можно отцентрировать блок с шириной меньше родительского элемента при помощи margin:0 auto. Однако мало кто задумывается, что почти во всех случаях дело касается непозиционированных элементов, и в этом случае значение margin-top:auto или margin-bottom:auto устанавливается равным нулю, а значит данное правило можно сократить до простого margin:auto.
Правила margin-left:auto и margin-right:auto при ширине блока меньше ширины контейнера равномерно распределяют оставшееся место. Так, задав только margin-left:auto, можно выровнять элемент по правому краю.
В обычном потоке элементы идут сверху вниз, поэтому margin-top:autoустанавливается нулевым. Однако для абсолютно позиционированных элементов действует то же распределение свободного места, и аналогичным образом можно сделать центрирование по вертикали при заданных высоте и top с bottom(не работает в IE7).

Сокращения и значения по умолчанию

Не менее широко распространено использование спрайтов, например: background:url(icons.png) 0 0 no-repeat. Однако, background-position:0 0 является значением по умолчанию, поэтому 0 0 в таком случае можно опустить.
Но если в background-position задана хоть одна координата: будь то topleft или 100%, то вторая принимает значение 50%. Это может быть полезно для значков, выровненных посередине строки по вертикали — достаточно указать лишь положение слева или справа.
Не все знают, что опущенные в сокращённой записи правила принимают своё значение по умолчанию. Поэтому уточняющие правила надо писать после или делать сильнее общей сокращённой надписи, как background-position уточняет положение каждого спрайта после background в предыдущем примере.
При подобном написании:
h1 {    font:2em/1 Arial,sans-serif;}
задаётся не только шрифт, его размер и интерлиньяж, но и сразу сбрасывается полужирное написание (font-weight:normal), а также другие свойства, такие как font-style (курсив) и font-variant (капитель). Некоторые авторы совершенно зря дописывают в font значение normal. Непонятно даже к какому правилу из перечисленных трёх оно могло бы относиться — порядок следования в сокращённых свойствах неважен, и неучитывание порядка могло приводить к ошибкам лишь в устаревших браузерах.
Другими недопонятыми, но тоже полезными сокращёнными записями являются отдельные правила рамок border-widthborder-style и border-color. Например, благодаря им можно задать верхнюю и нижнюю одинаковые рамки не дублированием кода в border-top и в border-bottom, а подобным образом:
border:solid gray;border-width:3px 0;
Кроме меньшего размера кода, такая запись полезна тем, что каждое значение написано только один раз, и поменять, скажем, solid на double не составляет труда.
Более того, если будет использоваться border-image, то здесь явно задано, что размер боковых рамок нулевой. В противном случае border-image приводит к неявному появлению рамок, что может дать неожиданный эффект в углах.
Есть возможность, что border-radius может быть включен в сокращённую запись border (предлагался вариант с косой чертой «/»), поэтому записывайте на всякий случай border-radius после border.

Переусложенение

Часто, чтобы избавиться от рамки на картинке внутри ссылки, пишут:
a img {    border:0;}
Однако в таком случае бразуер будет на каждой картинке проверять, не находится ли она в ссылке. Если для простых страниц это кажется несущественным (вы и глазом моргнуть не успеете за те несколько миллисекунд, на которое задержится отображение страницы), то в какой-нибудь фотогалерее со сложной анимацией это может лишить вас нескольких кадров в секунду, прибавляя ощущения «тормознутости». Куда проще написать так:
img {    border:0;}
Эффект будет тот же самый. Уточнение, что рамка появляется на ссылках aв данном случае совершенно излишне.
Из тех же соображений производительности, как правило, незачем писать имя тэга вместе с классом и уж тем более с идентификатором, который сам по себе уникален. В данном правиле могут быть только два исключения: уточнение для конкретного тэга (возможно в этом случае у вас очень общий класс), и обход недостатка IE7, где эффекты при наведении :hover тормозят, если в селекторе не указан тэг (то есть надо писать a.class:hover { color:#FC0; }).

Наследование

Ещё одна недооценённая многими возможность CSS: наследование стилей. Например, может не устраивать, что по умолчанию содержимое ячеек таблиц центрируется по вертикали, при этом используются следующие правила:
th {    vertical-align:bottom;}td {    vertical-align:top;}
Вроде бы всё здорово, но, сделав так, вы лишаетесь простого способа переопределить выравнивание для целого ряда:
tr.images {    vertical-align:middle;}
Этого можно избежать, воспользовавшись тем, что ячейки таблицы th и tdнаследуют правила от рядов tr, а те в свою очередь от блоков theadtfootи tbody.
thead {    vertical-align:bottom;}tbody,tfoot {    vertical-align:top;}
Стоит отметить, что все браузеры, кроме IE8, наследуют еще и значение text-align для th, а сам IE8 понимет ключевое слово inherit, что также позволяет наследовать значение text-align.

Заключение

Знание основ спецификаций, понимание механизмов работы браузеров и выполняемых действий позволяет оптимизировать написание кода, упростить его, сделать лаконичней, а также упростить дальнейшую разработку и поддержку.
Добавлено: 25-03-2018, 17:09
0
86

Похожие публикации


Добавить комментарий


Наверх