Bagaimana saya bisa mendapatkan ukuran scrollbar browser?

164

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

glmxndr
sumber
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);
};
Matthew Vines
sumber
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;
};
Joshua Bambrick
sumber
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

Jan Šafránek
sumber
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)

Beep.exe
sumber
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; 
} 
Josh Stodola
sumber
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

Andrés Moreno
sumber
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.

Memet Olsen
sumber
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.

Mpen
sumber
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

mons droid
sumber
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 );
Bhuwan Prasad Upadhyay
sumber
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

Hengjie
sumber
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.

Ben
sumber
2

Ini seharusnya melakukan trik, bukan?

function getScrollbarWidth() {
  return (window.innerWidth - document.documentElement.clientWidth);
}
Alexander
sumber
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.

Orang itu
sumber
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;
  }
allenhwkim
sumber
1
function getScrollBarWidth() {
    return window.innerWidth - document.documentElement.clientWidth;
}

Sebagian besar browser menggunakan 15px untuk lebar scrollbar

Bayangan Grimes
sumber
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.

ling
sumber
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);
};
Max Vetriakov
sumber
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;
}
Evgeniy Miroshnichenko
sumber
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 .

Slava Fomin II
sumber
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!

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

Goga
sumber