Статьи

Основы CSS: содержание детей

Я получил несколько запросов на более простые учебники по CSS, которые учат хитрым основам. Это будет первая запись в серии, которая будет получать новые дополнения спорадически каждый месяц. Сегодня мы рассмотрим трюки overflow: hidden и clearfix, чтобы родительский div содержал своих дочерних элементов.

Вы когда-нибудь замечали, что когда вы перемещаете все дочерние элементы в div, родитель занимает нулевое пространство? Например, в вашем редакторе кода добавьте следующее в тег body.

1
2
3
4
5
6
7
8
<div id=»container»>
  <div id=»main»>
 
  </div>
  <div id=»sidebar»>
 
  </div>
</div>

Теперь давайте добавим немного CSS для имитации типичного веб-сайта.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
#container {
    background: red;
    width: 800px;
    padding-bottom: 2em;
 
#main {
    background: green;
    height: 500px;
    width: 600px;
    float: right;
 
#sidebar {
    background: blue;
    height: 500px;
    width: 200px;
    float: left;

Выше мы просто устанавливаем цвета фона и перемещаем боковую панель и основные элементы влево и вправо соответственно. Обратите внимание на «padding-bottom: 2em;». Это должно позволить нам увидеть красный фон в самом низу, верно? Просмотрите страницу в своем браузере, и вы увидите:

Переполнение не применено

Куда делся красный фон? Почему это не отображается?

Когда вы пропускаете всех детей, родитель по существу не занимает места. Чтобы лучше проиллюстрировать этот факт, давайте установим для контейнера произвольную высоту 50 пикселей, а затем уменьшим непрозрачность дочерних элементов div, чтобы мы могли видеть красный фон под ними.

1
2
3
4
5
6
#container {
  .. other styles
  height: 50px;
 
#main, #sidebar {
  opacity: .5;

Обновите ваш браузер, и вы увидите:

Не содержится

Как странно. Мы определили высоту 50px для нашего контейнера div, но главные и боковые дивы явно пересекают свои границы, как испорченные братские дивы.

Вернитесь к таблице стилей и примените один стиль:

1
2
3
4
#container {
  …other styles
  overflow: hidden;
}

После очередного обновления мы видим:

Не содержится

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

«Старайтесь избегать указания высот в максимально возможной степени. Обычно есть более разумный метод.

Решение состоит в том, чтобы вырвать свойство высоты из нашего контейнера. Удалите следующее свойство.

1
2
3
4
#container {
  …other styles
  height: 50px;
}

Последнее обновление, и наша проблема, похоже, исправлена.

Переполнение применено

Вы также можете удалить свойства непрозрачности. Они были только для демонстрационных целей.

Показанный выше метод будет работать в большинстве случаев. Однако давайте введем еще одну переменную. Что делать, если мы хотим разместить изображение на границе нашего контейнера, чтобы оно перекрывалось. Вы видели этот эффект много раз. В качестве примера мы будем использовать изображение круга с прозрачным фоном. На реальном сайте это может быть кнопка «Купить сейчас» или «Зарегистрироваться» — что-то вроде этого.

Круг

Используя CSS, давайте разместим изображение в верхней правой части нашего «сайта», перекрывая края. Это то, что мы хотим:

Ломая границы

Сначала мы ссылаемся на изображение в нашем HTML.

1
2
3
<div id=»container»>
  <img src=»circle.png» alt=»Buy Now» />
  …rest of html

Затем вернитесь к таблице стилей и добавьте следующие стили.

1
2
3
4
img {
    position: absolute;
    right: -100px;
    top: 20px;

Можно подумать, что это поместит изображение прямо над правым краем контейнера div. Тем не менее, он был бы неправ.

Поскольку мы не установили контекст позиционирования, вместо этого будет использоваться окно.

Не задан контекст позиционирования

Очевидно, это не то, что мы хотим. Чтобы применить контекст позиционирования к нашему контейнеру div, просто добавьте «position :lative;» в # контейнер. Как только мы это сделаем, изображение больше не будет использовать окно в качестве ссылки.

Потерянная половина

Но теперь у нас новая проблема! Поскольку мы установили переполнение: скрытое для нашего контейнера div, мы несколько застрелились в ногу. Как мы нарушаем границы и берем имена, если для переполнения задано скрытое значение? Должны ли мы просто признать, что этот конкретный веб-сайт сегодня не будет называться? Точно нет. В этих случаях стоит использовать другой метод.

С помощью этого метода мы будем использовать CSS для добавления контента после нашего контейнера div. Этот созданный контент затем очистит наш div, заставив его содержать своих потомков. Теперь очевидно, что мы не хотим видеть этот контент, поэтому мы должны быть уверены, что скрыли его от зрителя.

Вернитесь к своей таблице стилей, удалите «overflow: hidden;» из вашего контейнера div и добавьте следующее:

01
02
03
04
05
06
07
08
09
10
11
#container {
    … other styles
    _height: 1%;
 
#container:after {
    content: «.»;
    visibility: hidden;
    display: block;
    clear: both;
    height: 0;
    font-size: 0;

Это может показаться сложным, но я вас уверяю, что это довольно просто.

  • _height: вызывает «haslayout» в Internet Explorer, используя трюк с подчеркиванием, чтобы напрямую нацеливаться на IE6.
  • content: после контейнера div добавьте точку.
  • видимость: мы не хотим видеть период, поэтому скрыть его от страницы. (Равно установке непрозрачности: 0;)
  • display: заставляет период отображаться как уровень блока, а не как встроенный.
  • Понятно: важное свойство. Это очищает основные и боковые панели div. Это то же самое, что добавить на нашу страницу несемантическое <div style = «clear: both;»>.
  • высота: не занимать места.
  • размер шрифта: просто предосторожность для Firefox. Этот браузер иногда добавляет немного места после нашего родительского элемента. Установка нулевого размера шрифта исправляет это.
Отлично

Хотя переполнение: скрытый трюк предпочтительнее, он не всегда идеален. Вам нужно использовать лучшее решение для поставленной задачи. Важно изучить каждый метод, чтобы у вас были инструменты для решения головоломки.