Bagaimana saya bisa mendapatkan ukuran scrollbar browser?


164

Bagaimana saya bisa menentukan ketinggian scrollbar horizontal, atau lebar yang vertikal, di JavaScript?


2
Berikut ini cuplikan dari penulis plugin JQuery Dimension. github.com/brandonaaron/jquery-getscrollbarwidth/blob/master/... mungkin terlambat untuk memberikan solusi ini, tetapi tampaknya yang lebih baik bagi saya, IMO.
Yanick Rochon

Silahkan lihat pada solusi ini: davidwalsh.name/detect-scrollbar-width
GibboK

@GibboK - solusi itu gagal - offsetWidth == clientWidth jadi selalu nol. Ini diuji di ujung IE && Chrome.
beauXjames

1
@beauXjames aneh ini berfungsi untuk saya di FF
GibboK

Pertanyaan ini muncul dalam situasi di mana scrollbar berada di lokasi yang salah (di suatu tempat di tengah layar). Dalam situasi ini Anda mungkin tidak ingin menampilkan bilah gulir. Dalam kebanyakan kasus, saya menemukan iScroll sebagai solusi netral-desain yang sempurna untuk situasi ini: iscrolljs.com
JoostS

Jawaban:


139

Dari Alexandre Gomes Blog saya belum mencobanya. Beri tahu saya jika itu berhasil untuk Anda.

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
Idenya jenius, saya pasti membuat kelas MooTools berdasarkan ini.
Ryan Florence

Ya saya mendapat hasil google yang sama. :) Saya mencoba dan terus memberi informasi kepada Anda.
glmxndr

jika Anda mengubah tema menjadi tema dengan bilah gulir dengan ukuran berbeda, apa penyimpangannya dalam perhitungan menjadi aktual?
Matthew Vines

1
lihat di sini untuk referensi silang: stackoverflow.com/questions/3417139/…
Yanick Rochon

6
Mengembalikan nilai yang berbeda dengan zoom halaman yang berbeda. Win7, Opera, FF.
Kolyunya

79

Menggunakan jQuery, Anda dapat mempersingkat jawaban Matthew Vines ke:

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
Terima kasih, solusi ini sangat bersih !!
jherax

4
Apakah solusi ini benar-benar terasa lebih bersih jika seluruh kode sumber untuk JQuery disalin sebelumnya? Karena itulah yang dilakukan solusi ini. Pertanyaan ini tidak meminta jawaban di JQuery, dan sangat mungkin dan efisien untuk melakukan tugas ini tanpa menggunakan perpustakaan.
DaemonOfTheWest

5
Jika Anda sudah menggunakan JQuery, maka komentar Daemon tidak relevan. Ya, menambahkan JQuery hanya untuk melakukan ini akan menjadi omong kosong, tetapi bagi mereka yang sudah menggunakan JQuery dalam proyek mereka, ini adalah solusi yang jauh lebih sederhana daripada yang diterima.
Tyler Dahle

25

Ini hanya skrip yang saya temukan, yang berfungsi di browser 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;
};

Versi yang diperkecil:

$.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};

Dan Anda harus menyebutnya ketika dokumen siap ... jadi

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

Diuji 2012-03-28 pada Windows 7 dalam FF, Chrome, IE & Safari terbaru dan 100% berfungsi.

sumber: http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth


13
lebar akan SELALU === tidak ditentukan dalam kode itu. mungkin juga dilakukan jika (benar) {...}
sstur

3
Koreksi: widthakan selalu === tidak terdefinisi saat fungsi pertama kali dipanggil. Pada panggilan berikutnya ke fungsi widthsudah diatur, pemeriksaan itu hanya mencegah perhitungan berjalan lagi dengan sia-sia.
MartinAnsty

17
@ MartinAnsty Tetapi variabel [lebar] dideklarasikan di dalam fungsi, oleh karena itu dibuat ulang setiap kali Anda memanggil fungsi.
MadSkunk

4
@ MartinAnsty, jika Anda melihat sumbernya , itu dinyatakan di penutupan luar.
TheCloudlessSky

3
Hanya untuk memperkuat poin yang dibuat oleh @sstur dan @TheCloudlessSky, kode di atas tidak sama dengan yang ada di plugin Ben Alman, dan itu tidak akan menyimpan hasilnya width, melainkan menghitung ulang setiap kali. Ini bekerja, tetapi sangat tidak efisien. Tolong bantu dunia dan gunakan versi yang benar di plugin Alman's.
hashchange

24

jika Anda mencari operasi sederhana, cukup campur dom js dan jquery,

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

mengembalikan ukuran bilah gulir halaman saat ini. (jika terlihat atau yang lain akan mengembalikan 0)


10
Ini akan gagal jika jendela tidak memiliki scrollbar (monitor besar, atau halaman kecil / aplikasi)
Farid Nouri Neshat

