@SlavaSlavik

Как изменить размеры flex-элемента без изменения положения соседних блоков?

Друзья, всех приветствую!

Застрял на такой задаче: нужно сверстать сетку с карточками товаров. При наведении на один из товаров (.item:hover), один из его дочерних элементов становится видимым, и, соответственно, высота .item увеличивается. Но при этом новый, увеличенный item должен перекрывать соседние, влиять на их положение он не должен.

<div class="container">

		<div class="item">
			<div class="visible-block">
				Какой-то контент, который виден по умолчанию
			</div>
			<div class="hidden-block">
				Контент, который появляется при наведении мыши на item
			</div>
		</div>

		<div class="item">
			<div class="visible-block">
				Какой-то контент, который виден по умолчанию
			</div>
			<div class="hidden-block">
				Контент, который появляется при наведении мыши на item
			</div>
		</div>

		<div class="item">
			<div class="visible-block">
				Какой-то контент, который виден по умолчанию
			</div>
			<div class="hidden-block">
				Контент, который появляется при наведении мыши на item
			</div>
		</div>

		<div class="item">
			<div class="visible-block">
				Какой-то контент, который виден по умолчанию
			</div>
			<div class="hidden-block">
				Контент, который появляется при наведении мыши на item
			</div>
		</div>

		<div class="item">
			<div class="visible-block">
				Какой-то контент, который виден по умолчанию
			</div>
			<div class="hidden-block">
				Контент, который появляется при наведении мыши на item
			</div>
		</div>
		
	</div>


.container {
    max-width: 800px;
    padding: 10px;
    margin: 0 auto;
    border: 2px solid #000;
    box-sizing: border-box;

    display: flex;
    justify-content: flex-start;
    align-items: stretch;
    flex-wrap: wrap;
    gap: 25px;
}

.item {
    border: 1px solid red;
    text-align: center;
    flex: 0 1 240px;
    box-sizing: border-box;
}

.item div {
    padding: 20px;
}

.hidden-block {
    display: none;
}

.item:hover {box-shadow: 0 0 10px rgba(0,0,0,0.5);}

.item:hover .hidden-block {
    display: block;
}


Как реализовать это дело таким образом, чтобы положение соседних элементов при этом не менялось?

Пример: отображение товаров на wb, прикрепляю скриншот (на третий товар в первом ряду наведен курсор, и его содержимое накладывается на соседние элементы):
64cdfd463090c328298515.png

Пробовал добавлять внутрь .item дополнительный див .wrapper. Item'у добавлял position: relative, а wrapper'у absolute. Но т.к. relative ориентируется на исходные размеры элемента, не получается добавить тень и т.д.

В голову приходит только изменение размеров при помощи JS, но почему-то мне кажется, что должен быть более простой способ :) Может кто-нибудь подскажет, как реализовать? Буду очень благодарен.
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
AlexanderBashkin
@AlexanderBashkin
https://codepen.io/rainbrew/pen/OJaqEOy

<div class="container">
   <div class="item">
      <div class="item-wrapper">
         <div class="visible-block">
            Какой-то контент, который виден по умолчанию
         </div>
         <div class="hidden-block">
            Контент, который появляется при наведении мыши на item
         </div>
      </div>
   </div>
   <div class="item">
      <div class="item-wrapper">
         <div class="visible-block">
            Какой-то контент, который виден по умолчанию
         </div>
         <div class="hidden-block">
            Контент, который появляется при наведении мыши на item
         </div>
      </div>
   </div>
   <div class="item">
      <div class="item-wrapper">
         <div class="visible-block">
            Какой-то контент, который виден по умолчанию
         </div>
         <div class="hidden-block">
            Контент, который появляется при наведении мыши на item
         </div>
      </div>
   </div>
   <div class="item">
      <div class="item-wrapper">
         <div class="visible-block">
            Какой-то контент, который виден по умолчанию
         </div>
         <div class="hidden-block">
            Контент, который появляется при наведении мыши на item
         </div>
      </div>
   </div>
   <div class="item">
      <div class="item-wrapper">
         <div class="visible-block">
            Какой-то контент, который виден по умолчанию
         </div>
         <div class="hidden-block">
            Контент, который появляется при наведении мыши на item
         </div>
      </div>
   </div>
</div>


.container {
     max-width: 800px;
     padding: 10px;
     margin: 0 auto;
     border: 2px solid #000;
     box-sizing: border-box;
     display: flex;
     justify-content: flex-start;
     align-items: stretch;
     flex-wrap: wrap;
     gap: 25px;
}
 .item {
     text-align: center;
     flex: 0 1 240px;
     box-sizing: border-box;
     position: relative;
}
 .item .item-wrapper {
     border: 1px solid red;
     background: #fff;
}
 .item:hover .item-wrapper {
     position: absolute;
     top: 0;
     left: 0;
     box-shadow: 0 0 10px rgba(0,0,0,0.5);
     min-height: 100px;
     z-index: 2;
}
 .item:hover .hidden-block {
     display: block;
     padding: 0 20px 20px 20px;
}
 .item .visible-block {
     padding: 20px;
}
 .hidden-block {
     display: none;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы