Горизонтальный разделитель <hr />

Существует элемент <hr />. Существует он для логического разделения блоков текста. Используется в том случае, если нужно разделить некоторый текст, а подзаголовок неуместен или необязателен. Именно поэтому следует использовать именно этот элемент, а не заменители, на подобие <div class=”hr”></div>

Всемирно известная проблема (я говорю об MS IE) отображает горизонтальный разделитель с дополнительными отступами, причём, такое ощущение, что эти отступы прописаны ему на более низком уровне, не поддаваемом изменению с помощью css. Поэтому, чтобы сделать кроссбраузерные отступы у этого элемента, приходится идти на всяческие ухищрения.

Прочитав пару материалов по этому поводу (Тег <hr /> и кроссбраузерный отступ, A HaRd challenge – Styling An HR Element) и проанализировав, выяснил, что можно решить проблему кроссбраузерно.

Дмитрий Лялин, предлагал не лишать разделитель отступов, а наоборот, оставить, но везде сделать одинаковые. В теме A HaRd Challenge – Styling An HR Element предлагают убрать их вообще.

Собственно, получаем первое решение — без отступов:

hr {
	border: 0;
	color: red;
	height: 5px;
	background-color: red;
	display: block;
	margin: 0 !important;
	margin: -4px 0 -10px 0;
}

Заметьте, для исправления представления в IE6, я предлагаю вместо хакков и Conditional Comments использовать !important. Для всех браузеров кроме IE6 эта строчка будет приоритетной. А на следующей строчке можем написать исправление для IE6, который будет игнорировать !important.

margin: -4px 0 -10px 0;

эта строчка произвольная. Нет лекарства в виде какого-то точного значения. При изменении высоты строки, меняются и отступы в IE. И предлагаемый комментаторами в теме A HaRd Challenge – Styling An HR Element вариант -7px годится лишь для того, чтобы можно было использовать border для верхнего и нижнего элемента без залезания на разделитель. Мой вариант был для меня самым оптимальным для высоты строки 36px, с которой я экспериментировал.

display: block — предназначен для того, чтобы в IE6 сработал верхний отрицательный margin.
color: red — чтобы границы в IE стали красными, а то они какие-то серенькие.

Но всё-таки осталась проблема — IE7. Он как и IE6 устанавливает для <hr /> отступ в 7px, но в отличае от IE6, он понимает свойства с флагом !important (правда только в standart mode. Если убрать doctype, то IE7 резко тупеет). Придётся использовать хакки или Conditional Comments. Последние предпочтительнее, например, потому что известный хакк для IE7:

*+html hr { ... }

работает и для IE8 для которого исправления не требуются.

Ещё одна проблема безотступного <hr /> — налезание тех самых 7 пикселов на следующий за ним блок в IE6 и IE7, что не позволяет использовать для этого блока border иначе граница выглядит слегка порубленной.

Вот что в итоге получилось:

Borders я добавил для наглядности, если их отключить — выглядит на порядок красивше.

В общем, если вам не нужны отступы или нужны, но менее 7px — используйте вышеприведённый пример, а если вы не против отступов у горизонтального разделителя от 7px и более, то используйте следующий вариант:

hr {
	border: 0;
	color: red;
	height: 5px;
	background-color: red;
	margin: 7px 0;
	*margin: 0;
}

*margin: 0 — хак для IE6 и IE7 который будет игнорироваться браузером IE8. Но лучше так не делать. Лучше все исправления записывать в отдельный файл и подключать с помощью Conditional Comments. Мало ли что…

Дата: 24.05.2008
»
Категории: CSS
Google     

]]> Dimox ]]>

*+html hr { … } работает и для IE8

Неприятная для меня новость :( Я его частенько использую. Эх… этот гребаный ИЕ. С каждой версией добавляет новых проблем…

»

]]> pepelsbey ]]>

Мне больше нравится такой вариант исправления:

<div class=”hr”><hr/></div>

.hr HR { display:none }

»

]]> Никита ]]>

Dimox, парадокс — соблюдение стандартов улучшилось, а проблем прибавилось :)
pepelsbey, весьма удивлён, особенно учитывая тот факт, что ты пишешь о семантически правильной разметке. Вот как оправдать такой вариант? Ведь это в десять раз больше кода, нежели использовать просто <hr /> и смысла в этом блоке нет никакого. Разве это блок? Это же разделитель.

»

]]> Dimox ]]>

Я, кстати, тоже практикую вариант, который указал pepelsbey. С ним проще.

»

]]> pepelsbey ]]>

Как сказано выше, этот вариант действительно в разы проще, чем «если отступы такие, то вот так, а если другие, то вот так…», хоть он и не слишком удобно вписывается в светлую идею семантической вёрстки.

Кстати, можно попробовать вариант с генерируемым содержимым/expression’ами, чтобы прятать наш HR, а уже после дописывать элементы, которые проще оформить.

»

]]> Никита ]]>

Проще не значит лучше. В любом случае, я преложил вариант. Ваше дело, что использовать. Но вставить код один раз в свой reset.css и забыть, что может быть проще?

»

]]> pepelsbey ]]>

> В любом случае, я преложил вариант

