【问题标题】:How to add slide-up & slide-down animation to variable height div?如何将上滑和下滑动画添加到可变高度 div?
【发布时间】:2018-06-12 17:28:01
【问题描述】:

当我将鼠标悬停在 div 卡上时,我想添加上滑和下滑动画。

初始卡片:

当我将鼠标悬停在卡片上时:

黄色部分应该向上滑动,当我移除悬停时它应该向下滑动直到它不可见。

我可以在悬停时显示和隐藏黄色部分,但我无法动画它。我猜是因为top: 182px; bottom: auto;(用于隐藏黄色部分并将紫色部分放置在底部)和top:auto;bottom:0;(无论高度如何都完全显示黄牌)

代码如下:

.card{
  margin-right:20px;
display: inline-block;
    padding: 0;
    border-radius: 19px;
    box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
    overflow: hidden;
    height: 200px;
    background-color:#2196f3;
    position:relative;
    text-align:center;
}
.image{
  padding:50px;
}
.content{
  border-radius: 0 0 19px 19px;
        background-color: #673AB7;
    position: absolute;
    width: 100%;
    top: 182px;
    bottom: auto;
}
.desc{
  background-color:#ffeb3b;
}

.card:hover .content{
  top: auto;
    transition: all 2s ease;
    bottom: 0px;
}
<div class='card'>
    fixed height card
    <div class='image'>
        fixed height image
    </div>
    <div class='content'>
        <div class='title'>
            fixed height title
        </div>
        <div class='desc'>
            =:variable height description:= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
            labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud the end.
        </div>
    </div>
</div>

<div class='card'>
    fixed height card
    <div class='image'>
        fixed height image
    </div>
    <div class='content'>
        <div class='title'>
            fixed height title
        </div>
        <div class='desc'>
            =:variable height description:= Lorem ipsum dolor sit amet, consectecing elit, sed do eiusmod tempor incididunt ut the end.
        </div>
    </div>
</div>

这里是 JSFiddle:http://jsfiddle.net/JerryGoyal/63c8hbr5/

我对想法持开放态度,只要它只能用 CSS 来完成!

