成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 中那些關(guān)于坐標(biāo)和距離的屬性與方法

jsummer / 2741人閱讀

摘要:摘自阮一峰教程位置大小屬性只讀屬性返回瀏覽器窗口左上角相對(duì)于當(dāng)前屏幕左上角的水平距離和垂直距離單位像素。摘自阮一峰教程相關(guān)方法返回一個(gè)對(duì)象,提供當(dāng)前元素的大小位置等信息。摘自阮一峰教程四鼠標(biāo)事件接口通過(guò)添加的事件所產(chǎn)生的事件對(duì)象也是實(shí)例。

一 前言

在前端開(kāi)發(fā)中總會(huì)遇到各種各樣需要使用或計(jì)算坐標(biāo)和距離的情況,但是這些屬性和方法眾多,全部熟練地記下來(lái)并非是一件易事,大多只能現(xiàn)查,耗費(fèi)不少時(shí)間精力,于是便有了整理記錄的想法,即加深了印象,又方便隨時(shí)查閱。

二 window 對(duì)象
瀏覽器里面,window 對(duì)象(注意,w為小寫)指當(dāng)前的瀏覽器窗口。

它也是當(dāng)前頁(yè)面的頂層對(duì)象,即最高一層的對(duì)象,所有其他對(duì)象都是它的下屬。一個(gè)變量如果未聲明,那么默認(rèn)就是頂層對(duì)象的屬性。

摘自《阮一峰 JavaScript 教程》

位置大小屬性 window.screenX , window.screenY

只讀屬性

返回瀏覽器窗口左上角相對(duì)于當(dāng)前屏幕左上角的水平距離和垂直距離(單位像素)。

window.innerHeight , window.innerWidth

只讀屬性

返回網(wǎng)頁(yè)在當(dāng)前窗口中可見(jiàn)區(qū)域的高度和寬度,即「視口」(viewport)的大?。▎挝幌袼兀?。

注意,這兩個(gè)屬性包括滾動(dòng)條的高度和寬度。

window.outerHeight , window.outerWidth

只讀屬性

返回瀏覽器窗口的高度和寬度,包括瀏覽器菜單和邊框(單位像素)。

window.scrollX , window.scrollY

只讀屬性

別名: window.pageXOffset , window.pageYOffset

分別返回頁(yè)面的水平滾動(dòng)距離和垂直滾動(dòng)距離,單位都是像素。

注意,這兩個(gè)屬性的返回值不是整數(shù),而是雙精度浮點(diǎn)數(shù)。如果頁(yè)面沒(méi)有滾動(dòng),它們的值就是0。

摘自《阮一峰 JavaScript 教程》

為了跨瀏覽器兼容性,請(qǐng)使用 window.pageXOffset 代替 window.scrollX。另外,舊版本的 IE(<9)兩個(gè)屬性都不支持,必須通過(guò)其他的非標(biāo)準(zhǔn)屬性來(lái)解決此問(wèn)題。

摘自 MDN :https://developer.mozilla.org...

window 對(duì)象的方法 window.scrollTo() , window.scroll() , window.scrollBy()

window.scrollTo 方法 ---> 別名: window.scroll 方法

用于將文檔滾動(dòng)到指定位置。

它接受兩個(gè)參數(shù),表示滾動(dòng)后位于窗口左上角的頁(yè)面坐標(biāo)。

也可以接受一個(gè)配置對(duì)象作為參數(shù)。

window.scrollTo(options)

配置對(duì)象 options 有三個(gè)屬性。

top:滾動(dòng)后頁(yè)面左上角的垂直坐標(biāo),即 y 坐標(biāo)。

left:滾動(dòng)后頁(yè)面左上角的水平坐標(biāo),即 x 坐標(biāo)。

behavior:字符串,表示滾動(dòng)的方式,有三個(gè)可能值(smooth、instant、auto),默認(rèn)值為 auto。

