размещение элемента div перед другим div, расположенным по центру

#html #css

#HTML #css

Вопрос:

Возможно ли поместить элемент div прямо перед элементом, который уже центрирован? Уже центрированный элемент div должен был бы выровняться с элементом div сверху. Я пытаюсь выполнить описанное ниже на рисунке

            --------
           |      |
           |  1   |
           --------
     ----  --------
     |   | |      |
     |3  | |  2   |
      ---  --------
  

блоки div 1 и 2 будут располагаться друг над другом. Я могу сделать это, выполнив простое поле: 0 автоматически;

 .div1 .div2{
  margin: 0 auto
}
  

Однако у меня возникли проблемы с установкой блока div 3 прямо перед 2. Значение float:left в блоке 3 div также не сработало. Есть ли какой-либо способ вставить блок div 3 перед 2, сохранив свойство margin: 0 auto в блоке div 2. Любая помощь или указатели будут оценены

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

1. позиция: абсолютная в div3?

2. Я думал об этом, но не окажет ли это отрицательного влияния на отзывчивость div?

3. это будет зависеть от того, какой вы хотите, чтобы была скорость реагирования и какова ваша структура HTML

Ответ №1:

Вы можете рассмотреть решение, основанное на CSS grid, как показано ниже:

 .container {
  display:grid;
  grid-template-columns:1fr auto 1fr;
}

.container > div {
  min-height:50px;
  min-width:200px;
  outline:1px solid;
  grid-column:2;
}
.container > div:last-child {
  grid-column:1;
  grid-row:2;
}  
 <div class="container">
<div>1</div>
<div>2</div>
<div>3</div>
</div>  

Еще одна идея с flexbox:

 .container {
  display:flex;
  flex-wrap:wrap;
}

.container > div {
  min-height:50px;
  min-width:200px;
  outline:1px solid;
}
.container > div:first-child {
  order:-2;
  margin:auto; 
}
.container > div:last-child {
  order:-1;
  margin:0;
  flex:1;
}

/*to create break line*/
.container:before {
  content:"";
  order:-1;
  flex-basis:100%;
}

/*to have the same as 3*/
.container:after {
  content:"";
  flex:1;
}  
 <div class="container">
<div>1</div>
<div>2</div>
<div>3</div>
</div>  

Вы также можете рассмотреть возможность позиционирования:

 .container {
  position:relative;
}

.container > div:not(:last-child) {
  min-height:50px;
  max-width:200px;
  outline:1px solid;
  margin:auto;
}

.container > div:last-child {
  position:absolute;
  left:0;
  bottom:0;
  width:calc((100% - 200px)/2);
  min-height:50px;
  outline:1px solid;
}  
 <div class="container">
<div>1</div>
<div>2</div>
<div>3</div>
</div>  

Ответ №2:

Я выступаю за CSS Grid и grid-template-areas . В случае, если вы не знакомы с синтаксисом, . представляет собой пустую ячейку в сетке.

 .container { 
  display: grid;
  grid-gap: 8px;
  grid-template-areas: ". one"
                       "three two";
}
.container div {
  border: 1px dashed;
  padding: 4px;
}

.div1 {
  grid-area: one;
}

.div2 {
  grid-area: two;
  justify-self: flex-start;  
}

.div3 {
  grid-area: three;
  justify-self: flex-end;  
}  
 <div class="container">
  <div class="div1">div 1</div>
  <div class="div2">div 2</div>
  <div class="div3">div 3</div>
</div>  

Обновить

Я настроил элементы сетки так, чтобы они вели себя так, как вы просили в комментариях. Я удалил justify-content: center из родительской сетки, что позволяет элементам сетки расширяться до родительского контейнера. Затем я использовал justify-self для закрепления div2 и div3 в центре.

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

1. спасибо за ответ. Я попробовал это, и это отлично работает. Я присвоил div1 ширину 1020 пикселей и максимальную ширину: 100%. Когда я сворачиваю браузер, элемент div1 не реагирует и не изменяется с размером экрана. Есть ли способ обойти это?

2. @hello Я настроил сетку так, чтобы она div1 охватывала максимальную ширину и div2 и div3 оставалась в центре. Я не смог настроить div1 , чтобы иметь width of 1020px , оставаясь ограниченным родительским контейнером grid.