#css #flexbox
#css #flexbox
Вопрос:
У меня есть следующий HTML (упрощенный):
<div class='outer'>
<div class='nav-prev'></div>
<div class='content'></div>
<div class='nav-next'></div>
</div>
Мой текущий CSS:
.outer {
display:flex;
}
.content {
flex-grow:1;
}
Это дает мне макет из трех столбцов для рабочего стола с левыми и правыми кнопками навигации (в .nav-prev
и .nav-next
divs). Что-то вроде:
< CONTENT >
Однако на мобильных устройствах я хочу, чтобы кнопки навигации были ниже содержимого (или, возможно, выше, я еще не решил). Что-то вроде:
CONTENT
< >
Я не могу понять, возможно ли это с помощью flex. Я знаю, что могу изменять flex-direction:
и переупорядочивать элементы с order:
помощью, но я не думаю, что смогу поместить .nav-prev
и .nav-next
ниже .content
и рядом друг с другом без дополнительных разделителей контейнеров, которые были бы несовместимы с представлением рабочего стола с 3 столбцами.
Очевидно, что у меня может быть два набора кнопок навигации, отображаемых и скрытых по мере необходимости, но мне было интересно, есть ли волшебный гибкий способ добиться такого поведения без удвоения кнопок.
Комментарии:
1. Если вы можете использовать
display: grid
. Я могу показать вам, как это сделать.2. Я могу использовать
display: grid
, если он имеет эквивалентflex-grow
для содержимого в режиме 3 столбцов. Я раньше не использовалdisplay: grid
. (Или, может быть, вы говорите, переключиться на сетку для мобильных устройств?)3. попробуйте использовать
absolute
свойство position для кнопки навигации для мобильных устройств. Нравится@media (max-width: 767px) { .nav-prev{ position:absolute; bottom:0; left:0; } .nav-next{ position:absolute; bottom:0; right:0; } }
4. @jerry — Я не могу поверить, что я не думал об использовании absolute, это работает отлично — если вы дадите мне ответ, я приму его! Спасибо
5. @Ben Holness это всегда происходит :-). вы повсюду ищете отвертку, которая находится только в ваших руках.
Ответ №1:
попробуйте использовать абсолютное position
свойство для кнопки навигации для мобильных устройств. Нравится @media (max-width: 767px) { .nav-prev{ position:absolute; bottom:0; left:0; } .nav-next{ position:absolute; bottom:0; right:0; } }
Ответ №2:
Согласно вашему комментарию:
Вы можете использовать display: grid;
в мобильной версии. (используйте @media
запросы)
ОБРАТИТЕ ВНИМАНИЕ, ЧТО text-align: center;
и border
я добавил ТОЛЬКО для демонстрационных целей.
.outer {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
grid-column-gap: 0px;
grid-row-gap: 0px;
text-align: center;
}
.content { grid-area: 1 / 1 / 2 / 3; border: 1px solid #767676;}
.nav-prev { grid-area: 2 / 1 / 3 / 2; border: 1px solid #767676;}
.nav-next { grid-area: 2 / 2 / 3 / 3; border: 1px solid #767676;}
<div class="outer">
<div class="nav-prev">PREV</div>
<div class="content">CONTENT</div>
<div class="nav-next">NEXT</div>
</div>
НА СЛУЧАЙ, если вы хотите использовать display: grid;
и в настольной версии. Это будет ваш код для рабочего стола:
.outer {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 1fr;
grid-column-gap: 0px;
grid-row-gap: 0px;
text-align: center;
}
.nav-prev { grid-area: 1 / 1 / 2 / 2; border: 1px solid #767676;}
.content { grid-area: 1 / 2 / 2 / 3; border: 1px solid #767676;}
.nav-next { grid-area: 1 / 3 / 2 / 4; border: 1px solid #767676;}
<div class="outer">
<div class="nav-prev">PREV</div>
<div class="content">CONTENT</div>
<div class="nav-next">NEXT</div>
</div>
Комментарии:
1. Я попробовал это, и это сработало, хотя есть некоторые проблемы, которые мне нужно было бы решить (проблемы с интервалами), однако идея абсолютного позиционирования — гораздо более простое решение. Хотя спасибо!