#html #css #flexbox
#HTML #css #flexbox
Вопрос:
Я пытаюсь сделать свой слайдер отзывчивым, но он не работает. Я могу попробовать это, media query
но это много кода, и я не думаю, что это эффективно. Он показывает некоторое количество пробелов, но он все еще не работает. Я также рассмотрел другой вопрос о переполнении стека, и в нем говорилось, что у меня должен быть пробел. В моем случае «flex-shrink», похоже, не работает.
.recipes {
display: flex;
justify-content: center;
flex-direction: column;
width: 100vw;
}
.recipes h1 {
text-align: center;
font-family: var(--section-heading);
font-size: 2rem;
}
.btns-image-slider label[for] {
border-radius: 50%;
width: 25px;
height: 25px;
box-sizing: border-box;
border: 2px solid black;
display: inline-block;
transition: 200ms background-color;
cursor: pointer;
}
.btns-image-slider label[for]:hover {
background-color: dodgerblue;
border: none;
}
.container {
margin: auto;
max-width: 800px;
max-height: 600px;
overflow: hidden;
flex-shrink: 2;
}
.container input {
display: none;
}
#r1:checked~.images {
transform: translateX(0);
}
#r2:checked~.images {
transform: translateX(-800px);
}
#r3:checked~.images {
transform: translateX(-1600px);
}
#r4:checked~.images {
transform: translateX(-2400px);
}
#r5:checked~.images {
transform: translateX(-3200px);
}
.images {
margin: 0;
padding: 0;
display: flex;
width: 2400px;
height: 600px;
transition-property: transform;
transition-duration: 1000ms;
}
.center {
display: flex;
justify-content: center;
margin-top: 20px;
}
.images a {
position: relative;
}
.images a:hover::after {
content: url(../images/overlay-6.png);
position: absolute;
left: 70%;
top: 50%;
transform: translate(-70%, -49.55%);
animation-name: appear;
animation-duration: 0.5s;
animation-iteration-count: 1;
}
@keyframes appear {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.services>h1 {
font-family: var(--section-heading);
text-align: center;
}
<section class="recipes">
<h1>Popular recipes</h1>
<div class="container">
<input type="radio" name="r" checked id="r1">
<input type="radio" name="r" id="r2">
<input type="radio" name="r" id="r3">
<input type="radio" name="r" id="r4">
<input type="radio" name="r" id="r5">
<div class="images">
<a href="images/1.png"><img src="images/slide1.jpg"></a>
<a href="#"><img src="images/slide2.jpg"></a>
<a href="#"><img src="images/slide3.jpg"></a>
<a href="#"><img src="images/slide4.jpg"></a>
<a href="#"><img src="images/slide5.jpg"></a>
</div>
</div>
<div class="center">
<div class="btns-image-slider">
<label for="r1"></label>
<label for="r2"></label>
<label for="r3"></label>
<label for="r4"></label>
<label for="r5"></label>
</div>
</section>
Ответ №1:
Вам нужно изменить размер ваших элементов width
или min-width
отложить flex-shrink
в сторону, если это также необходимо. высоту можно удалять большую часть времени, позволяя браузеру управлять ею.
<a>
содержит изображение и является прямым дочерним элементом .images
с шириной сгиба, но отображается только треть его, поэтому <a>
оно должно иметь 33.33%
ширину (или 2400 пикселей / 3).
Если ваши изображения имеют разное соотношение, object-fit
это также может помочь (если все изображения имеют одинаковый размер и не сжимаются / не расширяются, не обращайте на это внимания
возможный пример из вашего кода с изображением другого соотношения, чтобы показать bject-fit
использование
.recipes{
display: flex;
justify-content: center;
flex-direction: column;
width: 100vw;
}
.recipes h1 {
text-align: center;
font-family: var(--section-heading);
font-size: 2rem;
}
.btns-image-slider label[for]{
border-radius: 50%;
width: 25px;
height: 25px;
box-sizing: border-box;
border: 2px solid black;
display: inline-block;
transition: 200ms background-color;
cursor: pointer;
}
.btns-image-slider label[for]:hover{
background-color: dodgerblue;
border: none;
}
.container{
margin: auto;
max-width: 800px;
max-height: 300px;
overflow: hidden;
flex-shrink: 2;
}
.container input{
display: none;
}
#r1:checked ~ .images{
transform: translateX(0);
}
#r2:checked ~ .images{
transform: translateX(-800px);
}
#r3:checked ~ .images{
transform: translateX(-1600px);
}
#r4:checked ~ .images{
transform: translateX(-2400px);
}
#r5:checked ~ .images{
transform: translateX(-3200px);
}
.images{
margin: 0;
padding: 0;
display: flex;
width: 2400px;
transition-property: transform;
transition-duration: 1000ms;
}
.center{
display: flex;
justify-content: center;
margin-top: 20px;
}
.images a{
position: relative;
min-width:33.33%;
}
.images a img {width:100%;height:100%;object-fit:cover}
.images a:hover::after{
content: url(../images/overlay-6.png);
position: absolute;
left: 70%;
top: 50%;
transform: translate(-70%,-49.55%);
animation-name: appear;
animation-duration: 0.5s;
animation-iteration-count: 1;
}
@keyframes appear {
from{
opacity: 0;
}
to{
opacity: 1;
}
}
.services > h1{
font-family: var(--section-heading);
text-align: center;
}
<section class="recipes">
<h1>Popular recipes</h1>
<div class="container">
<input type="radio" name="r" checked id="r1">
<input type="radio" name="r" id="r2">
<input type="radio" name="r" id="r3">
<input type="radio" name="r" id="r4">
<input type="radio" name="r" id="r5">
<div class="images">
<a href="#"><img src="https://dummyimage.com/800x200/456amp;text=slide1.jpg"></a>
<a href="#"><img src="https://dummyimage.com/800x250/ac8amp;text=images/slide2.jpg"></a>
<a href="#"><img src="https://dummyimage.com/800x230/f90amp;text=images/slide3.jpg"></a>
<a href="#"><img src="https://dummyimage.com/800x180/cc5amp;text=images/slide4.jpg"></a>
<a href="#"><img src="https://dummyimage.com/700x200/beeamp;text=images/slide5.jpg"></a>
</div>
</div>
<div class="center">
<div class="btns-image-slider">
<label for="r1"></label>
<label for="r2"></label>
<label for="r3"></label>
<label for="r4"></label>
<label for="r5"></label>
</div>
</section>
вы также можете превратить 2400 пикселей в 300% и использовать процентное значение else где (width, translate() … , так что тогда вы можете использовать также процент для контейнера вместо 800 пикселей с в конечном итоге максимальной шириной и минимальной шириной в пикселях, чтобы избежать его слишком большого уменьшения или увеличения.
Комментарии:
1. Я попробовал ваш код, но он не реагирует, в этом весь смысл моего вопроса. Я хотел, чтобы он уменьшал свой размер при использовании flex-shrink: (
2. @Self-Coder Итак, прочитайте, что находится под фрагментом, все дело в изменении размера в соответствии с размером окна. вместо этого используйте% с фиксированными значениями пикселей. Я думаю, вы можете сделать это сами.