4 плавающих раздела, которые симметрично реагируют на сужающиеся экраны с помощью CSS

#css #responsive

#css #отзывчивый

Вопрос:

[ 1 ] [ 2 ] [ 3 ] [ 4 ]

У меня есть четыре раздела, плавающие слева (вверху), используя простой CSS: float: left; width: 128px; height: 128px

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

[ 1 ] [ 2 ] [ 3 ]

[ 4 ]

Но чего бы мне действительно хотелось, так это чтобы последние два блока переходили на следующую строку, чтобы сохранить симметричный вид:

[ 1 ] [ 2 ]

[ 3 ] [ 4 ]

И когда экран сужается еще больше, блоки укладываются один над другим:

[ 1 ]

[ 2 ]

[ 3 ]

[ 4 ]

Ответ №1:

Вот один из способов сделать это с помощью медиа-запросов.

Хитрость заключается в том, чтобы выбрать подходящую точку останова для max-width , например, 610 пикселей, а затем использовать nth-child выбранный, чтобы очистить значение с плавающей точкой для каждого 3-го дочернего элемента, начиная с 3-го.

Ссылка: https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries

 .box {
  float: left;
  width: 128px;
  height: 128px;
  background-color: grey;
  margin: 10px;
  box-sizing: border-box;
  border: 2px solid black;
}
.container-box {
  border: 1px dotted blue;
  overflow: auto;
  box-sizing: borderbox;
}
@media (max-width: 610px) {
  .box {
    background-color: yellow;
  }
  .box:nth-child(2n 3) {
    background-color: red;
    clear: left;
  }
}  
 <div class="container-box">
  <div class="box">1</div>
  <div class="box">2</div>
  <div class="box">3</div>
  <div class="box">4</div>
</div>  

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

1. Спасибо за это, хотя последующий ответ немного проще.

Ответ №2:

Сгруппируйте [3] и [4] вместе в div (и [1] и [2], если хотите). Дайте ему максимальную ширину, но автоматическую высоту. Таким образом, когда экран сужается, два раздела должны двигаться бок о бок, но прыгать вниз, когда экран становится уже.

пример:

 .contain {
    max-width:256px;
    height:auto;
}

<div class="contain">
    <div class="div3">contents</div>
    <div class="div4">contents</div>
</contain>
  

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

1. Кажется, это помогает, о чем свидетельствует jsfiddle.net/n45u0c3x

Ответ №3:

Отлично, но для улучшения отзывчивости и удовлетворения последнего требования вы можете использовать это:

 .box {
  float: left;
  width: 128px;
  height: 128px;
  background-color: grey;
  margin: 10px;
  box-sizing: border-box;
  border: 2px solid black;
  width: calc(25% - 20px);
}

.container-box {
  border: 1px dotted blue;
  overflow: auto;
  box-sizing: borderbox;
}

@media (max-width: 610px) {
  .box {
    background-color: yellow;
    width: calc(50% - 20px);
  }
  .box:nth-child(2n 3) {
    background-color: red;
    clear: left;
  }
}

@media (max-width: 400px) {
  .box {
    background-color: yellow;
    width: calc(100% - 20px);
  }
  .box:nth-child(2n 3) {
    background-color: yellow;
    clear: initial;
  }
}  
 <div class="container-box">
  <div class="box">1</div>
  <div class="box">2</div>
  <div class="box">3</div>
  <div class="box">4</div>
</div>  

Ответ №4:

Попробуйте поместить 2 divs в контейнер div, затем установите ширину этого контейнера div в два раза больше размера каждого обычного div.

 <div class="container-box">
    <div class="box">1</div>
    <div class="box">2</div>
</div>
<div class="container-box">
    <div class="box">3</div>
    <div class="box">4</div>
</div>

.box {    
    float:left; 
    width:128px;
    height:128px;
    background: grey;
}

.container-box {
    float: left;
    width: 256px;
    height: 128px;
}
  

Вот ссылка на скрипку:https://jsfiddle.net/wfhk1fak/1 /

Надеюсь, это поможет.

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

1. К сожалению, две пары блоков не будут складываться в 4 одиночных, но модификация, предложенная Foxwells выше, сделала свое дело.