虽然Pierre的答案之前对我有用,但最近我遇到了一个它无法解决的情况。实现一个简单的循环图片滑块,我使用以下代码。
HTML:
<ul id="slides">
<li class="active">
<img src="/.../0.jpg">
<p>Caption</p>
</li>
<li class="active">
<img src="/.../1.jpg">
<p>Caption</p>
</li>
</ul>
CSS:
#slides {
position: relative;
}
#slides li {
position: absolute;
top: 0;
display: none;
opacity: 0;
-moz-transition: opacity 1s;
}
#slides li.active {
display: block;
opacity: 1;
}
以及 jQuery:
$(function(){
animateSlide();
});
function animateSlide(){
setTimeout(function(){
var current = $('#slides li.active');
var next = current.next();
if(!next.length){
next = $('#slides li:first');
}
current.add(next).css('display', 'block');
current.removeClass('active');
setTimeout(function(){
next.addClass('active');
setTimeout(function(){
current.css('display', 'none');
animateSlide();
}, 1000);
}, 1);
}, 6000);
}
这在Safari/Chrome中运行得很好(尽管我承认所有setTimeout
有些古怪),但是虽然滑块在Firefox中技术上可以工作,但那里没有任何过渡可见。
根据Jim Jeffers对类似问题的回答,我能够使它在Safari/Chrome和Firefox中平稳地工作,并且还大大简化了我的javascript代码。
更新的CSS:
#slides li {
position: absolute;
top: 0;
height: 0;
opacity: 0;
-moz-transition: opacity 1s;
}
#slides li.active {
height: auto;
opacity: 1;
}
更新的jQuery:
function animateSlide(){
setTimeout(function(){
var current = $('#slides li.active');
var next = current.next();
if(!next.length){
next = $('#slides li:first');
}
current.removeClass('active');
next.addClass('active');
animateSlide();
}, 6000);
}