[JS][深度]原生JS實現 jquery.css()函數

行間樣式:元素內部用style定義的樣式,如:<div style="width:200px;"></div>

非行間樣式:在<style></style>內通過css定義的樣式

先看一段出問題的代碼

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<style>
		div{
			height: 100px;
			width: 100px;
			border: 2px solid black;
			background: red;
		}
	</style>
	<body>
		<div id="div1" style="">
			寬
		</div>
	</body>
	<script type="text/javascript" >
		window.onload =function(){
			var oDiv1=document.getElementById('div1');
			oDiv1.οnclick=function(){
				oDiv1.style.width=200+'px';
			}
		}
	</script>
</html>

我在頁面放了一個方塊,紅底黑邊,想通過點擊該方塊讓他的寬度變爲200px,看一下結果——沒有任何反應,也沒有報錯。

在事件中添加alert('a');有反應,說明onclick事件被觸發了,那麼就是

oDiv1.style.Width=200+'px';

這行代碼有問題。

打印一下這個這個變量:

alert(oDiv1.style.Width);

雖然不報錯,但是顯示空白,即使用變量賦值之後任然無法獲取這個值,真正的原因是style只能獲取行間樣式,試一下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<style>
		
	</style>
	<body>
		<div id="div1" style="height: 100px;
			width: 100px;
			border: 2px solid black;
			background: red;">
			寬
		</div>
	</body>
	<script type="text/javascript" >
		window.onload =function(){
			var oDiv1=document.getElementById('div1');
			oDiv1.οnclick=function(){
				oDiv1.style.width=200+'px';
			}
		}
	</script>
</html>

可以確定確實是行間樣式與非行間樣式的問題,實際上不可能把所有樣式都寫在行間。

要解決這個問題,需要引入兩個元素屬性——currentStyle和getComputedStyle(obj, false)

currentStyle——獲取非行間(當前樣式)IE瀏覽器專屬,chrome和FF不兼容。

getComputedStyle(obj, false)——獲取非行間(計算後的樣式)IE不兼容。

<script type="text/javascript" >
	window.onload =function(){
		var oDiv1=document.getElementById('div1');
		oDiv1.οnclick=function(){
                        //FF、chrome
                        alert(getComputedStyle(oDiv1, false).width);
                        //IE
                        alert(oDiv1.currentStyle.width);
		}
	}
</script>

把他封裝一下寫成一個公用函數:

//obj:哪個元素
//attr:那個樣式
function getStyle(obj,attr){
	if(obj.currentStyle){
		//IE
		return obj.currentStyel[attr];
	}else{
		//FF
		return getComputedStyle(obj, false)[attr];
	}
}

通過判斷obj.currentStyle是否爲真來判斷當前瀏覽器爲IE還是其他。

注意:.width的寫法可以寫成['width']

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章