#html #reactjs #css #flexbox
#HTML #reactjs #css #flexbox
Вопрос:
У меня есть компонент в react, который я, повторяя в цикле. Этот компонент всегда будет отображаться три раза, и я хочу, чтобы они отображались в одной строке (каждый компонент — столбец). В примерах, которые я видел, вручную добавляется «flex: 1;» и так далее для каждого столбца, но поскольку я выполняю итерацию, это невозможно.
Это выглядит следующим образом:
<div className="styles.grid">
<!-- stuff -->
</div>
Выше будет показано три раза, и я хочу, чтобы они все были в одной строке (каждая будет столбцом).
Я пытался:
.grid {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
}
Не работает. Любая помощь?
Комментарии:
1.
flex-wrap: wrap
Это приведет к разрыву вашей строки с одной строки на несколько, если содержимое не может располагаться рядом друг с другом. Попробуйте удалить это?2. Вы пробовали использовать
float: left
?
Ответ №1:
Вы можете удалить flex-wrap
, чтобы все элементы flex располагались в одной строке, и придать каждому элементу flex треть ширины.
Пример
function App() {
return (
<div className="grid">
<div className="grid-item item-1">Foo</div>
<div className="grid-item item-2">Bar</div>
<div className="grid-item item-3">Baz</div>
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
.grid {
display: flex;
}
.grid-item {
width: 33.33333%;
height: 200px;
}
.item-1 {
background-color: red;
}
.item-2 {
background-color: green;
}
.item-3 {
background-color: blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
Ответ №2:
Попробуйте использовать flex-grow: 1
для дочерних столбцов. Это указывает дочерним элементам расти одинаково, чтобы заполнить ширину своих родителей.
Для получения дополнительной информации о flexbox:https://css-tricks.com/snippets/css/a-guide-to-flexbox /
Ниже приведен простой пример из 3 столбцов, где каждый столбец расширяется одинаково.
.parent {
width: 100%;
height: 200px;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.col {
flex-grow: 1;
height: 200px;
border: 1px solid black;
}
<div class="parent">
<div class="col">1</div>
<div class="col">2</div>
<div class="col">3</div>
</div>
Ответ №3:
Это то, чего вы, вероятно, пытаетесь достичь:
.grid {
display: flex;
flex-wrap: wrap;
align-items: space-between;
}
.grid-item {
width: 30%;
}
<div class="grid">
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
<div class="grid-item">Item content</div>
</div>
Гибкий контейнер обернет каждый элемент, как только он выйдет за его пределы с flex-wrap: wrap;
свойством.
И каждому элементу внутри flex затем должно быть присвоено значение width: 30%;
. Каждый 4-й элемент в сетке будет перенесен в следующую строку.