如何使用CSS3过渡获得与jQuery的slideToggle相同的效果?

sg24os4d  于 2023-03-01  发布在  jQuery
关注(0)|答案(6)|浏览(106)

我想要jQuery slideToggle效果,但希望使用CSS3过渡,以便调用iOS设备上的GPU,使过渡更平滑。

1szpjjfi

1szpjjfi1#

您可以通过转换heightpaddingborder-width来实现这一点。

$('.run-css').click(function() {
    $('.cont').toggleClass('toggled');
});
.cont {
    width: 100px;
    height: 100px;
    border: 1px #CCC solid;
    background-color: #EEE;
    padding: 5px;
    -webkit-transition: height .3s linear, padding-top .3s linear, padding-bottom .3s linear, border-top-width .3s linear, border-top-width .3s linear;
    transition: height .3s linear, padding-top .3s linear, padding-bottom .3s linear, border-top-width .3s linear, border-top-width .3s linear;
}
.toggled {
    overflow: hidden;
    padding-top: 0;
    padding-bottom: 0;
    height: 0;
    border-width: 0 1px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<button class="run-css">CSS slideToggle</button>

<div class="cont">Toggle this div</div>
3phpmpom

3phpmpom2#

抱歉,除非您知道确切的高度,否则CSS3不支持此功能。无法在0和自动之间进行动画。如果您知道确切的高度,您可以在此处生成一些转换代码:http://css3generator.com/

1l5u6lss

1l5u6lss3#

则不能在0和自动高度之间设置动画,但实际上可以切换最大高度。
max-height:0max-height:1000px之间切换(通过JS),您将获得所获得的结果,尽管它不会像jQuery的slideToggle函数那样平滑。
再加上一个不透明的褪色效果,它看起来相当不错。我强烈建议只在相对较短的容器上使用这种技术,因为大的容器可以创建一个肉干的动画。

syqv5f0l

syqv5f0l4#

.container {
    overflow-y: hidden;
    max-height: 0;

    transition: max-height 0.5s ease;
}
.container.open {
    max-height: 1000px; /* approx */
}
hpxqektj

hpxqektj5#

我相信Animatable应该可以做到这一点,它是一个CSS Transitions框架,虽然我不做iOS开发,但莱亚Verou提到她在FF和Chrome for iOS上测试了它。
还有其他CSS动画库,比如move.js,它使用CSS过渡和javascript。

s6fujrry

s6fujrry6#

另一种解决方法是使用transform:scale 3D和transform-origin。它并不完美,但总比没有好。它必须与显示/隐藏相结合。

.slideIn {
  animation-name: slideIn;
  animation-duration: 200ms;
  transform-origin: top;
  animation-timing-function: ease-in;
}

.slideOut {
  animation-name: slideIn;
  animation-duration: 200ms;
  animation-direction: reverse;
  transform-origin: top;
  animation-timing-function: ease-out;
}

@keyframes slideIn {
  from {
    opacity: 0;
    transform: scale3d(1, 0, 0);
  }

  to {
    opacity: 1;
    transform: scale3d(1, 1, 1);
  }
}

相关问题