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

Ссылка скопирована
1 ответ

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

Застрял на такой задаче: нужно сверстать сетку с карточками товаров. При наведении на один из товаров (.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>

<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; }

.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, прикрепляю скриншот (на третий товар в первом ряду наведен курсор, и его содержимое накладывается на соседние элементы):

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

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

В голову приходит только изменение размеров при помощи JS, но почему-то мне кажется, что должен быть более простой способ :) Может кто-нибудь подскажет, как реализовать? Буду очень благодарен.

Дополнительно:

плохо пробовал через absolute

  • не получается добавить тень и т.д.

    Отсюда вывод: не тому тень.

    Пример: отображение товаров на wb

    В голову приходит только изменение размеров при помощи JS

    Да, на WB так и сделано.
    Только размер как раз таки меняться не должен ;) Это содержимое должно вывалиться.

  • Ankhena, жалко, что нет здесь смайлика с рукой и лицом.. Как я сам не додумался тень врапперу добавить, не понимаю)) Спасибо за ответ!
  • szQocks, как говорится, спасибо за конструктивный ответ)
  • 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>

    <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; }

    .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; }

    • Огромное спасибо! За рабочее решение и за то, что потратили свое время
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Артём Dev Ответ

    Для изменения размеров flex-элемента без изменения положения соседних блоков, можно использовать свойства flex-grow, flex-shrink и flex-basis.

    Прежде всего, убедитесь, что ваш flex-контейнер имеет свойство display: flex или display: inline-flex, чтобы установить контейнер в режим гибкого макета.

    Для изменения размеров flex-элемента можно использовать свойство flex-grow. Оно определяет, насколько элемент может увеличиться по сравнению с другими flex-элементами внутри контейнера. Например, если установить flex-grow: 2 для одного элемента и flex-grow: 1 для другого, первый элемент будет занимать в два раза больше места.

    Также можно использовать свойство flex-shrink, которое определяет, насколько элемент может уменьшиться по сравнению с другими элементами в случае нехватки места. Если установить flex-shrink: 0 для элемента, он не будет уменьшаться в размере.

    Наконец, свойство flex-basis позволяет установить базовый размер элемента перед распределением свободного пространства. Например, можно задать flex-basis: 200px для элемента, чтобы установить его базовую ширину.

    Пример использования этих свойств в CSS:

    .flex-container {
      display: flex;
    }
     
    .flex-item {
      flex-grow: 2;
      flex-shrink: 0;
      flex-basis: 200px;
    }

    .flex-container { display: flex; } .flex-item { flex-grow: 2; flex-shrink: 0; flex-basis: 200px; }

    Таким образом, изменяя значения свойств flex-grow, flex-shrink и flex-basis для flex-элементов, можно контролировать их размеры без изменения положения соседних блоков.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно