#css #reactjs #flexbox #carousel #netflix
#css #reactjs #flexbox #карусель #netflix
Вопрос:
Привет, я пытаюсь создать клон netflix и заставить все работать так, как я хочу, но у меня проблема с макетом. Независимо от того, как я устанавливаю ширину div, который содержит изображения, они не меняются. Я использовал консоль, и, похоже, нет правила, которое препятствовало бы их росту. Я установил для изображений 100% ширину их родительского контейнера, но это делает их крошечными.
Я действительно борюсь с CSS, потому что нет консоли, сообщающей вам, что происходит не так. Если бы кто-нибудь мог взглянуть и помочь мне понять, я был бы очень признателен. (Кроме того, кто-нибудь знает, сколько времени требуется, чтобы перестать чувствовать себя идиотом при работе с CSS?)
Я включил код ниже. строка__imgLarge применяется только к одной конкретной строке. У этого та же проблема, что и у других.
<div className="row__images">
{movies.map((movie) => (
<div
className={`row__imgContainer ${
isLargeRow ? "row__imgLarge" : ""
}`}
key={movie.id}
onClick={() => handleClick(movie)}
>
<img
className="row__image"
// {some movies don't have the a backdrop image, in these cases use poster instead}
src={`${base_url}/${
isLargeRow || !movie.backdrop_path
? movie.poster_path
: movie.backdrop_path
}`}
alt={movie?.title || movie?.name || movie?.original_name}
/>
</div>
))}
.row__images {
display: flex;
overflow-y: hidden;
overflow-x: scroll;
padding: 20px;
}
.row__imgContainer {
/* width: 15.8vw; */
max-height: 40vh;
width: 150vw;
margin-right: 0.6vw;
}
.row__image {
width: 100%;
transition: transfrom 440ms;
}
.row__imgLarge {
max-height: 40vh;
}
Ответ №1:
Ширина элементов Flex (дочерних элементов контейнера flex) определяется контейнером flex. Вам нужно управлять ими с помощью свойств flex. Посмотрите justify-content
на контейнер и flex-grow
, flex-shrink
и flex-basis
на элементы.
Например, если вы хотите, чтобы элементы имели определенную неизменяемую ширину, вы бы установили grow и shrink равными 0, а basis — желаемой ширине:
.row_imgContainer {
flex-grow: 0; /* don't grow */
flex-shrink: 0; /* don't shrink */
flex-basis: 200px; /* desired width */
}
.row_imgContainer {
flex: 0 0 200px; /* shorthand, same as above */
}
Если вам просто нужен ряд изображений с горизонтальной прокруткой, установите overflow: auto
(или прокрутите) в контейнере flex и не позволяйте элементам сжиматься:
.container {
display: flex;
overflow-x: auto;
max-width: 500px;
}
.container>* {
flex: 0 0 200px;
}
<div class="container">
<img src="//placekitten.com/200" />
<img src="//placekitten.com/201" />
<img src="//placekitten.com/200" />
<img src="//placekitten.com/199" />
<img src="//placekitten.com/200" />
<img src="//placekitten.com/202" />
<img src="//placekitten.com/204" />
</div>
Комментарии:
1. Хорошо, я понимаю. Итак, поскольку flexbox пытается уместить все изображения по ширине страницы, он уменьшает их, чтобы сделать это возможным? Тогда вы бы сказали, что flexbox не подходит для чего-то вроде карусели? Если да, есть ли у вас лучшее предложение (не беспокойтесь, если нет, я знаю, что должен делать это для себя)
2. Не зная точно, что вы пытаетесь сделать, трудно сказать так или иначе, но flexbox невероятно универсален и надежен. Я бы не обязательно отказался от этого без уважительной причины, если у вас не было идеи получше.
3. Вы также можете применить
min-width
иmax-width
к элементам flex, что может быть полезно в вашем случае.4. Хорошо, спасибо за вашу помощь и объяснения. Я здесь новичок, поэтому мои положительные отзывы не отображаются, но я действительно ценю вашу помощь.
5. Обновил мой ответ фрагментом, показывающим контейнер flex с горизонтальной прокруткой.