呃,代码在这里面,是个渣,莫怪莫怪
怎么让它滑出的时候,正常关闭slide层
JS代码
javascript
function tool(cover){ var hidding = false; var divcover = function(){ hidding = false; setTimeout(function(){ if(!hidding){ if(cover.offsetHeight<150){ cover.style.height = cover.offsetHeight + 1; // 递归保证上一次执行完再执行divcover()->相当于同步, 而不是异步的for循环setTimeout divcover(); }else{ hidding = !hidding; } } }, 10); } var divcoverhide = function(){ hidding = true; setTimeout(function(){ if(hidding){ if(cover.offsetHeight>0){ cover.style.height = cover.offsetHeight - 1; divcoverhide(); }else{ hidding = !hidding; } } }, 10); } return { divcover: divcover, divcoverhide: divcoverhide } }; // 1) (function(){ var abdiv = document.getElementsByTagName('div'); for (var i = 0; i < abdiv.length; i++) { var cover = abdiv[i].firstChild; console.log("cover: "+cover.getAttribute('id')); var cc = tool(cover); // 这里回调函数是通过一个函数执行来生成的, 因为javascript没有块作用域, // 所以如果直接写成下面这样, 那么会形成闭包, 两次for引用同一个cc对象, // 因为for循环执行完之后, 闭包引用变量的作用域同时指向了注释1)处的函数 //abdiv[i].addEventListener('mouseover', function(e){ // cc.divcover(); //}, false); abdiv[i].addEventListener('mouseover', (function(divcover){ return function(e){ divcover(); } })(cc.divcover), false); abdiv[i].addEventListener('mouseout', (function(divcoverhide){ return function(e){ divcoverhide(); } })(cc.divcoverhide), false); } })();
或者
javascript
function tool(cover){ var hidding = true; setInterval(function(){ if(!hidding && cover.offsetHeight<150){ cover.style.height = cover.offsetHeight + 1; }else if(hidding && cover.offsetHeight>0){ cover.style.height = cover.offsetHeight - 1; } }, 10); return { hide: function(){ hidding = true; }, show: function(){ hidding = false; } } }; (function(){ var abdiv = document.getElementsByTagName('div'); for (var i = 0; i < abdiv.length; i++) { var cover = abdiv[i].firstChild; console.log("cover: "+cover.getAttribute('id')); var cc = tool(cover); abdiv[i].addEventListener('mouseover', (function(show){ return function(e){ show(); } })(cc.show), false); abdiv[i].addEventListener('mouseout', (function(hide){ return function(e){ hide(); } })(cc.hide), false); } })();
在函数 divcover和divcoverhide 内添加 clearInterval(timer);
既在执行该函数时停止 timer
function divcover(cover){
clearInterval(timer);
timer = setInterval(function(){},10)
}
这个动画代码还有个问题就是在span
完全或部分cover后 经过span
移出会触发span
的mouseover和mouseout,由于事件冒泡等同于又触发了setInterval
这样就丢失了之前setInterval
的timer引用 造成了无法clear
不考虑兼容的话用CSS3的transition
代替setInterval
来做动画会方便许多
10 回答11.6k 阅读
2 回答3.1k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
3 回答785 阅读✓ 已解决
先是清除需要指定清除哪个:
clearInterval(intervalID)
, intervalID 是创建的时候返回的。然后你这么写如果我在上一个动画结束前触发了下一个动画,那之前的 timer 岂不是就被覆盖了,然后就不停的加加减减。