Làm cách nào tôi có thể nhận được kích thước thanh cuộn của trình duyệt?


164

Làm cách nào để xác định chiều cao của thanh cuộn ngang hoặc chiều rộng của thanh dọc, trong JavaScript?


2
Đây là đoạn trích từ tác giả của plugin JQuery Dimension. github.com/brandonaaron/jquery-getscrollbarference/blob/master/ nam có thể trễ để đưa ra giải pháp này, nhưng nó có vẻ tốt hơn đối với tôi, IMO.
Yanick Rochon

Hãy xem giải pháp này: davidwalsh.name/detect-scrollbar- thong
GibboK

@GibboK - giải pháp đó thất bại - offsetWidth == clientWidth vì vậy nó luôn bằng không. Điều này đã được thử nghiệm trong IE && Chrome.
beauXjames

1
@beauXjames thật lạ khi nó hoạt động với tôi trên FF
GibboK

Câu hỏi này được đặt ra trong tình huống thanh cuộn nằm sai vị trí (một nơi nào đó ở giữa màn hình). Trong tình huống này, bạn có thể không muốn hiển thị thanh cuộn. Trong hầu hết các trường hợp, tôi thấy iScroll là giải pháp trung lập thiết kế hoàn hảo cho tình huống: iscrolljs.com
JoostS

Câu trả lời:


139

Từ Blog của Alexandre Gomes tôi chưa thử. Hãy cho tôi biết nếu nó làm việc cho bạn.

function getScrollBarWidth () {
  var inner = document.createElement('p');
  inner.style.width = "100%";
  inner.style.height = "200px";

  var outer = document.createElement('div');
  outer.style.position = "absolute";
  outer.style.top = "0px";
  outer.style.left = "0px";
  outer.style.visibility = "hidden";
  outer.style.width = "200px";
  outer.style.height = "150px";
  outer.style.overflow = "hidden";
  outer.appendChild (inner);

  document.body.appendChild (outer);
  var w1 = inner.offsetWidth;
  outer.style.overflow = 'scroll';
  var w2 = inner.offsetWidth;
  if (w1 == w2) w2 = outer.clientWidth;

  document.body.removeChild (outer);

  return (w1 - w2);
};

2
Ý tưởng là thiên tài, tôi chắc chắn tạo ra một lớp MooTools dựa trên điều này.
Ryan Florence

Vâng, tôi đã nhận được kết quả google tương tự. :) Tôi đang cố gắng và thông báo cho bạn.
glmxndr

Nếu bạn thay đổi chủ đề của mình thành một với các thanh cuộn có kích thước khác nhau, độ lệch được tính toán thực tế là bao nhiêu?
Matthew Vines

1
xem tại đây để tham khảo chéo: stackoverflow.com/questions
43217139 / từ

6
Trả về các giá trị khác nhau với thu phóng trang khác nhau. Win7, Opera, FF.
Kolyunya

79

Sử dụng jQuery, bạn có thể rút ngắn câu trả lời của Matthew Vines:

function getScrollBarWidth () {
    var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo('body'),
        widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
    $outer.remove();
    return 100 - widthWithScroll;
};

2
Cảm ơn, giải pháp này rất sạch sẽ !!
jherax

4
Giải pháp này có thực sự cảm thấy sạch hơn nếu toàn bộ mã nguồn cho JQuery đã được sao chép trước đó không? Bởi vì đó là khá nhiều những gì giải pháp này đang làm. Câu hỏi này không yêu cầu câu trả lời trong JQuery và hoàn toàn có thể và hiệu quả để thực hiện nhiệm vụ này mà không cần sử dụng thư viện.
DaemonOfTheWest

5
Nếu bạn đã sử dụng JQuery, thì nhận xét của Daemon là không liên quan. Đúng, để thêm JQuery chỉ để làm điều này sẽ là vô nghĩa, nhưng với những người đã sử dụng JQuery trong dự án của họ, đây là một giải pháp 'đơn giản' hơn nhiều so với giải pháp được chấp nhận.
Tyler Dahle

25

Đây chỉ là tập lệnh tôi tìm thấy, đang hoạt động trong trình duyệt webkit ... :)

$.scrollbarWidth = function() {
  var parent, child, width;

  if(width===undefined) {
    parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');
    child=parent.children();
    width=child.innerWidth()-child.height(99).innerWidth();
    parent.remove();
  }

 return width;
};

Phiên bản thu nhỏ:

$.scrollbarWidth=function(){var a,b,c;if(c===undefined){a=$('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');b=a.children();c=b.innerWidth()-b.height(99).innerWidth();a.remove()}return c};