Ну почему же, инициатива очень хорошая, мне просто кажется, что это чересчур сложное и перегруженное хаками решение не слишком существенной проблемы. Но если столкнусь с чем-нибудь подобным в практике — обязательно попробую.

»

]]> Repka ]]>

Кстати, использовали данный вопрос на собеседовании, если человек знает, как сделать <hr> однопиксельной полоской красного цвета, уже говорит о многом.

А этот вариант меня улыбнул:
<div class=”hr”><hr/></div>
.hr HR { display:none }

почему бы не сделать просто:
<div class=”hr”><!– –></div>

»

]]> Seleckis.lv :: журнал Никиты Селецкого » » Reset CSS ]]>

[...] этом я писал в предыдущей статье. ol li, ul li{ vertical-align: bottom; [...]

»

]]> pepelsbey ]]>

> почему бы не сделать просто: <div class=”hr”><!– –></div>

Потому, что мы тут вроде как пытаемся использовать логичную разметку. А комментарий внутри пустого элемента нужен только для HTML Tidy (на основе него построен плагин для FF), официальный валидатор благосклонен к абсолютно пустым элементам.

»

]]> webmolot ]]>

Однозначто согласен с Никитой.
Контент-менеджер забивает инфу в сайт и ему нужно разделить текст. Он очень обрадуется, когда после вставки простого семантического тега hr текст разделится красивой стилизованной линией.

»

]]> Octane ]]>

2 webmolot: для таких случаев применяют bb-коды.
Вариант, предложенный pepelsbey по моему лучший, конечно больше кода, но CSS в этом случае останется “чистым”. Да и например ситуация с <code><pre></pre></code> на всех форумах из-за невозможности кросбраузерно задать через CSS preformated текст, контент менеджер тоже не будет вводить <code><pre></pre></code>… здесь обсуждается как сделать, и как сделать рациональнее

»

]]> Никита ]]>

Octane, bb коды? Вы в каком веке живёте?
CSS останется чистым, зато HTML будет замусорен. А чистота HTML важнее чистоты CSS, поскольку это в большей степени влияет на трафик.
Насчёт code и pre не понял, можно выразиться яснее?

»

]]> Octane ]]>

причом тут время и bb-коды?) просто так выразился, думал идея будет ясна, имел ввиду, что нужно использовать обработку введенного текста по средством форматирования его при помощи bb-кодов или как в вордпрессе, например, обрабатывать разрешенные хтмл теги, чтобы всякие контент-менеджеры не ужасались от мысли о том, что им придеццо вводить страшную конструкцию <div><hr /></div>.
А про <code><pre></pre></code>…, ну обычно используют такую конструкцию <code>Language:<pre class="language"></pre></code> для подсветки синтаксиса, такую штуку уж точно никакой контент-менеджер не осилит :D

»

]]> Никита ]]>

Octane, с контент-менеджерами это другой вопрос. Они вообще не должны видеть тэги.

»

]]> Vladimir ]]>

> *+html hr { … } работает и для IE8

*+html/*/* /**/ body hr {}, если нужен только 7-й Ишак.

Будет желание – читайте

> Кстати, можно попробовать вариант с генерируемым содержимым/expression’ами

Честно говоря, это извращение – использовать скриптинг в CSS, да еще и для вставки всякого мусора :-) Тем более, что ИЕ вправе так поступать с отступами, ибо Sola Scriptura гласит, что “The amount of vertical space inserted between a rule and the content that surrounds it depends on the user agent.”

Лично по мне, если у IE проблема с нормальным отображением, то это лично проблема IE, и она не стоит того, чтобы с ней бороться тяжелой артиллерией. Если отступ не критичен – фиг с ним, если он рушит пресловутый pixel perfection – тогда другое дело (и решение Никиты мне здесь ближе)

> <code><pre></pre></code>
Не прокатит, code строчный, а pre блочный. Нужно наоборот.

»

]]> Никита ]]>

Vladimir, спасибо за хаки, хотя я не люблю это дело.

> The amount of vertical space inserted between a rule and the content that surrounds it depends on the user agent
В который раз разочаровываюсь в W3C.

»

]]> Archik ]]>

Ктонить скажет – вместо него картинку запихал… (CMS)
В css шаблоне написал:
hr {
display:none;
height: 5px;
width:156px;
height:22px;
background: url(line.jpg);
border: 0px !important;
}
но в Ишаке – 7 граница всеровно показывается, перепробывал почти все…
но бордер все ровно вокруг картинки, как исправить?
Заранее спасибо!

»

]]> алмазик ]]>

Извините, если скажу чушь, но по-моему display: block просто таки заставляет прописать для ие font: 0/0 tahoma. Или нет?

»

]]> Никита ]]>

Archik, border: none;
алмазик, нет.

»

]]> plx ]]>

Полезно знать про пресловутые 7px в ie. Так что вот вам стили для HR.
{width: 100%; display: block; margin: 0; height: 1px; color: red; background-color: red; border: none; //margin: -7px 0}

На мой взгляд, лучшее средство для сброса float-ов разделить плавающие блоки таким hr. (и добавить ему clear:both)

»

]]> Никита ]]>

plx, а чем это особо отличается от моего кода? Те же яйца, только в профиль.

Для сброса float-ов, это не лучший способ.

»

Напишите комментарий