Відповіді:
$(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:<");
}
});
$(document)замість цього $("body"), це працювало для мене, коли тіло не було (у мене є абсолютний позиціонований контейнер із співвідношенням сторін по ширині / висоті)
спробуйте це:
var hasVScroll = document.body.scrollHeight > document.body.clientHeight;
Це покаже лише вам, якщо вертикальна прокруткаВисота більша за висоту вмісту, який видно. hasVScrollМінлива міститиме істинне або помилкове.
Якщо вам потрібно зробити більш ретельну перевірку, додайте наступне до коду вище:
// 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");
cStyle.overflow === 'scroll'?
cStyle.overflow == "visible" може показувати смуги прокрутки, коли елементом є document.body. Але це має бути (hasVScroll && cStyle.overflow == "видимий" && element.nodeName == "BODY"). Плюс це потрібно перевірити, cStyle.overflow === 'scroll'як ви вказуєте.
Я спробував попередню відповідь, і, схоже, не працює $ ("body"). Висота () не обов'язково представляє всю висоту 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:<");
}
Давайте повернемо це питання з мертвих;) Існує причина, що Google не дає вам простого рішення. Особливі випадки та химерність браузера впливають на обчислення, і це не так банально, як здається.
На жаль, поки що існують проблеми з викладеними тут рішеннями. Я зовсім не хочу їх зневажати - вони є чудовими відправними точками і стосуються всіх ключових властивостей, необхідних для більш надійного підходу. Але я б не рекомендував копіювати та вставляти код з будь-якої з інших відповідей, оскільки
$( document ).width()і .height()стають здобиччю на помилку виявлення розміру документа jQuery .window.innerWidth, якщо підтримує браузер це робить ваш код не виявити смуги прокрутки в мобільних браузерах, де ширина смуги прокрутки зазвичай 0. Вони просто показані тимчасово як оверлей і не займають місця в документі . Збільшення масштабів на мобільних пристроях також стає проблемою в такий спосіб (довга історія).htmlі bodyелемента, що не мають значень за замовчуванням (те, що відбувається потім, мало пов'язане - див. Цей опис ).Я витратив більше часу, ніж я міг би уявити, щоб знайти рішення, яке "просто працює" (кашель). Алгоритм я придумав тепер є частиною плагіна, jQuery.isInView , який виставляє на .hasScrollbarметод . Побачте джерело, якщо бажаєте.
У випадку, коли ви повністю контролюєте сторінку та не маєте справи з невідомими CSS, використання плагіна може бути надмірним - адже ви знаєте, які крайові випадки застосовуються, а які ні. Однак якщо вам потрібні надійні результати у невідомому середовищі, я не думаю, що намічених тут рішень буде недостатньо. Вам краще використовувати перевірений плагін - мій або хтось інший.
window.scrollbarsоб'єкт , який має одну властивість, visible. Звучить багатообіцяюче, але ні. Він не підтримується в IE, включаючи IE11. І це просто говорить вам , що є смуга прокрутки - але не один , який. Дивіться тестову сторінку тут .
Цей працює для мене:
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().
clientHeightтут краще offsetHeight. В іншому випадку ви можете мати товсту облямівку, а повернення немає, коли панель прокрутки є.
var hasScrollbar = window.innerWidth > document.documentElement.clientWidth;
Як не дивно, жодне з цих рішень не повідомляє, чи на сторінці є вертикальна смуга прокрутки.
window.innerWidth - document.body.clientWidthдасть вам ширину смуги прокрутки. Це повинно працювати в будь-якому IE9 + (не перевірено в менших браузерах). (Або строго відповісти на питання,!!(window.innerWidth - document.body.clientWidth)
Чому? Скажімо, у вас є сторінка, де вміст вище, ніж висота вікна, і користувач може прокручувати вгору / вниз. Якщо ви користуєтеся Chrome на Mac без підключеної миші, користувач не побачить смугу прокрутки. Підключіть мишку і з’явиться панель прокрутки. (Зауважте, цю поведінку можна відмінити, але це AFAIK за замовчуванням).
Я знайшов рішення ваніли
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)
}
window.innerWidth > document.documentElement.clientWidthце правда, але window.innerHeight > document.documentElement.clientHeightце не так. Схоже, що в цьому випадку все було навпаки. Я не розробник JS, мені це просто потрібно для тестів Selenium. Я вдячний за підказки.
<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.
Помістіть це в тег сценарію після закриття тегу body.
Я написав оновлену версію відповіді Кіса К. Бейкера:
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)
}
Просто порівняйте ширину кореневого елемента документів (тобто елемента html) з внутрішньою частиною вікна:
if ((window.innerWidth - document.documentElement.clientWidth) >0) console.log('V-scrollbar active')
Якщо вам також потрібно знати ширину смуги прокрутки:
vScrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
Інші рішення не працювали в одному з моїх проектів, і я закінчував перевірку властивості css overflow
function haveScrollbar() {
var style = window.getComputedStyle(document.body);
return style["overflow-y"] != "hidden";
}
але він працюватиме лише у випадку, якщо на панелі прокрутки зникне, змінивши опору, вона не працюватиме, якщо вміст дорівнює або менший, ніж вікно.
overflowвластивість параметраbodyвстановленоhiddenдесь уздовж лінії, воно не працюватиме. Хоча встановлення на тілі є вкрай рідкісним.