Я пытаюсь, чтобы все буквы, отображаемые в контейнере, были равномерно распределены с помощью flexbox. Прямо сейчас, если я ввожу предложение типа «Мне нравится изучать код», все элементы отображаются внутри контейнера и работают нормально, но если я использую длинное слово, например «холодильник», буквы выходят из контейнера. Но я стараюсь, чтобы все буквы оставались внутри контейнера, независимо от длины слова. Я пробовал все доступные методы flexbox, но безуспешно. Пробовал max-width и на контейнере. Что мне не хватает? Вот код в песочнице кода: https://codesandbox.io/s/modern-sun-3u7b3?file=/src/App.js
import React from "react";
import "./styles.css";
function App() {
// let sentence = "I like learning code";
let sentence = "refrigerator";
const words = sentence.split(" ");
return (
<div className = "pageContainer">
{words.map((word, i) => (
<div className = "row" key = {i}>
{[...word].map((letter) => (
<p className = "letterBorder">{letter}</p>
))}
{i === words.length - 1 ? null : <p className = "whiteSpaceBorder"></p>}
</div>
))}
</div>
);
}
export default App;
.letterBorder {
border: 25px;
background: grey;
padding: 20px;
width: 50px;
height: 30px;
flex-grow: 1;
margin-right: 4px;
margin-left: 4px;
}
.row {
display: flex;
justify-content: space-evenly;
min-width: 100%;
align-content: flex-start;
}
.whiteSpaceBorder {
border: 25px;
background: orange;
padding: 20px;
width: 50px;
height: 30px;
flex-grow: 1;
margin-right: 4px;
margin-left: 4px;
}
.pageContainer {
border-radius: 1rem;
text-align: center;
background: lightcyan;
height: 40rem;
width: 30rem;
margin: auto;
}
Здесь пригодится свойство css flex-wrap
. Все элементы Flexbox по умолчанию пытаются уместиться в одну строку. Однако вы можете сделать их обернутыми, используя flex-wrap: wrap
.
Добавьте его в свой класс строк:
.row {
display: flex;
flex-wrap: wrap; /* Allow items in row to "wrap" to next line if needed */
justify-content: space-evenly;
min-width: 100%;
align-content: flex-start;
}
См. эту страницу css-трюков для лучшего визуального объяснения.
А, понял. Другой ответ, описывающий изменение отступа letterBorder на 20px 0
, должен помочь.
Ваша ошибка связана с жестко закодированным горизонтальным дополнением вашего класса letterBorder.
Заменять
padding: 20px;
с
padding: 20px 0;
https://codesandbox.io/s/gracious-violet-qg1xt?file=/src/App.js
Теперь работает отлично! Спасибо. Дополнительный 0 - это все, что мне было нужно... Никогда не знал, что отступы могут повлиять на flexbox. Спасибо за ценный урок.
Заполнение на самом деле не влияет на flexbox. Flexbox определяет высоту, ширину и положение ваших элементов, а отступы добавляют между ними некоторое пространство, заставляя их выходить за границы контейнера.
На самом деле мне нужно, чтобы холодильник помещался в контейнер в 1 ряд. Упаковка создает 3 ряда, чтобы поместиться в холодильник. Итак, одно слово в строке - это то, чего я пытаюсь достичь. Но если слово слишком длинное, как холодильник, оно вылезает из контейнера.