請問我的為什么實現不了?
<!Doctype html>
<html>
<head>
? <meta charset="utf-8">
? <title>js透明度變化</title>
? <style>
? ? div{width:200px;height:200px;background:#0f0;opacity:0.2;}
? </style>
</head>
<body>
<script> ?
? var newdiv=document.createElement("div");
? document.body.appendChild(newdiv);
? var timer=null;
? newdiv.onmouseover=function(){
?fadeToogle(1);
? }
? newdiv.onmouseout=function(){
?fadeToogle(0.2);
? }
? function fadeToogle(iTarget){
?if(timer){
?clearInterval(timer);
?}
?timer=setInterval(function(){
var speed;
if(newdiv.style.opacity>iTarget){
speed=-0.05;
}
if(newdiv.style.opacity<iTarget){
speed=0.05;
}
if(newdiv.style.opacity==iTarget){
? ?clearInterval(timer);
? ?}else{
? ?newdiv.style.opacity+=speed;
? ?}
?},30)
? }
</script>
</body>
</html>
2016-07-22
原諒我根本沒看到你的div在哪里??
我不敢相信你前面的都學會了??
2016-06-23
這個用jQuery的toggleClass就簡單了,可以看一下
2016-06-23
簡單看了下,代碼的邏輯是通過JS創建個DIV,插入到body中,然后希望鼠標移入時透明度變為1,移出時再把透明度變回來,但此代碼有幾個致命錯誤,反映出樓主要對基本概念的理解要加強。
1、通過創建插入的方法沒有錯,但是,這個時候創建的這個div有沒有opacity屬性呢?由newdiv.style.opacity可看出,樓主希望通過這個方法來獲取div的opacity屬性。但是,這個對象本身并沒有這個屬性啊,原因是樓主并沒有通過newdiv.setAttribute來設置這個opacity屬性。樓主可能認為在樣式表中寫了opacity:0.2,沒錯,但那并不是newdiv這個對象的屬性,別忘了,js中一切都是對象,沒有的屬性怎么得到?由對象的概念來解釋newdiv.style.opacity就是newdiv對象的style屬性下的opacity屬性,此時的newdiv沒有這個屬性。一句話總結:newdiv.style.opacity獲取的是行間樣式,并不能取到樣式表中的值,原回很簡單,也很基礎,就是對對象的理解要到位。
2、if(timer){clearInterval(timer)},樓主希望通過些判斷來清除計時器來達到清除定時器的效果。但事實上是清除不掉的。重申一遍,js里一切都是對象,函數也不例外,對于對象的引用僅僅是指針的引用。那么移入時的過程就是:指向匿名函數,調用fadeToggle函數時指針指向它,以后的過程都一樣。進入fadeToggle函數時判斷timer變里的布爾類型,首次是null,然后給他賦值了一個計時器,關鍵的是,計時器是什么?沒錯,是對象,那么全局變量對他的引用就是一個地址的引用,再次進入時企圖判斷timer的布爾類型清掉計時器,那么這時候清掉的是什么?僅僅是一個指針,而原來作用域鏈上的計時器并沒有被清掉,所以在控制臺里查看時,timer的個數(也就是計時器的個數)總是隨鼠標移入移出的次數而增加。
3、理解了上面基本上也就能找到解決方案了,還有一個地方也要注意下,就是函數作用域鏈的問題。鼠標移入時觸發了一個匿名函數,匿名函數又調用fadeToggle函數,fadeToggle函數中又有一個定時器,定時器里還有一個匿名函數,這一系列的函數串在一起就是形成了一個作用域鏈,這個作用域鏈并沒有因為鼠標的移出而銷毀掉,因為計時器里的匿名函數始終在被引用,所以不可能銷毀,除非我們將這個計時器給清掉,注意一定是清掉此條作用域鏈下的計時器。
聲明,本人也是一個初學者,有不當之處還請指點!開始也是看視頻練這些東西,但后來發現基礎的原理不掌握實在是舉步難行,所以放棄學這些,拿著書看原理,看完原理的東西再看這些一切都變得如此簡單,說來說去就那么點東西,雖然這段代碼并沒有親自實驗