Проверьте, имеет ли элемент HTML полосы прокрутки



каков самый быстрый способ проверить, имеет ли элемент полосы прокрутки?



одна вещь, конечно, проверяет, является ли элемент больше, чем его видовой экран, что можно легко сделать, проверив эти два значения:



el.scrollHeight > el.offsetHeight || el.scrollWidth > el.offsetWidth


но это не означает, что он также имеет полосы прокрутки (поэтому он может быть прокручен людьми).



вопрос



Как проверить наличие полос прокрутки в 1 кросс-браузер и 2 только javascript (как в нет jQuery) сторону?



только Javascript, потому что мне нужно как можно меньше накладных расходов, потому что я хотел бы написать очень быстрый фильтр селектора jQuery



// check for specific scrollbars
$(":scrollable(x/y/both)")

// check for ANY scrollbar
$(":scrollable")


Я полагаю, что мне придется проверить overflow настройки стиля, но как это сделать в кросс-браузере?



дополнительное редактирование



не только overflow настройки стиля. Проверка наличия у элемента полосы прокрутки не так тривиальна как кажется. Первая формула, которую я написал выше, отлично работает, когда элемент не имеет границы, но когда это происходит (особенно когда граница имеет значительную ширину),offset размер может быть больше, чем scroll размер, но элемент все еще может быть прокручиваемым. Мы на самом деле должны вычесть границы из offset измерение, чтобы получить фактический прокручиваемый видовой экран элемента и сравнить его с scroll измерение.



для дальнейшего использования



:scrollable jQuery селекторный фильтр включен в мой .scrollintoview() плагин jQuery. Полный код можно найти в моем блоге если кому-то надо. Несмотря на то, что он не предоставлял фактического решения, код Soumya значительно помог мне решить проблему. Он указал мне в правильном направлении.

774   10  

10 ответов:

Я нашла это где-то пару недель назад. Это сработало для меня.

var div = document.getElementById('container_div_id');

var hasHorizontalScrollbar = div.scrollWidth > div.clientWidth;
var hasVerticalScrollbar = div.scrollHeight > div.clientHeight;

/* you'll get true/false */

попробуй:

для вертикальной полосы прокрутки

Эл.scrollHeight > el.clientHeight

для горизонтальной полосы прокрутки

Эл.ширина прокрутки > Эл.значения свойств clientwidth

Я знаю, что это работает для IE8 и Firefox 3.6+, по крайней мере.

Это может показаться (или) немного хакерский, но вы могли бы проверить scrollTop и scrollLeft свойства.

если они больше 0, вы знаете, есть полосы прокрутки. Если они равны 0, то установите их в 1, и проверьте их снова, чтобы увидеть, если вы получите результат 1. Затем установите их обратно в 0.

пример:http://jsfiddle.net/MxpR6/1/

function hasScroll(el, direction) {
    direction = (direction === 'vertical') ? 'scrollTop' : 'scrollLeft';
    var result = !! el[direction];

    if (!result) {
        el[direction] = 1;
        result = !!el[direction];
        el[direction] = 0;
    }
    return result;
}

alert('vertical? ' + hasScroll(document.body, 'vertical'));
alert('horizontal? ' + hasScroll(document.body, 'horizontal'));

я считаю, что есть другое свойство для IE, поэтому я буду обновлять через минуту с этим.

EDIT: похоже, что IE может поддерживать это свойство. (Я не могу проверить IE прямо сейчас.)

http://msdn.microsoft.com/en-us/library/ms534618 (VS. 85). aspx

вот еще одно решение:

Как отметили несколько человек, простого сравнения offsetHeight и scrollHeight недостаточно, поскольку они отличаются по элементам со скрытым переполнением и т. д., у которого все еще нет полос прокрутки. Поэтому здесь я также проверяю, является ли переполнение прокруткой или авто на вычисленных стилях для элемента:

