jQuery รับตำแหน่งขององค์ประกอบที่สัมพันธ์กับหน้าต่าง


168

ได้รับ ID DOM HTML, วิธีการรับตำแหน่งขององค์ประกอบที่เกี่ยวข้องกับหน้าต่างใน JavaScript / JQuery? สิ่งนี้ไม่เหมือนกับความสัมพันธ์กับเอกสารหรือพาเรนต์ออฟเซ็ตเนื่องจากองค์ประกอบอาจอยู่ใน iframe หรือองค์ประกอบอื่น ๆ ฉันต้องการรับตำแหน่งหน้าจอของสี่เหลี่ยมขององค์ประกอบ (ตามตำแหน่งและมิติ) ตามที่มันถูกแสดงอยู่ในปัจจุบัน ค่าลบสามารถยอมรับได้หากองค์ประกอบอยู่นอกจอ (เลื่อนออกไปแล้ว)

นี่สำหรับแอปพลิเคชัน iPad (WebKit / WebView) เมื่อใดก็ตามที่ผู้ใช้แตะที่ลิงค์พิเศษในUIWebViewฉันควรจะเปิดมุมมองป๊อปโอเวอร์ที่แสดงข้อมูลเพิ่มเติมเกี่ยวกับลิงค์ มุมมองป๊อปโอเวอร์จำเป็นต้องแสดงลูกศรที่ชี้กลับไปยังส่วนของหน้าจอที่เรียกใช้

คำตอบ:


264

เริ่มแรกรับตำแหน่ง. offsetขององค์ประกอบและคำนวณตำแหน่งที่สัมพันธ์กับหน้าต่าง

อ้างอิง :
1. offset
2. scroll
3. scrollTop

คุณสามารถลองเล่นซอนี้ได้

การปฏิบัติตามโค้ดสองสามบรรทัดต่อไปนี้จะอธิบายวิธีการแก้ไขนี้

เมื่อมีการดำเนินการกิจกรรม. scrollเราคำนวณตำแหน่งสัมพัทธ์ขององค์ประกอบที่เกี่ยวข้องกับวัตถุหน้าต่าง

$(window).scroll(function () {
    console.log(eTop - $(window).scrollTop());
});

เมื่อทำการเลื่อนในเบราว์เซอร์เราเรียกใช้ฟังก์ชันตัวจัดการเหตุการณ์ด้านบน

ข้อมูลโค้ด


function log(txt) {
  $("#log").html("location : <b>" + txt + "</b> px")
}

$(function() {
  var eTop = $('#element').offset().top; //get the offset top of the element
  log(eTop - $(window).scrollTop()); //position of the ele w.r.t window

  $(window).scroll(function() { //when window is scrolled
    log(eTop - $(window).scrollTop());
  });
});
#element {
  margin: 140px;
  text-align: center;
  padding: 5px;
  width: 200px;
  height: 200px;
  border: 1px solid #0099f9;
  border-radius: 3px;
  background: #444;
  color: #0099d9;
  opacity: 0.6;
}
#log {
  position: fixed;
  top: 40px;
  left: 40px;
  color: #333;
}
#scroll {
  position: fixed;
  bottom: 10px;
  right: 10px;
  border: 1px solid #000;
  border-radius: 2px;
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log"></div>

<div id="element">Hello
  <hr>World</div>
<div id="scroll">Scroll Down</div>


1
ขอบคุณสำหรับสคริปต์ ดูเหมือนว่าจะทำงานบนเดสก์ท็อป แต่ไม่ทำงานบน iPad ดูเหมือนว่า $ (หน้าต่าง) .scrollTop () และ $ (หน้าต่าง) .scrollLeft () ไม่ได้รับการอัปเดตใน iPad คุณสามารถลองรุ่นของฉันผ่านjsbin.com/ogiwu4/5
Adib

2
พวกเขาไม่ได้รับการอัปเดตบน iPad เพราะหน้าต่างตัวเองไม่ได้เลื่อน - ผู้ใช้เลื่อนไปรอบ ๆ ภายในหน้าต่าง นี่เป็นกรณีสำหรับเว็บไซต์พื้นฐาน แต่ไม่แน่ใจว่ามีเว็บไซต์ที่มีเป้าหมายเป็นอุปกรณ์เคลื่อนที่หรือไม่อาจมีตัวเลือกเพิ่มเติม
eselk

สิ่งนี้จะล้มเหลวเมื่อองค์ประกอบอยู่ในองค์ประกอบที่เลื่อนได้อื่น ก. <div>. คุณพิจารณาเฉพาะการเลื่อนเอกสาร แต่ไม่ใช่การเลื่อนองค์ประกอบอื่น ๆ
ygoe

71

ลองใช้กล่อง จำกัด มันง่าย:

var leftPos  = $("#element")[0].getBoundingClientRect().left   + $(window)['scrollLeft']();
var rightPos = $("#element")[0].getBoundingClientRect().right  + $(window)['scrollLeft']();
var topPos   = $("#element")[0].getBoundingClientRect().top    + $(window)['scrollTop']();
var bottomPos= $("#element")[0].getBoundingClientRect().bottom + $(window)['scrollTop']();

