Вопрос или проблема
Я создал флексбокс для веб-сайта, над которым я работаю, который содержит три блока, представляющих варианты покупки. На маленьких экранах я хочу, чтобы первый вариант располагался на отдельной строке сверху, а два других блока сгруппировались на строке ниже. Это оказалось очень сложной задачей.
Вот как выглядит мой текущий проект:
Вот как я хочу, чтобы он выглядел:
Вот код, который я сейчас использую:
<section class="flexbox-container container-fluid">
<div class="reading reading1">
<div class="flex-number">1</div>
<h2 class="flex-type-of-report">Отчет о натальной карте</h2>
<p class="flex-text">Подробный письменный анализ ваших психологических черт, паттернов отношений и
карьерных индикаторов.
</p>
<a href="Birth Chart Report/birth-chart-report.html" class="flex-button btn btn-outline-primary">Узнать
больше</a>
</div>
<div class="reading reading2">
<div class="flex-number">2</div>
<h2 class="flex-type-of-report">Отчет об отношениях</h2>
<p class="flex-text">Подробный письменный анализ ваших отношений с другом, любовником или членом семьи по мере их развития со временем.
</p>
<a href="Relationship Report/relationship-report.html" class="flex-button btn btn-outline-primary">Узнать
больше</a>
</div>
<div class="reading reading3">
<div class="flex-number">3</div>
<h2 class="flex-type-of-report">Прогностический отчет</h2>
<p class="flex-text">Подробный письменный отчет, который предсказывает темы наступающего года и то, как вы можете подготовиться к предстоящим вызовам.
</p>
<a href="Predictive Report/predictive-report.html" class="flex-button btn btn-outline-primary">Узнать
больше</a>
</div>
</section>
.flexbox-container {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
gap: 40px;
background-image: url(../Images/Carousel.jpg);
background-size: cover;
padding: 40px 0 30px 0;
}
.reading {
background-color: #fff;
border-radius: 15px;
width: 310px;
height: 300px;
padding: 10px 30px 30px 30px;
position: relative;
box-sizing: border-box;
}
.flex-number {
background-color: #e8e8e8;
width: 70px;
height: 70px;
border-radius: 50px;
margin: auto;
text-align: center;
padding: 18px 20px 20px 20px;
position: absolute;
top: -25px;
left: 50%;
transform: translateX(-50%);
font-size: 1.5rem;
font-weight: bold;
}
.flex-type-of-report {
font-size: 1.6rem;
margin-top: 45px;
}
.flex-text {
margin-bottom: 30px;
}
Я пробовал использовать свойство flex-basis, чтобы сделать первый блок больше по размеру в флексбоксе и тем самым разместить его на своей строке, но это не то, что я хочу визуально (я хочу, чтобы блоки были одинакового размера), так что я отказался от этого подхода.
Я пробовал добавить пустой div на маленьких экранах, чтобы сдвинуть второй блок на следующую строку, но это привело к странному пространству, с которым я не смог справиться в свою пользу. Не знаю, что еще попробовать.
используйте этот стиль для контейнера
flex-wrap: wrap-reverse;
Вы можете добавить отступы .reading1 {margin:0 50vw}
:
.flexbox-container {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
gap: 40px;
background-image: url(../Images/Carousel.jpg);
background-size: cover;
padding: 40px 0 30px 0;
}
.reading {
flex: 0 0 auto;
background-color: #ccc;
border-radius: 15px;
width: 310px;
height: 300px;
padding: 10px 30px 30px 30px;
position: relative;
box-sizing: border-box;
}
.reading1 {margin:0 50vw}
.flex-number {
background-color: #e8e8e8;
width: 70px;
height: 70px;
border-radius: 50px;
margin: auto;
text-align: center;
padding: 18px 20px 20px 20px;
position: absolute;
top: -25px;
left: 50%;
transform: translateX(-50%);
font-size: 1.5rem;
font-weight: bold;
}
.flex-type-of-report {
font-size: 1.6rem;
margin-top: 45px;
}
.flex-text {
margin-bottom: 30px;
}
<section class="flexbox-container container-fluid">
<div class="reading reading1">
<div class="flex-number">1</div>
<h2 class="flex-type-of-report">Отчет о натальной карте</h2>
<p class="flex-text">Подробный письменный анализ ваших психологических черт, паттернов отношений и карьерных индикаторов.
</p>
<a href="https://stackoverflow.com/questions/79056369/Birth Chart Report/birth-chart-report.html" class="flex-button btn btn-outline-primary">Узнать
больше</a>
</div>
<div class="reading reading2">
<div class="flex-number">2</div>
<h2 class="flex-type-of-report">Отчет об отношениях</h2>
<p class="flex-text">Подробный письменный анализ ваших отношений с другом, любовником или членом семьи по мере их развития со временем.
</p>
<a href="Relationship Report/relationship-report.html" class="flex-button btn btn-outline-primary">Узнать
больше</a>
</div>
<div class="reading reading3">
<div class="flex-number">3</div>
<h2 class="flex-type-of-report">Прогностический отчет</h2>
<p class="flex-text">Подробный письменный отчет, который предсказывает темы наступающего года и то, как вы можете подготовиться к предстоящим вызовам.
</p>
<a href="Predictive Report/predictive-report.html" class="flex-button btn btn-outline-primary">Узнать
больше</a>
</div>
</section>
Ответ или решение
Для того чтобы разместить первый элемент в строке отдельно, а два других элемента расположить ниже на одной линии, мы можем воспользоваться свойствами Flexbox и медиазапросами CSS. Ваша текущая реализация имеет хорошую основу, но добавление нескольких правил позволит достичь желаемого результата.
Вот как это можно сделать:
- Добавьте медиазапрос, который будет применяться для малых экранов.
- Измените стиль для первого элемента так, чтобы он занимал всю ширину контейнера, а два других элемента — лишь часть ширины на следующей строке.
Ваш код будет выглядеть следующим образом:
HTML
Оставьте ваш HTML-код без изменений:
<section class="flexbox-container container-fluid">
<div class="reading reading1">
<div class="flex-number">1</div>
<h2 class="flex-type-of-report">Birth Chart Report</h2>
<p class="flex-text">A detailed written analysis of your psychological traits, relationship patterns, and career indicators.</p>
<a href="Birth Chart Report/birth-chart-report.html" class="flex-button btn btn-outline-primary">Learn More</a>
</div>
<div class="reading reading2">
<div class="flex-number">2</div>
<h2 class="flex-type-of-report">Relationship Report</h2>
<p class="flex-text">A thorough written analysis of your relationship with a friend, lover, or family member as it evolves over time.</p>
<a href="Relationship Report/relationship-report.html" class="flex-button btn btn-outline-primary">Learn More</a>
</div>
<div class="reading reading3">
<div class="flex-number">3</div>
<h2 class="flex-type-of-report">Predictive Report</h2>
<p class="flex-text">A detailed written report that forecasts themes of the coming year and how you can prepare for the challenges to come.</p>
<a href="Predictive Report/predictive-report.html" class="flex-button btn btn-outline-primary">Learn More</a>
</div>
</section>
CSS
Теперь обновите ваши стили, добавив медиазапросы:
.flexbox-container {
display: flex;
justify-content: center;
align-items: flex-start;
flex-wrap: wrap;
gap: 40px;
background-image: url(../Images/Carousel.jpg);
background-size: cover;
padding: 40px 0 30px 0;
}
.reading {
background-color: #fff;
border-radius: 15px;
width: 310px;
height: 300px;
padding: 10px 30px 30px 30px;
position: relative;
box-sizing: border-box;
}
.flex-number {
background-color: #e8e8e8;
width: 70px;
height: 70px;
border-radius: 50px;
margin: auto;
text-align: center;
padding: 18px 20px 20px 20px;
position: absolute;
top: -25px;
left: 50%;
transform: translateX(-50%);
font-size: 1.5rem;
font-weight: bold;
}
.flex-type-of-report {
font-size: 1.6rem;
margin-top: 45px;
}
.flex-text {
margin-bottom: 30px;
}
/* Медиазапрос для маленьких экраны */
@media (max-width: 768px) {
.reading {
flex: 1 1 100%;
}
.reading1 {
flex: 0 0 100%; /* Заставляет первый элемент занять всю ширину */
}
.reading2, .reading3 {
flex: 0 0 calc(50% - 20px); /* Два других элемента занимают по 50% ширины минус отступы */
}
}
Объяснение изменений:
- flex: 0 0 100%; для первого элемента заставляет его занимать 100% ширины контейнера на малых экранах.
- flex: 0 0 calc(50% – 20px); для второго и третьего элементов позволяет им располагаться по 50% ширины контейнера, одновременно учитывая отступы между ними.
Таким образом, на устройствах с маленькими экранами первый элемент будет занимать всю строку, а два других элемента будут размещены непосредственно под ним.