var isScrollable = function(node) {
  var overflowY = window.getComputedStyle(node)['overflow-y'];
  var overflowX = window.getComputedStyle(node)['overflow-x'];
  return {
    vertical: (overflowY === 'scroll' || overflowY === 'auto') && node.scrollHeight > node.clientHeight,
    horizontal: (overflowX === 'scroll' || overflowX === 'auto') && node.scrollWidth > node.clientWidth,
  };
}

Я может немного опоздал на вечеринку, но...

Я считаю, что вы можете обнаружить для полос прокрутки с e.offsetWidth против e.clientWidth. Ширина смещения включает границы и полосы прокрутки, отступы и ширину. Ширина клиента включает прокладку и ширину. Пожалуйста, смотрите:

https://developer.mozilla.org/en/DOM/element.offsetWidth (второе изображение) https://developer.mozilla.org/en/DOM/element.clientWidth (второе изображение)

вам нужно проверьте:

  1. имеет ли элемент overflow значение auto/scroll (включая overflowX/Y) с использованием вычисленного/каскадного/текущего стиля.
  2. если у элемента есть переполнение, установленное в auto / scroll. Установите значения offsetWidth и clientWidth.
  3. если clientWidth меньше, чем offsetWidth - правая граница (найденная снова через вычисленный/каскадный/текущий стиль), то вы знаете, что у вас есть полоса прокрутки.

сделать то же самое для вертикальный (смещение / высота клиента).

IE7 сообщает высоту клиента 0 для некоторых элементов (я не проверял, почему), поэтому вам всегда нужна первая проверка переполнения.

надеюсь, что это помогает!

просто возиться здесь, как ни одно из вышеперечисленных решений не сработало для меня (до сих пор). Я нашел некоторый успех в сравнении высоты прокрутки Div с его смещением

var oh = $('#wrapDiv').get(0).offsetHeight;
var sh = $('#wrapDiv').get(0).scrollHeight;

Кажется, чтобы дать мне точный сравнении...до сих пор. Кто-нибудь знает, законно ли это?

существует несколько проблем в случае проверки наличия полос прокрутки, одна из которых заключается в том, что в mac у вас нет видимой полосы прокрутки, поэтому все вышеперечисленные решения не дадут вам точного ответа.

поэтому, поскольку рендеринг браузера не очень часто, вы можете проверить наличие прокрутки с изменением прокрутки, а затем установить ее обратно:

const hasScrollBar = (element) => {
  const {scrollTop} = element;

  if(scrollTop > 0) {
    return true;
  }

  element.scrollTop += 10;

  if(scrollTop === element.scrollTop) {
    return false;
  }

  // undoing the change
  element.scrollTop = scrollTop;
  return true;
};

на IE11 (Internet Explorer 11) мне пришлось изменить логику на:

// Subtract 3 (a small arbitrary number) to allow for IE reporting a difference of 1 when no scrollbar is present
var hasVerticalScrollbar = div.scrollHeight - 3 > div.clientHeight;

это потому, что IE сообщает scrollHeight как 1 больше, чем clientHeight, когда нет полосы прокрутки, но приблизительно 9 больше, когда полоса прокрутки присутствует

ни один из этих ответов не является правильным. вы должны использовать это :

var div = document.getElementById('container_div_id');

var hasHorizontalScrollbar = (div.offsetWidth > div.clientWidth);
var hasVerticalScrollbar = (div.offsetHeight > div.clientHeight);

добавить 100% широкий элемент внутри него. Затем установить переполнение скрытый. Если вычисленный стиль элемента (из jQ) изменяется, у родителя была полоса прокрутки.

EDIT: кажется, вы хотите кросс-браузер метод, как getComputedStyle. Попробуйте:

function getCSS(_elem, _style)
{
    var computedStyle;
    if (typeof _elem.currentStyle != 'undefined')
        computedStyle = _elem.currentStyle;
    else
        computedStyle = document.defaultView.getComputedStyle(_elem, null);
    return computedStyle[_style];
}

Comments

    Ничего не найдено.