Как при помощи grid расположить изображение справа от текста?
Подскажите пожалуйста как расположить изображение справа от текста так, что бы оно не вылезало за пределы карточки. Получается так:
Хотелось бы узнать как лучше располагать изображение в контейнере, чтобы оно не выходило за его пределы, чтобы потом получилась адаптивная вёрстка.
Вот мой код: HTML:
<section class="shop">
<div class="shop__gr">
<div class="div__1 cart">
<h1 class="cart__shop">Фильтрующие<br> материалы </h1>
<p>Только лучшие фильтроматериалы<br> в наличие на складах!</p>
<button type="button" class="button__catalog__full button"><span>Подробнее </span><img class="image__but" src="/img/buttt.png"></button>
<img class="image_catalog" src="/img/image1_catalog.png">
</div>
<div class="div__2 cart">
<h1 class="cart__shop">Кондиционеры и сплит Системы </h1>
</div>
<div class="div__3 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
<div class="div__4 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
<div class="div__5 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
<div class="div__6 cart">
<h1 class="cart__shop">Фильтры для вентиляции</h1>
</div>
<div class="div__7 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
<div class="div__8 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
<div class="div__9 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
<div class="div__10 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
<div class="div__11 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
<div class="div__12 cart">
<h1 class="cart__shop">Фильтрующие материалы </h1>
</div>
</div>
</section>
CSS:
.button__catalog__full{
border-radius: 8px;
font-size: 18px;
background-color: #12e435;
border: 0px;
cursor: pointer;
font-family: Montserrat;
font-size: 18px;
font-weight: 700;
line-height: 24px;
text-align: center;
}
.shop__gr{
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(6, 1fr);
}
.cart{
background-color: #EBEFEC;
padding: 15px;
margin: 15px;
border-radius: 10px;
display: grid;
}
.image_catalog{
display: grid;
grid-column: 2;
}
.div__1{
/* grid-column-start: 0;
grid-column-end: 2;
grid-row-start: 0;
grid-row-end: 2; */
width: 670px;
height: 376px;
grid-area: 1/1/3/3;
/* display: grid; */
}
.div__1 p{
grid-column: 1;
}
.div__1 button{
grid-column: 1;
}
.div__2{
grid-area: 1 / 3 / 1 / 3;
}
.div__3{
grid-area: 1 / 4 / 1 / 4;
}
.div__4{
grid-area: 3 / 1 / 3 / 1;
}
.div__5{
grid-area: 3 / 2 / 3 / 2;
}
.div__6{
grid-area: 2 / 3 / 4 / 5;
}
.div__7{
grid-area: 4 / 1 / 6 / 3;
}
.div__8{
grid-area: 4 / 3 / 4 / 3;
}
.div__9{
grid-area: 4 / 4 / 4 / 4;
}
.div__10{
grid-area: 5 / 3 / 7 / 5;
}
.div__11{
grid-area: 6 / 1 / 6 / 1;
}
.div_12{
grid-area: 6 / 2 / 6 / 2;
}
Ответы (2 шт):
Путем grid
- div__1
сделать сеткой и поставить жестко ширину для картинки и блока слева. Но не такой адаптивный вариант:
.div__1 {
display: grid;
grid-template-columns: 200px 200px;
/* остальныe стили */
}
.image_catalog {
justify-self: end;
align-self: center;
}
<div class="div__1 cart">
<div>
<h1 class="cart__shop">Фильтрующие<br> материалы </h1>
<p>Только лучшие фильтроматериалы<br> в наличие на складах!</p>
<button type="button" class="button__catalog__full button"><span>Подробнее </span><img class="image__but" src="/img/buttt.png"></button>
</div>
<img class="image_catalog" src="/img/image1_catalog.png">
</div>
На макете такое изображение накладывается на текст. Поэтому нужно сделать его absolute
и центрировать:
.div__1 {
position: relative;
/*Остальные стили*/
}
.div__1-left {
/*Обрезать по нужной ширине*/
max-width: 50%;
}
.image_catalog {
position: absolute;
/* Цетроирование по вертикали */
top: 50%;
transform: translateY(-50%);
/* Позиционирование */
right: 0;
/*Если картинку решат поменять нужно назначить границы*/
height: 100%;
max-width: 50%;
object-fit: contain;
}
<div class="div__1 cart">
<div class="div__1-left">
<h1 class="cart__shop">Фильтрующие<br> материалы </h1>
<p>Только лучшие фильтроматериалы<br> в наличие на складах!</p>
<button type="button" class="button__catalog__full button">
<span>Подробнее </span><img class="image__but" src="/img/buttt.png">
</button>
<div>
<img class="image_catalog" src="/img/image1_catalog.png">
</div>
Можно сделать, например так (картинки просто для примера):
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<article class="card">
<div class="card-data">
<div class="card-info">
<h1 class="card-title">Фильтрующие материалы </h1>
<p>Только лучшие фильтроматериалы в наличие на складах!</p>
</div>
<button type="button" class="button__catalog__full button">
<span>Подробнее</span>
<img class="image__but"
src="https://gas-kvas.com/grafic/uploads/posts/2024-01/gas-kvas-com-p-strelka-dlya-detei-na-prozrachnom-fone-21.png">
</button>
</div>
<img class="image_catalog"
src="https://www.coolershop.ru/image/cache/catalog/filtry/Aquafor-set-b510-03-04-07-800x800.jpg">
</article>
</body>
</html>
CSS:
*,
*::after,
*::before {
margin: 0;
padding: 0;
}
.card {
display: grid;
grid-template-columns: repeat(2, 1fr);
max-width: 600px;
min-width: 400px;
background-color: #EBEFEC;
padding: 15px;
margin: 15px;
border-radius: 10px;
}
.card-data {
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 15px;
}
.card-title {
margin-bottom: 15px;
}
.button__catalog__full {
border-radius: 8px;
font-size: 18px;
background-color: #12e435;
border: 0px;
cursor: pointer;
font-family: Montserrat;
font-size: 18px;
font-weight: 700;
line-height: 24px;
text-align: center;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
gap: 15px;
max-width: 160px;
aspect-ratio: 3.5;
}
.image__but {
width: 30px;
object-fit: cover;
object-position: center;
}
.image_catalog {
width: 100%;
height: 100%;
object-fit: cover;
}
Получается более адаптивная карточка, хотя нужно еще тестить. И еще нужно решить вопрос максимального и минимального размера самой карточки, и от чего он зависит, но это уже нужно решать в контексте общего макета.