Очередной блог фрилансера

коротко и полезно о веб-разработке

Menu
  • О чем это все
Menu

Изучаем CSS-позиционирование за 10 шагов

16.02.201128.02.2011

Позиционирование — одно из ключевых понятий в блочной верстке. Разобравшись с ним, вам многое станет понятно, а верстка из шаманства превратится в осмысленный процесс. Итак, речь в статье пойдет о CSS-свойствах position и float.

1. position: static

По умолчанию все элементы на странице имеют статическое позиционирование (position: static), это означает, что элемент не позиционирован, и появляется в документе на своем обычном месте, то есть в том же порядке, как и в html-разметке.

Нет необходимости специально назначать это свойство какому-либо элементу, если только вам не требуется изменить ранее установленное позиционирование на дефолтное.

#content{
 position: static;
}

2. position:relative

Относительное позиционирование (position: relative) позволяет вам использовать свойства: top, bottom, left и right, для расположения элемента относительно того места, где бы он появился при обычном позиционировании.

Давайте переместим #content на 20 пикселей вниз, и на 40 пикселей влево:

#content{
 position: relative;
 top: 20px;
 left: -40px;
}

Обратите внимание, что на том месте, где бы должен был находится наш блок #content, теперь образовалось пустое пространство. Следующий за блоком #content, блок #footer не переместился ниже, потому что, #content по-прежнему занимает свое место в документе, несмотря на то, что мы передвинули его.

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

3. position: absolute

При абсолютном позиционировании (position: absolute), элемент удаляется из документа, и появляется там, где вы ему скажете.

Давайте, для примера, переместим блок #div-1a в верхний, правый угол страницы:

#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}

Обратите внимание, что на этот раз, поскольку блок #div-1a был удален из документа, оставшиеся элементы на странице расположились по-другому: #div-1b, #div-1c и #footer переместились выше, на место удаленного блока. А сам блок #div-1a, расположился точно в правом, верхнему углу страницы.

Таким образом, мы можем позиционировать любой элемент относительно страницы, однако этого не достаточно. На самом деле, нам необходимо позиционировать #div-1a относительно родительского блока #content. И на этом этапе, относительное позиционирование вновь вступает в игру.

4. position: fixed

Фиксированное позиционирование (position: fixed), является подразделом абсолютного позиционирования. Единственное его отличие в том, что он всегда находится в видимой области экрана, и не двигается во время прокрутки страницы. В этом отношении, он немного похож на фиксированное фоновое изображение.

#div-1a {
 position:fixed;
 top:0;
 right:0;
 width:200px;
}

В IE с position: fixed не все так гладко, как бы нам хотелось, но существует множество способов обойти эти ограничения.

5. position:relative + position:absolute

Назначив блоку #content относительное позиционирование (position: relative), мы сможем позиционировать любые дочерние элементы, относительно его границ. Давайте разместим блок #div-1a, в верхнем правом углу блока #content.

#content {
 position:relative;
}

#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}

6. Две колонки

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

#content {
 position:relative;
}

#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}

#div-1b {
 position:absolute;
 top:0;
 left:0;
 width:200px;
}

Одним из преимуществ абсолютного позиционирования, является возможность размещать элементы в произвольном порядке, независимо от того, как именно они расположены в разметке. В приведенном выше примере, блок #div-1b расположен перед блоком #div-1a.

А сейчас у вас должен был возникнуть вопрос: “А куда же делись остальные элементы из нашего примера?”. Они скрылись под абсолютно расположенными блоками. К счастью, есть возможность это исправить.

7. Две колонки с фиксированной высотой

Одно из решений – задать фиксированную высоту контейнеру, содержащему колонки.

#content {
 position:relative;
 height: 450px;
}

#div-1a {
 position:absolute;
 top:0;
 right:0;
 width:200px;
}

#div-1b {
 position:absolute;
 top:0;
 left:0;
 width:200px;
}

Решение не очень подходящее, поскольку мы никогда не знаем заранее, какого размера текст, будет расположен в колонках, и какой шрифт будет использован.

8. Float

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

Назначив блоку float, мы максимально возможно оттолкнем его к правому (или левому) краю, а следующий за блоком текст, будет обтекать его. Обычно такой прием используется для картинок, но мы будем использовать его для более сложной задачи, поскольку это единственный инструмент, имеющийся в нашем распоряжении.

#div-1a {
 float:left;
 width:200px;
}

9. “Плавающие” колонки

Если назначить первому блоку float: left, а затем второму float: left, каждый из блоков прижмется к левому краю, и мы получим две колонки, с переменной высотой.

#div-1a {
 float:left;
 width:150px;
}

#div-1b {
 float:left;
 width:150px;
}

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

#div-1a {
 float:right;
 width:150px;
}

#div-1b {
 float:left;
 width:150px;
}

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

10. Очистка float

Чистку флоатов можно делать двумя способами. Если после колонок идет еще один блок, достаточно назначить ему clear: both.

#div-1a {
 float:left;
 width:190px;
}

#div-1b {
 float:left;
 width:190px;
}

#div-1c {
 clear:both;
}

Или же назначить родительскому контейнеру свойство overflow: hidden

#content {
 overflow:hidden;
}

В любом случае, результат будет один и тот же.

Заключение

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

Перевод скринкаста “Learn CSS Positioning in Ten Steps”.

70 комментариев

Навигация по комментариям

