Какой display у элемента со свойством float?

216
04 апреля 2017, 09:50

Интересен следующий момент:

Много где пишут что мол если элементу присваивается свойство float:left; или float:right; то display будет иметь значение block!

Но я не соглашусь!

Пример:

.a 
{ 
  float:left; 
  background:yellow; 
} 
.b 
{ 
  width:100px; 
  background:red; 
  display:inline-block; 
}
<div class="a">This is Photoshop 1.</div> 
<div class="b">This is Photoshop 2.</div>

Результат: Один блок будет в ряду с другим.

Но это возможно когда стоит inline-block у обоих элементов. Иначе бы на одной строке нельзя было бы расположить 2 блока т.к всю ширину занимал бы блок с display:block;.

Вот еще пример:

.a 
{ 
  float:left; 
  background:yellow; 
  opacity:0.7; 
  padding:5px; 
} 
.b 
{ 
  background:red; 
  display:block; 
}
<div class="a">This is Photoshop 1.</div> 
<div class="b">This is Photoshop 2.</div>

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

В инспекторе кода элемент с float:left; показывает display:block;...опять же не понятно! Свою точку зрения я описал. Объясните мне если что-то я не так понял.

P.S Кто не понял вопроса!

Почему элемент cо свойством-значением display:inline-block;, который стоит после элемента со свойством-значением float:left; находится на одной строке?(Если провести тоже самое но без float:left; то элементы не будут находится на одной строке т.к display:block; заберет всю ширину).

Answer 1

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

Но это возможно когда стоит inline-block у обоих элементов. Иначе бы на одной строке нельзя было бы расположить 2 блока т.к всю ширину занимал бы блок с display:block;.

Начнем с контр-примера:

p { 
  margin: 5px; 
} 
 
.floats { 
  float:left; 
  background: #ccc; 
} 
 
.dib { 
  display: inline-block; 
}
<p class=dib>1. Something</p> 
<p class=floats>2. Something</p> 
<p class=floats>3. Something</p>

Очевидно, что если бы флоаты вели себя так же, как и инлайн-блоки, то порядок элементов был бы 1, 2, 3, а не 2, 3, 1. Если вас сбивает с толку возможность расположения в одной строке, то это не более, чем визуальный эффект :-) float так устроен по спецификации, что элемент, который обладает этим свойством изымается из потока и всплывает слева или справа, а контент остальных блоков его обтекает.

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

Резюмирую: Почему элемент cо свойством-значением display:inline-block;, который стоит после элемента со свойством-значением float:left; находится на одной строке?

Потому что в приведенном вами примере флоат-элемент (1) теряет свою способность занимать 100% доступной ширины и начинает занимать ширину своего контента; (1) и инлайн-блочный (2) занимают достаточно малую ширину, чтобы уместиться на одной строке. Также, при этом они находятся в одном блочном контексте форматирования. Если (2) будет содержать, например, большой параграф текста, то он целиком перенесется на следующую строку, т. е. не будет обтекать (1).

Рекомендую спецификацию, в которой есть множество примеров и, наверняка, более правильное и доступное описание текущего поведения.

Answer 2

Это справедливо в некоторых случаях. Например, если поставить так:

.a {
  display: table-cell;
  float: left;
  background: yellow;
}

То результирующее свойство будет display: block;.Даже последовательность не важна:

.a {
  float: left;
  display: table-cell;
  background: yellow;
}

все равно, display: block;.

Это надо учитывать, когда ведется табличная верстка с помощью display: table; и display: table-cell;. Элементам надо ставить float: none;.

READ ALSO
Проблемы с модальным окном CSS

Проблемы с модальным окном CSS

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

236
Как парсить в PHP Simple HTML DOM Parser тег &lt;title&gt; в &lt;head&gt;

Как парсить в PHP Simple HTML DOM Parser тег <title> в <head>

Не получается парсить head теги

246
Проблема с svg в браузере safari

Проблема с svg в браузере safari

В браузере safari, не отображается часть svg с linear gradient, в остальных браузерах все отлично работает

425