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

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

1. position: static

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

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

[css]
#content{
position: static;
}
[/css]

2. position:relative

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

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

[css]
#content{
position: relative;
top: 20px;
left: -40px;
}
[/css]

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

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

3. position: absolute

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

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

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

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

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

4. position: fixed

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

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

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

5. position:relative + position:absolute

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

[css]
#content {
position:relative;
}

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

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

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

[css]
#content {
position:relative;
}

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

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

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

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

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

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

[css]
#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;
}
[/css]

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

8. Float

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

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

[css]
#div-1a {
float:left;
width:200px;
}
[/css]

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

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

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

#div-1b {
float:left;
width:150px;
}
[/css]

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

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

#div-1b {
float:left;
width:150px;
}
[/css]

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

10. Очистка float

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

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

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

#div-1c {
clear:both;
}
[/css]

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

[css]
#content {
overflow:hidden;
}
[/css]

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

Заключение

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

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


Posted

in

,

by

Comments

70 responses to “Изучаем CSS-позиционирование за 10 шагов”

  1. Мюс Avatar

    Очень полезная статья для начинающих! все просто и понятно! Спасибо!

  2. Денис Avatar
    Денис

    Относительное позиционирование (position: relative) позволяет вам использовать свойства: top, bottom, left и right

    Только top и left, по-моему.

    1. dreamhelg Avatar
      dreamhelg

      Нет, работают все четыре свойства

  3. Andrey Avatar

    Спасибо, всё ясно, доступно и понятно.

  4. alexpts Avatar

    Доступно и наглядно, мне нравится )

  5. fotow Avatar

    Спасибо!!оч интересная статья!!все предельно понятно.

  6. Стас Avatar

    Две колонки лучше через inline-block делать…

    1. dreamhelg Avatar
      dreamhelg

      inline-block не поддерживается IE

      1. Сергей Avatar
        Сергей

        inline-block не поддерживается IE 7 и ниже соответственно. IE8+ все поддерживает.
        Ежли для старых проектов то на float если свежий проект то однозначно inline-block.
        http://caniuse.com/#search=inline-block

  7. News Avatar

    Кстати, у меня работали 5 программистов, из них никто не знал CSS стили, да и вообще не умеют верстать да же шаблоны, кодить только умеют и всё. Хорошо описано всё, чётко и понятно, круто вообще – так держать !

  8. madini Avatar

    Хорошие примеры, главное все показано на примерах, спасибо!

  9. Alex Leo Avatar

    Отличный урок … Спасибо. Столько интересного про div в одном месте еще не видел )

  10. Ljubimov Avatar
    Ljubimov

    Спасибо, буду знать.

  11. Losevskij Avatar
    Losevskij

    Быстро, просто и эффективно. Как всегда лучше всяких ожиданий. Спасибо.

  12. Елена Avatar
    Елена

    То,что было нужно,понятно с первого прочтения,подача материала превосходная,оч.помогло!

  13. продвижение сайта с малым заработком Avatar

    а я хотел научиться верстке, но так и не научился, сначала не было возможности, потом не было рвения, а теперь нет времени) завтра не будет желания)

  14. ingram Avatar
    ingram

    Акуенная и наглядная статья! ))) Довольно неплохо разбираюсь в html и CSS но с этим позиционированием всегда было, как сказал автор: “на уровне шаманства”. После этой статьи все стало гораздо яснее.

  15. SEOATOM Avatar

    Спасибо, вы мне очень помогли!

  16. Роман Avatar
    Роман

    Хорошая статья ) зашел глянуть про одно свойство, а прочитал всю статью )) +1

  17. Роман Avatar
    Роман

    Огромное спасибо!
    Сколько перерыл сайтов пока искал по дивам понятный, нормально разъясняющий материал.
    Еще раз спасибо Вам огромное!

  18. Sergey Avatar

    Спасибо, разжевали от и до. Будем применять на практике…

  19. radarium Avatar
    radarium

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

  20. Сергей Avatar
    Сергей

    Спасибо ..Четко, лаконично

  21. Елизавета Avatar
    Елизавета

    крутая статья!!!

  22. Гошка Avatar
    Гошка

    Спасибо огромное!!
    Могут же некоторые объяснять!

    Оказывается все намного проще, чем порой в книгах понаписана.

  23. Seo-West.Com Avatar

    Спасибо, помогли освежить память

  24. Эфранта Avatar

    Спасибо, интересно. Потихоньку осваиваю CSS.

  25. Евгений Avatar
    Евгений

    Отличный перевод статьи)
    Вот оригинал http://www.barelyfitz.com/screencast/html-training/css/positioning/

    1. dreamhelg Avatar
      dreamhelg

      Спасибо, оригинал у меня тоже указан в конце статьи

  26. pashokk Avatar
    pashokk

    блин реально большое спасибо за статью, везде описано просто текстом, а когда глазами видишь позиционирование эт совсем другое. А еще советую нубасям как я параллельно тож создать index и css файлы и на практике осваивать изложенное. Терь реально все понятно, щас перехожу на изучение тега display)

  27. Марк Avatar
    Марк

    Отличная статья!!! Все очень наглядно и понятно!

  28. алжана Avatar
    алжана

    Вы бы не могли написать статью про позиционирование с тремя колонками? Спасибо

  29. арт Avatar
    арт

    объясните как сделать так что-бы при абсолютном позиционировании текст обтекал изображение. Заранее благодарен))

  30. Виталий Avatar
    Виталий

    ОГРОМНОЕ СПАСИБО за столь подробно описанную технику позиционирования!! Несколько дней мучился с тем, что контент выходил за рамки основного блока (родительского элемента), а оказалось ему просто нужно было поставить оверфлоу: хидден!) Еще раз большое, человеческое спасибо!

  31. Юрий Avatar
    Юрий

    Спасибо все понятно

  32. Денис Avatar
    Денис

    Отличная статья, говорю со знанием дела, спасибо

  33. Яна Avatar
    Яна

    Автору огромное спасибо за качественную информацию!!! В сети стало много “воды”, а по делу – единицы блогов)))

  34. Илья Avatar
    Илья

    Добрый день. Подскажите, как в последнем примере сделать, чтоб блок div-1a заполнял собой пустое пространство до блока div-1c.

    Заранее спасибо.

  35. Антон Avatar

    Читаю книгу по HTML5 и CSS3 автор Дженнифер Роббинс но более понятного рассуждения чем здесь я ещё не нашел элементу position:
    Автору спасибо за материал.

  36. Ваня Avatar
    Ваня

    В девятом пункте второй пример вообще не понял, ему установлен float: right, но он слева, при том ещё и левее блока с float: left. В чём суть и как так вышло. Плюс я слышал, что “Блок с float:left не может быть правее, чем блок с float:right.” Собственно тут так и написано, третье правило в конце статьи.
    Так что интересно понять что происходит.

  37. wdtime.ru Avatar

    Позиционирование элементов на странице position css

  38. Ремонт автомобилей своими руками Avatar

    Подскажите плиззззз
    схема такая

    у меня когда блок float left он выходит за рамки родителя, скажите, как сделать что бы он был справа относительно равнозначного блока, но не выходил за рамки высоты родительского блока

  39. Егор Avatar
    Егор

    Спасибо! Супер!

    Доделал титульную страницу сайта, решил проверить растягивается ли блог при добавление контента – и… всё поплыло.
    Пункт 10. Очистка float – мгновенно решило проблему!

  40. Mari Avatar
    Mari

    Спасибо! Очень лаконично и доходчиво, отличная статья!

  41. Евгений Avatar
    Евгений

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

  42. Егор Avatar

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

  43. олег Avatar
    олег

    Спасибо!

  44. h Avatar

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

    1. Vel Avatar
      Vel

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

  45. Анна Avatar
    Анна

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

  46. Руслан Avatar
    Руслан

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

  47. alla Avatar
    alla

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

  48. .Руслан Avatar
    .Руслан

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

    1. Ольга Фомина Avatar

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

  49. Костя Avatar
    Костя

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

    1. Oleg Avatar

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

  50. alexey Avatar
    alexey

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

  51. Lera Avatar
    Lera

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

    спасибо =)

  52. vitek Avatar
    vitek

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

  53. Дима Avatar
    Дима

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

  54. master114 Avatar
    master114

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

  55. MeatCrash Avatar
    MeatCrash

    Не знаю, услышит ли меня кто-нибудь здесь, но таки и быть, спрошу. Вопрос следующий в 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 Avatar

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

      1. Олег Avatar
        Олег

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

  56. eugenebert Avatar
    eugenebert

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

  57. Гулнара Cмадиярова Avatar
    Гулнара Cмадиярова

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

  58. Эрнест Avatar
    Эрнест

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

  59. Igor Avatar
    Igor

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

  60. Stanislav Avatar
    Stanislav

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

  61. Александр Avatar
    Александр

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

Leave a Reply to eugenebert Cancel reply

Your email address will not be published. Required fields are marked *