【JavaScript】offset、client、scroll、mouseover和mouseenter區別
筆記
1.元素偏移量offset系列
1.1 offset概述
offset翻譯過來就是偏移量,我們使用offset系列相關屬性可以動態的得到該元素的位置(偏移)大小等。
-
獲得元素距離帶有定位父元素的位置
-
獲得元素自身的大小(寬度高度)
-
注意:返回的數值都不帶單位
offset系列常用屬性:
offset系列屬性 | 作用 |
---|---|
element.offsetParent | 返回作為該元素帶有定位的父級元素如果父級都沒有定位則返回body |
element.offsetTop | 返回元素相對帶有定位父元素上方的偏移 |
element.offsetLeft | 返回元素相對帶有定位父元素左邊框的偏移 |
element.offsetWidth | 返回自身包括padding、邊框、內容區的寬度,返回數值不帶單位 |
element.offsetHeight | 返回自身包括padding、邊框、內容區的高度,返回數值不帶單位 |
1.offsetParent和parentNode區別
console.log(son.offsetParent);//返回帶有定位的父親否則返回的是body
console.log(son.parentNode); //返回父親 不管父親有沒有定位
2.offset與style區別
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-DCav8jxR-1601646244735)(PC端網頁特效.assets/image-20200929113559569.png)]
案例:計算滑鼠在盒子裡的座標
①我們在盒子內點選,想要得到滑鼠距離盒子左右的距離
②首先得到滑鼠在頁面中的座標( e.pageX, e.pageY )
③其次得到盒子在頁面中的距離( box.offsetLeft, box.offsetTop)
④用滑鼠距離頁面的座標減去盒子在頁面中的距離,得到滑鼠在盒子內的座標
⑤如果想要移動一下滑鼠,就要獲取最新的座標,使用滑鼠移動事件mousemove
案例:模態框拖拽
彈出框,我們也稱為模態框。
1.點選彈出層,會彈出模態框,並且顯示灰色半透明的遮擋層。
2.點選關閉按鈕,可以關閉模態框,並且同時關閉灰色半透明遮擋層。
3.滑鼠放到模態框最上面一行,可以按住滑鼠拖拽模態框在頁面中移動。
4.滑鼠鬆開,可以停止拖動模態框移動。
分析:
①點選彈出層,模態框和遮擋層就會顯示出來display:block;
②點選關閉按鈕,模態框和遮擋層就會隱藏起來display:none;
③在頁面中拖拽的原理:滑鼠按下並且移動,之後鬆開滑鼠
④觸發事件是滑鼠按下mousedown,鼠 標移動mousemove滑鼠鬆開mouseup
⑤拖拽過程:滑鼠移動過程中,獲得最新的值賦值給模態框的Ieft和top值,這樣模態框可以跟著滑鼠走了
⑥滑鼠按下觸發的事件源是最上面一行,就是id為title
⑦滑鼠的座標減去滑鼠在盒子內的座標,才 是模態框真正的位置
案例:京東放大鏡效果
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ypcuJ25l-1601646244752)(PC端網頁特效.assets/12.gif)]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style></style>
<script src="jquery-1.12.4.js"></script>
</head>
<style>
* {
margin: 0;
padding: 0;
}
body {
background-color: pink;
}
.preview_img {
/* background-color: pink; */
position: relative;
width: 398px;
height: 398px;
margin-left: 50px;
margin-top: 100px;
cursor: move;
}
.mask {
position: absolute;
top: 0;
left: 0;
display: none;
width: 300px;
height: 300px;
background-color: #fede4f;
opacity: 0.5;
}
.big {
display: none;
position: absolute;
left: 550px;
top: 0;
width: 500px;
height: 500px;
overflow: hidden;
border: 1px solid #ccc;
}
.big .bigImg {
position: absolute;
top: 0;
left: 0;
}
</style>
<body>
<div class="preview_img">
<img src="imag/s3.png" alt="" />
<div class="mask"></div>
</div>
<div class="big">
<img class="bigImg" src="imag/big.jpg" alt="" />
</div>
</body>
<script>
var preview_img = document.querySelector('.preview_img');
var mask = document.querySelector('.mask');
var big = document.querySelector('.big');
//1.當我們滑鼠經過 preview_img 就顯示和隱藏 mask 遮擋層 和 big 大盒子
preview_img.addEventListener('mouseover', function () {
big.style.display = 'block';
mask.style.display = 'block';
});
preview_img.addEventListener('mouseout', function () {
big.style.display = 'none';
mask.style.display = 'none';
});
//2.滑鼠移動的時候,讓黃色的盒子跟著滑鼠來走
// (1). 由於mask有定位在先計算出滑鼠在盒子內的座標
preview_img.addEventListener('mousemove', function (e) {
var x = e.pageX - this.offsetLeft - mask.offsetWidth / 2;
var y = e.pageY - this.offsetTop - mask.offsetHeight / 2;
//(3)設定mask最大移動距離maskMax和最小距離(0)
//由於preview_img和mask都是正方形所以xy都是寬度
maskMax = preview_img.offsetWidth - mask.offsetWidth;
if (x <= 0) {
x = 0;
} else if (x >= maskMax) {
x = maskMax;
}
if (y <= 0) {
y = 0;
} else if (y >= maskMax) {
y = maskMax;
}
//(2)把滑鼠在盒子裡的座標給mask
mask.style.left = x + 'px';
mask.style.top = y + 'px';
//3.遮擋層移動距離/遮擋層最大移動距離=大圖移動距離/大圖移動最大距離
var bigImg = document.querySelector('.bigImg');
var bigMax = bigImg.offsetWidth - big.offsetWidth;
console.log(bigImg);
//大圖移動的距離
var bigx = (bigMax * x) / maskMax;
var bigy = (bigMax * y) / maskMax;
bigImg.style.left = -bigx + 'px';
bigImg.style.top = -bigy + 'px';
});
</script>
</html>
2.元素可視區client系列
client翻譯過來就是客戶端,我們使用client系列的相關屬性來獲取元素可視區的相關資訊。通過client系列的相關屬性可以動態的得到該元素的邊框大小、元素大小等。
client系列屬性 | 作用 |
---|---|
element.clientTop | 返回元素上邊框的大小 |
element.clientLeft | 返回元素左邊框的大小 |
element.clientWidth | 返回自身包括padding、內容區的寬度,不含邊框,返回數值不帶單位 |
element.clientHeight | 返回自身包括padding、內容區的高度,不含邊框,返回數值不帶單位 |
立即執行函式
1.(function(){})();//有引數(function(a,b){})(a,b);
2.(function(){}());//有引數(function(a,b){}(a,b))
建立一個獨立的作用域
3.元素滾動scroll系列
scroll翻譯過來就是滾動的,我們使用scroll系列的相關屬性可以動態的得到該元素的大小滾動距離等。
scroll系列屬性 | 作用 |
---|---|
element.scrollTop | 返回被捲去的上側距離,返回數值不帶單位 |
element.scrollLeft | 返回被捲去的左側距離,返回數值不帶單位 |
element.scrollWidth | 返回自身實際的寬度(包含文字超出部分),不含邊框,返回數值不帶單位 |
element.scrollHeight | 返回自身實際的高度(包含文字超出部分),不含邊框,返回數值不帶單位 |
3.1頁面被捲去頭部相容性解決方案
需要注意的是,頁面被捲去的頭部,有相容性問題,因此被捲去的頭部通常有如下幾種寫法:
1.宣告瞭DTD ,使用document.documentElement.scrollTop
2.未宣告DTD ,使用document.body.scrollTop
3.新方法window.pageYOffset
和window.pageXOffset
, IE9開始支援
4.解決相容問題
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-4aN60KhR-1601646244756)(PC端網頁特效.assets/image-20200930122912793.png)]
案例:仿淘寶固定右側側邊欄
1.原先側邊欄是絕對定位
2.當頁面滾動到一定位置,側邊欄改為固定定位
3.頁面繼續滾動,會讓返回頂部顯示出來
分析:
①需要用到頁面滾動事件scroll因為是頁面滾動,所以事件源是document
②滾動到某個位置,就是判斷頁面被捲去的上部值。
③頁面被捲去的頭部:可以通過window.pageYOffset獲得如果是 被捲去的左window.pageXOffset
④注意:元素被卷去的頭部是element.scrollTop ,如果是頁面被卷去的頭部則是window.pageYOffset
三大系列總結
他們主要用法:
- offset系列 經常用於獲得元素位置offsetleft offsetTop
- client 經常用於獲取元素大小clientWidth clientHeight
- scroll 經常用於獲取滾動距離scrollTop scrollLeft
- 注意頁面滾動的距離通過window. pageOXffset
mouseover和mouseenter區別
- 當滑鼠移動到元素上時就會觸發mouseenter事件
- 類似mouseover ,它們兩者之間的差別是
- mouseover 滑鼠經過自身盒子會觸發,經過子盒子還會觸發mouseenter 只會經過自身盒子觸發
- 之所以這樣,就是因為mouseenter不會冒泡
- 跟mouseenter搭配滑鼠離開mouseleave同樣不會冒泡
相關文章
- mouseenter與mouseover區別
- 區別mouseover與mouseenter?
- Js offset、scroll、client三大系列的區別JSclient
- JavaScript偏移量offset,可視區client,滾動scroll系列JavaScriptclient
- 淺談mouseenter和mouseover,mouseout和mouseleave
- 元素 offset client scroll 相關屬性簡介client
- BOM之三大系列(offset-scroll-client)client
- WPF Button MouseEnter and MouseLeave together play as MouseOver
- offset與style區別
- JavaScript mouseover 事件JavaScript事件
- JavaScript mouseenter 事件JavaScript事件
- 滑鼠事件css的:hover和js的mouseover有什麼區別?事件CSSJS
- 常見的page,client,offset系列client
- Client Side Cache 和 Server Side Cache 的區別clientIDEServer
- JavaScript中for in 和for of的區別JavaScript
- JavaScript中==和===的區別JavaScript
- .NET Framework 4和.NET Framework 4 Client Profile的區別Frameworkclient
- javascript push 和 concat 的區別JavaScript
- JavaScript方法和函式區別JavaScript函式
- JavaScript之childNodes 和 children 區別JavaScript
- JavaScript map和reduce的區別JavaScript
- 在 JavaScript 中,exec() 和 match() 區別JavaScript
- javascript中break和continue的區別和作用JavaScript
- javascript原始值和引用值型別及區別JavaScript型別
- JavaScript--元素偏移量(offset)JavaScript
- grant_type為client_credentials和password二者的區別client
- XML和HTML的主要區別、 jQuery 能做什麼?JavaScript中的“=、==、===”區別?XMLHTMLjQueryJavaScript
- JavaScript與ECMAScript 區別JavaScript
- JavaScript 與TypeScript區別JavaScriptTypeScript
- JavaScript中的“=、==、===”區別JavaScript
- JavaScript函式宣告和函式表示式區別JavaScript函式
- Python和JavaScript在使用上有什麼區別?PythonJavaScript
- JavaScript undefined與null區別JavaScriptUndefinedNull
- Javascript中“==”與“===”的區別JavaScript
- JavaScript兩個等號和三個等號區別JavaScript
- JavaScript客戶端document物件和window物件的區別JavaScript客戶端物件
- JavaScript 中的 Var,Let 和 Const 有什麼區別JavaScript
- 和區別