Программирование на Python и Objective-C в Mac OS

Программирование на Python и Objective-C под Mac OS и для iPhone / iPod Touch

Как в css поднять блок вверх: CSS позиционирование, обтекание элементов и контекст наложения

Содержание

CSS позиционирование, обтекание элементов и контекст наложения

CSS рассматривает макет html-документа как дерево элементов. Уникальный элемент, у которого нет родительского элемента, называется корневым элементом. Модуль CSS-позиционирование описывает, как любой из элементов может быть размещен независимо от порядка документа (т.е. извлечен из «потока»).

В CSS2 каждый элемент в дереве документа генерирует ноль или более блоков в соответствии с блочной моделью. Модуль CSS3 дополняет и расширяет схему позиционирования. Расположение этих блоков регулируется:

  • размерами и типом элемента,
  • схемой позиционирования (нормальный поток, обтекание и абсолютное позиционирование),
  • отношениями между элементами в дереве документа,
  • внешней информацией (например, размер области просмотра, внутренними размерами изображений и т.д.).

Схемы позиционирования

В CSS блок элемента может быть расположен в соответствии с тремя схемами позиционирования:

Нормальный поток

Нормальный поток включает блочный контекст форматирования (элементы с display block, list-item или table), строчный (встроенный) контекст форматирования (элементы с display inline, inline-block или inline-table), и относительное и «липкое» позиционирование элементов уровня блока и строки.

Обтекание

В обтекающей модели блок удаляется из нормального потока и позиционируется влево или вправо. Содержимое обтекает правую сторону элемента с float: left и левую сторону элемента с float: right.

Абсолютное позиционирование

В модели абсолютного позиционирования блок полностью удаляется из нормального потока и ему присваивается позиция относительно содержащего блока. Абсолютное позиционирование реализуется с помощью значений position: absolute; и position: fixed;.

Элементом «вне потока» может быть плавающий, абсолютно позиционированный или корневой элемент.

1. Содержащий блок

Положение и размер блока(ов) элемента иногда вычисляются относительно некоторого прямоугольника, называемого содержащим блоком элемента (containing block). В общих словах, содержащий блок — это блок, который содержит другой элемент. В случае нормального потока корневой элемент html является содержащим блоком для элемента body, который, в свою очередь, является содержащим блоком для всех его дочерних элементов и так далее. В случае позиционирования содержащий блок полностью зависит от типа позиционирования. Содержащий блок элемента определяется следующим образом:

  • Содержащий блок, в котором находится корневой элемент, представляет собой прямоугольник — так называемый начальный содержащий блок.
  • Для некорневого элемента с position: static; или position: relative; содержащий блок формируется краем области содержимого ближайшего родительского блока уровня блока, ячейки таблицы или уровня строки.
  • Содержащим блоком элемента с position: fixed; является окно просмотра.
  • Для некорневого элемента с position: absolute; содержащим блоком устанавливается ближайший родительский элемент со значением position: absolute/relative/fixed следующим образом:
    — если предок — элемент уровня блока, содержащим блоком будет область содержимого плюс поля элемента padding;
    — если предок — элемент уровня строки, содержащим блоком будет область содержимого;
    — если предков нет, то содержащий блок элемента определяется как начальный содержащий блок.
  • Для «липкого» блока содержащим блоком является ближайший предок с прокруткой или окно просмотра, в противном случае.

2. Выбор схемы позиционирования: свойство position

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

Свойство не наследуется.

position
Значение:
staticБлок располагается в соответствии с нормальным потоком. Свойства top, right, bottom и left не применяются. Значение по умолчанию.
relativeПоложение блока рассчитывается в соответствии с нормальным потоком. Затем блок смещается относительно его нормального положения и во всех случаях, включая элементы таблицы, не влияет на положение любых следующих блоков. Тем не менее, такое смещение может привести к перекрытию блоков, а также к появлению полосы прокрутки в случае переполнения.

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

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

Влияние position: relative; на элементы таблицы определяется следующим образом:
Элементы с table-row-group, table-header-group, table-footer-group иd table-row смещаются относительно их обычной позиции в таблице. Если ячейки таблицы занимают несколько строк, смещаются только ячейки начальной строки.
table-column-group, table-column не смещает соответствующий столбец и не оказывает визуального влияния.
table-caption and table-cell смещаются относительно своего нормального положения в таблице. Если ячейка таблицы охватывает несколько столбцов или строк, то она смещается целиком.

absoluteПоложение блока (и, возможно, размер) задается с помощью свойств top, right, bottom и left. Эти свойства определяют явное смещение относительно его содержащего блока. Абсолютно позиционированные блоки полностью удаляется из нормального потока, не влияя на расположение сестринских элементов.

Отступы margin абсолютно позиционированных блоков не схлопываются.

Абсолютно позиционированный блок создает новый содержащий блок для дочерних элементов нормального потока и потомков с position: absolute;.

Содержимое абсолютно позиционированного элемента не может обтекать другие блоки. Абсолютно позиционированный блок могут скрывать содержимое другого блока (или сами могут быть скрыты), в зависимости от значения z-index перекрывающихся блоков.

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

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

«Липкий» блок сохраняет свои размеры, включая разрывы строк и пространство, первоначально зарезервированное для него.

«Липкий» блок создает новый содержащий блок для абсолютно и относительно позиционированных потомков.

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

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

initialУстанавливает значение свойства в значение по умолчанию.
inheritНаследует значение свойства от родительского элемента.

Синтаксис

position: static;
position: relative;
position: absolute;
position: sticky;
position: fixed;
position: initial;
position: inherit;

Рис. 1. Разница между статичным, относительным и абсолютным позиционированием

3. Смещение блока: свойства top, right, bottom, left

Элемент считается позиционированным, если свойство position имеет значение, отличное от static. Позиционированные элементы генерируют позиционированные блоки и могут быть расположены в соответствии со следующими четырьмя физическими свойствами:

top
Значение:
autoВлияние значения зависит от типа элемента. Значение по умолчанию.
длинаСмещение на фиксированном расстоянии от указанного края. Отрицательные значения допускаются.
%Процентные значения вычисляются относительно высоты содержащего блока. Для «липкого» блока — относительно высоты корневого элемента. Отрицательные значения допускаются.
initialУстанавливает значение свойства в значение по умолчанию.
inheritНаследует значение свойства от родительского элемента.

Синтаксис

top: 10px;
top: 2em;
top: 50%;
top: auto;
top: inherit;
top: initial;

Свойство top задает расстояние, на которое верхний край абсолютно позиционированного блока (с учетом его margin) смещается ниже верхнего края содержащего блока. Для относительно позиционированных блоков определяет смещение относительно верхнего края самого блока (то есть блоку задается позиция в нормальном потоке, а затем смещение от этой позиции в соответствии с этим свойством).

right
Значение:
autoВлияние значения зависит от типа элемента. Значение по умолчанию.
длинаСмещение на фиксированном расстоянии от указанного края. Отрицательные значения допускаются.
%Процентные значения вычисляются относительно ширины содержащего блока. Для «липкого» блока — относительно ширины корневого элемента. Отрицательные значения допускаются.
initialУстанавливает значение свойства в значение по умолчанию.
inheritНаследует значение свойства от родительского элемента.

Синтаксис

right: -10px;
right: .5em;
right: -10%;
right: auto;
right: inherit;
right: initial;

Свойство right указывает расстояние, на которое правый край абсолютно позиционированного блока (с учетом его margin) смещен влево от правого края содержащего блока. Для относительно позиционированных блоков определяет смещение относительно правого края самого блока.

bottom
Значение:
autoВлияние значения зависит от типа элемента. Значение по умолчанию.
длинаСмещение на фиксированном расстоянии от указанного края. Отрицательные значения допускаются.
%Процентные значения вычисляются относительно высоты содержащего блока. Для «липкого» блока — относительно высоты корневого элемента. Отрицательные значения допускаются.
initialУстанавливает значение свойства в значение по умолчанию.
inheritНаследует значение свойства от родительского элемента.

Синтаксис

bottom: 50px;
bottom: -3em;
bottom: -50%;
bottom: auto;
bottom: inherit;
bottom: initial;

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

left
Значение:
autoВлияние значения зависит от типа элемента. Значение по умолчанию.
длинаСмещение на фиксированном расстоянии от указанного края. Отрицательные значения допускаются.
%Процентные значения вычисляются относительно ширины содержащего блока. Для «липкого» блока — относительно ширины корневого элемента. Отрицательные значения допускаются.
initialУстанавливает значение свойства в значение по умолчанию.
inheritНаследует значение свойства от родительского элемента.

Синтаксис

left: 50px;
left: 10em;
left: 20%;
left: auto;
left: inherit;
left: initial;

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

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

4. Обтекание: свойство float

Обтекание позволяет блокам смещаться влево или вправо на текущей строке. «Плавающий блок» смещается влево или вправо до тех пор, пока его внешний край не коснется края содержащего блока или внешнего края другого плавающего блока. Если имеется линейный блок, внешняя верхняя часть плавающего блока выравнивается с верхней частью текущего линейного блока.

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

Правила, регулирующие поведение плавающих боков, описываются свойством float.

Свойство не наследуется.

float
Значение:
noneОтсутствие обтекания. Значение по умолчанию.
leftЭлемент перемещается влево, содержимое обтекает плавающий блок по правому краю.
rightЭлемент перемещается вправо, содержимое обтекает плавающий блок по левому краю.
inheritНаследует значение свойства от родительского элемента.

Синтаксис

float: left;
float: right;
float: none;
float: inherit;

Плавающий блок принимает размеры своего содержимого с учетом внутренних отступов и рамок. Верхние и нижние отступы margin плавающих элементов не схлопываются.

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

Свойство автоматически изменяет вычисляемое (отображаемое в браузере) значение свойства display на display: block для следующих значений: inline, inline-block, table-row, table-row-group, table-column, table-column-group, table-cell, table-caption, table-header-group, table-footer-group. Значение inline-table меняет на table.

Свойство не оказывает влияние на элементы с display: flex и display: inline-flex. Не применяется к абсолютно позиционированным элементам.

Рис. 2. Обтекание элементов

5. Управление потоком рядом с плавающими элементами: свойство clear

Свойство clear указывает, какие стороны блока/блоков элемента не должны прилегать к плавающим блокам, находящемся выше в исходном документе. В CSS2 и CSS 2.1 свойство применяется только к неплавающим элементам уровня блока.

Свойство не наследуется.

clear
Значение:
noneОзначает отсутствие ограничений на положение элемента относительно плавающих блоков. Значение по умолчанию.
leftСмещает элемент вниз относительно нижнего края любого плавающего слева элемента, находящемся выше в исходном документе.
rightСмещает элемент вниз относительно нижнего края любого плавающего справа элемента, находящемся выше в исходном документе.
bothСмещает элемент вниз относительно нижнего края любого плавающего слева и справа элемента, находящемся выше в исходном документе.
inheritНаследует значение свойства от родительского элемента.

Синтаксис

clear: none;
clear: left;
clear: right;
clear: both;
clear: inherit;

Для предотвращения отображение фона или границ под плавающими элементами используется правило {overflow: hidden;}.

6. Определение контекста наложения: свойство z-index

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

Рис. 3. Положение элементов вдоль оси Z

