使用css从下到上为div设置动画

问题描述 投票:3回答:3

我需要动画从下到上的div。情况就是这样:我有一个缩略图,其中包含一部电影的标题和描述。我想隐藏描述并仅在用户将鼠标悬停在其上时显示。

我尝试调整容器的高度,但是当值设置为“auto”时你无法为它设置动画,并且我无法为它提供特定的大小,因为标题可能因每部电影而异。正如您可能知道的那样,您无法使用“底部”和“顶部”属性从下到上进行动画制作。

这是html:

<div class="thumbnail-component">
  <img class="thumbnail-component__background" src="background.jpg" alt="">
  <div class="thumbnail-component__gradient"></div>
  <div class="text">

    <div class="text__content">
        <p class="text__title">The movie title</p>
        <div class="text__separator"></div>
        <p class="text__description">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        </p>
        <p class="text__author">Published by Author</p>
    </div>
</div>

这是我想要完成的图像:

https://imgur.com/Ddkj5oI

我老实说完全失去了,我想我尝试了所有我知道的东西。抱歉,我的英语不太好。

html css
3个回答
2
投票

完全灵活和响应迅速 没有硬编码或任意高度,没有涉及JS。

On hover show card description using CSS

基本上,

  • 将标题翻译为-100%,将动画片悬停在0
  • 将标题和内容包装成DIV(即:.anim
  • translateY .anim+100%,并将其动画为0

在整页中打开示例,看看会发生什么以及它是如何工作的:

/*QuickReset*/*{margin:0;box-sizing:border-box;}

.thumb {
  width: 140px;
  background: #eee;
}

.anim {
  transition: 0.5s;
  transform: translateY(100%);
}

.title {
  color: red;
  transition: 0.5s;
  transform: translateY(-100%);
}

.author {
  color: blue;
}

/* ANIMATE */

.thumb:hover .anim,
.thumb:hover .title {
  transform: translateY(0);
}
<div class="thumb">
  <div class="anim">
    <div class="title">The movie even longer title</div>
    <div class="description">
      Text lenghts of Title and Author or even Description do not matter. They will all perfectly accommodate into .thumb on hover
    </div>
  </div>
  <div class="author">Published by super long some Author</div>
</div>

Flexbox Grid!

实例证明概念示例:

/*QuickReset*/

* {
  margin: 0;
  box-sizing: border-box;
}

html {
  height: 100%
}

body {
  min-height: 100%;
  font: 14px/1.4 sans-serif;
}

.grid-3 {
  display: flex;
  flex-flow: row wrap;
}

.thumb {
  display: flex;
  flex-flow: column nowrap;
  position: relative;
  overflow: hidden;
  width: 33.333%;
  color: #fff;
}

.thumb-gradient,
.thumb-img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.thumb-gradient {
  background: linear-gradient(to bottom, rgba(0, 0, 0, 0.24) 0%, rgba(0, 0, 0, 0.56) 100%);
}

.thumb-anim {
  margin-top: auto;  /* pushes all content to bottom */
  position: relative;
  transition: 0.5s;
  transform: translateY(100%);
}

.thumb-title {
  text-transform: uppercase;
  padding: 20px;
  transition: 0.5s;
  transform: translateY(-100%);
}

.thumb-description {
  padding: 10px 20px;
  transition: 0.5s;
  opacity: 0;
  flex: 1;
}

.thumb-author {
  padding: 20px;
  position: relative;
}


/* ANIMATE */

.thumb:hover .thumb-anim {
  transform: translateY(0);
}

.thumb:hover .thumb-title {
  transform: translateY(0%);
}

.thumb:hover .thumb-description {
  opacity: 1;
}
<div class="grid-3">

  <div class="thumb">
    <img class="thumb-img" src="http://placekitten.com/300/300" alt="Catz!">
    <div class="thumb-gradient"></div>
    <div class="thumb-anim">
      <h3 class="thumb-title">The movie title</h3>
      <p class="thumb-description">
        Text lenghts of Title and Author or even Description do not matter. They will all perfectly accommodate into .thumb on hover
      </p>
    </div>
    <div class="thumb-author">Published by super long some Author</div>
  </div>

  <div class="thumb">
    <img class="thumb-img" src="http://placekitten.com/400/300" alt="Catz!">
    <div class="thumb-gradient"></div>
    <div class="thumb-anim">
      <h3 class="thumb-title">The movie title</h3>
      <p class="thumb-description">
        The row heights are dictated by the tallest in the horizontal group
      </p>
    </div>
    <div class="thumb-author">Published</div>
  </div>

  <div class="thumb">
    <img class="thumb-img" src="http://placekitten.com/230/300" alt="Catz!">
    <div class="thumb-gradient"></div>
    <div class="thumb-anim">
      <h3 class="thumb-title">The movie title a super long title here</h3>
      <p class="thumb-description">
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus facilis beatae, numquam aliquam eveniet. Iure porro provident itaque hic quae tempora. Quaerat doloribus dolore facilis similique, soluta asperiores quas sapiente.
      </p>
    </div>
    <div class="thumb-author">Published by super long some Author</div>
  </div>

  <div class="thumb">
    <img class="thumb-img" src="http://placekitten.com/270/300" alt="Catz!">
    <div class="thumb-gradient"></div>
    <div class="thumb-anim">
      <h3 class="thumb-title">The movie title</h3>
      <p class="thumb-description">
        Text lenghts of Title and Author or even Description do not matter. They will all perfectly accommodate into .thumb on hover
      </p>
    </div>
    <div class="thumb-author">Published by super long some Author</div>
  </div>

  <div class="thumb">
    <img class="thumb-img" src="http://placekitten.com/250/370" alt="Catz!">
    <div class="thumb-gradient"></div>
    <div class="thumb-anim">
      <h3 class="thumb-title">The movie title</h3>
      <p class="thumb-description">
        Text lenghts of Title and Author or even Description do not matter. They will all perfectly accommodate into .thumb on hover
      </p>
    </div>
    <div class="thumb-author">Yep. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cupiditate sequi aspernatur cumque saepe incidunt enim, nihil dolores ipsam numquam architecto velit labore quod laboriosam aliquam distinctio tempora unde ad totam.</div>
  </div>

  <div class="thumb">
    <img class="thumb-img" src="http://placekitten.com/290/340" alt="Catz!">
    <div class="thumb-gradient"></div>
    <div class="thumb-anim">
      <h3 class="thumb-title">The movie title</h3>
      <p class="thumb-description">
        Text lenghts of Title and Author or even Description do not matter. They will all perfectly accommodate into .thumb on hover
      </p>
    </div>
    <div class="thumb-author">Published by super long some Author</div>
  </div>

</div>

0
投票

使用CSS转换很容易......

.thumbnail-component {
  width: 240px;
  border: 1px solid red;
  overflow: hidden;
  cursor: pointer;
}

.thumbnail-component .text {
  display: inline-block;
  position: relative;
  text-align: center;
  transform: translateY(70%);
  transition: all 1s ease;
}

.thumbnail-component:hover .text {
  transform: translateY(0%);
}
<div class="thumbnail-component">
  <img class="thumbnail-component__background" src="background.jpg" alt="">
  <div class="thumbnail-component__gradient"></div>
  <div class="text">

    <div class="text__content">
      <p class="text__title">The movie author</p>
      <div class="text__separator"></div>
      <p class="text__description">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
      </p>
      <p class="text__author">Published by Author</p>
    </div>
  </div>
</div>

0
投票

您可以转换flex属性,这在这里很有用。为了在悬停期间显示描述,我将其opacity设置为0并将其绝对安全地放置在其相对父容器中。最后,我删除了text__separator div因为作为一个flex孩子没用。

.text__content {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

.text__content__top {
  position: relative;
  margin-top: auto;
  transition: 0.5s flex ease-in-out;
}

.text__description {
  position: absolute;
  opacity: 0;
  transition: 0.4s opacity ease-in-out 0.1s;
}

.text__title {
  border-bottom: 2px solid red;
}

.thumbnail-component:hover .text__content__top {
  flex: 1;
}

.thumbnail-component:hover .text__content__top > * {
  pointer-events: none;
}

.thumbnail-component:hover .text__description {
  opacity: 1;
}
<div class="thumbnail-component">
  <div class="text">
    <div class="text__content">

      <div class="text__content__top">
        <p class="text__title">The movie title</p>
        <p class="text__description">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        </p>
      </div>

      <div class="text__content__bottom">
        <p class="text__author">Published by Author</p>
      </div>

    </div>
  </div>
</div>

jsFiddle

© www.soinside.com 2019 - 2024. All rights reserved.