Và bạn phải gọi nó khi tài liệu đã sẵn sàng ... vì vậy

$(function(){ console.log($.scrollbarWidth()); });

Đã thử nghiệm 2012 / 03-28 trên Windows 7 trong FF, Chrome, IE & Safari mới nhất và hoạt động 100%.

nguồn: http://benalman.com/projects/jquery-misc-plugins/#scrollbarference


13
chiều rộng sẽ LUÔN === không xác định trong mã đó. cũng có thể làm nếu (đúng) {...}
sstur

3
Sửa lỗi: widthsẽ luôn luôn === không xác định lần đầu tiên hàm được gọi. Trong các cuộc gọi tiếp theo đến chức năng widthđã được đặt, việc kiểm tra đó chỉ ngăn các phép tính được chạy lại một cách không cần thiết.
MartinAnsty

17
@MartinAnsty Nhưng biến [width] được khai báo bên trong hàm, do đó, nó được tạo lại mỗi khi bạn gọi hàm.
MadSkunk

4
@MartinAnsty, nếu bạn nhìn vào nguồn , nó được khai báo trong bao đóng bên ngoài.
TheCloudlessSky

3
Chỉ để củng cố quan điểm được tạo bởi @sstur và @TheCloudlessSky, đoạn mã trên không giống với mã trong plugin của Ben Alman, và nó sẽ không lưu trữ kết quả vào bộ đệm widthmà chỉ tính toán lại mỗi lần. Nó hoạt động, nhưng nó là không hiệu quả khủng khiếp. Thay vào đó, hãy ủng hộ thế giới và sử dụng phiên bản chính xác trong plugin của Alman.
hashchange

24

Nếu bạn đang tìm kiếm một hoạt động đơn giản, chỉ cần trộn js dom và jquery đơn giản,

var swidth=(window.innerWidth-$(window).width());

trả về kích thước của thanh cuộn trang hiện tại. (nếu nó hiển thị nếu không sẽ trả về 0)


10
Điều này sẽ thất bại trong trường hợp cửa sổ không có thanh cuộn (màn hình lớn hoặc trang / ứng dụng nhỏ)
Farid Nouri Neshat

1
đây là điều hoàn hảo tôi muốn
azerafati

16
window.scrollBarWidth = function() {
  document.body.style.overflow = 'hidden'; 
  var width = document.body.clientWidth;
  document.body.style.overflow = 'scroll'; 
  width -= document.body.clientWidth; 
  if(!width) width = document.body.offsetWidth - document.body.clientWidth;
  document.body.style.overflow = ''; 
  return width; 
} 

Đầu tiên đã thử câu trả lời được chấp nhận nhưng thấy rằng nó không còn hoạt động trong Firefox trên Windows 8. Chuyển sang biến thể này hoạt động rất tốt.
Matijs

1
Mã ngắn hơn, nhưng trình duyệt phải vẽ lại toàn bộ trang, vì vậy nó rất chậm.
Adrian Maire

11

Đối với tôi, cách hữu ích nhất là

(window.innerWidth - document.getElementsByTagName('html')[0].clientWidth)

với JavaScript vani.

nhập mô tả hình ảnh ở đây


Cảm ơn @ stephen-kendy. Một lời chào.
Andrés Moreno

3
Đúng thứ tôi cần. Một gợi ý: Thuật ngữ thứ hai có thể được thay thế bằng document.documentElement.clientWidth. documentElementrõ ràng hơn và rõ ràng thể hiện ý định có được <html>yếu tố.
Jan Miksovsky

9

Tôi tìm thấy một giải pháp đơn giản hoạt động cho các thành phần bên trong trang, thay vì chính trang đó: $('#element')[0].offsetHeight - $('#element')[0].clientHeight

Điều này trả về chiều cao của thanh cuộn trục x.


Tuyệt vời !! Bạn đã tạo ra ngày của tôi :) Nó cũng hoạt động tốt với ".offsetWidth" và ".clientWidth" cho thanh cuộn trục y.
Polosson

1
Thật không may, dường như không đáng tin cậy, ít nhất là về chiều rộng. .clientWidth dường như bao gồm một nửa chiều rộng của thanh cuộn trong cả FireFox và Chrome trong Linux.
Michael Scheper

6

Từ blog của David Walsh :

// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
document.body.appendChild(scrollDiv);

// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
console.info(scrollbarWidth); // Mac:  15