Порядок, в котором дерево документа отрисовывается на экране, описывается с помощью контекста наложения. Каждый блок принадлежит одному контексту наложения. Каждый блок в данном контексте наложения имеет целочисленный уровень, который является его положением на оси Z относительно других блоков в том же контексте наложения.

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

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

Свойство не наследуется.

z-index
Значение:
autoВычисляется в 0. Если для блока задано position: fixed; или это корневой элемент, значение auto также устанавливает новый контекст наложения. Значение по умолчанию.
целое числоОпределяет положение блока в текущем контексте наложения. Также устанавливает новый локальный контекст наложения. Можно использовать любое целое число, включая отрицательные числа. Отрицательные значения помещают элемент вглубь экрана.
inheritНаследует значение свойства от родительского элемента.
initialУстанавливает значение свойства в значение по умолчанию.

Синтаксис

z-index: auto;
z-index: 0;
z-index: 5;
z-index: 999;
z-index: -1;
z-index: inherit;
z-index: initial;
6.1. Контекст наложения

Если для элементов свойства z-index и position не заданы явно, контекст наложения равен порядку их расположения в исходном коде и браузер отображает элементы на странице в следующем порядке:

  • Корневой элемент <html>, который содержит все элементы веб-странице.
  • Блочные элементы, неплавающие и непозиционированные.
  • Плавающие float непозиционированные элементы в порядке их расположения в исходном коде.
  • Строковые непозиционированные элементы (текст, изображения).
  • Позиционированные position элементы в порядке их следования в исходном коде. Последний из них будет расположен на переднем плане.

Свойство z-index создает новый контекст наложения. Оно позволяет изменить порядок наложения позиционированных элементов. Элементы будут отображаться на странице в следующем порядке (если для них не заданы свойства, влияющие на контекст наложения — opacity, filter, transform):

  • Корневой элемент <html>, который содержит все элементы веб-странице.
  • Позиционированные элементы с отрицательным значением z-index.
  • Блочные элементы, неплавающие и непозиционированные.
  • Плавающие float непозиционированные элементы в порядке их расположения в исходном коде.
  • Строковые непозиционированные элементы (текст, изображения).
  • Позиционированные элементы со значениями z-index: 0; и z-index: auto;.

z-index | htmlbook.ru

Internet ExplorerChromeOperaSafariFirefoxAndroidiOS
6.0+8.0+1.0+4.0+1.0+1.0+3.0+1.0+1.0+

Краткая информация

Версии CSS

Описание

Любые позиционированные элементы на веб-странице могут накладываться друг
на друга в определенном порядке, имитируя тем самым третье измерение, перпендикулярное
экрану. Каждый элемент может находиться как ниже, так и выше других объектов
веб-страницы, их размещением по z-оси и управляет z-index. Это свойство работает только для элементов, у которых значение position задано как absolute, fixed или relative.

Синтаксис

z-index: число | auto | inherit

Значения

В качестве значения используются целые числа (положительные, отрицательные и ноль). Чем больше значение, тем выше находится элемент по
сравнению с теми элементами, у которых оно меньше. При равном значении z-index,
на переднем плане находится тот элемент, который в коде HTML описан ниже. Хотя
спецификация и разрешает использовать отрицательные значения z-index,
но такие элементы не отображаются в браузере Firefox до версии 2.0 включительно.

Кроме числовых значений применяется auto —
порядок элементов в этом случае строится автоматически, исходя из их положения
в коде HTML и принадлежности к родителю, поскольку дочерние элементы имеют тот
же номер, что их родительский элемент. Значение inherit указывает, что оно наследуется у родителя.

Пример

HTML5CSS2.1IECrOpSaFx

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>z-index</title>
  <style>
   #layer1, #layer2, #layer3, #layer4 {
    position: relative; /* Относительное позиционирование */
   } 
   #layer1, #layer3 {
    font-size: 50px; /* Размер шрифта в пикселах */
    color: #000080; /* Синий цвет текста */
   }
   #layer2, #layer4 {
    top: -55px; /* Сдвигаем текст вверх */
    left: 5px; /* Сдвигаем текст вправо */
    color: #ffa500; /* Оранжевый цвет текста */
    font-size:70px;  /* Размер шрифта в пикселах */
   }
   #layer1 { z-index: 2; }
   #layer2 { z-index: 1; }
   #layer3 { z-index: 3; }
   #layer4 { z-index: 4; }
  </style>
 </head>
 <body>
  <p>Слой 1 наверху</p>
  <div>Слой 1</div>
  <div>Слой 2</div> 
  <p>Слой 4 наверху</p>
  <div>Слой 3</div>
  <div>Слой 4</div> 
 </body>
</html>

Результат данного примера показан на рис. 1.

Рис. 1. Применение свойства z-index

Объектная модель

[window.]document.getElementById(«elementID»).style.zIndex

Браузеры

Список, созданный с помощью тега <select>,
в браузере Internet Explorer 6 всегда отображается поверх других элементов, несмотря
на значение z-index.

Internet Explorer до версии 7.0 включительно не поддерживает значение inherit и интерпретирует auto как 0.

В браузере Firefox до версии 2.0 включительно отрицательное значение z-index располагает элемент ниже фона веб-страницы и его контента.

Сдвинуть блок (position: relative;) | CSS примеры

Элемент с position: relative; смещается на расстояние, указанное в свойствах top, right, bottom, left, от своего первоначального расположения. Размещение элемента над другими элементами правится с помощью свойства z-index.

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

Переместить элемент над другими элементами

Чтобы элемент «2» спрятался под другой часто неподвижный элемент «1», можно элементу «1» указать position: relative;, при котором не игнорируется свойство z-index.

Большое количество контекста наложения усложняет работу, поэтому лучше не применять z-index там, где без него можно обойтись.



Сместить элемент в сторону так, чтобы соседние элементы остались на своих местах

исходное положение

элемент
position: relative

top

-bottom

left

-right

Cвойства top, right, bottom, left могут иметь как положительные, так и отрицательные значения в любых единицах измерения, а также в процентах. По умолчанию у них установлено значение auto.

Элемент с top: -4em; примет то же положение, что и с bottom: 4em;. Элемент с left: -4em; примет то же положение, что и с right: 4em;.

При одновременном использовании свойств top и bottom, свойство bottom игнорируется. При одновременном использовании свойств left и right, свойство right игнорируется.

Значения свойств top и bottom в процентах рассчитываются от высоты содержимого ближайшего не inline родителя, у которого height не auto.

Если height ближайшего родителя имеет значение auto, то height в процентах заменяется на height: auto;, при котором не работают свойства top и bottom в процентах у ближайших потомков.

Значения свойств left и right в процентах рассчитываются от ширины содержимого ближайшего не inline родителя.

Значения свойств top, right, bottom, left в процентах пропускают inline родителя.

Значение overflow отличное от visible у родителя прячет выходящую за границы часть дочернего элемента с первого экрана видимости.



Указать родителя, в рамках которого будет перемещаться элемент с

position: absolute;

Изучаем CSS-позиционирование за 10 шагов — Очередной блог фрилансера

Позиционирование — одно из ключевых понятий в блочной верстке. Разобравшись с ним, вам многое станет понятно, а верстка из шаманства превратится в осмысленный процесс. Итак, речь в статье пойдет о 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”.

Всё о свойстве float | CSS-Tricks по-русски

Всё о свойстве float

Что такое «float»?

Float — это свойство CSS для позиционирования элементов. Для того чтобы понять его назначение и происхождение, можно обратиться к полиграфическому дизайну. В компоновке при печати, изображения могут располагаться на странице так, чтобы текст «обтекал» их. Обычно это так и называется: «обтекание текстом».

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

В веб-дизайне, элементы страницы с установленным свойством float, ведут себя точно также как и изображения в полиграфии, когда текст «обтекает» их. Такие элементы являются частью основного потока веб-страницы. Однако всё обстоит иначе, если элементы используют абсолютное позиционирование. Абсолютно позиционированные элементы удаляются из основного потока страницы, подобно примеру выше, когда в полиграфии текст игнорирует изображения. Такие элементы не влияют на позицию остальных элементов, соприкасаются они или нет.

Установка свойства float происходит следующим образом:


#sidebar {
	float	: right;
}

Всего есть 4 значения для свойства float. Left и right используются для соответствующих направлений. None (по умолчанию) — обеспечивает, что элемент не будет «плавать». И inherit, которое говорит, что поведение должно быть такое же, как и у родительского элемента.

Для чего можно использовать float?

Помимо обтекания текстом изображений, float может использоваться для создания макета всего сайта.

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

Такое же расположение объектов может быть достигнуто путём использования позиционирования. Объекту-контейнеру присваивается относительное (relative) позиционирование, а объекту с изображением — абсолютное (absolute). В этом случае аватар не повлияет на положение текста.

Отмена свойства float

Для float, родственное свойство — clear. Любой элемент, у которого установлено свойство clear, не будет поднят вверх, как от него ожидается, а отобразится ниже, после float-элементов. Возможно, пример на картинке объяснит лучше, чем слова.

В примере, сайд-бар прижат к правому краю (float: right;), а его высота меньше, чем область основного контента. Поэтому footer будет поднят выше, поскольку для него хватает высоты и этого требует поведение float. Чтобы исправить ситуацию, ему необходимо установить свойство clear, которое гарантирует, что элемент выведется ниже float-элементов.


#footer {
	clear: both;
}

Свойство clear может принимать четыре значения. Both, наиболее используемое, применяется для отмены float каждого из направлений. Left и Right — используются для отмены float одного из направлений. None — по умолчанию, обычно не используется, за исключением случаев, когда необходимо отменить значение clear. Значение inherit было бы пятым значением, но оно странным образом не поддерживается в Internet Explorer. Отмена только левого или правого float, встречается гораздо реже, но, безусловно, имеет свои цели.

Большой коллапс

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

Такое схлопывание выглядит нелогичным, однако альтернатива ещё хуже. Рассмотрим такой пример:

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

Таким образом, схлопывание почти всегда необходимо, чтобы предотвратить трудности в вёрстке. Для того чтобы изменить такое поведение, необходимо добавить элемент отменяющий float после float-элементов, но до закрытия родительского элемента.

Способы отмены float

Если вам известно, что следом после float-элементов, всегда будет выводится какой-либо другой элемент (например футер), то вам достаточно ему установить свойство clear: both;, как в примере выше, и заниматься дальше своими делами. Это идеальный вариант, поскольку он не требует каких-либо хаков, или дополнительных элементов. Конечно не всё в нашей жизни так гладко и бывают случаи когда такого способа не достаточно. Поэтому необходимо иметь несколько дополнительных способов в своём арсенале.

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

Для более лучшего визуального представления было бы неплохо объединить подобные блоки. Например мы хотим, чтобы каждый тип начинался с новой строки, в нашем случае тип элемента определяется цветом. Мы можем использовать метод с overflow или «метод простой очистки», если у каждой группы есть свой элемент-контейнер. Или же мы можем использовать метод пустого div-а между каждой из групп. Три элемента-контейнера, или три пустых div-а, что лучше для вашей задачи — решать вам.

