Какой самый быстрый способ проверить, есть ли у элемента полосы прокрутки?
Одна вещь, конечно же, - это проверить, больше ли элемент, чем его область просмотра, что можно легко сделать, проверив эти два значения:
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 значительно помог мне решить проблему. Это указывало мне в правильном направлении.
источник
overflow:hidden
на нем установился? Был бы лишний контент, но он все равно не прокручивается. Проблема далеко не так проста, как может показаться.div.scrollHeight>div.clientHeight && !(div.style.overflow && div.style.overflow == 'hidden')
)?Пытаться:
Для вертикальной полосы прокрутки
Для горизонтальной полосы прокрутки
Я знаю, что это работает как минимум для IE8 и Firefox 3.6+.
источник
overflow:hidden
и его больше нельзя будет прокручивать.overflow:hidden
на нем этот конкретный элемент ... это все еще правильный ответ, на мой взгляд, поскольку он самый простой.Это может показаться (или быть) немного хака, но вы можете протестировать
scrollTop
иscrollLeft
свойство.Если они больше 0, вы знаете, что есть полосы прокрутки. Если они равны 0, установите их в 1 и проверьте их снова, чтобы увидеть, получите ли вы результат 1. Затем установите их обратно в 0.
Пример: http://jsfiddle.net/MxpR6/1/
Я считаю, что для IE есть другое свойство, поэтому я обновлю его через минуту.EDIT: похоже, что IE может поддерживать это свойство. (Я не могу сейчас протестировать IE.)
http://msdn.microsoft.com/en-us/library/ms534618(VS.85).aspx
источник
offsetHeight
иclientHeight
. Последний всегда меньше на размер полосы прокрутки, когда полоса прокрутки присутствует.overflow:scroll
, вы хотите, чтобы он отображался как прокручиваемый, независимо от того, включены ли полосы прокрутки. Конечно, у моего решения могут быть проблемы, если к нему прикреплено событие onscroll.Вот еще одно решение:
Как отметили некоторые люди, простого сравнения offsetHeight и scrollHeight недостаточно, поскольку они различаются по элементам со скрытым переполнением и т. Д., У которых все еще нет полос прокрутки. Итак, здесь я также проверяю, является ли переполнение прокручиваемым или автоматическим для вычисленных стилей для элемента:
источник
overflow*
этоscroll
всегда будет полоса прокрутки, так что я думаю , что вы хотитеvertical: overflowY === 'scroll' || overflowY === 'auto' && node.scrollHeight > node.clientHeight
, и т.д. (т.е. снять скобки такscroll*
противclient*
проверяется только когдаoverflow*
естьauto
). В противном случае это кажется наиболее правильным решением.Я, может быть, немного опоздал на вечеринку, но ...
Я считаю, что вы можете обнаружить полосы прокрутки с помощью e.offsetWidth против e.clientWidth. Ширина смещения включает границы и полосы прокрутки, отступы и ширину. Ширина клиента включает отступы и ширину. Посмотри пожалуйста:
https://developer.mozilla.org/en/DOM/element.offsetWidth (второе изображение) https://developer.mozilla.org/en/DOM/element.clientWidth (второе изображение)
Вам необходимо проверить:
Сделайте то же самое для вертикали (offset / clientHeight).
IE7 сообщает, что clientHeight равен 0 для некоторых элементов (я не проверял почему), поэтому вам всегда нужна первая проверка переполнения.
Надеюсь это поможет!
источник
В случае проверки наличия полос прокрутки возникает несколько проблем, одна из которых заключается в том, что в Mac у вас нет видимой полосы прокрутки, поэтому оба приведенных выше решения не дадут вам точного ответа.
Так как рендеринг браузера происходит не очень часто, вы можете проверить наличие прокрутки с изменением прокрутки, а затем вернуть ее:
источник
Просто возиться здесь, поскольку ни одно из вышеперечисленных решений для меня не сработало (пока). Я нашел некоторый успех при сравнении высоты прокрутки Div с его offsetHeight
Кажется, это дает мне точное сравнение ... пока что. Кто-нибудь знает, законно ли это?
источник
Для IE11 (Internet Explorer 11) мне пришлось изменить логику на:
Это связано с тем, что IE сообщает scrollHeight на 1 больше, чем clientHeight, когда полоса прокрутки отсутствует, но примерно на 9 больше, когда полоса прокрутки присутствует.
источник
Если вам нужно знать, присутствует ли полоса прокрутки для всей веб-страницы и с полной поддержкой браузера, вы можете использовать это:
Это важно использовать
window.innerHeight
вместо,document.body.clientHeight
потому что в некоторых мобильных браузерах clientHeight не получает размер адресной строки, а scrollHeight будет, поэтому вы получите неправильные вычисления.источник
ни один из этих ответов не является правильным. вы должны использовать это:
источник
Добавьте внутрь элемент шириной 100%. Затем установите значение переполнения как скрытое. Если вычисленный стиль элемента (из jQ) изменяется, у родительского элемента была полоса прокрутки.
РЕДАКТИРОВАТЬ: Кажется, вам нужен кроссбраузерный метод, например getComputedStyle . Пытаться:
источник
$(el).css("overflow/overflowX/overflowY")
и посмотрел, установлен ли он на автоматический или прокручиваемый . Но я бы не хотел использовать jQuery.computedStyle = el.currentStyle || document.defaultView.getComputedStyle(el, null);