Равноудаленные блоки и :first-child
31 января 2010 года | Вёрстка
В этот раз хотелось написать, что-то о вёрстке. Сначала хотелось взять и рассказать о чем-то новом, например о CSS3, но передумал. А начать я решил с небольших полезностей, которые часто использую сам в верстке.
В этот раз хочу рассказать о удобстве использования псевдо-класса :first-child.
Представим, что у нас есть главный блок фиксированной ширины, и в нём нужно разместить несколько элементов (также блоков), которые «прилипают» к левому и правому краю «родителя». И при этом имеют между собой равный отступ. Но на словах это сложно представить, поэтому я изобразил всё ниже на рисунке.

А вот и сам HTML:
<div class="section">Блок 1</div>
<div class="section">Блок 2</div>
<div class="section">Блок 3</div>
</div>
Чтобы растянуть на всю ширину три блока внутри родительского, мы применим несколько строчек CSS кода. Первая мысль, что приходит в голову, это указать классу .section, ширину и нужный отступ справа. Но возникает проблема с последним крайним блоком. Его отступ будет больше ширины родительского блока.

Так как третий блок, из-за отступа не влазит в ширину родительского элемента, то и браузеры его будут «сбрасывать» ниже:

В итоге, последний <div> будет перемещен вниз, и возникает вопрос, как задать последнему элементу отступ равный 0 (нулю).
Как я уже и сказал в начале статьи, что для решения этой проблемы можно применить удобный селектор :first-child, А также сменить правый отступ в дочерних блоках на левый. Получится, что теперь проблема у самого левого блока, а его легко может обработать наш псевдо-класс.
Итак, при написание стилей, сразу оформим родительский блок:
width: 320px;
height: 60px;
background: #EFEFEF;
}
За ним опишем класс для всех внутренних блоков:
border: solid 1px #999;
float: left;
height: 58px;
margin-left: 10px;
width: 98px;
}
В этом примере, я использовал фиксированную ширину и отступ. Но если вам нужно задать динамическую ширину, можете указать значения например в процентах.
Теперь мы удалим отступ у первого внутреннего блока:
margin-left: 0px;
}
Как браузеры понимают этот псевдо-класс? Сначала находится элемент с id=»wrapper», а затем первому дочернему элементу применяет этот стиль.
В итоге получаем:

Вот такое не хитрое и удобное использование этого селектора.
Этот пример работает прекрасно в любом современном браузере. А так как я не считаю IE6 современным браузером, к нему это не относится.
Но проекты бывают разные и заказчики бывают разные. Поэтому, дам совет, как исправить данный пример, чтобы он корректно работал и в IE6.
Нужно для первого дочернего элемента использовать другой класс, например .section-first или добавить второй класс .section.first и прописать для него нулевой отступ.
- http://rendermarket.com Сергей
- divbyzero
- http://rendermarket.com Сергей
- divbyzero
- http://www.nayjest.ru/ Master Nayjest
- http://www.nayjest.ru/ Nayjest, web-developer
- divbyzero
- http://medialworld.com sad
- http://medialworld.com sad
- divbyzero
- http://medialworld.com sad
- divbyzero
- Selenit
- abc_ua