Проблемы с float

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

  • «Выталкивание» (pushdown). Возникает когда элемент внутри float-элемента оказывается шире его (обычно это изображения). Большинство браузеров обработает такие элементы вне float-структуры и вёрстка не будет сломана. IE расширит элемент, чтобы изображение влезло, зачастую это ломает дизайн. На картинке представлен пример, как изображение торчит из основного контента и таким образом «выталкивает» сайд-бар вниз. Самый просто способ избежать этого — это проверить что все ваши изображения подходят по ширине. Можно использовать overflow: hidden;, чтобы обрезать выступающую часть.
  • Двойной внешний отступ. Ошибка проявляющаяся в IE6, в случае если вы устанавливаете внешний отступ в том же направлении, в котором у вас указан float. В этом случае отступ удваивается. Чтобы исправить это, необходимо установить плавающему (float) элементу свойство display: inline;, не беспокойтесь, элемент по прежнему будет блочным.
  • Трёх-пиксельный прыжок (3px Jog). Ошибка, которая проявляется следующим образом: текст, который расположен рядом с float-элементом неожиданно съезжает на 3 пикселя. Чтобы избежать этого, необходимо установить ширину или высоту пострадавшему тексту.
  • В IE7 существует Ошибка нижнего внешнего отступа (Bottom Margin Bug) — возникает когда элемент с установленным свойством float, содержит в себе ещё один float-элемент. В таких случаях, нижний внешний отступ дочернего элемента игнорируется. Для обхода этой проблемы необходимо использовать внутренний отступ родительского элемента, вместо внешнего отступа дочернего.

Альтернативы float

Если вам необходимо обтекание картинки текстом, то альтернатив нет. Но для макета страницы, определённо есть выбор. Существуют очень интересные подходы, в которых комбинируется гибкость float с мощью абсолютного позиционирования. В CSS3 есть, так называемый, Модуль разметки шаблона (Template Layout Module), который в будущем предоставит достойную альтернативу float.

Позиционирование в CSS

От автора: одним из наиболее полезных инструментов в CSS, на мой взгляд, является позиционирование элементов документа. Под термином «позиционирование» понимается возможность расположить элемент (блок, картинку и др.) в абсолютно любом месте документа.

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

Для начала давайте рассмотрим классический пример, где нам потребуется использование позиционирования… к слову, пример этот как раз и взят из одного из упомянутых выше вопросов. Итак, на указанной части шаблона:

Практический курс по верстке адаптивного сайта с нуля!

Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3

Узнать подробнее

мы имеем 2 логические части — шапка и блок меню. При этом оба блока содержат в себе части единой картинки — автомобиля «заезжающего» с шапки на меню. Теоретически здесь мы могли бы обойтись и без позиционирования. Для этого достаточно было бы вырезать картинку шапки и фон меню, при этом на каждой из картинок присутствовала бы своя часть автомобиля:

Но этот вариант далеко не оптимален. Гораздо лучше было бы, если бы у нас имелась отдельно картинка автомобиля, которая совсем не зависела бы от остального потока элементов. В этом случае мы смогли бы «таскать» автомобиль, выбирая для него нужное расположение. Как раз такую возможность нам предоставляет свойство CSS под названием position.

Указанное свойство имеет следующие возможные атрибуты: position: absolute | fixed | relative | static

Относительно атрибута static следует заметить, что его можно не использовать вообще, поскольку изначально это атрибут любого элемента на странице, поэтому если указать для элемента свойство position:static, то абсолютно никаких изменений мы не увидим.

А вот 3 других атрибута — весьма полезны. Для начала давайте укажем описание каждого из них.

absolute (абсолютный). Указывает, что элемент абсолютно позиционирован. В этом случае он не существует в обычном потоке документа подобно другим элементам, которые отображаются на веб-странице словно абсолютно позиционированного объекта и нет. Положение элемента задается атрибутами left, top, right и bottom относительно края окна браузера.

— fixed (фиксированный). По своим свойствам это значение аналогично аргументу absolute, но в отличие от него привязывается к указанной параметрами left, top, right и bottom точке на экране и не меняет своего положения даже при пролистывании веб-страницы.

— relative (относительный). Положение элемента устанавливается относительно его исходного места. Добавление атрибутов left, top, right и bottom изменяет позицию элемента и сдвигает его в ту или иную сторону от первоначального расположения, в зависимости от применяемого параметра.

Итак, как же мы можем осуществить задуманное. Все просто. Нам известна ширина макета сайта (она фиксирована). Соответственно, все что потребуется — это разместить картинку, к примеру, в шапке и спозиционировать ее относительно шапки. «Сдвигать» картинку мы можем посредством упомянутых атрибутов left (сдвиг от левой границы), top (сдвиг от верхней границы), right (сдвиг от правой границы) и bottom (сдвиг от нижней границы). Во всех четырех случаях границами будут границы элемента, относительно которого осуществляется позиционирование. И вот здесь есть небольшой нюанс, который мы сейчас увидим.

Итак, картинку автомобиля мы вырезали из макета и размещаем ее в шапке:

<div>
<a href «/»> Записки Путешественника</a>
<h3>на своем АВТО<br>и не только…</h3>
<img src=»images/car.png» alt=»» />
</div>

<div>

<a href «/»> Записки Путешественника</a>

<h3>на своем АВТО<br>и не только…</h3>

<img src=»images/car.png» alt=»» />

</div>

В результате автомобиль расположится между ссылкой (для нее установлено выравнивание float:left) и заголовком второго уровня (для него установлено выравнивание float:right) в шапке. Пока что наша картинка находится в потоке элементов. Теперь давайте «изымем» ее из этого потока, чтобы ее можно было передвигать. Установим для элемента с классом car абсолютное позиционирование:

Если сейчас обновить страницу, то никаких изменений мы не увидим. Все потому, что мы пока что не указали те самые атрибуты left, top, right и bottom. Для позиционирования элемента необходимо указывать 2 атрибута (1 из них должен отвечать за горизонтальное движение, второй — за вертикальное… например, пара left-top или left-bottom, или right-top и т.д.).

Для начала давайте укажем нулевую точку отсчета для картинки, прижав ее к верхнему левому углу:

.car{
position:absolute;
left:0;
top:0;
}

.car{

position:absolute;

left:0;

top:0;

}

Теперь, если обновить страницу, то мы сможем увидеть, что картинка действительно оказалась в верхнем левом углу, но не шапки, как мы могли ожидать… картинка прижалась к левому верхнему углу браузера:

Почему так произошло? Дело в том, что задав абсолютное позиционирование элементу, он начинает позиционироваться относительно элемента body. Как же сделать так, чтобы элемент позиционировался относительно другого конкретного элемента, например, относительно своего родителя — шапки? Все очень просто. Для этого мы можем задать родительскому элементу, к примеру, свойство относительного позиционирования. После этого дочерний блок будет позиционироваться уже относительно своего родителя, а не относительно элемента body.

.head{
height: 250px;
position:relative;
}
.car{
position:absolute;
left:0;
top:0;
}

.head{

height: 250px;

position:relative;

}

.car{

position:absolute;

left:0;

top:0;

}

Практический курс по верстке адаптивного сайта с нуля!

Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3

Узнать подробнее

При этом заметьте, что элемент уже вне потока документа, т.е. другие элементы его попросту «не замечают» — автомобиль перекрывает ссылку, игнорируя свойство обтекания float:left. Отлично, мы спозиционировали картинку относительно родителя. Осталось подивнуть ее на определенное количество пикселей от левой и верхней границ родителя (атрибуты left-top). Здесь можно взять соответствующие координаты из макета фотошопа или использовать другие удобные инструменты… или просто выровняв картинку «на глаз».

.car{
position:absolute;
left:450px;
top:140px;
}

.car{

position:absolute;

left:450px;

top:140px;

}

И мы добиваемся необходимого результата:

Ничего сложного нет. Поскольку макет я взял из вопроса пользователя — я не буду его прикладывать к дополнительным материалам. Практически аналогичный макет Вы можете найти в нашем курсе – Как нарисовать обалденный дизайн сайта с нуля, сверстать его и установить на WordPress

Для закрепления материала давайте решим следующую задачу, используя возможности позиционирования. Итак:

1. Необходимо разместить блок со строго заданными размерами по центру документа.
2. В этом блоке необходимо спозиционировать дочерний блок относительно его родителя.
3. Также необходимо создать блок, который должен быть прижат к левой границе браузера и при этом его положение должно быть фиксированным, т.е. он должен оставаться на месте, несмотря на возможную прокрутку документа.

Начнем с первого. Имеем блок со следующими размерами: ширина — 500 пикселей, высота — 300 пикселей. Необходимо центрировать этот блок относительно окна браузера. Вполне очевидно, что здесь мы должны воспользоваться относительными величинами (процентами), поскольку разрешение у каждого конкретного пользователя может отличаться — это и 1024*768, и 1440*900, и масса прочих.

Указываем разметку блока:

<div></div>

<div></div>

Его стили:

.block{
width:500px;
height:300px;
border:1px solid red;
position:absolute;
left:50%;
top:50%;
}

.block{

width:500px;

height:300px;

border:1px solid red;

position:absolute;

left:50%;

top:50%;

}

Если посмотреть результат в браузере, то увидим, что сейчас центрирована левая верхняя точка блока. Это логично, поскольку эта точка является своеобразным началом системы координат блока. И именно эту точку мы отодвинули от левого верхнего угла браузера на 50% (left:50%; top:50%). Мы центрировали вершину блока, но каким образом центрировать блок? Здесь все просто. Для реализации задуманного мы воспользуемся отступами (свойство margin) и подвинем блок вверх на половину его высоты и влево на половину ширины. Таким образом, мы получим центр самого блока, который и совпадет с центром документа:

.block{
width:500px;
height:300px;
border:1px solid red;
position:absolute;
left:50%;
top:50%;
margin:-150px 0 0 -250px;
}

.block{

width:500px;

height:300px;

border:1px solid red;

position:absolute;

left:50%;

top:50%;

margin:-150px 0 0 -250px;

}

Теперь второе задание. Здесь просто. Создаем разметку дочернего блока:

<div>
<div></div>
</div>

<div>

<div></div>

</div>

И его стили:

.child{
width:200px;
height:100px;
border:1px solid #000;
position:absolute;
left:100px;
top:50px;
}

.child{

width:200px;

height:100px;

border:1px solid #000;

position:absolute;

left:100px;

top:50px;

}

Ничего нового здесь нет — все тоже мы делали с автомобилем за тем исключением, что здесь родительский блок имеет свойство position:absolute (в первом примере для родителя мы устанавливали position:relative). Однако здесь мы все равно получили нужный результат, поскольку неважно какое свойство задано для родителя (absolute или relative) — дочерний блок все равно будет позиционирован относительно родителя.

И последнее задание. Со свойством position:fixed мы пока что не работали, но ничего сложного там также нет. Данное свойство очень похоже на position:absolute за одним исключением: элемент с таким свойством «привязывается» к точке окна браузера с указанными координатами.

Создаем разметку:

<div>
<div></div>
</div>
<div></div>

<div>

<div></div>

</div>

<div></div>

И стили:

.fix{
width:20px;
height:150px;
border:1px solid #000;
position:fixed;
top:200px;
left:0;
}

.fix{

width:20px;

height:150px;

border:1px solid #000;

position:fixed;

top:200px;

left:0;

}

Таким образом, мы указали, что блок всегда будет прилегать к левой границе документа (left:0;) и всегда будет иметь отступ от верхней границы 200 пикселей (top:200px;). Для того, чтобы убедиться в этом, достаточно увеличить высоту блока с классом block для получения полосы прокрутки. Теперь, если прокручивать документ, фиксированный блок всегда будет занимать одну и ту же позицию относительно окна браузера.

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