【问题讨论】:

    标签: html css


    【解决方案1】:

    你是正确的,需要使用始终相同的位置技术。

    你需要坚持到底,然后设置一个translateY

    .card {
      margin-right: 20px;
      display: inline-block;
      padding: 0;
      border-radius: 19px;
      box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
      overflow: hidden;
      height: 200px;
      background-color: #2196f3;
      position: relative;
      text-align: center;
    }
    
    .image {
      padding: 50px;
    }
    
    .content {
      border-radius: 0 0 19px 19px;
      background-color: #673AB7;
      position: absolute;
      width: 100%;
      bottom: 18px;
      transform: translateY(100%);
      transition: all 2s ease;
    }
    
    .desc {
      background-color: #ffeb3b;
    }
    
    .card:hover .content {
      bottom: 0px;
      transform: translateY(0%);
    }
    <div class='card'>
      fixed height card
      <div class='image'>
        fixed height image
      </div>
      <div class='content'>
        <div class='title'>
          fixed height title
        </div>
        <div class='desc'>
          =:variable height description:= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud the end.
        </div>
      </div>
    </div>
    
    <div class='card'>
      fixed height card
      <div class='image'>
        fixed height image
      </div>
      <div class='content'>
        <div class='title'>
          fixed height title
        </div>
        <div class='desc'>
          =:variable height description:= Lorem ipsum dolor sit amet, consectecing elit, sed do eiusmod tempor incididunt ut the end.
        </div>
      </div>
    </div>

    【讨论】:

    • 这是你做的如此优雅!经验很重要:)
    【解决方案2】:

    将过渡更改为在 desc div 上工作,而不是在 content 上工作。转换也不适用于 auto 属性。尝试使用我展示的 max-height 属性。最大高度应该是您的 div 可以获得的非常大的高度。

    更新的 CSS

    .card {
          margin-right: 20px;
          display: inline-block;
          padding: 0;
          border-radius: 19px;
          box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
          overflow: hidden;
          height: 200px;
          background-color: #2196f3;
          position: relative;
          text-align: center;
        }
    
        .image {
          padding: 50px;
        }
    
        .content {
          border-radius: 0 0 19px 19px;
          background-color: #673AB7;
          position: absolute;
          width: 100%;
          bottom: 0;
        }
    
        .desc {
          background-color: #ffeb3b;
          max-height: 0;
          transition: all 2s ease;
        }
    
        .card:hover .desc {
          max-height: 500px;
        }
    

    .card {
      margin-right: 20px;
      display: inline-block;
      padding: 0;
      border-radius: 19px;
      box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
      overflow: hidden;
      height: 200px;
      background-color: #2196f3;
      position: relative;
      text-align: center;
    }
    
    .image {
      padding: 50px;
    }
    
    .content {
      border-radius: 0 0 19px 19px;
      background-color: #673AB7;
      position: absolute;
      width: 100%;
      bottom: 0;
    }
    
    .desc {
      background-color: #ffeb3b;
      max-height: 0;
      transition: all 2s ease;
    }
    
    .card:hover .desc {
      max-height: 500px;
    }
    <div class='card'>
      fixed height card
      <div class='image'>
        fixed height image
      </div>
      <div class='content'>
        <div class='title'>
          fixed height title
        </div>
        <div class='desc'>
          =:variable height description:= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud the end.
        </div>
      </div>
    </div>
    
    <div class='card'>
      fixed height card
      <div class='image'>
        fixed height image
      </div>
      <div class='content'>
        <div class='title'>
          fixed height title
        </div>
        <div class='desc'>
          =:variable height description:= Lorem ipsum dolor sit amet, consectecing elit, sed do eiusmod tempor incididunt ut the end.
        </div>
      </div>
    </div>

    【讨论】:

    • 这是一个很好的解决方法,但是因为它使用了最大高度技术,所以滑动动画会有一点延迟。但当然,这可以通过校准最大高度来最小化:)
    • 是的,我现在意识到了 :) 谢谢
    【解决方案3】:

    您可以使用关键帧在悬停内容上添加动画。

    .card{
      margin-right:20px;
    display: inline-block;
        padding: 0;
        border-radius: 19px;
        box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
        overflow: hidden;
        height: 200px;
        background-color:#2196f3;
        position:relative;
        text-align:center;
    }
    .image{
      padding:50px;
    }
        .content{
      border-radius: 0 0 19px 19px;
            background-color: #673AB7;
        position: absolute;
        width: 100%;
        top: 182px;
        bottom: auto;
        animation-name: slideFromTop;
            -webkit-animation-name: slideFromTop;
            animation-duration: 800ms;
            -webkit-animation-duration: 800ms;
            animation-timing-function: ease-out;
            -webkit-animation-timing-function: ease-out;
            animation-fill-mode: forwards;
            -webkit-animation-fill-mode: forwards;
    }
    .desc{
      background-color:#ffeb3b;
    }
    
    .card:hover .content{
      top: auto;
        bottom: 0px;
        animation-name: slideFromBottom;
            -webkit-animation-name: slideFromBottom;
            animation-duration: 800ms;
            -webkit-animation-duration: 800ms;
            animation-timing-function: ease-in;
            -webkit-animation-timing-function: ease-in;
            animation-fill-mode: forwards;
            -webkit-animation-fill-mode: forwards;
      
    }
    
    
    
    @keyframes slideFromBottom  {
            0%{
                opacity:0;
                -webkit-transform: translateY(100%);
                -moz-transform: translateY(100%);
                -ms-transform: translateY(100%);
                -o-transform: translateY(100%);
                transform: translateY(100%);
            }
            100%{
                opacity: 1;
                -webkit-transform: translateY(0px);
                -moz-transform: translateY(0px);
                -ms-transform: translateY(0px);
                -o-transform: translateY(0px);
                transform: translateY(0px);
                display: block;
            }
        }
    @keyframes slideFromTop  {
        0%{
            opacity:1;
            -webkit-transform: translateY(0px);
            -moz-transform: translateY(0px);
            -ms-transform: translateY(0px);
            -o-transform: translateY(0px);
            transform: translateY(0px);
        }
        100%{
            opacity: 0;
            -webkit-transform: translateY(100%);
            -moz-transform: translateY(100%);
            -ms-transform: translateY(400%);
            -o-transform: translateY(100%);
            transform: translateY(100%);
        }
    }
    <div class='card'>
        fixed height card
        <div class='image'>
            fixed height image
        </div>
        <div class='content'>
            <div class='title'>
                fixed height title
            </div>
            <div class='desc'>
                =:variable height description:= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
                labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud the end.
            </div>
        </div>
    </div>
    
    <div class='card'>
        fixed height card
        <div class='image'>
            fixed height image
        </div>
        <div class='content'>
            <div class='title'>
                fixed height title
            </div>
            <div class='desc'>
                =:variable height description:= Lorem ipsum dolor sit amet, consectecing elit, sed do eiusmod tempor incididunt ut the end.
            </div>
        </div>
    </div>

    您可以在此链接中查看JSFiddle

    希望对你有帮助!

    干杯!

    【讨论】:

    • “固定高度标题”紫色div默认应该是可见的。
    猜你喜欢
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2012-02-27
    • 2010-11-18
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多