請(qǐng)問(wèn)我的為什么實(shí)現(xiàn)不了?
<!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
原諒我根本沒(méi)看到你的div在哪里??
我不敢相信你前面的都學(xué)會(huì)了??
2016-06-23
這個(gè)用jQuery的toggleClass就簡(jiǎn)單了,可以看一下
2016-06-23
簡(jiǎn)單看了下,代碼的邏輯是通過(guò)JS創(chuàng)建個(gè)DIV,插入到body中,然后希望鼠標(biāo)移入時(shí)透明度變?yōu)?,移出時(shí)再把透明度變回來(lái),但此代碼有幾個(gè)致命錯(cuò)誤,反映出樓主要對(duì)基本概念的理解要加強(qiáng)。
1、通過(guò)創(chuàng)建插入的方法沒(méi)有錯(cuò),但是,這個(gè)時(shí)候創(chuàng)建的這個(gè)div有沒(méi)有opacity屬性呢?由newdiv.style.opacity可看出,樓主希望通過(guò)這個(gè)方法來(lái)獲取div的opacity屬性。但是,這個(gè)對(duì)象本身并沒(méi)有這個(gè)屬性啊,原因是樓主并沒(méi)有通過(guò)newdiv.setAttribute來(lái)設(shè)置這個(gè)opacity屬性。樓主可能認(rèn)為在樣式表中寫(xiě)了opacity:0.2,沒(méi)錯(cuò),但那并不是newdiv這個(gè)對(duì)象的屬性,別忘了,js中一切都是對(duì)象,沒(méi)有的屬性怎么得到?由對(duì)象的概念來(lái)解釋newdiv.style.opacity就是newdiv對(duì)象的style屬性下的opacity屬性,此時(shí)的newdiv沒(méi)有這個(gè)屬性。一句話總結(jié):newdiv.style.opacity獲取的是行間樣式,并不能取到樣式表中的值,原回很簡(jiǎn)單,也很基礎(chǔ),就是對(duì)對(duì)象的理解要到位。
2、if(timer){clearInterval(timer)},樓主希望通過(guò)些判斷來(lái)清除計(jì)時(shí)器來(lái)達(dá)到清除定時(shí)器的效果。但事實(shí)上是清除不掉的。重申一遍,js里一切都是對(duì)象,函數(shù)也不例外,對(duì)于對(duì)象的引用僅僅是指針的引用。那么移入時(shí)的過(guò)程就是:指向匿名函數(shù),調(diào)用fadeToggle函數(shù)時(shí)指針指向它,以后的過(guò)程都一樣。進(jìn)入fadeToggle函數(shù)時(shí)判斷timer變里的布爾類(lèi)型,首次是null,然后給他賦值了一個(gè)計(jì)時(shí)器,關(guān)鍵的是,計(jì)時(shí)器是什么?沒(méi)錯(cuò),是對(duì)象,那么全局變量對(duì)他的引用就是一個(gè)地址的引用,再次進(jìn)入時(shí)企圖判斷timer的布爾類(lèi)型清掉計(jì)時(shí)器,那么這時(shí)候清掉的是什么??jī)H僅是一個(gè)指針,而原來(lái)作用域鏈上的計(jì)時(shí)器并沒(méi)有被清掉,所以在控制臺(tái)里查看時(shí),timer的個(gè)數(shù)(也就是計(jì)時(shí)器的個(gè)數(shù))總是隨鼠標(biāo)移入移出的次數(shù)而增加。
3、理解了上面基本上也就能找到解決方案了,還有一個(gè)地方也要注意下,就是函數(shù)作用域鏈的問(wèn)題。鼠標(biāo)移入時(shí)觸發(fā)了一個(gè)匿名函數(shù),匿名函數(shù)又調(diào)用fadeToggle函數(shù),fadeToggle函數(shù)中又有一個(gè)定時(shí)器,定時(shí)器里還有一個(gè)匿名函數(shù),這一系列的函數(shù)串在一起就是形成了一個(gè)作用域鏈,這個(gè)作用域鏈并沒(méi)有因?yàn)槭髽?biāo)的移出而銷(xiāo)毀掉,因?yàn)橛?jì)時(shí)器里的匿名函數(shù)始終在被引用,所以不可能銷(xiāo)毀,除非我們將這個(gè)計(jì)時(shí)器給清掉,注意一定是清掉此條作用域鏈下的計(jì)時(shí)器。
聲明,本人也是一個(gè)初學(xué)者,有不當(dāng)之處還請(qǐng)指點(diǎn)!開(kāi)始也是看視頻練這些東西,但后來(lái)發(fā)現(xiàn)基礎(chǔ)的原理不掌握實(shí)在是舉步難行,所以放棄學(xué)這些,拿著書(shū)看原理,看完原理的東西再看這些一切都變得如此簡(jiǎn)單,說(shuō)來(lái)說(shuō)去就那么點(diǎn)東西,雖然這段代碼并沒(méi)有親自實(shí)驗(yàn)