Практический курс по верстке адаптивного сайта с нуля!

Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3

Узнать подробнее

PSD to HTML

Верстка сайта на HTML5 и CSS3 с нуля

Смотреть

позиционирование в CSS и HTML, relative, absolute, fixed, static, sticky


Автор Андрей На чтение 5 мин. Просмотров 510 Опубликовано
Обновлено

Свойство position помогает управлять расположением элементов на странице. Например, следующие инструкции:

.element {
  position: relative;
  top: 10px;
}

сместят элемент относительно своего исходного положения вниз на 10px.

Синтаксис

position: static | absolute | relative | fixed | sticky | inherit

Свойство может применяться вместе с указанием отступа от краев контейнера (левого, нижнего, правого, верхнего).

Например, создадим два контейнера, родительский (parent) – в синей рамке и дочерний (element) внутри него. Для дочернего элемента установим относительное позиционирование relative и сдвиги сверху и слева по 10px.

.element {
position: relative;
  top: 10px;
  left: 10px;
}

Результат выполнения видно ниже.

See the Pen
position relative by Андрей (@adlibi)
on CodePen.

Значения

Свойство position может принимать следующие значения:

static
По умолчанию каждый элемент имеет положение static, при котором он находится в обычном потоке страницы. Если установлено, то применение lefttopright и bottom не имеет никакого воздействия.
absolute
Элемент удаляется из потока документа, а другие блоки будут вести себя так, как будто его нет. Положение блока определяется значениями toprightbottom, и left. Блок расположится как бы поверх всех элементов. Учтите, что на местоположение влияет значение свойства position его предка. Позиционирование идет от ближайшего предка со значением position не равном static. Если такого не найдется, отсчет координат идет от документа.
relative
Позиционируется обычным образом, а затем смещается относительно своей позиции в соответствии со значениями toprightbottom и left. Такое смещение не влияет на местоположение других элементов.
fixed
При указании этого значения элемент привязывается к точке на экране, указанной значениями lefttopright и bottom, при этом блок не меняет своего положения при прокрутке документа.
sticky
Экспериментальное свойство – элемент обрабатывается как имеющий относительное положение до тех пор, пока положение прокрутки области просмотра не достигнет указанного порога, после чего блок занимает фиксированное положение, в котором он и остается.
inherit
Это значение можно использовать, чтобы принудительно заставить наследовать значение позиционирования от его предка.

Координаты

Для сдвига можно использовать четыре координаты:

  • top – сдвиг от верхней границы
  • bottom – сдвиг от нижней границы
  • left – сдвиг слева
  • right – сдвиг справа

Не будут работать одновременно указанные top и bottomleft и right. Нужно использовать только одну границу из каждой пары.

В качестве указания значений можно использовать принятые в CSS единицы измерения: px, em и т.п., а также проценты. Так, left: 10% сместит элемент на 10% его ширины вправо.

Возможны отрицательные координаты. При смещении часть элемента может оказаться за границей контейнера или документа.

Рассмотрим их работу подробнее на примерах.

Абсолютное позиционирование

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

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

div.element {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
}

В результате видим, что элемент расположился относительно всего документа (прижался к его низу), а не своего предка.

See the Pen
position absolute 2 by Андрей (@adlibi)
on CodePen.

Таким образом для корректного положения нужно задать позиционирование для предка. Например:

.parent {
  position: relative;
}

Теперь свойства top, bottom, left, right соотносятся с предком и видно, как изменилось положение элемента – получилось прижать элемент к низу блока-родителя.

See the Pen
position absolute by Андрей (@adlibi)
on CodePen.

Кроме того:

  • Ширина элемента с position: absolute устанавливается по содержимому.
  • Элемент получает свойство display:block.

Фиксированное позиционирование

Значение fixed по воздействию похоже на  абсолютное позиционирование. Оно поможет расположить элемент в любом месте  документа, но это расположение не будет меняться при прокрутке документа. Посмотрите на поведение дочернего элемента на демонстрации ниже, на то, как при прокрутке он продолжает оставаться внизу страницы.

See the Pen e0e72fa57f387265fb7a3aa7a296d684 by CSS-Tricks (@css-tricks) on CodePen.

Для закрепления блока внизу экрана использовалось bottom, и точно также вы можете поднять его вверх используя свойство top.

При position, установленном в значения absolute или fixed, свойство display по умолчанию устанавливается в block, а float — в none.

“Липкое” позиционирование

Sticky можно перевести как “липкий”. Это некий компромисс между относительным и фиксированным значениями. На текущий момент это экспериментальное значение и не является частью официальной спецификации. Оно лишь частично поддерживается некоторыми браузерами. Поэтому, вероятно, пока не стоит использовать его на рабочих проектах.

Что оно делает? Позволяет позиционировать элемент относительно чего-либо в документе, а затем, когда пользователь прокручивает определенную точку в области просмотра, фиксирует положение элемента в этом месте, чтобы он оставался постоянно отображаемым, как фиксированный. Проще понять его работу взглянув на пример ниже.

Sticky элемент «прилипает» к своему ближайшему предку с прокруткой, созданной при overflow равном hiddenscrollauto или overlay, даже если тот не является ближайшим фактически прокручивающим родителем.

Возьмем пример:

.element {
  position: sticky; top: 30px;
}

Здесь элемент будет располагаться относительно, пока при прокрутке области просмотра его положение не достигнет точки, в которой он будет находиться на расстоянии 30px от верха области просмотра. В этот момент он станет липким и остается в фиксированной позиции 30 пикселей вверху экрана.

Следующий пример демонстрирует иллюстрирует момент, где первое меню навигации имеет относительное позиционирование по умолчанию, а второе меню настроено на закрепление в самом верху области просмотра. Этот пример будет работать в Chrome, Safari и Opera, а в остальных браузерах только если они уже доработали его поддержку.

See the Pen
position sticky by Андрей (@adlibi)
on CodePen.

CSS display: inline-block: почему это круто и почему отстой

Обычно, когда вам нужен горизонтальный список, вам нужно использовать float в коде CSS, чтобы он работал, со всеми его недостатками. Однако есть альтернатива с дисплеем : встроенный блок .

Проблемы с поплавком

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

Введите отображение: встроенный блок

Здесь в игру вступает магическое значение inline-block для свойства display . По сути, это способ сделать элементы встроенными, но с сохранением их блочных возможностей, таких как установка ширины и высоты, верхнего и нижнего полей, отступов и т. Д.Простой пример будет выглядеть так:

 <стиль>
ul # display-inline-block-example,
ul # display-inline-block-example li {
/ * Установка общей базы * /
маржа: 0;
отступ: 0;
}

ul # display-inline-block-example li {
дисплей: встроенный блок;
ширина: 100 пикселей;
минимальная высота: 100 пикселей;
фон: #ccc;
}


  • Пункт первый
  • Пункт второй
  • Пункт третий

Результаты обработки

  • Позиция первая
  • Пункт два
  • Элемент три

Как видите, display: inline-block; помогает нам визуализировать три квадратных серых прямоугольника рядом друг с другом.Классно, правда? Однако с различным содержанием нам нужно добавить свойство vertical-align: top , чтобы убедиться, что все выровнено по верхнему краю.

 <стиль>
ul # display-inline-block-example,
ul # display-inline-block-example li {
/ * Установка общей базы * /
маржа: 0;
отступ: 0;
}

ul # display-inline-block-example li {
дисплей: встроенный блок;
ширина: 100 пикселей;
минимальная высота: 100 пикселей;
фон: #ccc;
вертикальное выравнивание: сверху;
}


  • Пункт первый
  • Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два
  • Пункт третий

Результаты обработки

  • Позиция первая
  • Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два
  • Элемент три

Это будет нормально отображаться в Firefox, Safari, Google Chrome и IE 8.Однако для более старых версий Internet Explorer нам нужно активировать hasLayout, а также использовать небольшой прием, чтобы установить отображение на inline (обратите внимание, что этот код может быть в отдельной таблице стилей для IE, включенной через условные комментарии — это встроенный здесь для простоты):

 <стиль>
ul # display-inline-block-example,
ul # display-inline-block-example li {
/ * Установка общей базы * /
маржа: 0;
отступ: 0;
}

ul # display-inline-block-example li {
дисплей: встроенный блок;
ширина: 100 пикселей;
минимальная высота: 100 пикселей;
фон: #ccc;
вертикальное выравнивание: сверху;

/ * Для IE 7 * /
масштабирование: 1;
* дисплей: встроенный;
}


  • Пункт первый
  • Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два Элемент два
  • Пункт третий

Результаты рендеринга, которые будут работать и в IE 7

  • Позиция первая
  • Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два Позиция два
  • Элемент три

Огромный недостаток

Я надеюсь, что мне удалось заставить вас осознать потенциал и простоту этого подхода.Однако есть один огромный недостаток, который может относиться или не относиться к вашему варианту использования. То есть, поскольку элементы становятся встроенными, пробелы в вашем HTML-коде будут влиять на визуализацию. Это означает, что если нам нужен идеальный размер и выравнивание, но у нас есть пространство между элементами LI в нашем примере кода, он будет отображать поле в 4 пикселя справа от каждого элемента.

В качестве примера давайте проясним его, предоставив окружающему элементу UL фиксированную ширину, в то время как элементы LI должны соответствовать :

 <стиль>
ul # display-inline-block-example,
ul # display-inline-block-example li {
/ * Установка общей базы * /
маржа: 0;
отступ: 0;
}

ul # display-inline-block-example {
ширина: 300 пикселей;
граница: 1px solid # 000;
}

ul # display-inline-block-example li {
дисплей: встроенный блок;
ширина: 100 пикселей;
минимальная высота: 100 пикселей;
фон: #ccc;
вертикальное выравнивание: сверху;

/ * Для IE 7 * /
масштабирование: 1;
* дисплей: встроенный;
}


  • Пункт первый
  • Пункт второй
  • Пункт третий

Результаты обработки

  • Позиция первая
  • Пункт два
  • Элемент три

Как видите, третий элемент теперь переместится в следующую строку.Что отстой! Жесткий! Однако, если бы мы разместили элементы LI непосредственно друг за другом, все они были бы визуализированы в одной строке:

 
  • Пункт один
  • Пункт два
  • Пункт три

Заключение

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

Ссылки по теме

Кроссбраузерный встроенный блок

CSS Inline vs Inline-Block vs Block

Хорошо, давайте заменим изображения на CSS. Помимо вопросов об алгоритмах JavaScript, вы, как Front End разработчик, также можете получить вопросы, связанные с CSS. Итак, давайте убедимся, что вы готовы, и углубим свои основы работы в Интернете!

Меня действительно спросили об этом в интервью. Я проходил собеседование на роль Front-end, поэтому готовился только к вопросам алгоритма.Так что я немного наткнулся на это 😰 Это лучшее из ошибок, у вас есть шанс извлечь из этого урок, чтобы не повторять их снова. Вот почему я всегда рекомендую людям подавать заявки в как можно большее количество мест. Собеседование похоже на любой навык: чем больше вы практикуетесь, тем лучше вы становитесь. Теперь этот вопрос меня больше не беспокоит, потому что я буду готов! И вы тоже, давайте начнем!

