【问题标题】:CSS transition of a div does not animatediv 的 CSS 过渡不设置动画
【发布时间】:2016-06-12 03:36:21
【问题描述】:

当我点击一个 div 时,我想要第二个 div 展开/折叠。这是使用 JS、HTML 和 CSS 完成的。现在我想要 CSS 过渡动画。

现在我得到的只是一个跳跃扩展和滚动(Edge)或等待后的跳跃(Chrome、Opera、Firefox)。

我尝试将高度设置为 1px 而不是 0px,但这并没有改变任何东西。

function growDiv(id) {
  var ele = document.getElementById(id);
  if (ele.style.height == '100%') {
    ele.style.height = '0px';
  } else {
    ele.style.height = '100%';
  }
}
.main {
  font-weight: 700;
  overflow: hidden;
  cursor: pointer;
}
.secondary {
  -webkit-transition: height .5s ease;
  -moz-transition: height .5s ease;
  -ms-transition: height .5s ease;
  -o-transition: height .5s ease;
  transition: height .5s ease;
  overflow: hidden;
  padding-left: 20px;
  height: 0px;
  cursor: pointer;
}
<div class="main" onclick="growDiv('expandable')">
  Expand
</div>
<div class="secondary" id="expandable" onclick="growDiv('expandable')">
  number1,
  <br>number2,
  <br>number3,
  <br>number4.
</div>

Codepen 的行为与我所知道的整个网站的行为一样,因此可以很好地衡量;这是密码笔:http://codepen.io/anon/pen/ezJQjM

【问题讨论】:

  • 使用 PX 而不是 % 在你的 codepen 上工作(在 JS 函数中)
  • 你不能在 px 和 % 之间做动画

标签: javascript css css-transitions


【解决方案1】:

来自http://css3.bradshawenterprises.com/animating_height/ 而不是使用 100%,只是“让它”通过不限制它来获取 auto 值。

注意:100px 只是“大于实际大小的任何数字”

function growDiv(id) {
  var ele = document.getElementById(id);
  if (ele.style.maxHeight != '0vh') {
    ele.style.maxHeight = '0vh';
  } else {
    ele.style.maxHeight = "100vh";
  }
}
.main {
  font-weight: 700;
  overflow: hidden;
  cursor: pointer;
}
.secondary {
  -webkit-transition: all .5s ease;
  -moz-transition: all .5s ease;
  -ms-transition: all .5s ease;
  -o-transition: all .5s ease;
  transition: all .5s ease;
  overflow: hidden;
  padding-left: 20px;
  cursor: pointer;
}
<div class="main" onclick="growDiv('expandable')">
  Expand
</div>
<div class="secondary" id="expandable" onclick="growDiv('expandable')" style="max-height: 0vh;">
  number1,
  <br>number2,
  <br>number3,
  <br>number4.
</div>

编辑:将所有内容更改为 VH(视口高度),因此它永远不会超过屏幕高度的 100%,并且会适应任何屏幕的最大高度。 还将 "style="max-height: 0vh;" 切换到元素本身而不是类,因此如果需要,您可以使用 ele.style 取消设置它(否则您将需要设置一个新值来覆盖类。

【讨论】:

  • 过渡现在有效。但它不能很好地扩展。假设我在一个列表中有 4 分,但在另一个列表中有 20 分。 (严格来说,实现不是一个列表,而是为了论证..)我当然可以让函数接受一个最大高度并手动调整它,但随之而来的是屏幕尺寸不同的问题。以编程方式解决它的任何建议?
  • 您可以将所有内容更改为“vh”(从 0vh 开始,然后将 max-height 增加到 100vh),因此它永远不会大于屏幕尺寸的 100%。 1vh = 视口高度的 1%。编辑了答案,除非其中一个“列表”实际上大于一个屏幕高度,否则应该可以正常工作,当然您实际上可以将此设置调整为 200vh 或列表中最长的大小。
【解决方案2】:

你愿意使用 jQuery 吗?它提供了一些很酷的动画可能性,并且可以完成您想要做的事情。这只是您方法的一种可能替代方案。

在这里查看我的小提琴:

https://jsfiddle.net/3mo28z1t/11/

<div class="main" id="clicker">
  Expand
</div>
<div class="secondary" id="expandable">
  number1, <br> number2, <br> number3, <br> number4.
</div>

<script>
 $( document ).ready(function() {

$(".secondary").hide();

$(document).ready(
    function(){
        $("#clicker").click(function () {
            $(".secondary").toggle("slow");
        });

    });   

});
</script>

【讨论】:

  • 我试图远离 JQuery 以减小页面大小。它可能只有 84 kB,但如果我可以避免它,我会更喜欢它——特别是因为我的项目的整个其余部分现在只有 34 kB。另外,我不理解反对票;我从来没有专门要求一个没有 JQuery 的解决方案,就像我没有要求一个 JQuery 解决方案一样。我会试试你的解决方案,谢谢。
  • 像魅力一样工作。谢谢你。我只需要在头部包含 JQuery,而不是像我尝试的那样在底部包含。
  • 实际上它引入了一个新问题,至少据我所知。即div.secondary 具有 100 % 的屏幕宽度而不是 100 % 的父宽度。我使用 CSS 函数 calc(100% - offset) 解决了它,其中 offset 是父 div 的填充和边距。我不能保证问题出在这个解决方案上,只是我在这个解决方案实施之后才看到它。
【解决方案3】:

问题是由切换度量单位引起的,因此从像素切换到百分比。不过,我可能会做一些不同的事情。

growDiv = function(id) {
  document.getElementById(id).classList.toggle('expanded');
}
.main {
  font-weight: 700;
  overflow: hidden;
  cursor: pointer;
}
.secondary {
  transition: max-height .5s ease;
  overflow: hidden;
  padding-left: 20px;
  max-height: 0;
  cursor: pointer;
}
.secondary.expanded {
  height: 100%;
  max-height: 100px;
}
<div class="main" onclick="growDiv('expandable')">
  Expand
</div>
<div class="secondary" id="expandable" onclick="growDiv('expandable')">
  number1,
  <br>number2,
  <br>number3,
  <br>number4.
</div>

您会注意到 JS 更简单一些,并且更多地依赖于 CSS。

【讨论】:

  • 漂亮的解决方案,但缺乏规模。如果我添加 number5、number6 和 number7,则 number6 会中途中断,并且不会显示 number7。我想我想要的不是我所要求的。
  • 您可以将最大高度设置为更大的数字以显示更多结果。
猜你喜欢
  • 1970-01-01
  • 2018-04-20
  • 2020-03-20
  • 2014-04-26
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多