我怎样才能实现像jQuery的slideDown一样的向下滑动效果,但只使用CSS?

Posted

技术标签:

【中文标题】我怎样才能实现像jQuery的slideDown一样的向下滑动效果,但只使用CSS?【英文标题】:How can I achieve a slide down effect like jQuery's slideDown, but only using CSS? 【发布时间】:2011-12-02 03:02:03 【问题描述】:

CSS3 动画存在问题。它们不支持“自动”高度属性(以及宽度、边距等)。在不知道元素的确切高度的情况下创建 CSS3 向下滑动动画的最佳方法是什么?

这个问题类似于this 一个,但那里接受的答案并没有回答实际问题,因为它们不处理计算您希望滑动的元素高度的问题。

【问题讨论】:

我不确定你是否问完全同样的事情,但看看这个:***.com/questions/5072526/… @thirtydot,那里的问题没有适当的解决方案。接近自动高度滑动问题的唯一解决方案是使用行高动画,这看起来很糟糕,并且仅与文本兼容。 @thirtydot,另外,那里接受的答案实际上并没有解决问题。 我同意@Ron。您必须计算元素的高度并相应地调整动画。 @Ron:你看到了吗:jsfiddle.net/XUjAH/6 【参考方案1】:

看看这个:http://jsfiddle.net/gion_13/eNR6Q/ 这只是css3动画。在其他浏览器中使用更改/添加浏览器特定的供应商 css 前缀:“-moz”用于 firefox,“-webkit”用于 chrome&safari,“-o”用于 Opera,“-ms”用于 ie

【讨论】:

不是一个好的答案,因为它不处理自动高度。不过谢谢【参考方案2】:

您可以通过复制元素、将其高度设置为“自动”并询问其高度(以像素为单位)来了解元素的高度。

假设这是您要在其上制作动画的 div:<div id="mydiv" style="height:0px">,使用此代码计算其高度(仅为了简单起见使用 jQuery):

var divHeight = $("#mydiv").clone().css("height", "auto").height();

【讨论】:

嘿@dutzi,你为什么需要克隆它?为什么不直接设置自动高度并测量它的高度? 因为某些浏览器可能会在您将其更改回之前尝试将元素呈现在其“新”高度,从而导致它闪烁。不过,您之前可以将其“显示”更改为“无”...【参考方案3】:

你看过我根据那个答案挖出来的这个演示吗? 我试过自己写,但似乎没有用。

$('#click-me').click(function() 
  var height = $("#this").height();
  if (height > 0) 
    $('#this').css('height', '0');
   else 
    $("#this").css(
      'position': 'absolute',
      'visibility': 'hidden',
      'height': 'auto'
    );
    var newHeight = $("#this").height();
    $("#this").css(
      'position': 'static',
      'visibility': 'visible',
      'height': '0'
    );
    $('#this').css('height', newHeight + 'px');
  
);
#this 
  width: 500px;
  height: 0;
  max-height: 9999px;
  overflow: hidden;
  background: #BBBBBB;
  -webkit-transition: height 1s ease-in-out;


#click-me 
  cursor: pointer;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<p id="click-me">click me</p>
<div id="this">here<br />is<br />a<br />bunch<br />of<br />content<br />sdf</div>
<div>always shows</div>

View on jsFiddle

【讨论】:

我希望有一个更可靠的解决方案,也许像这样的一些 jQuery 插件:github.com/benbarnett/jQuery-Animate-Enhanced 那么,那个插件有什么问题? slideDown 就是 animate(height: 'toggle'); 这是一封来自 Ben 的邮件,它的作者:嘿 遗憾的是,我不得不编写一个函数来避免加速这些转换,因为它会导致一些奇怪的显示问题。如果你看一下这个函数: _isBoxShortcut() on line 354: github.com/benbarnett/jQuery-Animate-Enhanced/blob/master/… 我很想找到一种让它们工作的方法。如果你想试一试,只需将该函数设置为“返回 false”,然后插件会将所有 slideDown、SlideUp 和 slideToggle 快捷方式转换为 CSS3 动画。【参考方案4】:

我正在使用这个:

.slide-down 
  transition: max-height .3s ease-out, opacity .3s ease-out, margin .3s ease-out;
  overflow: hidden;
  max-height: 100px; 

  &.collapsed 
    max-height: 0;
    opacity: 0;
    margin: 0;
  

如果您使用的是 LESS 或 Sass,您可能希望使用一个变量来表示效果持续时间和缓动。 要触发效果, 使用$('.slide-down').toggleClass('collapsed')。 如果 100 像素对于您的容器来说太小,请设置不同的最大高度 在元素中使用额外的 CSS 类。 如果你觉得花哨, 尝试使用cubic-bezier(0.17, 0.04, 0.03, 0.94)而不是 ease-out

【讨论】:

以上是关于我怎样才能实现像jQuery的slideDown一样的向下滑动效果,但只使用CSS?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery:FadeIn/To 和 SlideDown 新元素

jQuery slideDown 无法正常工作

jQuery slideUp 和 slideDown 正在提供弹跳效果

Angular2 中的 jQuery .slideUp() 和 .slideDown() 等效项

仅在最后一项完成后运行jQuery slideDown完成功能[重复]

jQuery 滑动