window.scrollBy 方法用于將網(wǎng)頁(yè)滾動(dòng)指定距離(單位像素)。

它接受兩個(gè)參數(shù):水平向右滾動(dòng)的像素,垂直向下滾動(dòng)的像素。

注意:仔細(xì)體會(huì)這兩者的差別。

三 Element 節(jié)點(diǎn)
Element節(jié)點(diǎn)對(duì)象對(duì)應(yīng)網(wǎng)頁(yè)的 HTML 元素。每一個(gè) HTML 元素,在 DOM 樹(shù)上都會(huì)轉(zhuǎn)化成一個(gè)Element節(jié)點(diǎn)對(duì)象(簡(jiǎn)稱元素節(jié)點(diǎn))。
相關(guān)屬性 Element.clientHeight,Element.clientWidth

分別返回元素的高度和寬度,始終是整數(shù)值。

如果該元素是內(nèi)聯(lián)元素(display: inline;),則返回值為 0。

從盒模型的概念上來(lái)講,返回的數(shù)值計(jì)算包括元素的 content 和 padding ,不包括 border 和 margin 。

如果有滾動(dòng)條,返回的數(shù)值會(huì)減去滾動(dòng)條占據(jù)的寬度或高度。(即不包含滾動(dòng)條在內(nèi))

// 瀏覽器視口高度
document.documentElement.clientHeight

// 網(wǎng)頁(yè)總高度
document.body.clientHeight
Element.clientLeft,Element.clientTop

分別返回元素的左邊框?qū)挾群蜕线吙驅(qū)挾龋瑳](méi)有邊框則返回 0。

同樣不支持內(nèi)聯(lián)元素。

(我沒(méi)太明白這兩個(gè)屬性有啥作用……)

Element.scrollHeight,Element.scrollWidth

返回當(dāng)前元素的總高度和總寬度,包括溢出容器、當(dāng)前并不可見(jiàn)的部分。

包括 padding 區(qū)域。

包括偽元素的寬度和高度。

不包含滾動(dòng)條的寬度和高度。

來(lái)個(gè)小 demo 輔助下理解:

666
.box {
  width: 200px; height: 200px; overflow: hidden;
  border: 1px solid red; padding: 10px; position: relative;
}
.box::after {
  position: absolute; content: "";
  width: 100px; height: 100px; left: 100%;
}
let box = document.querySelector(".box")
console.log(box.scrollWidth) // 320
console.log(box.scrollHeight) // 220

可以看到 box 元素的 scrollHeight 是 220,這個(gè)和我們提到的「包括 padding 區(qū)域」相符合。

那 box 元素的 scrollWidth 為啥是 320 ? 是因?yàn)閭卧氐奈恢煤蛯挾龋m然偽元素溢出被隱藏了,但是這個(gè)屬性返回的數(shù)值依然包括它。

當(dāng)然不僅僅包括它的寬度和高度,它所處的位置也會(huì)計(jì)算在內(nèi)。

比如把偽元素的 css 改一下:

.box::after {
  position: absolute; content: "";
  width: 100px; height: 100px;
  left: 120%; top: 120%;
}

現(xiàn)在你要不要猜一下 box 的 scrollWidthscrollHeight 分別是多少?

Element.scrollLeft,Element.scrollTop

可讀寫,設(shè)置該屬性的值,會(huì)導(dǎo)致瀏覽器將當(dāng)前元素自動(dòng)滾動(dòng)到相應(yīng)的位置。

分別返回當(dāng)前元素的水平滾動(dòng)距離和垂直滾動(dòng)距離。

對(duì)于那些沒(méi)有滾動(dòng)條的網(wǎng)頁(yè)元素,這兩個(gè)屬性總是等于 0。

如果要查看整張網(wǎng)頁(yè)的水平的和垂直的滾動(dòng)距離,要從 document.documentElement 元素上讀取。

