Адаптивная сетка css — как сделать первый элемент шириной 2 x и адаптивным

#css #css-grid

#css #css-сетка

Вопрос:

Я сделал следующее с помощью CSS grid:

https://imgur.com/a/wu8bJ7d (анимированный gif, показывающий текущее поведение)

Это поведение, которое я хочу, за исключением того, что я хочу, чтобы первое изображение было в 2 раза больше ширины (т.Е. 3 cols с первым элементом, охватывающим 2 cols, как в макете ниже):

введите описание изображения здесь

Это код, который у меня есть до сих пор

 .news-container {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(441px, 1fr));
    margin-top:2rem;
    column-gap: 2.33em;
    row-gap:  2.33em;

}
.news-item:first-child {
    grid-column:  1 2;
  }

.news-item {
position: relative;
border-radius: 10px;
border: 5px solid #fff;
color: #fff;
-webkit-box-shadow: 0px 0px 16px -1px rgba(0,0,0,0.11);
-moz-box-shadow: 0px 0px 16px -1px rgba(0,0,0,0.112);
box-shadow: 0px 0px 16px -1px rgba(0, 0, 0, 0.11);
  

}

Это возможно?

Спасибо

Ответ №1:

Если у вас есть только две фотографии, и вы хотите, чтобы вторая была перенесена на новую строку при сжатии экрана, проще использовать гибкий блок:

 .container {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
}

.container div {
  box-sizing: border-box;
  padding: 20px;
  background-color: green;
  color: white;
  font: 24px sans-serif;
}

.one {
  flex-basis: 441px;
  flex-grow: 2;
}

.two {
  flex-basis: 220px;
  flex-grow: 1;
}  
 <div class="container">
  <div class="one">One</div>
  <div class="two">Two</div>
</div>  

Вы можете поэкспериментировать с flex-grow , flex-basis и max-width если вы не хотите, чтобы ваше второе изображение занимало всю ширину, когда оно переходит к следующей строке.

Насколько я знаю, единственный способ добиться такого поведения с сеткой, если только ячейки не имеют одинакового размера, — это использовать медиа-запросы и корректировать прямоугольник сетки непосредственно для меньшего экрана.

Комментарии:

1. Спасибо за ответы — в конце концов, я выбрал этот подход.

2. @Burns Всегда пожалуйста. Если вы считаете, что это решение вашей проблемы, пожалуйста, примите его (и проголосуйте за него), чтобы другим людям с такой же проблемой было легче его найти.

Ответ №2:

grid-area можно сделать это. Например:

 .grid-container {
  display: grid;
  grid-template-columns: auto auto auto auto;
  grid-gap: 10px;
  background-color: #2196F3;
  padding: 10px;
}

.grid-container > div {
  background-color: rgba(255, 255, 255, 0.8);
  text-align: center;
  padding: 20px 0;
  font-size: 30px;
  height: 50px;
}

.item1 {
  grid-area: 1 / 1 / span 2 / span 3;
}  
 <div class="grid-container">
  <div class="item1">1</div>
  <div class="item2">2</div>
</div>  

Комментарии:

1. Ваше решение не перенесет второй элемент на следующую строку при уменьшении размера экрана.

2. Правильно, и есть способы справиться с этим. Моей целью было просто помочь OP в курсе области сетки.

3. Какие есть способы справиться с этим, используя сетку, за исключением изменения области сетки в медиа-запросах? Могут быть некоторые, но я о них не знаю.