Определить, имеет ли страница вертикальную полосу прокрутки?
Я просто хочу, чтобы некоторые простые JQ/JS проверяли, имеет ли текущая страница/окно (а не конкретный элемент) вертикальную полосу прокрутки.
Googling дает мне вещи, которые кажутся слишком сложными для этой основной функции.
Как это можно сделать?
Ответы
Ответ 1
$(document).ready(function() {
// Check if body height is higher than window height :)
if ($("body").height() > $(window).height()) {
alert("Vertical Scrollbar! D:");
}
// Check if body width is higher than window width :)
if ($("body").width() > $(window).width()) {
alert("Horizontal Scrollbar! D:<");
}
});
Ответ 2
попробуйте следующее:
var hasVScroll = document.body.scrollHeight > document.body.clientHeight;
Это только скажет вам, если вертикальный scrollHeight больше высоты отображаемого контента. Переменная hasVScroll
будет содержать true или false.
Если вам нужно выполнить более тщательную проверку, добавьте следующее в код выше:
// Get the computed style of the body element
var cStyle = document.body.currentStyle||window.getComputedStyle(document.body, "");
// Check the overflow and overflowY properties for "auto" and "visible" values
hasVScroll = cStyle.overflow == "visible"
|| cStyle.overflowY == "visible"
|| (hasVScroll && cStyle.overflow == "auto")
|| (hasVScroll && cStyle.overflowY == "auto");
Ответ 3
Я пробовал предыдущий ответ и, похоже, не работал с $( "body" ). height() не обязательно представляет всю высоту html.
Я исправил решение следующим образом:
// Check if body height is higher than window height :)
if ($(document).height() > $(window).height()) {
alert("Vertical Scrollbar! D:");
}
// Check if body width is higher than window width :)
if ($(document).width() > $(window).width()) {
alert("Horizontal Scrollbar! D:<");
}
Ответ 4
Верните этот вопрос из мертвых;) Существует причина, по которой Google не дает вам простого решения. Особые случаи и причуды браузера влияют на вычисления, и это не так тривиально, как кажется.
К сожалению, есть проблемы с решениями, изложенными здесь до сих пор. Я вовсе не хочу унижать их - они являются отличными отправными точками и касаются всех ключевых свойств, необходимых для более надежного подхода. Но я бы не рекомендовал копировать и вставлять код из любого другого ответа, потому что
- они не фиксируют эффект позиционированного контента таким образом, который является надежным кросс-браузером. Ответы, которые основаны на размере тела, пропустят это полностью (тело не является родителем смещения такого содержимого, если оно не расположено непосредственно). И те ответы, которые проверяют
$( document ).width()
и .height()
, становятся жертвами jQuery ошибка определения размера документа.
- Опираясь на
window.innerWidth
, если браузер поддерживает его, ваш код не сможет обнаружить полосы прокрутки в мобильных браузерах, где ширина полосы прокрутки в целом равна 0. Они просто отображаются временно как оверлей и не занять место в документе. Масштабирование на мобильных устройствах также становится проблемой таким образом (длинная история).
- Обнаружение может быть отброшено, когда люди явно устанавливают переполнение элемента
html
и body
на значения, отличные от значений по умолчанию (что происходит тогда немного, см. это описание).
- В большинстве ответов заполнение, границы или поля тела не обнаруживаются и искажают результаты.
Я потратил больше времени, чем мог бы себе представить, найдя решение, которое "просто работает" (кашель). Алгоритм, который я придумал, теперь является частью плагина, jQuery.isInView, который предоставляет a .hasScrollbar
метод. Посмотрите в источнике, если хотите.
В сценарии, когда вы полностью контролируете страницу и не имеете дело с неизвестным CSS, использование плагина может быть чрезмерным - в конце концов, вы знаете, какие крайние случаи применяются, а какие нет. Однако, если вам нужны надежные результаты в неизвестной среде, я не думаю, что описанных здесь решений будет достаточно. Вам лучше использовать хорошо протестированный плагин-шахту или любой другой.
Ответ 5
Это работает для меня:
function hasVerticalScroll(node){
if(node == undefined){
if(window.innerHeight){
return document.body.offsetHeight> window.innerHeight;
}
else {
return document.documentElement.scrollHeight >
document.documentElement.offsetHeight ||
document.body.scrollHeight>document.body.offsetHeight;
}
}
else {
return node.scrollHeight> node.offsetHeight;
}
}
Для тела просто используйте hasVerticalScroll()
.
Ответ 6
var hasScrollbar = window.innerWidth > document.documentElement.clientWidth;
Ответ 7
Как ни странно, ни одно из этих решений не говорит вам, есть ли страница с вертикальной полосой прокрутки.
window.innerWidth - document.body.clientWidth
даст вам ширину полосы прокрутки. Это должно работать во всех IE9 + (не тестировалось в меньших браузерах). (Или строго ответить на вопрос, !!(window.innerWidth - document.body.clientWidth)
Почему? Скажем, у вас есть страница, где содержание выше высоты окна, и пользователь может прокручивать вверх/вниз. Если вы используете Chrome на Mac без подключения мыши, пользователь не увидит полосу прокрутки. Подключите мышь и появится полоса прокрутки. (Обратите внимание, что это поведение можно переопределить, но это AFAIK по умолчанию).
Ответ 8
Я нашел решение Ванилы
var hasScrollbar = function() {
// The Modern solution
if (typeof window.innerWidth === 'number')
return window.innerWidth > document.documentElement.clientWidth
// rootElem for quirksmode
var rootElem = document.documentElement || document.body
// Check overflow style property on body for fauxscrollbars
var overflowStyle
if (typeof rootElem.currentStyle !== 'undefined')
overflowStyle = rootElem.currentStyle.overflow
overflowStyle = overflowStyle || window.getComputedStyle(rootElem, '').overflow
// Also need to check the Y axis overflow
var overflowYStyle
if (typeof rootElem.currentStyle !== 'undefined')
overflowYStyle = rootElem.currentStyle.overflowY
overflowYStyle = overflowYStyle || window.getComputedStyle(rootElem, '').overflowY
var contentOverflows = rootElem.scrollHeight > rootElem.clientHeight
var overflowShown = /^(visible|auto)$/.test(overflowStyle) || /^(visible|auto)$/.test(overflowYStyle)
var alwaysShowScroll = overflowStyle === 'scroll' || overflowYStyle === 'scroll'
return (contentOverflows && overflowShown) || (alwaysShowScroll)
}
Ответ 9
<script>
var scrollHeight = document.body.scrollHeight;
var clientHeight = document.documentElement.clientHeight;
var hasVerticalScrollbar = scrollHeight > clientHeight;
alert(scrollHeight + " and " + clientHeight); //for checking / debugging.
alert("hasVerticalScrollbar is " + hasVerticalScrollbar + "."); //for checking / debugging.
</script>
Это скажет вам, есть ли полоса прокрутки или нет. Я включил некоторую информацию, которая может помочь в отладке, которая будет отображаться как предупреждение JavaScript.
Поместите это в тег script после закрытия тега body.
Ответ 10
Я написал обновленную версию ответа Kees C. Bakker:
const hasVerticalScroll = (node) => {
if (!node) {
if (window.innerHeight) {
return document.body.offsetHeight > window.innerHeight
}
return (document.documentElement.scrollHeight > document.documentElement.offsetHeight)
|| (document.body.scrollHeight > document.body.offsetHeight)
}
return node.scrollHeight > node.offsetHeight
}
if (hasVerticalScroll(document.querySelector('body'))) {
this.props.handleDisableDownScrollerButton()
}
Функция возвращает true или false в зависимости от того, имеет ли страница вертикальную полосу прокрутки или нет.
Например:
const hasVScroll = hasVerticalScroll(document.querySelector('body'))
if (hasVScroll) {
console.log('HAS SCROLL', hasVScroll)
}
Ответ 11
Другие решения не работали в одном из моих проектов, и я заканчиваю проверку переполнения свойства css
function haveScrollbar() {
var style = window.getComputedStyle(document.body);
return style["overflow-y"] != "hidden";
}
но он будет работать только в том случае, если полоса прокрутки исчезнет, изменив опору, она не будет работать, если содержимое будет равно или меньше, чем окно.
Ответ 12
я использую
public windowHasScroll()
{
return document.body.clientHeight > document.documentElement.clientHeight;
}
Ответ 13
Просто сравните ширину корневого элемента документов (т.е. элемента html) с внутренней частью окна:
if ((window.innerWidth - document.documentElement.clientWidth) >0) console.log('V-scrollbar active')
Если вам также нужно знать ширину полосы прокрутки:
vScrollbarWidth = window.innerWidth - document.documentElement.clientWidth;