7
getBoundingClientRect () คือคำตอบสำหรับปัญหานี้ ขอบคุณ prograhammer
Vlad Lego

1
มันใช้งานได้ดี ฉันต้องใส่รหัสเพื่อแก้ไขการเลื่อนของฉันนอกจาก scrollLetf และ scrollTop ของคุณ: topPos = topPos - $ (หน้าต่าง) .scrollTop (); leftPos = leftPos - $ (หน้าต่าง) .scrollLeft (); rightPos = rightPos - $ (หน้าต่าง) .scrollTop (); bottomPos = bottomPos - $ (หน้าต่าง) .scrollLeft ();
Cesar

1
วันที่ผู้คนจะเรียนรู้ที่จะห่อสิ่งต่าง ๆ ด้วยวิธีที่มีประโยชน์ดี
mmm

@Noldorin การสนับสนุน IE / Edge ดูดีสำหรับฉัน: caniuse.com/#feat=getboundingclientrect
prograhammer

1
@prograhammer ฉันไม่ดีคุณพูดถูก ฉันอ่านสิ่งนี้ในบางเว็บไซต์และใช้คำพูดที่มูลค่า ... กลายเป็นว่ามันผิด (หรืออย่างน้อยก็ใช้ไม่ได้กับ IE เก่า)
Noldorin

6
function getWindowRelativeOffset(parentWindow, elem) {
        var offset = {
            left : 0,
            top : 0
        };
        // relative to the target field's document
        offset.left = elem.getBoundingClientRect().left;
        offset.top = elem.getBoundingClientRect().top;
        // now we will calculate according to the current document, this current
        // document might be same as the document of target field or it may be
        // parent of the document of the target field
        var childWindow = elem.document.frames.window;
        while (childWindow != parentWindow) {
            offset.left = offset.left + childWindow.frameElement.getBoundingClientRect().left;
            offset.top = offset.top + childWindow.frameElement.getBoundingClientRect().top;
            childWindow = childWindow.parent;
        }
        return offset;
    };

คุณสามารถเรียกมันว่าสิ่งนี้

getWindowRelativeOffset(top, inputElement);

ฉันมุ่งเน้นไปที่ IE เท่านั้นตามความต้องการของฉัน แต่สามารถทำได้คล้ายกับเบราว์เซอร์อื่น ๆ


4

ฟังดูเหมือนว่าคุณต้องการคำแนะนำเครื่องมือสำหรับลิงค์ที่เลือก มีคำแนะนำเครื่องมือ jQuery มากมายลองjQuery qTipqTip มันมีตัวเลือกมากมายและง่ายต่อการเปลี่ยนสไตล์

มิฉะนั้นถ้าคุณต้องการที่จะทำเช่นนี้ด้วยตัวคุณเองคุณสามารถใช้ .position()jQuery ข้อมูลเพิ่มเติมเกี่ยวกับ.position()อยู่ในhttp://api.jquery.com/position/

$("#element").position(); จะส่งคืนตำแหน่งปัจจุบันขององค์ประกอบที่สัมพันธ์กับผู้ปกครองชดเชย

นอกจากนี้ยังมี jQuery .offset (); ซึ่งจะส่งคืนตำแหน่งที่สัมพันธ์กับเอกสาร


2
ไม่ใช่คำแนะนำเครื่องมือ แต่เปิดวิดเจ็ต UI ดั้งเดิมเพื่อเพิ่มคำอธิบายประกอบ
adib

3

TL; DR

headroom_by_jQuery = $('#id').offset().top - $(window).scrollTop();

headroom_by_DOM = $('#id')[0].getBoundingClientRect().top;   // if no iframe

.getBoundingClientRect ()ดูเหมือนจะเป็นสากล .offset ()และ. scrollTop ()ได้รับการสนับสนุนตั้งแต่ jQuery 1.2 ขอบคุณ @ user372551 และ @prograhammer หากต้องการใช้ DOM ใน iframe ดู@ วิธีการแก้ปัญหาของ


1
    function trbl(e, relative) {
            var r = $(e).get(0).getBoundingClientRect(); relative = $(relative);

            return {
                    t : r.top    + relative['scrollTop'] (),
                    r : r.right  + relative['scrollLeft'](),
                    b : r.bottom + relative['scrollTop'] (),
                    l : r.left   + relative['scrollLeft']() 

            }
    }

    // Example
    trbl(e, window);

1

ลองใช้วิธีนี้เพื่อดูตำแหน่งขององค์ประกอบที่สัมพันธ์กับหน้าต่าง

        $("button").click(function(){
            var offset = $("#simplebox").offset();
            alert("Current position of the box is: (left: " + offset.left + ", top: " + offset.top + ")");
        });
    #simplebox{
        width:150px;
        height:100px;
        background: #FBBC09;
        margin: 150px 100px;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button">Get Box Position</button>
    <p><strong>Note:</strong> Play with the value of margin property to see how the jQuery offest() method works.</p>
    <div id="simplebox"></div>

ดูเพิ่มเติม @ รับตำแหน่งขององค์ประกอบที่สัมพันธ์กับเอกสารด้วย jQuery

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.