а.

встроенный

Отображает элемент как встроенный элемент. Любые свойства высоты и ширины не будут иметь никакого эффекта.

Свойство display определяет поведение отображения элемента. Это необходимо знать для управления компоновкой элемента. Существует множество ценностей собственности. Но давайте начнем с основного inline .

Отображает элемент в строке или в той же строке. Другими словами, встроенные элементы НЕ начинаются с новой строки и занимают ровно столько ширины, сколько ее содержимое. Итак, если вы попытаетесь установить любую ширину и высоту, это не будет иметь никакого эффекта.

inline elements

Вот несколько элементов, которые имеют свойство inline по умолчанию:

И большинство тегов форматирования также по своей сути inline :

b.

inline-block

Отображает элемент как контейнер блока встроенного уровня. Вы МОЖЕТЕ установить значения высоты и ширины.

Хорошо, перейдем к inline-block . По сути, это то же самое, что и inline , за исключением того, что вы можете установить значения высоты и ширины.

г.

block

Проверить длину строки

До сих пор мы говорили о inline . Теперь перейдем к противоположному, блоку . Помните, что встроенных элементов появляются в одной строке. Итак, блок начинается с НОВОЙ строки и занимает всю доступную ширину. Это означает, что элементы блока будут занимать всю ширину его родительского элемента.

block elements

Вот несколько элементов, которые имеют свойство block по умолчанию:

Объяснено в терминах, не связанных с разработкой

Представьте, что если вы посещаете концерт, у вас есть ряды сидений, верно.Если вы назначите своему другу место inline , он сядет рядом с вами. Итак, что касается сидений inline , это то, что все они являются одним и тем же физическим стулом. Вы не можете манипулировать стулом, чтобы сделать его больше или меньше. Один размер подходит всем, что они называют!

Теперь ваша подруга Дженнифер хочет присоединиться к вам, но потому что она дочь владельца стадиона. Ей назначают место inline-block . Что ж, она все еще может сидеть рядом с тобой. Потому что она «в русле» с тобой (плохой каламбур, смеется), и, конечно же, ты хочешь, чтобы она села рядом с тобой.Однако, поскольку она дочь стадиона, ее мама хочет убедиться, что ей комфортно. Поэтому она дает ей специальное сиденье, где ее стул настраивается и может быть отрегулирован, чтобы сделать его больше или меньше. Кумовство в самом лучшем виде 🤫

Твоя одноклассница Анджелина тоже присутствует на концерте. Теперь твоей подруге Дженнифер она не очень нравится. Поэтому она просит маму выделить ей место , блок . Таким образом, Анджелина не сядет рядом с вами. Вместо этого она сидит в следующем ряду.

Окончательное решение

inline Элемент не начинается на новой строке, а занимает только необходимую ширину.Вы не можете установить ширину или высоту.

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

block Элемент начнется с новой строки и займет всю доступную ширину. И вы можете установить значения ширины и высоты.

Вот наглядное изображение того, как выглядят все эти элементы iplay :

Теперь, в вашем техническом собеседовании, вы можете получить ответ на этот вопрос:

  • В чем разница между inline и block
  • В чем разница между inline и inline-block

Но независимо от того, какой вариант, вы должны уметь их решать! Удачи вам с собеседованием 👍

Ресурсы

Как с помощью CSS настроить ширину div для соответствия содержимому?

Есть три способа решить эту проблему, которые перечислены ниже:

  1. Случай по умолчанию
  2. Использование свойства inline-block
  3. Использование свойства fit-content по ширине и высоте

Случай по умолчанию: HTML div по умолчанию соответствует содержимому внутри него.Пример выглядит так:
Пример 1:

Внимание, читатель! Не прекращайте учиться сейчас. Освойте все важные концепции HTML с Web Design for Beginners | HTML курс.

< html lang = «en» dir = t

< головка >

< meta charset = "utf-8" > 9000ee 000 e Пример title >

< style media = "screen" 0005 "тело экрана" >

фон: оранжевый;

переполнение: скрыто;

цвет: белый;

}

.GeeksForGeeks {

выравнивание текста: по центру;

фон: dodgerblue;

позиция: абсолютная;

верх: 50%;

осталось: 1%;

правый: 1%;

}

стиль >

головка >

< h2 style = "цвет: лесно-зеленый; вверху: 35%;

слева: 35%; положение: абсолютное

;">

Вундеркинды Для вундеркиндов

h2 >

< div 000 00050005 000

Каскадные таблицы стилей, ссылки с любовью

90 006 как CSS - это просто разработанный язык

, предназначенный для упрощения процесса

создания презентабельных веб-страниц.CSS

позволяет вам применять стили к веб-страницам. Подробнее

что важно, CSS позволяет вам делать это

независимо от HTML, составляющего

каждую веб-страницу.

div >

корпус >

0006 Вывод:

Использование свойства inline-block: Используйте свойство display: inline-block, чтобы установить размер div в соответствии с его содержимым.

Пример 2:

< html lang =

"en" < головка >

< мета кодировка = «utf-8» >

Пример GeeksforGeeks title >

< style media = 9000 "экран " экран

фон: фиолетовый;

переполнение: авто;

цвет: белый;

}

.GeeksForGeeks {

выравнивание текста: по центру;

фон: dodgerblue;

позиция: абсолютная;

дисплей: встроенный блок;

осталось: 1%;

правый: 1%;

верх: 50%;

}

стиль >

головка >

< h2 style = "color: forestgreen;

вверху: 35%; слева: 35%; положение: абсолютное;">

Geeks Для компьютерных фанатов

h2 >

< div class 9000ee6 000 000 000 000 000 000 Каскадные таблицы стилей, с любовью называемые

CSS, - это простой дизайн. ned language

предназначен для упрощения процесса

создания презентабельных веб-страниц.CSS

позволяет вам применять стили к веб-страницам. Подробнее

что важно, CSS позволяет вам делать это

независимо от HTML, составляющего

каждую веб-страницу.

div >

корпус >

0006 Вывод:

Использование свойства fit-content в ширине и высоте: В этом методе мы устанавливаем для свойства width и height значение fit-content.
Пример 3:

< html lang = "en" 000 "en" 000 "en" 000 "en" >

< голова >

< meta charset = "utf > 9000 title > Geeks for Geeks Example title >

< style 0005 media media

тело {

фон: помидор;

переполнение: скрыто;

цвет: белый;

}

.GeeksForGeeks {

фон: малиновый;

позиция: абсолютная;

ширина: fit-content;

высота: fit-content;

осталось: 0;

верх: 50%;

}

стиль >

головка >

< h2 style = "цвет: салатовый; верх: 35%;

слева: 35%; положение: абсолютное;">

Для компьютерных фанатов

h2 >

< div class 9000ee6 000 000 000 000 000 000 Каскадные таблицы стилей, с любовью называемые

CSS, представляют собой просто d Разработанный язык

предназначен для упрощения процесса

создания презентабельных веб-страниц.CSS

позволяет вам применять стили к веб-страницам. Подробнее

что важно, CSS позволяет вам делать это

независимо от HTML, составляющего

каждую веб-страницу.

div >

корпус >

0006 Вывод:

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

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

Выровнять текст с помощью HTML / CSS? Не делай этого!

Выровнять текст с помощью HTML / CSS? Не делай этого! - Дизайн для хакеров. Обосновать текст с помощью HTML / CSS? Не делай этого! - Дизайн для хакеров

Курс визуального дизайна | Белый космический курс

Книга в помощь разработчикам
и программисты изучают веб-дизайн.Это бестселлер (18-е место на всем Amazon).
автор: @kadavy

Сейчас 3 часа ночи, и вы вносите последние штрихи в свой макет. Он выглядит чистым, все на своих местах - выровнено по сетке. Вы прищуриваетесь издалека. «Края этих блоков выглядят неровными», - говорите вы себе. Вы переходите в Sublime и набираете text-align: justify .

Вместо того, чтобы говорить «кто?» сова за окном ахает, ага !?

Вы только что сделали ошибку новичка в дизайне! Вы никогда не должны оправдывать шрифт в Интернете.Вот почему.

Чистые линии по краям = беспорядок внутри текстового блока

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

Выравнивающий шрифт в Интернете делает большие дыры в блоках текста, которые прерывают чтение и делают текстовый блок неровным.

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

Интернет-технология не готова к оправданию

Приложения

Layout, такие как InDesign, имеют сложные способы равномерного выравнивания текстовых блоков.

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

CSS и браузеры оставляют огромные дыры в текстовых блоках при выравнивании шрифта.

Но браузеры, которые обрабатывают CSS и HTML, лишены большинства этих функций. Все, что они делают, это увеличивают интервал между словами, что, конечно же, приводит к неприятным пробелам в текстовом блоке, особенно если текстовый блок имеет идеальную длину строки в 8–15 слов.CSS имеет свойство дефисов , но даже если бы оно поддерживалось большинством браузеров (а это не так), одного расстановки переносов было бы недостаточно для выравнивания текста.

Выровненный по ширине текст труднее читать

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

Это просто плохая типографика

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

  • Сама задача типографики - передавать слова.
  • Для передачи слов вам нужны буквы.
  • Буквы предназначены для создания ровной «текстуры» в текстовых блоках.Только истинная природа каждой буквы просвечивает.
  • Обоснование текста нарушает эту ровную текстуру. Даже если программа верстки страницы использует тонкий интервал между буквами или регулирует ширину букв - эти вещи тоже сделают текстуру неровной.
  • Итак, выровненного по ширине текста действительно следует избегать не только в Интернете, но и везде, где это возможно.

Просто скажи «нет» оправданию

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

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

Узнайте больше в нашем бесплатном электронном курсе

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

Конфиденциальность | G +
D4H.com работает на WordPress. Хостинг и оптимизация WordPress с помощью WPEngine (купон).

Kadavy, Inc. оставляет за собой права на содержимое этого сайта в соответствии с этой лицензией Creative Commons.
| Купоны и промокоды

Расширенные макеты с абсолютным и фиксированным позиционированием · Документы WebPlatform

Сводка

В этой статье рассматривается абсолютное и фиксированное позиционирование.

Введение

Теперь пора обратить ваше внимание на вторую пару значений свойств , позиция - абсолютное и фиксированное . Первая пара значений - статический и относительный - тесно связаны, и мы подробно рассмотрели их в предыдущей статье.

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

Фиксированное позиционирование - это просто специализированная форма абсолютного позиционирования; элементы с фиксированным позиционированием фиксируются относительно окна просмотра / браузера, а не содержащего элемента; даже если страница прокручивается, они остаются в том же положении внутри окна браузера.

В этой статье мы рассмотрим несколько практических примеров использования позиционирования absolute и fixed , рассмотрим некоторые особенности поддержки браузеров и исследуем концепцию z-index.

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

Содержащие блоки

Важным понятием, когда дело доходит до абсолютного позиционирования, является содержащий блок: блок блока, относительно которого расположены положение и размеры абсолютно позиционированного блока.Для статических блоков и блоков, расположенных относительно друг друга, содержащий блок является ближайшим предком на уровне блока, другими словами, родительским элементом. Однако для абсолютно позиционированных элементов все немного сложнее. В этом случае содержащий блок является ближайшим -м предком . Под «позиционированным» мы подразумеваем элемент, у которого свойство position установлено в значение relative , absolute или fixed - другими словами, все, кроме обычных статических элементов.