1
inilah yang saya inginkan
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; 
} 

Pertama mencoba jawaban yang diterima tetapi menemukan bahwa itu tidak lagi berfungsi di Firefox pada Windows 8. Beralih ke varian ini yang melakukan pekerjaan dengan indah.
Matijs

1
Kode lebih pendek, tetapi browser harus menggambar ulang seluruh halaman, sehingga sangat lambat.
Adrian Maire

11

Bagi saya, cara yang paling bermanfaat adalah

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

dengan JavaScript vanilla.

masukkan deskripsi gambar di sini


Terima kasih @ stephen-kendy. Salam.
Andrés Moreno

3
Apa yang saya butuhkan. Satu saran: Istilah kedua dapat diganti dengan document.documentElement.clientWidth. documentElementlebih jelas dan bersih mengekspresikan niat mendapatkan <html>elemen.
Jan Miksovsky

9

Saya menemukan solusi sederhana yang berfungsi untuk elemen di dalam halaman, bukan halaman itu sendiri: $('#element')[0].offsetHeight - $('#element')[0].clientHeight

Ini mengembalikan ketinggian scrollbar sumbu x.


Bagus !! Anda membuat hari saya :) Ini bekerja dengan baik dengan ".offsetWidth" dan ".clientWidth" untuk scrollbar y-axis.
Polosson

1
Tampaknya tidak sepenuhnya dapat diandalkan, sayangnya, setidaknya untuk lebar. .clientWidth tampaknya mencakup setengah lebar scrollbar di FireFox dan Chrome di Linux.
Michael Scheper

6

Dari blog 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;
}

Memberi saya 17 di situs web saya, 14 di sini di Stackoverflow.


4

Jika Anda sudah memiliki elemen dengan scrollbar, gunakan:

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

Jika tidak ada horzintscrollbar, fungsi ini akan mengembalikan 0


Ini adalah jawaban terbaik. KISS aturan semua
MarcD

4

Anda dapat menentukan windowscroll bar dengan documentseperti di bawah ini menggunakan jquery + javascript:

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

Perhatikan bahwa innerWidth untuk IE9 +. Sebaliknya solusi hebat.
Pål Thingbø

3

Cara Antiscroll.jsmelakukannya dalam kode itu adalah:

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;
};

Kode berasal dari sini: 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
    };
},

Diuji di Chrome, FF, IE8, IE11.


2

Ini seharusnya melakukan trik, bukan?

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

2

Buat yang kosong divdan pastikan itu ada di semua halaman (yaitu dengan meletakkannya di headertemplat).

Berikan gaya ini:

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

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

Kemudian cukup periksa ukurannya #scrollbar-helperdengan Javascript:

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

Tidak perlu menghitung apa pun, karena ini divakan selalu memiliki widthdan heightdari scrollbar.

Satu-satunya downside adalah bahwa akan ada kosong divdi template Anda .. Tetapi di sisi lain, file Javascript Anda akan lebih bersih, karena ini hanya membutuhkan 1 atau 2 baris kode.


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;
}

Sebagian besar browser menggunakan 15px untuk lebar scrollbar


0

Dengan jquery (hanya diuji di 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;
}

Tapi saya sebenarnya lebih suka jawaban Steve.


0

Ini adalah jawaban yang bagus: https://stackoverflow.com/a/986977/5914609

Namun dalam kasus saya itu tidak berhasil. Dan saya menghabiskan berjam-jam mencari solusinya.
Akhirnya saya telah kembali ke kode di atas dan menambahkan! Penting untuk setiap gaya. Dan itu berhasil.
Saya tidak bisa menambahkan komentar di bawah jawaban asli. Jadi di sini adalah perbaikannya:

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

Keputusan seumur hidup ini akan memberi Anda kesempatan untuk menemukan lebar peramban scrollY (JavaScript vanilla). Dengan menggunakan contoh ini Anda bisa mendapatkan lebar gulir pada elemen apa pun termasuk elemen -elemen yang tidak harus memiliki gulir sesuai dengan konsepsi desain Anda saat ini ,:

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

Inilah solusi yang lebih ringkas dan mudah dibaca berdasarkan perbedaan lebar offset:

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;

}

Lihat JSFiddle .


0

Sudah dikodekan di perpustakaan saya jadi ini dia:

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

Saya harus menyebutkan bahwa jQuery $(window).width()juga bisa digunakan window.document.documentElement.clientWidth.

Tidak berfungsi jika Anda membuka alat pengembang di firefox di sebelah kanan tetapi mengatasinya jika jendela devs dibuka di bagian bawah!

window.screendidukung quirksmode.org !

Selamat bersenang-senang!


0

Tampaknya berfungsi, tetapi mungkin ada solusi sederhana yang berfungsi di semua browser?

// 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;
}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.