Nhận vị trí của thẻ div / span


103

Ai đó có thể chỉ cho tôi cách lấy top& leftvị trí của một divhoặc spanphần tử khi một hoặc phần tử không được chỉ định không?

I E:

<span id='11a' style='top:55px;' onmouseover="GetPos(this);">stuff</span>
<span id='12a' onmouseover="GetPos(this);">stuff</span>

Ở trên, nếu tôi làm:

document.getElementById('11a').style.top

Giá trị của 55pxđược trả về. Tuy nhiên, nếu tôi thử điều đó cho span'12a', thì không có gì được trả lại.

Tôi có một loạt các div/ spans trên một trang mà tôi không thể chỉ định các thuộc tính top/ left, nhưng tôi cần hiển thị divtrực tiếp dưới phần tử đó.

Câu trả lời:


100

Hàm này sẽ cho bạn biết vị trí x, y của phần tử so với trang. Về cơ bản, bạn phải lặp lại tất cả các cha mẹ của phần tử và cộng các hiệu số của chúng lại với nhau.

function getPos(el) {
    // yay readability
    for (var lx=0, ly=0;
         el != null;
         lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
    return {x: lx,y: ly};
}

Tuy nhiên, nếu bạn chỉ muốn vị trí x, y của phần tử liên quan đến vùng chứa của nó, thì tất cả những gì bạn cần là:

var x = el.offsetLeft, y = el.offsetTop;

Để đặt một phần tử ngay bên dưới phần tử này, bạn cũng cần biết chiều cao của phần tử đó. Điều này được lưu trữ trong thuộc tính offsetHeight / offsetWidth.

var yPositionOfNewElement = el.offsetTop + el.offsetHeight + someMargin;

5
Rất tiếc, phương pháp này không thành công trong Chrome khi phần tử nằm trong bảng có đường viền. Nó cũng sẽ không thành công trong chế độ tiêu chuẩn IE6 do lề BODY.
GetFree

1
Chỉ là một cảnh báo cho người dùng mã này. Điều này liên quan đến trang chứ không phải cửa sổ. Nó trả về cùng một giá trị nếu người dùng cuộn xung quanh bằng các thanh cuộn. Hãy cẩn thận.
Isaac Bolinger

cảm ơn @IsaacBolinger vừa nhận thấy nó. Ai đó có thể cho tôi biết làm thế nào tôi có thể thay đổi các giá trị khi cửa sổ được thay đổi kích thước hoặc người dùng cuộn không?
David Fariña

@ DavidFariña Tôi đã sử dụng mô-đun hình học "dom-Hình học" của dojo cho việc đó. Tôi không biết làm thế nào để làm điều đó một cách tự nhiên.
Isaac Bolinger

Phản đối - Điều này có thể rõ ràng với những người dùng có kinh nghiệm hơn, nhưng bạn chưa chỉ định chính xác những gì cần được chuyển cho el (tức là vui lòng cung cấp cách sử dụng mẫu).
Matt

183

Bạn có thể gọi phương thức getBoundingClientRect()trên một tham chiếu đến phần tử. Sau đó, bạn có thể kiểm tra top, left, rightvà / hoặc bottomtài sản ...

var offsets = document.getElementById('11a').getBoundingClientRect();
var top = offsets.top;
var left = offsets.left;

Nếu sử dụng jQuery, bạn có thể sử dụng mã ngắn gọn hơn ...

var offsets = $('#11a').offset();
var top = offsets.top;
var left = offsets.left;

11
+1 cho câu trả lời này, getBoundingClientRect()nên được sử dụng - và đây phải là câu trả lời được chấp nhận! Nhưng bạn không cần "trình duyệt hiện đại" để điều này hoạt động, hãy xem danh sách khả năng tương thích mà tôi đã hiển thị ở đây: stackoverflow.com/questions/1480133/… . Nó hoạt động tốt trên IE 4.0+ (!), Chrome 1.0+, FF 3.0+, Safari 4.0+ và Opera.
Sk8erPeter

25
Lưu ý rằng getBoundingClientRect()trả về các giá trị liên quan đến chế độ xem, không phải tài liệu. Đối với điều đó, bạn muốn một cái gì đó như thế nào top = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop.
Zack Bloom

1
Cũng lưu ý rằng getBoundingClientRectcó tính transformđến.
ExpExc,

Điều này không chính xác nếu con đầu tiên không được định vị tuyệt đối có margin-top hoặc margin-left. Hiện tại không có giải pháp chính xác trên trang này vì vậy nếu ai biết, xin vui lòng đăng câu trả lời.
Curtis

16

Trong khi câu trả lời của @ nickf hoạt động. Nếu bạn không quan tâm đến các trình duyệt cũ hơn, bạn có thể sử dụng phiên bản Javascript thuần túy này. Hoạt động trên IE9 + và các trình duyệt khác

var rect = el.getBoundingClientRect();

var position = {
  top: rect.top + window.pageYOffset,
  left: rect.left + window.pageXOffset
};

12

Như Alex đã lưu ý, bạn có thể sử dụng jQuery offset () để có được vị trí liên quan đến luồng tài liệu. Sử dụng vị trí () cho các tọa độ x, y của nó liên quan đến gốc.

EDIT: Switched document.readycho window.loadloadchờ đợi cho tất cả các yếu tố để bạn có được kích thước của chúng thay vì chỉ đơn giản là chuẩn bị DOM. Theo kinh nghiệm của tôi, loaddẫn đến ít phần tử Javascript được định vị sai hơn.

$(window).load(function(){ 
  // Log the position with jQuery
  var position = $('#myDivInQuestion').position();
  console.log('X: ' + position.left + ", Y: " + position.top );
});

9

Đối với bất kỳ ai chỉ cần vị trí trên cùng hoặc bên trái, các sửa đổi nhỏ đối với mã có thể đọc được của @ Nickf sẽ thực hiện được mẹo.

function getTopPos(el) {
    for (var topPos = 0;
        el != null;
        topPos += el.offsetTop, el = el.offsetParent);
    return topPos;
}

function getLeftPos(el) {
    for (var leftPos = 0;
        el != null;
        leftPos += el.offsetLeft, el = el.offsetParent);
    return leftPos;
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.