// Delete the DIV 
document.body.removeChild(scrollDiv);
.scrollbar-measure {
	width: 100px;
	height: 100px;
	overflow: scroll;
	position: absolute;
	top: -9999px;
}

Cung cấp cho tôi 17 trên trang web của tôi, 14 ở đây trên Stackoverflow.


4

Nếu bạn đã có một phần tử có thanh cuộn trên đó, hãy sử dụng:

function getScrollbarHeight(el) {
    return el.getBoundingClientRect().height - el.scrollHeight;
};

Nếu không có horzintscrollbar, chức năng sẽ trả về 0


Đây là câu trả lời tốt nhất chưa. KISS quy định tất cả
MarcD

4

Bạn có thể xác định windowthanh cuộn với documentbên dưới bằng jquery + javascript:

var scrollbarWidth = ($(document).width() - window.innerWidth);
console.info("Window Scroll Bar Width=" + scrollbarWidth );

Lưu ý rằng InternalWidth dành cho IE9 +. Nếu không thì giải pháp tuyệt vời.
Pål Thingbø

3

Cách thức Antiscroll.jsthực hiện trong mã của nó là:

function scrollbarSize () {
  var div = $(
      '<div class="antiscroll-inner" style="width:50px;height:50px;overflow-y:scroll;'
    + 'position:absolute;top:-200px;left:-200px;"><div style="height:100px;width:100%"/>'
    + '</div>'
  );

  $('body').append(div);
  var w1 = $(div).innerWidth();
  var w2 = $('div', div).innerWidth();
  $(div).remove();

  return w1 - w2;
};

Mã từ đây: https://github.com/LearnBoost/antiscroll/blob/master/antiscroll.js#L447


3
detectScrollbarWidthHeight: function() {
    var div = document.createElement("div");
    div.style.overflow = "scroll";
    div.style.visibility = "hidden";
    div.style.position = 'absolute';
    div.style.width = '100px';
    div.style.height = '100px';
    document.body.appendChild(div);

    return {
        width: div.offsetWidth - div.clientWidth,
        height: div.offsetHeight - div.clientHeight
    };
},

Đã thử nghiệm trong Chrome, FF, IE8, IE11.


2

Điều này có nên làm mánh khóe không?

function getScrollbarWidth() {
  return (window.innerWidth - document.documentElement.clientWidth);
}

2

Tạo một sản phẩm nào divvà đảm bảo nó có mặt trên tất cả các trang (nghĩa là bằng cách đặt nó vàoheader mẫu).

Cung cấp cho nó kiểu dáng này:

#scrollbar-helper {
    // Hide it beyond the borders of the browser
    position: absolute;
    top: -100%;

    // Make sure the scrollbar is always visible
    overflow: scroll;
}

Sau đó, chỉ cần kiểm tra kích thước của #scrollbar-helperJavascript:

var scrollbarWidth = document.getElementById('scrollbar-helper').offsetWidth;
var scrollbarHeight = document.getElementById('scrollbar-helper').offsetHeight;

Không cần phải tính toán bất cứ điều gì, vì điều này divsẽ luôn luôn có widthheightcủa scrollbar.

Nhược điểm duy nhất là sẽ có một khoảng trống divtrong các mẫu của bạn .. Nhưng mặt khác, các tệp Javascript của bạn sẽ sạch hơn, vì điều này chỉ mất 1 hoặc 2 dòng mã.


1
function getWindowScrollBarHeight() {
    let bodyStyle = window.getComputedStyle(document.body);
    let fullHeight = document.body.scrollHeight;
    let contentsHeight = document.body.getBoundingClientRect().height;
    let marginTop = parseInt(bodyStyle.getPropertyValue('margin-top'), 10);
    let marginBottom = parseInt(bodyStyle.getPropertyValue('margin-bottom'), 10);
    return fullHeight - contentHeight - marginTop - marginBottom;
  }

1
function getScrollBarWidth() {
    return window.innerWidth - document.documentElement.clientWidth;
}

Hầu hết các trình duyệt sử dụng 15px cho chiều rộng thanh cuộn


0

Với jquery (chỉ được thử nghiệm trong firefox):

function getScrollBarHeight() {
    var jTest = $('<div style="display:none;width:50px;overflow: scroll"><div style="width:100px;"><br /><br /></div></div>');
    $('body').append(jTest);
    var h = jTest.innerHeight();
    jTest.css({
        overflow: 'auto',
        width: '200px'
    });
    var h2 = jTest.innerHeight();
    return h - h2;
}