document.documentElement.scrollLeft
document.documentElement.scrollTop
Element.offsetHeight,Element.offsetWidth

分別返回元素的高度和寬度,包括元素本身的高和寬、padding 和 border ,以及滾動(dòng)條的高和寬。

如果元素的 display 為 none,則返回 0。

與 clientHeight 和 clientWidth 相比,我想這對(duì)屬性用的更多一點(diǎn),因?yàn)楦嗟臅r(shí)候我們需要獲取的是元素的完整寬高。

Element.offsetLeft,Element.offsetTop

返回當(dāng)前元素左上角相對(duì)于 Element.offsetParent 節(jié)點(diǎn)的水平和垂直位移。

說(shuō)到這個(gè)我們來(lái)了解下 Element.offsetParent:

Element.offsetParent 屬性返回最靠近當(dāng)前元素的、并且 CSS 的 position 屬性不等于 static 的上層元素。

如果該元素是不可見(jiàn)的(display屬性為none),或者位置是固定的(position屬性為fixed),則offsetParent屬性返回null。

如果某個(gè)元素的所有上層節(jié)點(diǎn)的position屬性都是static,則Element.offsetParent屬性指向元素。

摘自《阮一峰 JavaScript 教程》

相關(guān)方法 Element.getBoundingClientRect()

返回一個(gè)對(duì)象,提供當(dāng)前元素的大小、位置等信息。

我常用來(lái)它獲取元素的寬高和坐標(biāo)。

該對(duì)象有如下屬性:

width

height

x 元素左上角相對(duì)于 視口 的橫坐標(biāo)

y

left

right

top

bottom

由于元素相對(duì)于視口(viewport)的位置,會(huì)隨著頁(yè)面滾動(dòng)變化,因此表示位置的四個(gè)屬性值,都不是固定不變的。如果想得到絕對(duì)位置,可以將 left 屬性加上 window.scrollX , top 屬性加上 window.scrollY。

摘自《阮一峰 JavaScript 教程》

四 鼠標(biāo)事件 MouseEvent 接口
let event = new MouseEvent("click", {
    // ...
})

通過(guò) addEventListener 添加的 click 事件所產(chǎn)生的事件對(duì)象也是 MouseEvent 實(shí)例。

let box = document.querySelector(".box")

box.addEventListener("click", (e) => {
  console.log(e) // 事件對(duì)象
})

這個(gè)事件對(duì)象,也就是 MouseEvent 實(shí)例,有很多屬性,這里來(lái)簡(jiǎn)單分析一下。

MouseEvent.clientX 和 MouseEvent.clientY

只讀屬性

分別返回鼠標(biāo)位置相對(duì)于 瀏覽器窗口 左上角的水平坐標(biāo)和垂直坐標(biāo)。(不受滾動(dòng)距離的影響)

可以這樣理解:

client 本來(lái)就是客戶端的意思,web 中的客戶端就是瀏覽器,那 clientX 和 clientY 自然就是相對(duì)于瀏覽器的位置了。

這兩個(gè)屬性還分別有一個(gè)別名 MouseEvent.x 和 MouseEvent.y 。

MouseEvent.screenX,MouseEvent.screenY

只讀屬性

分別返回鼠標(biāo)位置相對(duì)于 屏幕(顯示器屏幕區(qū)域) 左上角的水平坐標(biāo)和垂直坐標(biāo)。

screen 是屏幕的意思,所以,你懂的。

MouseEvent.offsetX,MouseEvent.offsetY

只讀屬性

分別返回鼠標(biāo)位置相對(duì)于 目標(biāo)節(jié)點(diǎn)(即當(dāng)前元素) 左上角 padding 邊緣 的 水平距離和垂直距離。

offset 有偏移的意思,所以這里也可以理解為鼠標(biāo)位置相對(duì)于目標(biāo)元素內(nèi)部左上角的偏移值,和目標(biāo)元素本身以及外部的元素都無(wú)關(guān)。

