JavaScript รับหน้าต่างตำแหน่ง X / Y สำหรับการเลื่อน


214

ฉันหวังว่าจะหาวิธีในการรับตำแหน่งของหน้าต่างที่สามารถดูได้ในปัจจุบัน (เทียบกับความกว้าง / ความสูงของหน้าทั้งหมด) ดังนั้นฉันสามารถใช้มันเพื่อบังคับให้เลื่อนจากส่วนหนึ่งไปยังอีกส่วนหนึ่ง อย่างไรก็ตามดูเหมือนว่าจะมีตัวเลือกมากมายเมื่อคาดเดาว่าวัตถุใดที่ถือ X / Y ที่แท้จริงสำหรับเบราว์เซอร์ของคุณ

ฉันต้องทำสิ่งใดเพื่อให้แน่ใจว่า IE 6+, FF 2+ และ Chrome / Safari ใช้งานได้

window.innerWidth
window.innerHeight
window.pageXOffset
window.pageYOffset
document.documentElement.clientWidth
document.documentElement.clientHeight
document.documentElement.scrollLeft
document.documentElement.scrollTop
document.body.clientWidth
document.body.clientHeight
document.body.scrollLeft
document.body.scrollTop

แล้วมีคนอื่นอีกไหม? เมื่อฉันรู้ว่าหน้าต่างอยู่ที่ไหนฉันสามารถตั้งค่าห่วงโซ่เหตุการณ์ที่จะเรียกช้าๆwindow.scrollBy(x,y);จนกว่าจะถึงจุดที่ฉันต้องการ

คำตอบ:


282

วิธีการ jQuery (v1.10) ใช้เพื่อค้นหาสิ่งนี้คือ:

var doc = document.documentElement;
var left = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
var top = (window.pageYOffset || doc.scrollTop)  - (doc.clientTop || 0);

นั่นคือ:

  • มันจะทำการทดสอบwindow.pageXOffsetก่อนและใช้มันหากมีอยู่
  • document.documentElement.scrollLeftมิฉะนั้นจะใช้
  • จากนั้นจะลบdocument.documentElement.clientLeftหากมีอยู่

การลบdocument.documentElement.clientLeft/ Topเพียงดูเหมือนว่าจำเป็นต้องแก้ไขในสถานการณ์ที่คุณใช้เส้นขอบ (ไม่ใช่การขยายหรือขอบ แต่เป็นเส้นขอบที่แท้จริง) กับองค์ประกอบรากและที่อาจเป็นไปได้ในเบราว์เซอร์บางอย่างเท่านั้น


โทมัส - คุณพูดถูก ความผิดฉันเอง. ลบความคิดเห็นแล้ว ฉันอ่านความคิดเห็นของคุณอีกครั้งและตระหนักว่าโซลูชันของคุณไม่ใช่โซลูชัน Jquery เลย ขอโทษ. Modded up
กรุงเทพ

มันใช้งานได้แล้ว ฉันคิดว่าพวกเขามีข้อผิดพลาดชั่วคราวใน webkit และพวกเขาแก้ไขมันแล้ว ฉันเขียนปลั๊กอินที่เสียหายอย่างสมบูรณ์เนื่องจากข้อผิดพลาดนั้นและผู้ใช้รายงานเรื่องนี้ให้ฉัน สิ่งพื้นฐานที่น่ากลัวอย่างนี้อาจแตกหัก
vsync

2
นี่คือรหัสสำหรับ $ (หน้าต่าง) .scrollTop (); ? มันอาจจะมีประโยชน์ที่จะรวมวิธีการ jQuery เช่นกันในคำตอบนี้
ฟิล

1
รหัสที่ฉันโพสต์เป็นการแปลความหมายของสิ่งที่เกิดjQuery.fn.offset()ขึ้น scrollTop()/ scrollLeft()ทำเหมือนเดิม แต่ไม่ลบ clientTop / clientLeft
thomasrutter

วิธีการคืออะไร?
Maxrunner

208

อาจจะง่ายขึ้น

var top  = window.pageYOffset || document.documentElement.scrollTop,
    left = window.pageXOffset || document.documentElement.scrollLeft;

เครดิต: so.dom.js # L492


1
ข้ามเบราว์เซอร์อย่างปลอดภัย! ทางออกที่ดีที่สุด
Simon Steinberger

1
ที่ทำงานดีกว่ารหัสคำตอบ แต่ ... รหัสคำตอบไม่ได้ทำงานไม่บิต ...
Hydroper

2
ฉันสงสัยว่าทำไมไม่ใช้เพียงdocument.documentElement.scrollTopซึ่งใช้งานได้ทุกที่
vsync

33

ใช้จาวาสคริปต์ที่บริสุทธิ์คุณสามารถใช้Window.scrollXและWindow.scrollY

window.addEventListener("scroll", function(event) {
    var top = this.scrollY,
        left =this.scrollX;
}, false);

หมายเหตุ

คุณสมบัติ pageXOffset เป็นนามแฝงสำหรับคุณสมบัติ scrollX และคุณสมบัติ pageYOffset เป็นนามแฝงสำหรับคุณสมบัติ scrollY:

window.pageXOffset == window.scrollX; // always true
window.pageYOffset == window.scrollY; // always true

นี่คือตัวอย่างรวดเร็ว

window.addEventListener("scroll", function(event) {
  
    var top = this.scrollY,
        left = this.scrollX;
  
    var horizontalScroll = document.querySelector(".horizontalScroll"),
        verticalScroll = document.querySelector(".verticalScroll");
    
    horizontalScroll.innerHTML = "Scroll X: " + left + "px";
      verticalScroll.innerHTML = "Scroll Y: " + top + "px";
  
}, false);
*{box-sizing: border-box}
:root{height: 200vh;width: 200vw}
.wrapper{
    position: fixed;
    top:20px;
    left:0px;
    width:320px;
    background: black;
    color: green;
    height: 64px;
}
.wrapper div{
    display: inline;
    width: 50%;
    float: left;
    text-align: center;
    line-height: 64px
}
.horizontalScroll{color: orange}
<div class=wrapper>
    <div class=horizontalScroll>Scroll (x,y) to </div>
    <div class=verticalScroll>see me in action</div>
</div>


6
หน้าที่คุณเชื่อมโยงกับข้อความว่า "เพื่อความเข้ากันได้ข้ามเบราว์เซอร์ให้ใช้ window.pageYOffset แทน window.scrollY"
JeremyWeir

สิ่งนี้ใช้ไม่ได้กับ IE IE ต้องการสิ่งที่คล้ายกันwindow.pageYOffset
hipkiss

-1
function FastScrollUp()
{
     window.scroll(0,0)
};

function FastScrollDown()
{
     $i = document.documentElement.scrollHeight ; 
     window.scroll(0,$i)
};
 var step = 20;
 var h,t;
 var y = 0;
function SmoothScrollUp()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, -step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollUp()},20);

};


function SmoothScrollDown()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollDown()},20);

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