Расположены ли дочерние элементы flexbox таким образом, чтобы их можно было использовать для абсолютного позиционирования своих дочерних элементов?

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

HTML:

 <div id="pagecontainer"> <!--the flex container-->
    <header id="pageheader"><!--the header--><h1>...</h1><!--the heading-->
       <nav><ul>...</ul></nav><!--the navigation-->
       <form>...</form><!--the search--></header>
    <main id="pagemain>...</main><!--the main content area-->
    <footer id="pagemain>...</footer><!--the footer-->
 </div>

CSS

 #pagecontainer {
    display:flex;
    flex-direction:column;
    min-height:100VH;
 }
 #pageheader {
    position:sticky;
    top:0PX;
    ...
 }
 #pagemain {
    flex:1;
    ...
 }
 #pagefooter {
    ...
 }
 #pageheader form {
    position:absolute;
    right:0;
    bottom:0;
    ...
 }

Проблема, с которой я столкнулся, заключается в том, что в Firefox поле поиска расположено правильно - в правом нижнем углу заголовка - но в Chrome (и в других браузерах Webkit) оно находится в правом нижнем углу страницы. Согласно статье MDN о позиции (https://developer.mozilla.org/en-US/docs/Web/CSS/position), абсолютно позиционированные элементы  «позиционируются относительно ближайшего позиционированного предка. Если позиционированный предок не существует, используется начальный контейнер». Итак, очевидно, что Firefox видит элементы с гибким позиционированием как позиционируемые, но Webkit видит их как находящиеся в обычном потоке. Какое поведение «правильное»? и есть ли запасной вариант, который я могу использовать вместо этого?

Спасибо Том


person user2243240    schedule 19.12.2014    source источник


Ответы (1)


Я не знаю, правильно ли ведет себя Chrome, но Firefox определенно закодирован для более старой версии спецификации (и текст спецификации по абсолютному позиционированию внутри гибкого бокса менялся несколько раз).

Ошибка при обновлении поведения firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=874718

А пока я бы не рекомендовал полагаться на текущее поведение Firefox в отношении абсолютно позиционированных вещей внутри гибкого контейнера (если между ними и контейнером нет position:relative предка - см. Ниже).

Отвечая на другие ваши вопросы:

  • Нет, гибкие элементы не считаются «позиционированными» (и не становятся абсосами, содержащими блоки для своих потомков).
  • Однако заставить их вести себя так легко - просто стилизуйте их с помощью position:relative.
person dholbert    schedule 19.12.2014
comment
Спасибо, Дхольберт. Считается ли position: sticky позиционированием? Я бы подумал, что это так, поскольку это (частично) исправлено, но, говоря, что эти элементы также находятся в потоке документов. И глупый вопрос, но было бы семантически некорректно устанавливать position: sticky и position: relative или position: sticky relative или что-то в этом роде, не так ли? - person user2243240; 20.12.2014
comment
Does position: sticky считается позиционированным - да, в этом случае липкая вещь должна стать блоком, содержащим abspos (точно так же, как это сделала бы позиция: relative). И вы правы, что вы не можете сделать что-то одновременно относительным и закрепленным. Однако вы, вероятно, могли бы добиться чего-то подобного с помощью вложенности. (закрепленная обертка, относительно позиционированный дочерний элемент или что-то подобное) - person dholbert; 22.12.2014
comment
Спасибо, Долберт. Я принял ваш ответ, поскольку с вашим комментарием он полностью отвечает на мой вопрос. В этом случае, насколько я могу судить, Firefox ведет себя правильно, поскольку заголовок может быть липким. - person user2243240; 23.12.2014
comment
Просто скрипка для визуализации ошибки firefox с абсолютным позиционированием внутри гибкого контейнера. Желтое поле должно скрывать первое розовое поле. jsfiddle.net/homyasusina/yxfzczmr/1 - person Olga; 01.04.2015