function getScrollBarWidth() {
    var jTest = $('<div style="display:none;height:50px;overflow: scroll"><div style="height:100px;"></div></div>');
    $('body').append(jTest);
    var w = jTest.innerWidth();
    jTest.css({
        overflow: 'auto',
        height: '200px'
    });
    var w2 = jTest.innerWidth();
    return w - w2;
}

Nhưng tôi thực sự thích câu trả lời của @ Steve hơn.


0

Đây là một câu trả lời tuyệt vời: https://stackoverflow.com/a/986977/5914609

Tuy nhiên trong trường hợp của tôi nó không hoạt động. Và tôi đã dành hàng giờ để tìm kiếm giải pháp.
Cuối cùng tôi đã trở lại mã trên và thêm! Quan trọng cho từng phong cách. Va no đa hoạt động.
Tôi không thể thêm ý kiến ​​dưới câu trả lời ban đầu. Vì vậy, đây là sửa chữa:

function getScrollBarWidth () {
  var inner = document.createElement('p');
  inner.style.width = "100% !important";
  inner.style.height = "200px !important";

  var outer = document.createElement('div');
  outer.style.position = "absolute !important";
  outer.style.top = "0px !important";
  outer.style.left = "0px !important";
  outer.style.visibility = "hidden !important";
  outer.style.width = "200px !important";
  outer.style.height = "150px !important";
  outer.style.overflow = "hidden !important";
  outer.appendChild (inner);

  document.body.appendChild (outer);
  var w1 = inner.offsetWidth;
  outer.style.overflow = 'scroll !important';
  var w2 = inner.offsetWidth;
  if (w1 == w2) w2 = outer.clientWidth;

  document.body.removeChild (outer);

  return (w1 - w2);
};

0

Quyết định hack trọn đời này sẽ cho bạn cơ hội tìm thấy chiều rộng cuộn của trình duyệt (vanilla JavaScript). Sử dụng ví dụ này, bạn có thể lấy chiều rộng cuộn trên bất kỳ phần tử nào, kể cả những phần tử không cần phải có cuộn theo quan niệm thiết kế hiện tại của bạn ,:

getComputedScrollYWidth     (el)  {

  let displayCSSValue  ; // CSS value
  let overflowYCSSValue; // CSS value

  // SAVE current original STYLES values
  {
    displayCSSValue   = el.style.display;
    overflowYCSSValue = el.style.overflowY;
  }

  // SET TEMPORALLY styles values
  {
    el.style.display   = 'block';
    el.style.overflowY = 'scroll';
  }

  // SAVE SCROLL WIDTH of the current browser.
  const scrollWidth = el.offsetWidth - el.clientWidth;

  // REPLACE temporally STYLES values by original
  {
    el.style.display   = displayCSSValue;
    el.style.overflowY = overflowYCSSValue;
  }

  return scrollWidth;
}

0

Đây là giải pháp ngắn gọn và dễ đọc hơn dựa trên chênh lệch độ rộng bù:

function getScrollbarWidth(): number {

  // Creating invisible container
  const outer = document.createElement('div');
  outer.style.visibility = 'hidden';
  outer.style.overflow = 'scroll'; // forcing scrollbar to appear
  outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps
  document.body.appendChild(outer);

  // Creating inner element and placing it in the container
  const inner = document.createElement('div');
  outer.appendChild(inner);

  // Calculating difference between container's full width and the child width
  const scrollbarWidth = (outer.offsetWidth - inner.offsetWidth);

  // Removing temporary elements from the DOM
  outer.parentNode.removeChild(outer);

  return scrollbarWidth;

}

Xem JSFiddle .


0

Đã được mã hóa trong thư viện của tôi vì vậy đây là:

var vScrollWidth = window.screen.width - window.document.documentElement.clientWidth;

Tôi nên đề cập rằng jQuery $(window).width()cũng có thể được sử dụng thay thế window.document.documentElement.clientWidth.

Nó không hoạt động nếu bạn mở các công cụ dành cho nhà phát triển trong firefox ở bên phải nhưng nó sẽ khắc phục được nếu cửa sổ dev được mở ở phía dưới!

window.screenđược hỗ trợ quirksmode.org !

Chúc vui vẻ!


0

Nó dường như hoạt động, nhưng có lẽ có một giải pháp đơn giản hơn hoạt động trong tất cả các trình duyệt?

// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
document.body.appendChild(scrollDiv);

// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
console.info(scrollbarWidth); // Mac:  15

// Delete the DIV 
document.body.removeChild(scrollDiv);
.scrollbar-measure {
	width: 100px;
	height: 100px;
	overflow: scroll;
	position: absolute;
	top: -9999px;
}

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.