Итак, устанавливая position: relative для элемента, вы делаете его содержащим блоком для любого абсолютно позиционированного потомка (дочерних элементов), независимо от того, появляются ли они сразу под относительно позиционированным элементом в иерархии или ниже по иерархии.

Если абсолютно позиционированный элемент не имеет позиционированного предка, то содержащий блок - это то, что называется «начальным содержащим блоком», что на практике приравнивается к элементу html .Если вы смотрите на веб-страницу на экране, это означает окно браузера; если вы печатаете страницу, это означает границу страницы.

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

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

  1. Посмотрите на родительский элемент абсолютно позиционированного элемента - имеет ли свойство position этого элемента одно из значений: относительное , абсолютное или фиксированное ?
  2. Если да, то вы нашли содержащий блок.
  3. Если нет, перейдите к родительскому элементу и повторяйте с шага 1, пока не найдете содержащий блок или не исчерпаете предков.
  4. Если вы достигли элемента html , не найдя позиционированного предка, то содержащим блоком является элемент html .

Абсолютное позиционирование

Фиксированное позиционирование - это особая форма абсолютного позиционирования, поэтому мы изучим это позже и сконцентрируемся здесь на более общем случае. Если не указано иное, когда я использую термин «абсолютно позиционированный» с этого момента и до конца статьи, я буду ссылаться на оба элемента с положением : фиксированное и элементы с положением : абсолютное .

Указание позиции

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

Для относительно позиционированного элемента четыре свойства определяют относительное расстояние для смещения созданного блока.Помните, что в случае относительного позиционирования они дополняют друг друга, так что top: 1em и bottom: -1em означают одно и то же, и не имеет смысла указывать одновременно top и bottom (или слева ). и справа ) для того же элемента, потому что одно из значений будет проигнорировано.

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

Microsoft Internet Explorer версии 6 и старше не поддерживает метод указания всех четырех краев, но они поддерживают метод указания одного угла плюс размеры.

  / * Этот метод работает в IE6 * /
#foo {
  позиция: абсолютная;
  верх: 3em;
  слева: 0;
  ширина: 30em;
  высота: 20em;
}

/ * Этот метод не работает в IE6 * /
#foo {
  позиция: абсолютная;
  верх: 3em;
  справа: 0;
  внизу: 3em;
  слева: 0;
}
  

Здесь следует помнить, что значения, которые вы устанавливаете для свойств верхний , правый , нижний и левый , определяют расстояния от краев элемента до соответствующих им , содержащих края блока.Это не похоже на систему координат, где каждое значение относится к одной исходной точке. Например, right: 2em означает, что правый край абсолютно позиционированного блока будет на 2em от правого края содержащего блока.

При использовании абсолютного позиционирования абсолютно необходимо знать, какой у вас содержащий блок. Вот почему установка position: relative в содержащем блоке так полезна, даже если вы на самом деле не меняете положение поля.Он позволяет вам сделать элемент содержащим блоком для его абсолютно позиционированных потомков - это дает вам контроль.

Давайте попробуем пример, чтобы увидеть, как это работает.

  1. Скопируйте приведенный ниже код в текстовый редактор и сохраните документ как absolute.html.

      
     
       
         
          Абсолютное позиционирование 
         
       
       
         
  2. Затем скопируйте следующий код в новый файл и сохраните его как absolute.css.

      html, body {
       маржа: 0;
       отступ: 0;
     }
    
     #outer {
       маржа: 5em;
       граница: 1px solid # f00;
     }
    
     #внутренний {
       ширина: 6em;
       высота: 4em;
       цвет фона: # 999;
     }
      
  3. Сохраните оба файла и загрузите HTML-документ в браузер.Вы увидите серый прямоугольник, окруженный несколько более широкой красной рамкой.

    Элемент #inner имеет заданную ширину и высоту, а также серый цвет фона. Элемент #outer , который является структурным родительским элементом #inner , имеет красную границу. Он также имеет поле 5em по периметру, чтобы сместить его от краев окна браузера и позволить нам более четко видеть, что происходит. Пока ничего удивительного, правда? Высота элемента #outer задается его дочерним элементом ( #inner ), а ширина - горизонтальными полями.

  4. Теперь посмотрите, что произойдет, если вы сделаете #inner абсолютно позиционированным! Добавьте следующее выделенное объявление к правилу #inner :

      #inner {
       ширина: 6em;
       высота: 4em;
       цвет фона: # 999;
       позиция: абсолютная;
     }
      
  5. Сохранить и перезагрузить. Вместо красной границы вокруг серого прямоугольника теперь есть только более толстая верхняя граница. А серая коробка вообще не двигалась! Вы этого ожидали?

Здесь происходят две интересные вещи.

Во-первых, создание абсолютно позиционированного #inner полностью удалило его из документооборота. Это означает, что его родительский элемент #outer теперь не имеет дочерних элементов, находящихся в нормальном потоке, поэтому его высота уменьшается до нуля. То, что выглядит как красная линия толщиной 2 пикселя, на самом деле является границей в 1 пиксель вокруг элемента с нулевой высотой - вы видите верхнюю и нижнюю границы, между которыми ничего нет.

Вторая интересная вещь - абсолютно позиционированная коробка не двигалась.Значение по умолчанию для свойств сверху , справа , снизу и слева - auto , что означает, что поле с абсолютным позиционированием появится именно там, где оно было бы, если бы оно не было расположено. Однако, поскольку он удален из потока, он будет перекрывать любые элементы в нормальном потоке, следующие за ним. На самом деле это очень полезно - вы можете положиться на это, если хотите переместить сгенерированный блок только в одном измерении. Например, в раскрывающемся меню, управляемом CSS, «раскрывающиеся» панели могут быть абсолютно позиционированы с указанием только свойства top .Затем они автоматически появятся в ожидаемых координатах по оси X (так же, как их родительские).

  1. Затем давайте установим высоту для элемента #outer , чтобы он снова выглядел как прямоугольник, и переместим #inner в сторону. Добавьте следующие выделенные строки в свои правила CSS:

      #outer {
       маржа: 5em;
       граница: 1px solid # f00;
       высота: 4em;
     }
    
     #внутренний {
       ширина: 6em;
       высота: 4em;
       цвет фона: # 999;
       позиция: абсолютная;
       слева: 1em;
     }
      
  2. Сохраните и перезагрузите, и вы увидите некоторые изменения.Элемент #outer теперь снова является прямоугольником, поскольку вы задали для него высоту. Элемент #inner сместился в сторону, но не туда, где вы могли ожидать. Это не 1em от левого края своего родителя, а 1em от левого края окна! Причина в том, что, как объяснялось выше, #inner не имеет позиционированного предка, поэтому его содержащий блок является начальным содержащим блоком. Если вы укажете позицию, отличную от auto , она будет относиться к соответствующему краю содержащего блока.Когда вы устанавливаете left: 1em , левый край #inner заканчивается на 1em от левого края окна.

    1. Сохраните и перезагрузите - о чудо! Серый прямоугольник теперь находится на расстоянии 1em от левой границы родительского элемента. Установка position: relative в правиле #outer сделало его позиционированным и установило его как содержащий блок для любых абсолютно позиционированных потомков, которые он мог иметь. left: 1em , которое вы установили для #inner , теперь отсчитывается от левого края #outer , а не от левого края окна браузера.

Указание размеров

Абсолютно позиционированные элементы будут сжаты, чтобы соответствовать их содержимому, если вы не укажете их размеры. Вы можете указать ширину, задав свойства left и right , или задав свойство width . Вы можете указать высоту, задав свойства верхний и нижний или задав свойство высота .

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

Для абсолютно позиционированного элемента процентные значения для свойств left , right и width относятся к ширине содержащего блока. Значения в процентах для свойств top , bottom и height относятся к высоте содержащего блока.

Internet Explorer 6 и старше, а также Opera 8 и старше ошибались и использовали вместо этого размеры родительского блока .Давайте поэкспериментируем с другим примером, чтобы увидеть, как это может иметь большое значение.

  1. Начните с указания размеров #inner с использованием процентных значений - внесите следующие изменения в правило #inner :

      #inner {
       ширина: 50%; высота: 50%;
       цвет фона: # 999;
       позиция: абсолютная;
       слева: 1em;
     }
      
  2. Сохраните и перезагрузите, и вы увидите, что серый прямоугольник становится шире и короче (по крайней мере, если вы используете современный браузер).Содержащий блок по-прежнему имеет номер #outer , поскольку он имеет позицию : относительно . Ширина элемента #inner теперь вдвое меньше, чем у элемента #outer , а его высота составляет половину высоты #outer .

  3. Давайте снова сделаем область просмотра содержащим блоком, чтобы увидеть разницу! Внесите следующие изменения в #outer :

    .

      #outer {
       маржа: 5em;
       граница: 1px solid # f00;
       высота: 4em;
       положение: статическое;
     }
      
  4. Сохранить и перезагрузить - большая разница, а? Серое поле теперь вдвое меньше ширины и вдвое меньше окна браузера.Как видите, знание содержащихся блоков абсолютно необходимо!

Третье измерение - z-index

Естественно рассматривать веб-страницу как двумерную. Технологии еще недостаточно развиты, чтобы 3D-дисплеи стали обычным явлением, поэтому нам приходится довольствоваться шириной и высотой и поддельными 3D-эффектами. Но на самом деле рендеринг CSS происходит в трех измерениях! Это не значит, что вы можете заставить элемент зависать перед монитором - но вы можете делать другие полезные вещи с позиционированными элементами.

Две основные оси на веб-странице - это горизонтальная ось X и вертикальная ось Y. Начало этой системы координат находится в верхнем левом углу области просмотра, то есть там, где значения X и Y равны 0. Но есть также ось Z, которую мы можем представить как идущую перпендикулярно поверхности монитора. (или на бумагу при печати). Более высокие значения Z указывают на положение «перед» более низкими значениями Z. Значения Z также могут быть отрицательными, что указывает на положение «позади» некоторой точки отсчета (я объясню эту точку отсчета через минуту).

Прежде чем мы продолжим, предупреждаем, что это одна из самых сложных тем в CSS, поэтому не расстраивайтесь, если вы не поймете ее при первом чтении.

Позиционированные элементы (включая относительно позиционированные элементы) визуализируются в рамках так называемого контекста наложения. Элементы в контексте наложения имеют одну и ту же точку отсчета по оси Z. Подробнее об этом я расскажу ниже. Вы можете изменить положение Z (также называемое уровнем стека) позиционированного элемента, используя свойство z-index .Значение может быть целым числом (которое может быть отрицательным) или одним из ключевых слов auto или inherit . Значение по умолчанию - auto , что означает, что элемент имеет тот же уровень стека, что и его родительский элемент.

Следует отметить, что вы можете указать только позицию индекса вдоль оси Z. Вы не можете заставить один элемент отображаться на 19 пикселей позади или на 5 сантиметров впереди другого. Думайте об этом как о колоде карт: вы можете складывать карты и решать, что пиковый туз должен быть поверх трех бубен - у каждой карты есть свой уровень стека или Z-индекс.

