Як я можу отримати розміри панелі прокрутки браузера?


164

Як я можу визначити висоту горизонтальної смуги прокрутки або ширину вертикальної в JavaScript?


2
Ось фрагмент від автора плагіна JQuery Dimension. github.com/brandonaaron/jquery-getscrollbarwidth/blob/master/…, можливо, пізно, щоб дати це рішення, але мені здається кращим, IMO.
Янік Рошон

Подивіться на це рішення: davidwalsh.name/detect-scrollbar-width
GibboK

@GibboK - це рішення не вдається - offsetWidth == clientWidth, тому він завжди дорівнює нулю. Це перевірено в кращих IE && Chrome.
beauXjames

1
@beauXjames дивно, це працює для мене на FF
GibboK

Це запитання виникає в ситуації, коли смуга прокрутки знаходиться в неправильному місці (десь посередині екрана). У цій ситуації ви, мабуть, не хочете показувати смугу прокрутки. У більшості випадків я вважаю, що iScroll є ідеальним нейтральним дизайнерським рішенням для ситуації: iscrolljs.com
JoostS

Відповіді:


139

З блогу Олександра Гомеса я цього не пробував. Дайте мені знати, чи працює це для вас.

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
Ідея геніальна, я, безумовно, роблю клас MooTools на основі цього.
Райан Флоренція

Так, я отримав такий же результат Google. :) Я намагаюся інформувати вас.
glmxndr

якщо ви зміните свою тему на одну з різними розмірами смуг прокрутки, яке відхилення обчислюється на фактичне?
Меттью Вайнс

1
дивіться тут для перехресного посилання: stackoverflow.com/questions/3417139/…
Yanick Rochon

6
Повертає різні значення з різним збільшенням сторінки. Win7, Opera, FF.
Колюня

79

Використовуючи jQuery, ви можете скоротити відповідь 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
Дякую, це рішення дуже чисте !!
jherax

4
Чи справді це рішення почуватиметься чистішим, якби весь вихідний код для JQuery був скопійований перед ним копією? Тому що це майже все, що робить це рішення. Це запитання не вимагало відповіді в JQuery, і цілком можливо та ефективно виконати це завдання без використання бібліотеки.
DaemonOfTheWest

5
Якщо ви вже використовуєте JQuery, то коментар Демона не має значення. Так, додавати JQuery просто для цього було б нісенітницею, але для тих, хто вже використовує JQuery у своєму проекті, це набагато простіше рішення, ніж прийняте.
Тайлер Дале

25

Це єдиний я знайдений сценарій, який працює у веб-браузерах ... :)

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

Мінімізована версія:

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

І вам доведеться зателефонувати, коли документ готовий ... так

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

Тестовано 2012-03-28 на Windows 7 в останніх версіях FF, Chrome, IE і Safari і працює на 100%.

джерело: http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth


13
ширина ЗАВЖДИ буде визначена в цьому коді === може також зробити, якщо (правда) {...}
sstur

3
Виправлення: завждиwidth буде === невизначено під час першого виклику функції. При наступних викликах до функції вже встановлено, що перевірка просто запобігає повторному виконанню обчислень. width
MartinAnsty

17
@MartinAnsty Але змінна [width] оголошена всередині функції, тому вона відтворюється щоразу, коли ви викликаєте функцію.
MadSkunk

4
@MartinAnsty, якщо подивитися на джерело , це оголошено у зовнішньому закритті.
TheCloudlessSky

3
Просто для посилення моменту, зробленого @sstur та @TheCloudlessSky, наведений вище код не такий, як той у плагіні Бена Альмана, і він не кешуватиме результат width, а скоріше перераховуватиме його кожен раз. Це працює, але це жахливо неефективно. Будь ласка, зробіть світові послугу і використовуйте правильну версію в плагіні Alman.
hashchange

24

якщо ви шукаєте просту операцію, просто змішайте звичайний dom js та jquery,

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

повертає розмір панелі прокрутки поточної сторінки. (якщо воно видно або інше поверне 0)


10
Це не вдасться у тому випадку, якщо у вікні не було полос прокрутки (великий монітор або мала сторінка / додаток)
Farid Nouri Neshat

