【问题标题】:CSS transitions in Edge and IE11 not workingEdge 和 IE11 中的 CSS 过渡不起作用
【发布时间】:2016-07-29 06:37:44
【问题描述】:

我并不经常发现自己遇到 CSS 问题,但这让我摸不着头脑。

在这个 plunk http://plnkr.co/i2Fxol 中,除了 IE10 和 11 和 Edge 完全无法将 css 转换应用到 一些 元素(不是全部)之外,所有浏览器都按预期工作。而且无论我怎么看,我都看不出它为什么在那些特定的地方失败了。 (此处添加了 CSS,但需要在上下文中查看,因为这是一个非常简单的视图)

#navigation ul {
  display: block;
  list-style: none;
  overflow: hidden;
  transition: all .2s ease;
}

基本上,当手风琴打开并且菜单可以在规定的 0.2 秒内扩展和收缩时,它们会打嗝。所有其他转换都有效。

哦,我现在有办法在 HTML5 中为 svg 路径添加闭包,只是为了消除 IE 和 Edge 中那些完全没有意义的警告。

编辑

在加载时收集手风琴的初始高度:

...
var initialHeights = document.getElementsByClassName("level-1");
var values = [];
for(var i = 0; initialHeights.length > i; i++){
  values.push(initialHeights[i].offsetHeight);
}
...

然后使用以下方法将它们与安全存储在数组中的值内联归零:

function toZero(){
  for(i = 0; mainSubMenus.length > i; i++){
    mainSubMenus[i].setAttribute("style", "height:0;");
  }
}
toZero();

这允许使用 css 在零高度和已知值之间转换。

脑残

我认为也许以下方法可以治愈疾病:

mainSubMenus[i].style.height = 0;

我错了。

【问题讨论】:

  • 您是否在为从display: nonedisplay: block 的任何元素设置动画?
  • 不,高度。当元素的高度在它们设置为 0 之前已知时,从加载中获取高度。
  • 您能否更具体地说明哪些动画无法正常工作?对比 Edge 与 Chrome 的行为的 GIF 也会很有帮助;你可以通过screentogif.codeplex.com获得一个很棒的应用程序。
  • Edge is this oneChrome is this one。您将在 Edge 中看到展开和折叠的手风琴转换是瞬时的,而 Chrome(以及除 IE 之外的所有其他)中的手风琴转换是流畅的。这些是only 没有按预期播放的动画。所有其他人都按预期工作。

标签: javascript css internet-explorer microsoft-edge


【解决方案1】:

我认为这里的问题在于缺少初始高度。如果您循环遍历元素,并将它们的高度设置为等于其计算高度样式的高度,那么您可以使用 collapse 样式将高度覆盖为 0px,从而触发两个显式数字之间的转换。

var box = document.querySelector( ".box" );

// Set the box's initial height to its computed height
box.style.height = window.getComputedStyle( box ).height;

// Hide the box
box.classList.add( "collapsed" );

// Click will toggle a "collapsed" class on the box
document.addEventListener( "click", e => box.classList.toggle( "collapsed" ) )
.box {
  width: 100px;
  overflow: hidden;
  border: 1px solid #000;
  transition: all .2s ease;
}

.collapsed {
  height: 0!important;
}
<ul class="box">
  <li>Hello</li>
  <li>World</li>
</ul>

【讨论】:

  • 是的,我想到了。高度在页面加载时已知并保存在内存中。然后在单击var initialHeights = document.getElementsByClassName("level-1"); var values = []; for(var i = 0; initialHeights.length &gt; i; i++){ values.push(initialHeights[i].offsetHeight); } 时将它们注入到样式属性中。我还需要在删除和添加折叠的同时应用和删除扩展类。我确实使用了 toggle(),但选择了 element.classList.add() 和 element.classList(remove) 的更详细和准确的方法。我会试试你的方法然后回来。
  • 我试过了,它有点工作,直到我添加了一个 sub-accordion 到争吵中,它都崩溃了,没有尊重高度,所以我回到了填充数组的原始版本与初始高度。我的任务还在继续,一旦我对我所拥有的感到满意,我会更新 plunk。
  • @StuartHarding 请分享您想使用的标记,我很乐意修改我的答案以适应,尽我所能。
  • 前往this plunk。所有的东西都在那里,并做了一些更多的改进,因为这在 IE 中养出了丑陋的 CSS,而不是表现得糊涂。
  • 我必须说,它可能只是在我的机器上无法正常工作。我有一台运行 Win10 的 Windows 机器和四台具有各种操作系统的 Mac,所以如果它可以在其他地方工作,我很乐意让它因我的 Windows 笔记本电脑故障而失败。我之所以这么说是因为 Parallels 中的菜单可以在 IE10 中工作(显然,IE9 无法为 css 设置动画),但这可能是侥幸。
猜你喜欢
  • 2017-05-24
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2015-12-01
  • 2012-09-27
相关资源
最近更新 更多