Переполнение дочернего элемента за пределы родительского элемента

У меня есть простая карточка с изображением .menu-card__header-image. При наведении я хочу, чтобы поднимать это изображение поднялось на несколько пикселей. Однако, когда я поднимаю изображение, оно не видно за пределами родительского контейнера .menu-card.

.menu-card {
  font-family: sans-serif;
  color: red;
  margin-left: auto;
  margin-right: auto;
  width: 80%;
  overflow: hidden;
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
  transition: 0.3s;
  border-bottom-left-radius: 5px;
  border-bottom-right-radius: 5px;
  padding-bottom: 20px;
  max-width: 400px;
}
.menu-card:hover {
  box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
  overflow: visible;
}
.menu-card__header {
  background-color: orange;
  clip-path: polygon(0 0, 100% 0, 100% calc(100% - 6vw), 0 100%);
  max-height: 300px;
  border-top-left-radius: 5px;
  border-top-right-radius: 5px;
  overflow: hidden;
  text-align: center;
}
.menu-card__header-image {
  margin-left: auto;
  margin-right: auto;
  z-index: 33;
  position: relative;
  bottom: 0px;
  transition: bottom 0.5s ease-in-out;
}
.menu-card:hover .menu-card__header-image {
  bottom: 80px;
}
.menu-card:first-child {
  margin-bottom: 50px;
}
.menu-card:last-child {
  margin-top: 50px;
}
.menu-card__title {
  padding: 0 12px;
}
.menu-card__description {
  padding: 0 12px;
}

.menu-card__title {
  text-align: center;
}
<div class = "menu-card">
  <div class = "menu-card__header">
    <img src = "http://lorempixel.com/250/635" alt = "" class = "menu-card__header-image" height = "400px" />
  </div>
  <h2 class = "menu-card__title">
    Lorem Ipsum
  </h2>
  <p class = "menu-card__description">
    Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corrupti, architecto. Repudiandae dolorum incidunt sint ex
  </p>
</div>

Вот соответствующее перо: https://codepen.io/saifalfalah/pen/gJKNBE?editors=1100

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

Я опубликовал ответ, и я возился с вашей кодовой ручкой, чтобы посмотреть, смогу ли я дать вам рабочий пример.

JasonB 28.05.2019 05:43
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
1
86
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Есть три причины, по которым ваше изображение не видно при подъеме.

  • у вас есть overflow:hidden на .menu-card
  • у вас есть overflow:hidden на .menu-card__header
  • у вас установлен clip-path на .menu-card__header

Вы можете получить угловой эффект, используя белый элемент, расположенный внизу заголовка, используя clip-path или треугольник css. Это сведет на нет необходимость в пути клипа заголовка. Затем удалите переполнение css, и вы должны получить эффект, который ищете.

Спасибо Джейсон! Это сработало. Интересно, почему использование пути обрезки означает, что изображение перестало быть видимым?

Saif Al Falah 29.05.2019 01:29

Здорово! Думайте о пути отсечения как о границе с переполнением: скрыто

JasonB 29.05.2019 05:15

Хм... Это имеет смысл. Спасибо!

Saif Al Falah 29.05.2019 21:03
Ответ принят как подходящий

Одним из вариантов без изменения разметки является оживлять свойство clip-path, а также изменение на clip-path: polygon(0 -80px, 100% -80px, 100% calc(100% - 6vw), 0 100%) при наведении — см. демонстрацию ниже:

body {
  margin-top: 100px; /* for illustration */
}

.menu-card {
  margin-left: auto;
  margin-right: auto;
  width: 80%;
  /*overflow: hidden;*/
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
  transition: 0.3s;
  border-bottom-left-radius: 5px;
  border-bottom-right-radius: 5px;
  padding-bottom: 20px;
  max-width: 400px;
}
.menu-card:hover {
  box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
  /*overflow: visible;*/
}
.menu-card:hover .menu-card__header { /* added */
   clip-path: polygon(0 -80px, 100% -80px, 100% calc(100% - 6vw), 0 100%);
}
.menu-card__header {
  background-color: orange;
  clip-path: polygon(0 0, 100% 0, 100% calc(100% - 6vw), 0 100%);
  max-height: 300px;
  border-top-left-radius: 5px;
  border-top-right-radius: 5px;
  /*overflow: hidden;*/
  text-align: center;
  transition: clip-path 0.5s ease-in-out; /* added */
}
.menu-card__header-image {
  margin-left: auto;
  margin-right: auto;
  z-index: 33;
  position: relative;
  bottom: 0px;
  transition: bottom 0.5s ease-in-out;
}
.menu-card:hover .menu-card__header-image {
  bottom: 80px;
}
.menu-card__title {
  padding: 0 12px;
}
.menu-card__description {
  padding: 0 12px;
}

.menu-card__title {
  text-align: center;
}
<div class = "menu-card">
  <div class = "menu-card__header">
    <img src = "http://lorempixel.com/250/635" alt = "" class = "menu-card__header-image" height = "400px" />
  </div>
  <h2 class = "menu-card__title">
    Lorem Ipsum
  </h2>
  <p class = "menu-card__description">
    Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corrupti, architecto. Repudiandae dolorum incidunt sint ex
  </p>
</div>

Я бы сделал это по-другому, вместо clip-path я рассмотрю фон в разделе заголовка, чтобы создать угловую форму, и ваше изображение будет просто скрыто за ним. Затем вы выполняете анимацию простого преобразования, и у вас не будет проблем с переполнением.

Я заменил 6vw на 40px в приведенном ниже примере:

.menu-card {
  font-family: sans-serif;
  color: red;
  margin:40px auto;
  width: 80%;
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
  transition: 0.3s;
  border-radius:0 0 5px 5px;
  max-width: 400px;
}
.menu-card:hover {
  box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
}
.menu-card__header {
  background-color: orange;
  max-height: 300px;
  border-radius: 5px 5px 0 0;
  text-align: center;
}
.menu-card__header-image {
  transition: transform 0.5s ease-in-out;
}
.menu-card:hover .menu-card__header-image {
  transform:translateY(-80px);
}
.menu-card__title {
  margin:0;
  padding:15px;
  padding-top:40px; /* space for the triangle shape */
  margin-top:-40px; /* to create the overlap with the top section (same as padding)*/
  background:
    /* top background will take 40px and draw a triangular shape*/
    linear-gradient(to bottom right,transparent 49%,#fff 50%)top/100% 40px,
    /* bottom background will take the remaining space as a rectangular shape*/
    linear-gradient(#fff,#fff) bottom/100% calc(100% - 40px);
  background-repeat:no-repeat;
  position:relative;
  text-align: center;
}
.menu-card__description {
  margin:0;
  padding: 0 12px 20px;
  background:#fff;
  position:relative;
}
<div class = "menu-card">
  <div class = "menu-card__header">
    <img src = "https://picsum.photos/id/0/250/635" alt = "" class = "menu-card__header-image" height = "400px" />
  </div>
  <h2 class = "menu-card__title">
    Lorem Ipsum
  </h2>
  <p class = "menu-card__description">
    Lorem ipsum, dolor sit amet consectetur adipisicing elit. Corrupti, architecto. Repudiandae dolorum incidunt sint ex
  </p>
</div>

Нужно всего лишь изменить две поправки на стили.

1, удалить свойство переполнения из ".menu-card__header"

.menu-card__header { /* overflow: hidden; */}

2, добавить свойство ниже при наведении

&:hover  .menu-card__header {
clip-path: polygon(0 -80px, 100% -80px, 100% calc(100% - 6vw), 0 100%);

}

См. ниже пример jsfiddle здесь

Другие вопросы по теме