JS下offsetLeft,style.left,以及jQuery中的offset().left,css("left")的區別。
JS下的offsetLeft和style.left,以及jquery的css("left"),對定位的理解相似,如果父元素中有定位元素,都是相對於上一個定位元素(position不為static)定位。
值得一提的是如果沒有已經定位的父元素,那么offsetLeft指向的是文檔(document)的左邊緣,而style.left與css("left")指向的是body的左邊緣,如果body默認存在margin的話,他們取得的值是不一樣的。
此外老生常談,css("left")和style.left是帶單位"px"的,而offsetLeft沒有單位,另外,style.left必須是內聯樣式,或者在JS中通過style.left賦值,否則取得的將為空字符串(在內部樣式和外部樣式中指定left是無效的)。而jquery的css("left")沒有這一限制,顯然使用jquery操作dom的優勢就體現出來了。
最后是jquery的offset().left,它永遠是相對於文檔的左邊緣(往往體現為瀏覽器的左邊緣)定位的,這樣的話使用jquery就可以在不同的應用場景采用不同的方法來獲取元素的位置,相比較原生JS有巨大的優勢。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
body{
margin:50px;
/**/
}
.wrap{
width:300px;
height: 300px;
background-color: red;
left:200px;
position:relative;
}
.inner{
position: absolute;
width: 100px;
height: 100px;
left: 50px;
background-color: blue;
}
</style>
<script type="text/javascript" src="js/lib/bootstrap/js/jquery-1.11.3.js"></script>
</head>
<body>
<div class="wrap" id="wrap" style="left:200px;">
<div class="inner" id="inner">
</div>
</div>
<script type="text/javascript">
console.log($(".wrap").css("left")); /*如果父元素中有定位元素,都是相對於上一個定位元素(position不為static)定位。此處相對於body的左邊,有單位 200px*/
console.log($(".wrap").offset().left); /* 它永遠是相對於文檔的左邊緣(往往體現為瀏覽器的左邊緣)定位的 沒有單位 249.9999999 */
console.log(document.getElementById("wrap").offsetLeft); /*如果沒有已經定位的父元素,那么offsetLeft指向的是文檔(document)的左邊緣 沒有單位 250*/
console.log(document.getElementById("wrap").style.left); /*style.left與css("left")指向的是body的左邊緣* 有單位 200px/
console.log($(".inner").css("left")); /* 相對於上一個定位元素 50px */
console.log($(".inner").offset().left); /*文檔的左邊緣 沒有單位 300*/
console.log(document.getElementById("inner").offsetLeft); /*相對於上一級 沒有單位 50*/
// console.log("如果style.left沒有在內聯樣式中指定:"+document.getElementById("inner").style.left);
</script>
</body>
</html>