回答:
$(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;
ただし、これは、垂直の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");
cStyle.overflow === 'scroll'
?
cStyle.overflow == "visible"
要素がの場合、@ BT はスクロールバーを表示できdocument.body
ます。ただし、(hasVScroll && cStyle.overflow == "visible" && element.nodeName == "BODY")である必要があります。さらにcStyle.overflow === 'scroll'
、あなたが指摘するようにそれをチェックする必要があります。
私は以前の答えを試してみましたが、$( "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:<");
}
この質問を復活させましょう;)Googleが簡単な解決策を提供しないのには理由があります。特殊なケースやブラウザの癖が計算に影響を及ぼし、見かけほど簡単ではありません。
残念ながら、これまでに説明したソリューションには問題があります。それらを非難するつもりはありません。これらは優れた出発点であり、より堅牢なアプローチに必要なすべての主要なプロパティに触れます。しかし、他の回答からコードをコピーして貼り付けることはお勧めしません。
$( document ).width()
あり.height()
、jQueryによるドキュメントサイズのバグのある検出の犠牲になります。window.innerWidth
場合、ブラウザーがそれをサポートしていると、コードはモバイルブラウザーでのスクロールバーの検出に失敗します。スクロールバーの幅は通常0です。これらは一時的にオーバーレイとして表示されるだけで、ドキュメント内のスペースを占有しません。 。モバイルでのズームもそのように問題になります(長い話)。html
とbody
要素の両方のオーバーフローをデフォルト以外の値に明示的に設定すると、検出がスローされます(その場合の動作は少し複雑です- この説明を参照してください)。「うまくいく」(咳)解決策を見つけるために、想像以上に多くの時間を費やしました。私が思いついたアルゴリズムは現在、メソッドを公開するプラグインjQuery.isInViewの一部です。.hasScrollbar
。顔をしているソースであなたが望むなら。
ページを完全に制御していて、不明なCSSを処理する必要がないシナリオでは、プラグインを使用するのはやり過ぎかもしれません。ただし、未知の環境で信頼できる結果が必要な場合は、ここで概説されているソリューションでは十分ではないと思います。十分にテストされたプラグインを使用するほうがよいです-私または他の誰か。
window.scrollbars
オブジェクトがありますvisible
。有望に聞こえますが、そうではありません。IE11を含むIEではサポートされていません。そしてそれは単にスクロールバーがあることを告げるだけです-しかし、どのスクロールバーはありません。こちらのテストページをご覧ください。
これは私にとってはうまくいきました:
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)
どうして?たとえば、コンテンツがウィンドウの高さよりも高く、ユーザーが上下にスクロールできるページがあるとします。マウスが接続されていないMacでChromeを使用している場合、ユーザーにはスクロールバーが表示されません。マウスを接続すると、スクロールバーが表示されます。(この動作はオーバーライドできますが、これはデフォルトの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
いる場合、trueですが、そうで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終了タグの後のスクリプトタグに挿入します。
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)
}
overflow
プロパティが行のどこかにbody
設定されている場合、機能しhidden
ません。しかし、体に隠される設定は非常にまれです。