#html #css #flexbox
#HTML #css #flexbox
Вопрос:
У меня есть веб-страница, на которой я хочу центрировать одну из страниц как по вертикали, так и по горизонтали, вот так:
<main>
<div>
This has to be centered both vertically and horizontally.
</div>
</main>
Я не могу изменить отображение main
, поскольку он широко используется для всех страниц, и его использование flex
слишком много ломает.
Я предположил, что это должно сработать, но это не так, потому div
что не увеличивается в высоту:
main {
min-height: 1000px;
border: solid 1px red;
}
div {
display: flex;
align-items: center;
justify-content: center;
align-content: stretch;
flex-grow: 1;
}
Я бы предпочел этого не делать position: absolute; top: 0; right: 0; bottom: 0; left: 0;
.
Любые подсказки, как я могу растянуть свой div
, чтобы заполнить main
? Почему это не сработает из коробки, не может flex
просто расти внутри элементов с block/inline-block
дисплеями?
Комментарии:
1. flex-grow бесполезен, потому что ему нужно, чтобы родительский элемент отображался; flex, а не сам элемент
2. На самом деле на данный момент это не имеет значения, гибкий рост был добавлен только потому, что, если бы у него был гибкий родительский элемент, он бы рос вертикально, прямо сейчас он ничего не делает, как вы указали. Я предполагаю, что flex в основном бесполезен при использовании внутри элементов block / inline-block? Эх…
3. дисплей: гибкий; всегда должен применяться к родительскому элементу
4. Я не могу изменить отображение main, поскольку он широко используется для всех страниц -> Использовать ID / classes для некоторых конкретных случаев. Это звучит как проблема дизайна / концепции, а не CSS
5. @TemaniAfif Я понял вашу точку зрения. Это было бы немного проще, но я вообще не контролирую и не использую классы в этом проекте, стилизованном под компоненты. О, технология.
Ответ №1:
Это может вам помочь.
/* I cannot edit main, there are 100s of pages based on it, cant change its display etc. */
main {
min-height: 200px;
border: solid 1px red;
}
div {
display: flex;
min-height: inherit;
justify-content: center;
align-items: center;
}
<main>
<div>
<span>This has to be centered both vertically and horizontally.</span>
</div>
</main>
Ответ №2:
Особенность flexbox в том, что вы должны сосредоточиться на инструктировании родителя, а не дочернего элемента.
В вашем примере justify-content
и display: flex
должен быть в родительском. Вы также можете использовать flex-direction: column
, чтобы сообщить браузеру, что вы хотите, чтобы дочерний элемент рос вертикально.
Вы также можете использовать flex: 1
в качестве сокращения для flex-grow. Таким образом, дочернему элементу даже не нужно display: flex
.
main {
min-height: 1000px;
border: solid 1px red;
display: flex;
flex-direction: column;
justify-content: stretch;
}
div {
flex: 1;
}
Обновить
Чтобы достичь того, что вы упомянули в комментариях, почему бы вам не попробовать это:
main {
min-height: 1000px;
border: solid 1px red;
}
section {
height: 1000px;
width: 100px;
background: gainsboro;
/* important stuff */
display: flex;
flex-direction: column;
justify-content: stretch;
}
div {
flex: 1;
width: 40px;
background: aquamarine;
}
Эти размеры и цвета предназначены только для того, чтобы вы могли видеть результаты.
Комментарии:
1. Поддержано. Итак, мой вопрос — могу ли я каким-то образом поместить гибкий родительский элемент внутри
main
, а затем использовать div внутри этого родительского элемента? Я пробовал это, но оболочка flex, похоже, тоже не растет… Я думаю о чем-то вроде<main><section><div></div></section></main>
wheresection
has hasflex
. Не могу понять это :/2. @Wordpressor должен быть сделан для правильного ответа, а не неправильного , который противоречит вопросу.. на самом деле вы сделаете свой вопрос более запутанным. Итак, если я предложу вам решение, используя position:absolute, вы поддержите меня? если это так, позвольте мне ответить на повторяющийся вопрос.
3. @TemaniAfif Не могли бы вы подробнее рассказать о том, как мой ответ противоречит вопросу? Я буквально показываю ему, как добиться того, чего он хочет, и объясняю, как работает flexbox.
4. он сказал, что я не могу изменить отображение main, поскольку он широко используется для всех страниц, а использование flex там слишком много ломается. —> и вы изменили main в обоих ваших примерах
5. @FilipeMerker Я чувствую, что ваш второй ответ был точен и совсем не противоречив, но, похоже, это вообще не работает, мы что-то упускаем? Обратите внимание, что я также не хочу устанавливать высоту в разделе, поэтому я использую flex. jsfiddle.net/qpcvx0Lg