Если вы указываете z-index как положительное целое число, вы назначаете ему уровень стека «перед» другими элементами в том же контексте стекирования, которые имеют более низкий уровень стека. Z-index 0 (ноль) означает то же самое, что и auto , но есть разница, к которой я вернусь через минуту. Отрицательное целочисленное значение для z-index назначает уровень стека «позади» родительского уровня стека.

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

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

  1. Фон и границы элементов, образующих контекст наложения
  2. Позиционированные потомки с отрицательными уровнями стека
  3. Потомки блочного уровня в нормальном потоке
  4. Плавучие потомки
  5. Потомки встроенного уровня в нормальном потоке
  6. Позиционированные потомки с уровнем стека, установленным как авто или (ноль)
  7. Позиционированные потомки с положительными уровнями стека

Выделенные записи - это элементы, уровень стека которых мы можем изменить с помощью свойства z-index .

Все это довольно сложно представить, поэтому давайте проведем несколько практических экспериментов, чтобы проиллюстрировать Z-индекс.

  1. Начните с добавления следующей выделенной строки в свой небольшой образец документа:

      <тело>
       
  2. Затем я предложу вам восстановить CSS так, чтобы #outer был содержащим блоком, и установить непроцентные размеры #inner .Давайте сделаем #outer немного выше, чтобы у вас было больше возможностей для экспериментов. Внесите следующие выделенные изменения в два правила:

      #outer {
       маржа: 5em;
       граница: 1px solid # f00;
       высота: 8em; положение: относительное;
     }
    
     #внутренний {
       ширина: 5em; высота: 5em;
       цвет фона: # 999;
       позиция: абсолютная;
       слева: 1em;
     }
      
  3. Добавьте также правило для элемента #second :

      #second {
       ширина: 5em;
       высота: 5em;
       цвет фона: # 00f;
       позиция: абсолютная;
       верх: 1em;
       слева: 2em;
     }
      
  4. Сохраните и перезагрузите, и вы увидите ярко-синюю рамку, перекрывающую серую.Оба поля имеют одинаковый уровень стека ( auto , начальное значение, что означает уровень стека 0), но синий прямоугольник отображается перед серым прямоугольником, потому что он появляется позже в исходном коде. Вы можете сделать так, чтобы серый прямоугольник появлялся впереди, задав ему положительный уровень стека. Вам нужно всего лишь установить его больше 0 - не нужно переусердствовать и использовать значение вроде 10000. Добавьте следующую выделенную строку в правило #inner :

      #inner {
       ширина: 5em;
       высота: 5em;
       цвет фона: # 999;
       позиция: абсолютная;
       слева: 1em;
       z-индекс: 1;
     }
      
  5. Сохраните и перезагрузите, и теперь вы увидите серое поле перед синим.

Локальные контексты стека

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

Каждый элемент, чей z-index указан как целое число, устанавливает новый, «локальный» контекст стека, в котором сам элемент имеет уровень стека 0.Это разница, о которой я упоминал ранее, между z-index: auto и z-index: 0 . Первое не устанавливает новый контекст стекирования, а второе - устанавливает.

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

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

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

Каждый раз, когда вы присваиваете целочисленное значение свойству z-index для элемента, вы создаете «конверт», который содержит этот элемент и его потомков.

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

  1. Начните с добавления содержимого к вашим двум внутренним элементам - добавьте выделенные строки в свой HTML-документ:

      
  2. Добавьте правило CSS, которое будет применяться к обоим элементам span :

      пролет {
       позиция: абсолютная;
       верх: 2em;
       слева: 2em;
       ширина: 3em;
       высота: 3em;
     }
      

    Это делает элементы span абсолютно позиционированными и задает их положение и размеры.Подождите секунду - span элементов встроены - как вы можете указать размеры для встроенных элементов? Ответ заключается в том, что абсолютно позиционированные элементы, такие как плавающие, автоматически создают блоки блоков. Указанные вами позиции будут применяться относительно каждого блока, содержащего span ’. Поскольку оба элемента span имеют абсолютно позиционированный div как родительский, эти родительские элементы берут на себя роль содержащихся блоков.

  3. Давайте теперь добавим цвет к элементам span , чтобы вы могли видеть, где они появляются.Добавьте в таблицу стилей следующие правила:

      # inner span {
       цвет фона: # ff0;
     }
    
     #second span {
       цвет фона: # 0ff;
     }
      
  4. Сохраните и перезагрузите, и вы должны увидеть желтый квадрат в нижнем правом углу большего серого квадрата и голубой квадрат в нижнем правом углу большего синего квадрата. Серый и желтый квадраты появляются перед синим и голубым квадратами, так как серый квадрат имеет z-index : 1 .

  5. Что делать, если вы хотите, чтобы голубой квадрат был впереди всех остальных квадратов? Все, что вам нужно сделать, это установить более высокий уровень стека, чем серый квадрат. На самом деле, достаточно присвоить ему тот же уровень стека , что и серый квадрат, поскольку голубой квадрат появляется позже в разметке. Давайте попробуем - внесите следующие изменения в свой CSS:

      #second span {
       цвет фона: # 0ff;
       z-индекс: 1;
     }
      
  6. Сохранить и перезагрузить. Если ваш браузер правильно поддерживает рекомендации CSS, голубой квадрат теперь должен быть впереди.Серый квадрат имеет z-index: 1 , что означает, что он устанавливает локальный контекст стекирования. Другими словами, вы создали один из этих «конвертов» и поместили внутрь серый квадрат и его желтый дочерний квадрат.

Еще не запутались? Следующий эксперимент должен прояснить ситуацию.

  1. Установите высокий уровень стека для желтого квадрата, чтобы вывести его на передний план - внесите следующие изменения в свой CSS:

      # inner span {
       цвет фона: # ff0;
       z-индекс: 4;
    }
      
  2. Если вы сохраните и перезагрузите, вы увидите… никаких изменений! Уровень стека, который мы указали для желтого квадрата, применяется в локальном контексте стека, установленном серым квадратом - желтый квадрат находится внутри конверта вместе со своим серым родительским элементом.Вы можете переместить голубой квадрат на передний план, потому что его родительский элемент (синий квадрат) не устанавливает локальный контекст наложения - он имеет подразумеваемый z-index : auto . Синий квадрат - это незакрепленная бумага в стопке. Желтые и голубые квадраты фактически находятся в маленьких конвертах сами по себе (они имеют целочисленный уровень стека и сами устанавливают локальные контексты стека).

  3. Если вы заставите синий квадрат установить локальный контекст наложения, вы не сможете переместить голубой квадрат на передний план, если вы также не перенесете его родительский элемент (синий квадрат) на передний план.Давайте попробуем - внесите следующие изменения в свой CSS:

      #inner {
    
       ...
    
       z-индекс: 2;
     }
    
     #второй {
    
       ...
    
       z-индекс: 1;
     }
    
     #second span {
    
       ...
    
       z-индекс: 3;
     }
      
  4. Сохранить и перезагрузить. Теперь серый и синий квадраты устанавливают локальные контексты наложения, что дает нам два конверта. Внизу стопки находится конверт с уровнем стопки 1, содержащий два внутренних конверта (синий квадрат и голубой квадрат). Вверху стопки находится конверт с уровнем стопки 2, содержащий два внутренних конверта (серый квадрат и желтый квадрат).В первом конверте синий квадрат имеет уровень локального стека 0, поэтому он появляется за голубым квадратом, который имеет уровень локального стека 3. Во втором конверте серый квадрат имеет локальный уровень стека 0, поэтому он появляется за желтым квадратом с локальным уровнем стека. уровень стека 4. На рисунке 1 показаны четыре бокса и два локальных контекста стека сбоку по оси Z.

Рисунок 1: Иллюстрация различных контекстов наложения.

Элементы, расположенные внутри «2», всегда будут появляться перед всеми элементами внутри «1».Затем в каждом контексте наложения элементы с более высоким номером z-индекса появляются перед элементами с небольшим номером z-индекса. Если два элемента имеют одинаковый номер z-index, то тот, который появляется позже в разметке, появится впереди.

Эта часть, вероятно, была довольно запутанной, особенно если вы новичок в CSS. Дело в том, что вам нужно знать контексты стекирования, если вы пытаетесь изменить уровни стека различных элементов. Если элемент принадлежит локальному контексту наложения, вы можете изменить его положение только по оси Z в этом локальном контексте.Элемент в одном локальном контексте наложения не может перемещаться между двумя элементами в другом локальном контексте наложения.

Хорошая новость в том, что вы, скорее всего, никогда не столкнетесь с этими проблемами. Изменения в z-index не очень распространены в хороших макетах, и если они вообще происходят, то обычно в пределах одного контекста стека.

Фиксированное позиционирование

Элемент с позицией : фиксированная фиксируется относительно области просмотра. Он остается на месте, даже если документ прокручивается.Для media = "print" фиксированный элемент будет повторяться на каждой печатной странице.

Обратите внимание, что Internet Explorer версии 6 и старше вообще не поддерживает фиксированное позиционирование. Если вы используете один из этих браузеров, вы не сможете увидеть результаты примеров в этом разделе.

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

  1. Внесите следующие изменения в свой код CSS:

      #inner {
       ширина: 5em;
       высота: 5em;
       цвет фона: # 999;
       положение: фиксированное; верх: 1em;
       слева: 1em;
     }
    
     #второй {
       ширина: 5em;
       высота: 150мм;
       цвет фона: # 00f;
       позиция: абсолютная;
       верх: 1em;
       слева: 2em;
     }
      
  2. Сохранить и перезагрузить.Если у вас нет вертикальной полосы прокрутки, увеличьте высоту , значение для #second . (А какой у вас гигантский монитор?) Высокий синий элемент выступает за нижнюю часть окна. Прокрутите страницу вниз и обратите внимание на серый квадрат в верхнем левом углу. #inner теперь фиксируется в позиции 1em сверху окна и 1em слева; поэтому при прокрутке серая рамка остается на том же месте на экране.

Заключение

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

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

Все позиционированные элементы отображаются на определенном уровне стека в контексте стекирования.Вы можете изменить уровень стека позиционированного элемента, используя свойство z-index . Когда z-index указан как целое число, элемент устанавливает локальный контекст стекирования для своих потомков.

См. Также

Вопросы для упражнений

  • Отмените изменения из примера фиксированного позиционирования, а затем измените порядок наложения между четырьмя абсолютно позиционированными квадратами так, чтобы серый квадрат был сзади, а затем синий, желтый и голубой квадраты в указанном порядке.(Совет: удалите все объявления z-index и начните заново.)
  • Переместите желтый квадрат вверх и вправо, установив top: -1em и left: 8em . Затем сделайте так, чтобы элемент #outer находился на позади элемента #outer , чтобы красная граница появилась на желтом квадрате.
  • Скопируйте макет из трех столбцов, который мы создали в статье о статическом и относительном позиционировании, используя вместо этого абсолютное позиционирование. Поскольку невозможно получить полноразмерный нижний колонтитул, вы можете удалить элемент #footer , но вам не разрешается изменять что-либо еще в разметке (кроме ссылки на таблицу стилей).
  • Измените макет из предыдущего упражнения, чтобы навигация использовала фиксированное позиционирование. Чтобы это стало возможным, необходимо удалить автоматические горизонтальные поля на элементе body . Добавьте достаточно содержимого в основной столбец и / или на боковую панель, чтобы появилась полоса прокрутки, чтобы вы могли убедиться, что она работает.

Как установить поля и отступы CSS (и классные трюки с макетом)