那 「padding 邊緣」是什么意思呢?

我們拿圖說(shuō)話:

上圖中三個(gè)元素分別有紅藍(lán)綠三種邊框來(lái)區(qū)分,紅藍(lán)邊框?qū)挾葹?1px , 綠邊框?yàn)?30px 。每個(gè)元素都有 padding 值。具體代碼如下:



  
Hello
/* css */
body {
  border: 1px solid red; margin: 0; padding: 20px;
}
.parent {
  border: 1px solid blue; padding-top: 50px;
}
.hello {
  width: 100px; height: 100px; padding: 100px; border: 30px solid green;
}

我們給 hello 元素添加一個(gè) click 時(shí)間監(jiān)聽(tīng)函數(shù):

// js
let hello = document.querySelector(".hello")

hello.addEventListener("click", (e) => {
  console.log(e)
  console.log(e.offsetX)
  console.log(e.offsetY)
})

分別點(diǎn)擊 hello 元素的綠色邊框和空白區(qū)域,會(huì)發(fā)現(xiàn)前者的值為負(fù)數(shù),后者的值為整數(shù),且都是相對(duì)空白區(qū)域的左上角開(kāi)始計(jì)算的。

這就是我們一開(kāi)始提到的 「鼠標(biāo)位置相對(duì)于 目標(biāo)節(jié)點(diǎn)(即當(dāng)前元素) 左上角 padding 邊緣 的 水平距離和垂直距離」 這句話的意思。

MouseEvent.pageX,MouseEvent.pageY

只讀屬性

分別返回鼠標(biāo)位置相對(duì)于文檔左上角的距離。(包括滾動(dòng)距離)

MouseEvent.movementX,MouseEvent.movementY

只讀屬性

返回當(dāng)前位置與上一個(gè) mousemove 事件之間的水平距離和垂直距離。

很明顯這兩個(gè)屬性和 mousemove 事件肯定有著密切的關(guān)系,所以我們?cè)倭私庖幌?mousemove 事件:

當(dāng)鼠標(biāo)在一個(gè)節(jié)點(diǎn)內(nèi)部移動(dòng)時(shí)觸發(fā)。當(dāng)鼠標(biāo)持續(xù)移動(dòng)時(shí),該事件會(huì)連續(xù)觸發(fā)。為了避免性能問(wèn)題,建議對(duì)該事件的監(jiān)聽(tīng)函數(shù)做一些限定,比如限定一段時(shí)間內(nèi)只能運(yùn)行一次。

說(shuō)到這個(gè)應(yīng)該會(huì)牽扯到「節(jié)流」,暫不深入了。

這兩個(gè)屬性還是很有用的,我雖然沒(méi)咋用過(guò),不過(guò)目前想來(lái)可以用來(lái)判斷鼠標(biāo)的移動(dòng)方向等。

參考鏈接:

window 對(duì)象 - WangDoc.com

Element 節(jié)點(diǎn) - WangDoc.com

鼠標(biāo)事件 - WangDoc.com

(完)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109866.html

