座標系

在圖形上下文中指定畫素位置時(就像在代數中指定座標系統一樣),其位置是相對於上下文中的固定點定義的。這個固定點稱為原點。位置是根據相對於原點在上下文的每個維度上的畫素偏移量來指定的。

本指南描述了 CSS 物件模型使用的標準座標系統。這些系統通常僅在原點位置不同。

維度

在 Web 技術使用的座標系統中,水平偏移稱為x 座標,負值表示原點左側的位置,正值表示原點右側的位置。y 座標指定垂直偏移,負值表示原點上方,正值表示原點下方。

在 Web 上,預設的原點是給定上下文的左上角(正 y 座標值在原點下方)。請注意,這與大多數數學模型不同,在數學模型中,原點位於左下角,正 y 座標值在原點上方。

當使用第三個維度從前到後分層物件時,我們使用z 軸。z 軸從觀察者延伸到螢幕表面。CSS z-index 屬性值會影響定位元素在該軸上的位置,從而產生遠離或靠近觀察者的效果。

注意:可以使用 CSS 屬性(如 transform)來更改這些座標系統的定義和方向。但是,我們目前只討論標準座標系統。

標準 CSSOM 座標系統

CSS 物件模型使用四種標準座標系統。為了幫助視覺化主要系統,下圖顯示了一個帶有瀏覽器視窗的顯示器,該視窗包含滾動到視口外部的內容。滾動到視口外部的頁面內容以半透明的形式顯示在瀏覽器視窗上方,以指示“頁面”座標的原點位置。“客戶端”、“頁面”和“視口”座標系統的原點已高亮顯示。

A large screen with a smaller browser window rendering a web page's bottom half; the top half is shown as scrolled outside the browser viewport. The top-left corners of the screen, page, and viewport are all labeled with coordinates of 0,0.

偏移量

使用“偏移量”模型指定的座標使用正在檢查的元素或發生事件的元素的左上角。

例如,當發生滑鼠事件時,事件的 offsetXoffsetY 屬性指定的滑鼠位置是相對於事件已分派到的節點的左上角。原點向內偏移了內邊距邊緣,即內邊距區域和邊框區域之間的邊緣。

視口

“視口”(或“客戶端”)座標系統以事件發生的視口或瀏覽上下文的左上角作為其原點。這是呈現文件的整個可視區域。

例如,在臺式計算機上,MouseEvent.clientXMouseEvent.clientY 屬性指示事件發生時滑鼠游標相對於window 左上角的位置。在使用觸控筆或指標時,觸控事件中的 Touch.clientXTouch.clientY 座標相對於相同的原點。

視窗的左上角始終是 (0, 0),無論文件內容如何或是否進行了任何滾動。換句話說,滾動文件將改變文件中給定位置的視口座標。

頁面

“頁面”座標系統提供了一個畫素相對於整個渲染的Document 左上角的位置。這意味著文件內元素的點在使用者水平或垂直滾動文件後將具有相同的座標,除非元素因佈局更改而移動。

滑鼠事件的 pageXpageY 屬性提供了事件生成時滑鼠相對於文件左上角的位置。觸控事件中的 Touch.pageXTouch.pageY 座標相對於相同的原點。

Screen

最後,我們來看“螢幕”模型,其原點是使用者螢幕空間的左上角。此座標系統中的每個點代表一個邏輯畫素,因此值沿每個軸以整數值遞增和遞減。如果包含視窗移動,或者使用者更改螢幕幾何形狀(透過更改顯示解析度或新增/刪除監視器),文件中給定點的位置將發生變化。

MouseEvent.screenXMouseEvent.screenY 屬性提供滑鼠事件位置相對於螢幕原點的座標。觸控事件中的 Touch.screenXTouch.screenY 座標相對於相同的原點。

示例

讓我們看一個記錄元素中滑鼠座標的示例。每當滑鼠進入、在內部移動或退出內部框時,都會透過記錄每個可用系統中當前的滑鼠座標來處理這些事件。

JavaScript

對於 JavaScript,程式碼透過呼叫 addEventListener() 來為每種型別的 mouseentermousemovemouseleave 設定內部框上的事件處理程式。對於每個事件,我們都呼叫 setCoords() 函式,該函式將每個系統座標設定為 <p> 元素的內部文字。

js
const log = document.querySelector(".log");
const inner = document.querySelector(".inner");

function setCoords(e) {
  log.innerText = `
    Offset X/Y: ${e.offsetX}, ${e.offsetY}
    Viewport X/Y: ${e.clientX}, ${e.clientY}
    Page X/Y: ${e.pageX}, ${e.pageY}
    Screen X/Y: ${e.screenX}, ${e.screenY}`;
}

inner.addEventListener("mousemove", setCoords);
inner.addEventListener("mouseenter", setCoords);
inner.addEventListener("mouseleave", setCoords);

HTML

HTML 包含一個帶有 "log" 類的 <p> 元素,該元素顯示滑鼠事件的資料。

html
<div class="outer">
  <div class="inner">
    <p class="log">Mouse over this section to view coordinates</p>
  </div>
</div>

CSS

容器框的 "outer" 類故意設定得太寬,以便在滾動內容時檢視滑鼠座標效果。"inner" 段落是跟蹤和記錄滑鼠事件的地方。

css
.outer {
  width: 1000px;
}

.inner {
  font-family: monospace;
  position: relative;
  width: 500px;
  height: 150px;
  top: 25px;
  left: 100px;
  background-color: darkblue;
  color: white;
  cursor: crosshair;
  user-select: none;
}

.log {
  position: relative;
  width: 100%;
  text-align: center;
}

結果

您可以在此處檢視實際效果。當您將滑鼠移入和移出藍色框時,請觀察滑鼠 X 和 Y 座標值在各種座標系統中如何變化。

另見