Эта статья была рецензирована Дэйвом Максвеллом, Адрианом Санду и Панайотисом Велисаракосом.Спасибо всем рецензентам SitePoint за то, что они сделали контент SitePoint как можно лучше!

Когда я только начинал изучать CSS, свойства полей и отступов меня всегда смущали. Они казались очень похожими и в некоторых случаях давали одинаковый результат.

В этом руководстве вы узнаете разницу между полями и отступами CSS и как эти свойства влияют на пространство между элементами на веб-странице. Мы также обсудим сворачивание полей, эффект использования различных единиц при создании адаптивных веб-сайтов и в заключение расскажем о некоторых трюках с макетом, которые вы можете сделать с помощью полей и отступов CSS.

Коробка Модель

Элементы в CSS представлены в виде прямоугольного блока . Размер прямоугольной коробки определяется размером элемента:

  • Содержание
  • Прокладка
  • Граница
  • Маржа

Область содержимого элемента находится в середине элемента . Заполнение окружает содержимое элемента. Границы , в свою очередь, окружают прокладку .Поле элемента - это его внешний слой , то есть он находится вне элемента.

Следующая диаграмма должна прояснить расположение.

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

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

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

  • Модель коробки W3C
  • Традиционная коробчатая модель

См. Ручка Выбор модели коробки с помощью SitePoint (@SitePoint) на CodePen.

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

Например, давайте рассмотрим прямоугольник с шириной 200 пикселей и высотой 200 пикселей, отступом 10 пикселей со всех сторон и границей 2 пикселя по всему периметру. Браузер не видит это просто как поле размером 200 пикселей.Вместо этого браузер вычисляет горизонтальное пространство, необходимое для отображения поля, как 224 пикселя: 200 (ширина) + 2 (левая граница) + 10 (отступ слева) + 10 (отступ справа) + 2 (граница справа) = 224 пикселя. Учитывая, что элемент представляет собой идеальный квадрат, высота также будет равна 224 пикселям.

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

По умолчанию все браузеры используют блочную модель W3C. Вы можете явно указать блочную модель, установив для свойства box-sizing значение content-box (блочная модель W3C) или border-box (традиционная блочная модель). Традиционная блочная модель, будучи более интуитивно понятной, является наиболее популярным подходом среди веб-разработчиков.

Вот как вы можете настроить свойство box-sizing , чтобы оно соответствовало традиционной блочной модели в вашем веб-проекте:

  html {
  размер коробки: рамка-рамка;
}

*, *:до после {
  размер коробки: наследовать;
}  

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

Установка полей и отступов

Вы можете управлять заполнением, применяемым к четырем сторонам элемента, используя свойства padding-top , padding-right , padding-bottom и padding-left . Вы также можете указать заполнение, используя сокращенное свойство padding.

  • Когда присутствует одно значение заполнения, CSS использует это значение для определения заполнения всех четырех сторон:

     
     отступ: 10 пикселей;  
  • Когда присутствуют два значения, первое значение определяет верхнее и нижнее заполнение, а второе значение определяет левое и правое заполнение:

     
     заполнение: 2em 4em;  
  • Когда присутствуют три значения, первое значение определяет верхнее заполнение, второе значение определяет левое и правое заполнение, а третье значение определяет нижнее заполнение:

     
    отступ: 1em 20px 2em;  
  • Когда присутствуют все четыре значения, они устанавливают верхнее, правое, нижнее и левое отступы в точном порядке:

     
    отступ: 10px 10% 2em 15%;  

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

Как и в случае с заполнением, вы можете управлять полем, применяемым к четырем сторонам элемента, используя свойства margin-top , margin-right , margin-bottom и margin-left .Вы также можете указать поле для всех четырех сторон элемента, используя сокращенное свойство поля.

 
маржа: 10 пикселей;


маржа: 2em 4em;


маржа: 2em auto 2em;


маржа: 10px 10% 2em 15%;  

Что нужно помнить

Использование правильных устройств

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

Допустим, вы установили ширину элемента на 50%, а также применили к нему поле в 15 пикселей.При 1200 пикселей его ширина будет 600 пикселей, а поля - 15 пикселей. При 769px его ширина будет 384px, а поле все равно будет 15px.

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

Точно так же вы можете добавить отступ к текстовым элементам на веб-странице. Как правило, вы хотите, чтобы отступы были пропорциональны размеру шрифта соответствующего элемента. Этого нельзя достичь с помощью абсолютных единиц. Однако, если заполнение указано в единицах em , оно будет автоматически масштабироваться в соответствии с размером шрифта. Вот демонстрация, демонстрирующая это масштабирование в действии.

Как браузеры вычисляют значения поля и заполнения для разных единиц

Браузеры вычисляют окончательные значения полей и отступов для элемента по-разному в зависимости от используемой единицы измерения.

Любое поле или заполнение, указанное как процентное значение , рассчитывается на основе ширины содержащего элемента . Это означает, что отступ в 5% будет равен 5 пикселей, если родительский элемент имеет ширину 100 пикселей, и будет равен 50 пикселей, если родительский элемент имеет ширину 1000 пикселей. Помните, что верхнее и нижнее значения также вычисляются на основе ширины родительского элемента .

В случае em единиц вычисленное значение для поля и заполнения основано на размере шрифта элемента .В предыдущей демонстрации CodePen отступ, примененный к трем нижним текстовым элементам, равен 1em . Однако вычисленное значение заполнения в каждом случае разное из-за разного размера шрифта.

Существует также четыре различных модуля на основе области просмотра, которые называются vw , vh , vmin и vmax . Вычисленное значение поля и заполнения в этом случае основано на области просмотра . Например, отступ 5vw будет равен 25 пикселей, когда ширина области просмотра составляет 500 пикселей, а отступ 10vw будет равен 50 пикселей для той же ширины области просмотра.Вы можете узнать больше об этих единицах в разделе «Модули видового экрана CSS: Краткое руководство по SitePoint».

Как новичок, знание того, как работают эти различные единицы, может помочь вам быстро понять, почему отступы или поля HTML-элементов изменяются в зависимости от размера родительского элемента, размера шрифта или даже области просмотра, что дает вам возможность взять под контроль ваш макет.

Работа с падающими полями

Еще одна концепция, о которой вам следует знать, - это сворачивание полей. В определенных ситуациях верхнее и нижнее поля двух элементов могут объединиться в одно.Это явление называется схлопыванием маржи.

Допустим, у вас есть два элемента рядом, т. Е. Смежные братья и сестры. Если для свойства margin-bottom первого элемента установлено значение 40 пикселей, а для свойства margin-top второго элемента установлено значение 25 пикселей, конечное поле между двумя элементами будет , а не , равным 65 пикселей. Его фактическое значение будет равно значению большего поля, то есть 40 пикселей.

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

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

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

Вы можете прочитать больше по этой теме в книге Collapsing Margins Адама Робертса.

Интересные варианты использования полей и отступов

Иногда можно использовать свойства CSS margin и padding для решения ряда проблем, связанных с макетом. Вот несколько примеров:

Центральные элементы в пределах их родителей

Центрирование блочных элементов по горизонтали внутри их родителя очень просто с помощью свойства margin.Все, что вам нужно сделать, это установить для свойств элемента margin-left и margin-right значение auto .

  .child {
  маржа: 10 пикселей автоматически;
}  

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

Сохранение соотношения сторон изображения

Часто изображения на веб-странице не имеют фиксированного соотношения сторон. Если вам нужно показать все изображения с одинаковым соотношением сторон, может помочь заполнение CSS.

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

Например, соотношение сторон 16: 9 может быть достигнуто с помощью padding: 56.25% 0 0 0 . Здесь значение 56,25 было получено после вычисления (9/16) * 100 . Тот же метод можно использовать для расчета процента заполнения для любого другого соотношения сторон.

Подробнее об этой технике можно прочитать в статье Крейга Баклера «Как сохранить соотношение сторон изображения в адаптивном веб-дизайне».

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

Заключение

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

Если вы знаете какие-либо другие советы по поводу полей и отступов CSS, поделитесь ими с нами в комментариях .

Поднимите свои навыки CSS на новый уровень с помощью нашей книги «Мастер CSS, 2-е издание» Тиффани Б. Браун, в которой рассматриваются CSS-анимации, переходы, преобразования и многое другое.

Как вложить блоки в блоки в БЭМ

Декабрь 5, 2019

Когда вы практикуете методологию БЭМ и у вас есть компоненты внутри компонентов, трудно определить наиболее эффективное (и передовое) соглашение об именах, которому нужно следовать.

В этой статье я расскажу, как решить эту распространенную проблему, и воспользуюсь передовыми методами БЭМ.

Вы сможете использовать блоки внутри блоков, как мастер BEMi.

Я не мог устоять перед шуткой из «Звездных войн»… Тем более, что БЭМ работает как lego

Готовы? Давайте углубимся.

  1. Вложенные блоки внутри блоков
  2. Использование модификаторов БЭМ для настройки стилей компонентов
  3. Когда использовать классы элементов и блоков вместе
  4. Заключение

Вложенные блоки внутри блоков

Давайте использовать компонент карты в качестве примера для вложения блоков в блоки.

Обычно внутри карты находится кнопка.

Хотя этот подход следует методологии БЭМ, существует более модульный способ. Продолжайте читать для этого.

Вот как можно написать HTML с помощью БЭМ:

 

Я - карта

Я - абзац карты

Подробнее

Этот код соответствует БЭМ методология.

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

Вот и вся уловка. Вы должны спросить себя:

«Состоит ли этот« блок », который я собираюсь создать, из подкомпонентов, которые можно использовать в других частях веб-сайта?»

Или иначе:

«Может ли этот БЭМ-элемент, который я собираюсь добавить в блок, использовать в качестве компонента в других областях веб-сайта»

Если ответ положительный (как в случае с кнопкой в карточке), то можно так:

Просто превратите элемент в блок.

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

 

Я карта

Я параграф карты

Подробнее

Вот как вы размещаете блок внутри блока с помощью БЭМ.

Это действительно так просто. И да, это соответствует лучшим практикам БЭМ.

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

Привыкайте мыслить атомарно о своем компоненты, и вы начнете находить их повсюду.

Использование модификаторов БЭМ для настройки стилей компонентов

Теперь вы можете подумать…

«Подождите! Что, если я хочу, чтобы мои обычные кнопки на веб-сайте были красными, а все кнопки внутри карточек должны быть зелеными? »

Вот тут-то и пригодятся БЭМ-модификаторы.

 

В CSS вы можете видеть, что .btn-green написано после класса .btn , что означает, что если есть какие-либо дублированные объявления, . btn —- зеленый класс имеет приоритет из-за правил специфичности CSS.

Использование модификатора БЭМ позволяет иметь компонент core .btn и при необходимости изменять стиль.

Когда использовать классы элементов и блоков вместе

Могут быть некоторые случаи, когда вы захотите использовать ОБА класс элемента и класс блока.

Например, мы хотим, чтобы кнопка была выровнена по правому краю:

Это может показаться немного неправильным, но применение и элемента, и класса блока - допустимый способ справиться с такой ситуацией:

 

Я карта

Я параграф карты

Заключение

Я надеюсь, что это прояснило вашу путаницу с вложением блоков в блоки!

Вот краткий обзор:

Добавить комментарий

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