Предыдущие комментарии
  1. Евгений:
    25.04.2016 в 00:54

    спасибо. становится на свои места.

    Ответить
  2. Егор:
    13.06.2016 в 00:38

    Хорошая статья спасибо

    Ответить
  3. олег:
    02.07.2016 в 23:17

    Спасибо!

    Ответить
  4. h:
    30.11.2016 в 12:44

    У вас браузер кривой. На картинках походу старая версия firefox. Потому как любой текст должен обтекаться вокруг плавающих элементов (пока не будет прописано clear), а он у вас получился скрытым на нижнем рисунке пункта 9.
    Также в самом начале пункта 9 div1c оказался смещённым вниз, такого не должно быть.
    Отличие clear и overflow не правильно описано, и результат их использования разный.

    Ответить
    1. Vel:
      18.07.2019 в 12:03

      вообще статья 11 года а вы пишите 16))))

      Ответить
  5. Анна:
    17.12.2016 в 21:41

    Спасибо большое! Наконец-то я подвинула бокс куда мне надо!

    Ответить
  6. Руслан:
    20.12.2016 в 20:25

    Все описано ясно! Спасибо автору!

    Ответить
  7. alla:
    11.01.2017 в 15:08

    большое спасибо,в т.ч. и за отличную ссылку на сайт Ивана Сагалаева

    Ответить
  8. .Руслан:
    10.04.2017 в 01:20

    а как вы в header или во wraper или в body уголок загнули, что-то не разберусь background-image не нашел

    Ответить
    1. Ольга Фомина:
      11.04.2017 в 13:13

      Это сделано через псевдо-элемент :after, блоку задается крупный бордер, без указания ширины и высоты самого блока, а потом свойствами цвета бордера (border-top-color, border-bottom-color..) задается комбинация светло серого и темно-серого цветов. Если посмотрите на этот уголок в инспекторе объектов, все сразу станет ясно.

      Ответить
  9. Костя:
    16.04.2017 в 22:47

    А что за шрифт был использован на скринах?

    Ответить
    1. Oleg:
      25.01.2019 в 15:03

      это стандартный шрифт, просто фото било сдела на комп’ютере, где не использується анти-алиасинг.

      Ответить
  10. alexey:
    30.08.2017 в 15:52

    Статья очень полезная, понял что до этого занимался шаманством. спасибо

    Ответить
  11. Lera:
    10.09.2017 в 22:41

    Кто здесь молодец? — Ольга молодец!

    спасибо =)

    Ответить
  12. vitek:
    13.09.2017 в 12:35

    Спасибо. Полезная статья.

    Ответить
  13. Дима:
    14.01.2018 в 14:44

    спасибо! Наконец-то нашел нормальный материал

    Ответить
  14. master114:
    04.06.2018 в 10:46

    Спасибо большое за нормальное объяснение.
    Долго не мог разобраться с этим вопросом, везде тупой копипаст свойств.
    У Вас очень наглядно и понятно, теперь действительно шаманство превратилось в осмысленное действие

    Ответить
  15. MeatCrash:
    11.07.2018 в 11:06

    Не знаю, услышит ли меня кто-нибудь здесь, но таки и быть, спрошу. Вопрос следующий в 9-м пункте:

    #div-1a {
    float:right;
    width:150px;
    }

    #div-1b {
    float:left;
    width:150px;
    }

    Указано что div-1a присваивается свойство float:right; , а div-1b — float:left; — но почему на рисунке они в противоположных углах? div-1a слева, а div-1b справа. Как так? Если что, я новичок и мой вопрос многим может показаться глупым, но очень бы хотелось услышать ответ на этот вопрос! =)

    Ответить
    1. Oleg:
      25.01.2019 в 15:01

      Потому что кажды блок присоединился к тому углу, который указан в float, в нашем случае это right и left.

      Ответить
      1. Олег:
        02.11.2020 в 12:47

        так у вас 1b написано left, а прижато к правому краю. Ошибка? или тут всё задом-наперед считается?

        Ответить
  16. eugenebert:
    15.08.2018 в 15:12

    спасибо большое хоть кто то разжевал

    Ответить
  17. Гулнара Cмадиярова:
    21.12.2018 в 17:46

    Благодарность автору! Очень подробное и практично, доступное объяснение.

    Ответить
  18. Эрнест:
    09.05.2019 в 00:15

    Они сначала делали скрины, потом писали текст. => возможны небольшие расхождения, поэтому просто пиши, как тебе нужно (слева, справа) и верстай на здоровье))

    Ответить
  19. Igor:
    17.02.2020 в 13:12

    А исходники можно добавить?

    Ответить
  20. Stanislav:
    23.06.2020 в 08:59

    Вчера пол ночи сидел, не мог правильно расположить sidebar. Потом нашел эту статью. Я в восторге. Все систематизировалось в голове и в верстке. Огромное спасибо!

    Ответить
  21. Александр:
    29.01.2021 в 11:31

    Спасибо! Толково!)))

    Ответить

Навигация по комментариям

Предыдущие комментарии

Добавить комментарий для MeatCrash Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Об авторе

avatar

Ольга Фомина

Senior Frontend Developer
Почтовые технологии
telegram youtube instagram vkontakte

Рубрики

  • angular
  • JavaScript
  • nodejs
  • svg
  • wordpress
  • верстка
  • изучаем Jquery
  • общая
  • переводы
  • плагины Jquery
  • юнит-тесты
© 2025 Очередной блог фрилансера | Powered by Superbs Personal Blog theme