相關(guān)文章

  • JavaScript 那些關(guān)于坐標(biāo)距離屬性方法

    摘要:摘自阮一峰教程位置大小屬性只讀屬性返回瀏覽器窗口左上角相對(duì)于當(dāng)前屏幕左上角的水平距離和垂直距離單位像素。摘自阮一峰教程相關(guān)方法返回一個(gè)對(duì)象,提供當(dāng)前元素的大小位置等信息。摘自阮一峰教程四鼠標(biāo)事件接口通過(guò)添加的事件所產(chǎn)生的事件對(duì)象也是實(shí)例。一 前言 在前端開(kāi)發(fā)中總會(huì)遇到各種各樣需要使用或計(jì)算坐標(biāo)和距離的情況,但是這些屬性和方法眾多,全部熟練地記下來(lái)并非是一件易事,大多只能現(xiàn)查,耗費(fèi)不少時(shí)間精力...

    guqiu 評(píng)論0 收藏0
  • 關(guān)于JS、JQ獲取可視區(qū)域高度、寬度以及屏幕分辨率那些

    摘要:用和獲取相關(guān)屬性網(wǎng)頁(yè)可見(jiàn)區(qū)域?qū)捑W(wǎng)頁(yè)可見(jiàn)區(qū)域高網(wǎng)頁(yè)可見(jiàn)區(qū)域?qū)挵ㄟ吙虻膶捑W(wǎng)頁(yè)可見(jiàn)區(qū)域高包括邊框的高網(wǎng)頁(yè)正文全文寬網(wǎng)頁(yè)正文全文高網(wǎng)頁(yè)下滑的距離網(wǎng)頁(yè)左滑的距離屏幕分辨率的高屏幕分辨率的寬屏幕可用工作區(qū)的高屏幕可用工作區(qū)的高瀏覽器可視區(qū)域的內(nèi)寬度, 用JS和JQ獲取相關(guān)屬性 JavaScript document.body.clientWidth;//網(wǎng)頁(yè)可見(jiàn)區(qū)域?qū)抎ocument.body....

    or0fun 評(píng)論0 收藏0
  • 看完這篇,你也可以實(shí)現(xiàn)一個(gè)360度全景插件

    摘要:兩種相機(jī)的區(qū)別目前提供了幾種不同的相機(jī),最常用的,也是下面插件中使用的兩種相機(jī)是透視相機(jī)正交投影相機(jī)。上面的圖很清楚的解釋了兩種相機(jī)的區(qū)別右側(cè)是正交投影相機(jī)他不具有透視效果,即物體的大小不受遠(yuǎn)近距離的影響,對(duì)應(yīng)的是投影中的正交投影。導(dǎo)讀 本文從繪圖基礎(chǔ)開(kāi)始講起,詳細(xì)介紹了如何使用Three.js開(kāi)發(fā)一個(gè)功能齊全的全景插件。 我們先來(lái)看一下插件的效果: showImg(https://user...

    Michael_Lin 評(píng)論0 收藏0
  • 看完這篇,你也可以實(shí)現(xiàn)一個(gè)360度全景插件

    摘要:導(dǎo)讀本文從繪圖基礎(chǔ)開(kāi)始講起,詳細(xì)介紹了如何使用開(kāi)發(fā)一個(gè)功能齊全的全景插件。兩種相機(jī)的區(qū)別目前提供了幾種不同的相機(jī),最常用的,也是下面插件中使用的兩種相機(jī)是透視相機(jī)正交投影相機(jī)。 導(dǎo)讀 本文從繪圖基礎(chǔ)開(kāi)始講起,詳細(xì)介紹了如何使用Three.js開(kāi)發(fā)一個(gè)功能齊全的全景插件。 我們先來(lái)看一下插件的效果: showImg(https://segmentfault.com/img/remote/...

    XiNGRZ 評(píng)論0 收藏0
  • 看完這篇,你也可以實(shí)現(xiàn)一個(gè)360度全景插件

    摘要:導(dǎo)讀本文從繪圖基礎(chǔ)開(kāi)始講起,詳細(xì)介紹了如何使用開(kāi)發(fā)一個(gè)功能齊全的全景插件。兩種相機(jī)的區(qū)別目前提供了幾種不同的相機(jī),最常用的,也是下面插件中使用的兩種相機(jī)是透視相機(jī)正交投影相機(jī)。 導(dǎo)讀 本文從繪圖基礎(chǔ)開(kāi)始講起,詳細(xì)介紹了如何使用Three.js開(kāi)發(fā)一個(gè)功能齊全的全景插件。 我們先來(lái)看一下插件的效果: showImg(https://segmentfault.com/img/remote/...

    fredshare 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<