1
це ідеально те, що я хотів
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; 
} 

Спочатку спробував прийняти відповідь, але виявив, що це більше не працює у Firefox у Windows 8. Переключився на цей варіант, який виконує роботу прекрасно.
Матійс

1
Коротший код, але браузер повинен перемальовувати всю сторінку, тому це дуже повільно.
Адріан Мейр

11

Для мене найкориснішим був спосіб

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

з ванільним JavaScript.

введіть тут опис зображення


Дякуємо @ Stephen-kendy. Вітання.
Андрес Морено

3
Тільки те, що мені було потрібно. Одна пропозиція: другий член можна замінити на document.documentElement.clientWidth. documentElementбільш чітко і чисто виражає намір отримати <html>елемент.
Ян Міксовський

9

Я знайшов просте рішення, яке працює для елементів всередині сторінки замість самої сторінки: $('#element')[0].offsetHeight - $('#element')[0].clientHeight

Це повертає висоту смуги прокрутки по осі x.


Чудовий !! Ви зробили мій день :) Він добре працює з ".offsetWidth" та ".clientWidth" для прокрутки по осі y.
Полоссон

1
Не здається цілком надійним, на жаль, принаймні для ширини. .clientWidth начебто містить половину ширини смуги прокрутки як у FireFox, так і в Chrome під Linux.
Майкл Шепер

6

З блогу Девіда Уолша :

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

Дає мені 17 на своєму веб-сайті, 14 тут на Stackoverflow.


4

Якщо у вас вже є елемент із смугами прокрутки, використовуйте:

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

Якщо немає панелі horzintscrollbar, функція перезапуститься 0


Це найкраща відповідь поки. KISS правила всіх
MarcD

4

Ви можете визначити windowсмугу прокрутки documentяк нижче, використовуючи jquery + javascript:

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

Зауважте, що внутрішня ширина призначена для IE9 +. Інакше чудове рішення.
Pål Thingbø

3

У Antiscroll.jsкоді це так:

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

Код звідси: 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
    };
},

Тестували в Chrome, FF, IE8, IE11.


2

Це має зробити трюк, ні?

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

2

Створіть порожнє divі переконайтеся, що він присутній на всіх сторінках (тобто, розмістивши його вheader шаблон).

Надайте йому таку кладку:

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

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

Потім просто перевірте розмір #scrollbar-helperJavascript:

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

Немає необхідності обчислювати що - або, так як це divзавжди матиме widthі heightз scrollbar.

Єдиним недоліком є ​​те, що divу ваших шаблонах буде порожня частина. Але з іншого боку, ваші файли Javascript стануть більш чистими, оскільки для цього потрібно лише 1 або 2 рядки коду.


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

Більшість браузерів використовують ширину смуги прокрутки 15 пікселів


0

За допомогою jquery (тестується лише у 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;
}

Але мені справді подобається відповідь @ Стіва краще.


0

Це чудова відповідь: https://stackoverflow.com/a/986977/5914609

Однак у моєму випадку це не спрацювало. І я витратив години на пошуки рішення.
Нарешті я повернувся до вищевказаного коду та додав! Важливого для кожного стилю. І це спрацювало.
Я не можу додавати коментарі нижче початкової відповіді. Тож ось виправлення:

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

Це життєве рішення дозволить вам знайти ширину прокрутки браузераY (ванільний JavaScript). Використовуючи цей приклад, ви можете отримати ширину scrollY для будь-якого елемента, включаючи ті елементи, які не повинні мати прокрутку відповідно до вашої поточної концепції дизайну:

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

Ось більш стисле та просте для читання рішення на основі різниці в ширині зміщення:

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;

}

Дивіться JSFiddle .


0

В моїй бібліотеці вже зашифровано, ось ось це:

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

Зазначу, що jQuery $(window).width()можна використовувати замість window.document.documentElement.clientWidth.

Це не працює, якщо ви відкриєте інструменти для розробників у firefox праворуч, але це подолає його, якщо вікно розробників відкриється внизу!

window.screenпідтримується quirksmode.org !

Веселіться!


0

Здається, це працює, але, можливо, є більш просте рішення, яке працює у всіх браузерах?

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.