参见这个JSFiddle,例如:http://jsfiddle.net/6ocawwqd/21/
Stack Overflow坚持要我包含我链接到的代码,所以这里是JS和CSS:
$(document).on('click', '.show', function () {
$('.reveal')[0].style.removeProperty('display');
var height = $('.reveal')[0].scrollHeight;
$('.reveal').css({ 'max-height': height, 'overflow':'hidden' });
$('.reveal').removeClass('hide');
setTimeout(function() {
$('.reveal')[0].style.removeProperty('overflow');
$('.reveal')[0].style.removeProperty('max-height');
}, 501);
});
$(document).on('click', '.hide', function () {
var height = $('.reveal')[0].scrollHeight;
$('.reveal').css({'max-height': height, 'overflow':'hidden' });
setTimeout(function() {
$('.reveal').addClass('hide');
}, 5);
setTimeout(function() {
$('.reveal').css('display', 'none');
}, 505);
});
.CSS
a {
color:blue;
cursor:pointer;
}
.reveal {
width:250px;
background-color:#ccc;
padding:10px;
transition: all .5s;
overflow:hidden;
translate3d(0,.01%,0);
}
.reveal.hide {
max-height:0 !important;
padding-top:0;
padding-bottom:0;
}
基本问题:我有一个小部件,我需要隐藏/显示其高度未知。隐藏时,必须将显示设置为"无"以避免选项卡索引和表单验证问题。所以我使用 max-height 属性来利用 CSS 过渡来设置隐藏和显示的动画,并将显示从"无"切换到"块"(或者只是通过从元素中删除显示属性来切换到默认值。所描述的问题在任何一种情况下都会发生)。
在我的测试中,我只在OSX Safari,iOS上的Chrome和Safari以及Android Stock移动浏览器中获得双重动画。(它适用于Windows Chrome,FF,IE11,Android Chrome)
我已经确定了双重动画何时发生。第一个动画是正确的,当通过 JavaScript 将 max-height 属性从 0 更改为内容高度时,就会发生第一个动画。
第二个动画发生在动画完成后使用计时器删除最大高度属性时。 我必须删除最大高度,因为在可见之后,元素可能会添加更多项目,因此必须允许增长。
有没有人遇到过这种情况或有解决方案?
我遇到了类似的问题,但发现很多背面可见性:隐藏的建议并没有解决iOS的问题。
由于您已经在使用 JavaScript 设置/取消设置高度属性,因此您可以尝试在动画之前和动画完成后将额外的"animating"类切换到元素。如果您在删除高度(或将其设置回"自动")之前执行此操作,iOS 将不会尝试重新设置导致闪烁的高度属性的动画。
以您的 http://jsfiddle.net/m2adrugn/2/为例:
$(document).on('click', '.show', function () {
$('.reveal')[0].style.removeProperty('display');
var height = $('.reveal')[0].scrollHeight;
$('.reveal').css({ 'max-height': height, 'overflow':'hidden' });
$('.reveal').addClass('animating').removeClass('hide');
setTimeout(function() {
$('.reveal').removeClass('animating');
$('.reveal')[0].style.removeProperty('overflow');
$('.reveal')[0].style.removeProperty('max-height');
}, 501);
});
$(document).on('click', '.hide', function () {
var height = $('.reveal')[0].scrollHeight;
$('.reveal').addClass('animating').css({'max-height': height, 'overflow':'hidden' });
setTimeout(function() {
$('.reveal').addClass('hide');
}, 5);
setTimeout(function() {
$('.reveal').css('display', 'none').removeClass('animating');
}, 505);
});
.CSS
a {
color:blue;
cursor:pointer;
}
.reveal {
width:250px;
background-color:#ccc;
padding:10px;
overflow:hidden;
translate3d(0,.01%,0);
}
.reveal.animating {
transition: all .5s;
}
.reveal.hide {
max-height:0 !important;
padding-top:0;
padding-bottom:0;
}
将最大高度更改为高度。为我工作。