Вот спецификация, подробно описывающая, как вы можете найти ширину / высоту любого элемента: https://www.w3.org/TR/CSS21/visudet.html
Оттуда вы можете прочитать для абсолютного элемента, что:
Ограничение, которое определяет используемые значения для этих элементов:
'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = width of containing block
Then
Если все три из 'оставлены ',' width 'и' right 'являются' auto ': сначала установите любые значения' auto 'для' margin-left 'и' margin-right 'равными 0. Затем, если свойство' direction 'элемента, устанавливающего stati c -позиция, содержащая блок 'ltr', установите 'left' в позицию stati c и примените правило номер три ниже; в противном случае установите 'right' в позицию stati c и примените правило номер один ниже.
И правило номер три:
'width' и 'right 'are' auto 'и' left 'не' auto ', тогда ширина будет уменьшена до размера . Затем решите «правильно»
Правило номер один также аналогично
И если вы продолжите чтение, вы узнаете, как рассчитать усадку. - по размеру ширина. Вы также заметите, что тот же алгоритм сжатия применяется к float
и inline-block
элементу
Также обратите внимание, что фиксированный элемент - это частный случай абсолютного, поэтому применяется то же правило. Единственное отличие - это содержащий блок
Фиксированное позиционирование - это подкатегория абсолютного позиционирования. Единственное отличие состоит в том, что для фиксированного блока, содержащий блок устанавливается окном просмотра. исх.
Вы также можете видеть, что элементы блока подчиняются почти одинаковому ограничению (без левого / правого), но правила другие :
Следующие ограничения должны соблюдаться среди используемых значения других свойств:
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block
Затем
Если для 'width' установлено значение 'auto', любое другое 'auto' значения становятся '0', а 'ширина' следует из полученного равенства.
Это даст width = width of containing block
Важное различие между встроенными блочными элементами состоит в том, что абсолютный элемент не принимает ширину своего содержимого, как мы думаем. В большинстве случаев это происходит из-за ограничения, описанного выше, но проверьте следующий пример:
.container {
clear:left;
margin:5px;
}
<div class="container" style="float:left;position:relative;">
<div style="display:inline-block; background: red;"> 1 1 1 1 1 1 </div>
</div>
<div class="container" style="float:left;position:relative;">
<div style="position: absolute; background: red;"> 1 1 1 1 1 1 </div>
</div>
Обратите внимание на то, как абсолютный элемент будет переноситься до наименьшего возможного размера, не выстраивая встроенный блок. Это связано с тем, что содержащий блок также является контейнером shrink-to-fit .
Связано: Почему все переносятся по словам внутри абсолютного элемента, вложенного внутри float или встроенный блочный элемент