2010-08-12 48 views
133

Tôi hy vọng sẽ tìm cách để có được vị trí cửa sổ có thể xem hiện tại (tương ứng với tổng chiều rộng/chiều cao của trang) để tôi có thể sử dụng nó để buộc cuộn từ một phần đến khác. Tuy nhiên, dường như có một số lượng lớn các tùy chọn khi nói đến việc đoán đối tượng nào giữ đúng X/Y cho trình duyệt của bạn.JavaScript nhận cửa sổ Vị trí X/Y để cuộn

Tôi cần phải đảm bảo công việc nào trong IE 6+, FF 2+ và 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 

Và còn cách nào khác không? Một khi tôi biết nơi cửa sổ là tôi có thể thiết lập một chuỗi sự kiện mà từ từ sẽ gọi window.scrollBy(x,y); cho đến khi nó đạt đến điểm mong muốn của tôi.

Trả lời

196

Phương pháp jQuery (v1.10) sử dụng để tìm thấy điều này là:

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

Đó là:

  • Nó kiểm tra cho window.pageXOffset đầu tiên và sử dụng rằng nếu nó tồn tại.
  • Nếu không, nó sử dụng document.documentElement.scrollLeft.
  • Sau đó, nó trừ document.documentElement.clientLeft nếu nó tồn tại.

Các phép trừ của document.documentElement.clientLeft/Top chỉ dường như được yêu cầu để sửa chữa cho những tình huống mà bạn đã áp dụng một biên giới (không đệm hoặc lề, nhưng biên giới thực tế) để các phần tử gốc, và lúc đó, có thể chỉ trong một số trình duyệt.

+0

Thomas - bạn hoàn toàn đúng. Lỗi của tôi. Đã xóa nhận xét. Tôi đọc lại nhận xét của bạn và nhận ra rằng giải pháp của bạn không phải là giải pháp Jquery chút nào. Xin lỗi. Đã sửa đổi. – Bangkokian

+0

Nó hoàn toàn ngừng hoạt động trên Webkit. kỳ dị. – vsync

+0

Nó hoạt động ngay bây giờ. Tôi nghĩ rằng họ đã có một lỗi rất tạm thời trong webkit và họ đã sửa nó rồi. Tôi đã viết một plugin hoàn toàn bị phá vỡ vì lỗi đó và người dùng đã báo cáo với tôi về điều này. Những điều cơ bản rất đáng sợ có thể phá vỡ – vsync

153

Có thể đơn giản hơn;

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

Điểm Uy Tín: so.dom.js#L492

+11

+1, thực sự tốt hơn được chấp nhận. –

+2

Xem thêm https://developer.mozilla.org/en-US/docs/Web/API/window.scrollY – Chop

+1

Trình duyệt chéo hoàn hảo an toàn! Giải pháp tốt nhất. –

22

Sử dụng javascript tinh khiết bạn có thể sử dụng Window.scrollXWindow.scrollY

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

Ghi chú

Thuộc tính pageXOffset là một bí danh cho tài sản scrollX, và tài sản pageYOffset là một bí danh cho tài sản scrolly:

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

Đây là một bản demo nhanh

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

Trang bạn đã liên kết để nói "Để có khả năng tương thích giữa các trình duyệt, hãy sử dụng window.pageYOffset thay vì window.scrollY . " – JeremyWeir

+0

Tính năng này không hoạt động đối với IE. IE yêu cầu một cái gì đó như '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); 

} 
Các vấn đề liên quan