スクロールバーがChromeのページの幅に追加されないようにする


125

Chromeで.htmlページを一定の幅に維持しようとすると、小さな問題が発生します。たとえば、ビューポート(右の単語?)の高さからオーバーフローするコンテンツがたくさんあるページ(1)があるため、垂直スクロールバーがあります。そのページ(1)ページ(2)では、同じレイアウト(メニュー、div、...など)を持っていますが、コンテンツが少ないため、垂直スクロールバーはありません。

問題は、ページ(1)ではスクロールバーが要素を少し左に押しているように見える(幅に追加されているか?)一方で、すべてがページ(2)の中央に表示されていることです。

私はまだHTML / CSS / JSの初心者ですが、これはそれほど難しいことではないと確信していますが、解決策を見つけることができませんでした。IE10とFireFox(干渉しないスクロールバー)では意図したとおりに機能しますが、これはChromeでのみ発生しました。

回答:


42

スクロールバーのサイズを取得してから、コンテナにマージンを適用できます。

このようなもの:

var checkScrollBars = function(){
    var b = $('body');
    var normalw = 0;
    var scrollw = 0;
    if(b.prop('scrollHeight')>b.height()){
        normalw = window.innerWidth;
        scrollw = normalw - b.width();
        $('#container').css({marginRight:'-'+scrollw+'px'});
    }
}

h-scrollbarを削除するためのCSS:

body{
    overflow-x:hidden;
}

これを見てみてください:http : //jsfiddle.net/NQAzt/


1
賢い解決策ですが、「if」の状態がわかりません!
Acemad 2013

3
scrollHeightは要素の全体の高さです。あなたが見るものと隠されているもの。例:ウィンドウの高さは500pxで、本文には900pxのコンテンツがあります。500pxが表示されますが、他の400pxは非表示になり、スクロールバーが表示され、この残りのピクセルを示します。したがって、条件は「すべてのコンテンツの高さが視点の高さより高い場合は、本文にマージンを追加する」のようなものです。私の悪い英語で
ごめんなさい

私はそれを手に入れました、明確な説明のおかげで、私はこの解決策を試し、追加の水平スクロールバーを得ましたが、理由はわかりません。
Acemad 2013

2
私は返信でそれを防ぐためにcssの小さな部分を追加しました:)
Lwyrn

4
このソリューションはスクロールを無効にします
avalanche1

117

免責事項オーバーレイ廃止れました
どうしても必要な場合はこれを使用できますが、使用しないでください。

これはWebKitブラウザーのみ機能しますが、私はとても気に入っています。auto他のブラウザと同じように動作します。

.yourContent{
   overflow-y: overlay;
}

これにより、スクロールバーはオーバーレイとしてのみ表示され、要素の幅には影響しません。


IE11では機能しません。IEでオーバーレイ値が機能するための回避策はありますか?
Anvesh Reddy 2018

私の知る限りではありませんが、このIEのスレッドで提案されている他のオプションで
対処

とても必要です!私は30分以上かけて、マークアップで何が間違っているのかを確認しました。どのようなスタイルを使いすぎましたか?これもデフォルトにする必要があります。
kushalvm 2018年

3
しかし非推奨
Akash Yellappa

1
それを反映するようにソリューションを更新しました。
ちょっと

57

あなたがする必要があるすべては追加することです:

html {
    overflow-y: scroll;
}

あなたのCSSファイルでは、スクロールすることはできませんが、これが必要かどうかにかかわらずスクローラーがあります

これは、ビューポートの幅が両方で同じになることを意味します


4
だから、私は両方にスクロールバーを追加する義務がありますか?垂直スクロールバーの幅を単に無視する方法はありませんか?ありがとうございました !
Acemad 2013

私が気づいていることを無視する方法はありませんが、私が言ったことは@ Rockr90で効果を発揮します
Hive7

@ d3c0yこれは真実であり、私は答えでそれを述べましたが、そうするのが最も簡単な方法です。それが過去3年間で変わったかどうかはわかりません
Hive7

@aks。それはブラウザにあなたがスクロールできると思うように強制するので、スクロールバーを有効にし、yをスクロールすることが横スクロールです
Hive7

1
オーバーフロー-y:スクロール。スクロール可能な要素がなくても、すべてのビューポートにスクロールバーを追加/表示します。
Abhilash

35

恐らく

html {
    width: 100vw;
}

まさにあなたが欲しいものです。


1
これは私のユースケースに最適でした:gist.github.com/bmcminn/1ab50da18bde75f39bc88e8292a5a847calc()メインコンテンツビューの幅を決定するために 使用しているため、固定オフスクリーンナビゲーションがデスクトップの左側に表示され、ネイティブを維持できます。モバイルでスクロールします。
bmcminn

3
私は過去36時間スクロールバーをいじっています。いくつかの異なる解決策がありましたが、他の問題が発生しました。これはどちらも機能する最初のソリューションであり、通常のスクロールバーを他の場所で使用できるようにします。ありがとうございました。
コーシャー2018

どういたしまして!ただしhtmlvws の幅をいじるのは少しやりにくいので、注意してください。
神経伝達物質

これはうまくいきました、誰かがこれがどのように機能するか説明できますか?
Zeus

1
ソリューションは悪くありませんが、水平スクロールが追加される可能性があります。
FDisk

18

SafariやChromeなどのWebkitブラウザーは、幅を計算するときに、表示されるページの幅からスクロールバーの幅を差し引きます:100%または100vw。詳細については、DMラザフォードのスクロールとページ幅をご覧ください

overflow-y: overlay代わりに使用してみてください。


9
複数の質問に同じ回答を投稿しないでください。良い答えを1つ投稿してから、投票またはフラグを立てて、他の質問を重複として閉じます。質問が重複していない場合は、質問に対する回答を調整してください。
Paul Roub、2016

これは機能するはずですが、オーバーレイはまだ標準ではなく、すべてのブラウザーでサポートされていません。
Zia Ul Rehman Mughal

簡単なしゃっくり:Safariでは、これによりページのスクロールが停止しました
joshfindit

13

追加できることがわかりました

::-webkit-scrollbar { 
display: none; 
}

私のCSSに直接すると、スクロールバーが見えなくなりますが、それでもスクロールできます(少なくともChrome上で)。ページの邪魔なスクロールバーが不要な場合に適しています。


5
これは、しかし幾分危険なく、クロスブラウザソリューションであるstackoverflow.com/questions/9251354/...
アレックスPyzhianov

4

固定幅のコンテナーの場合、コンテナーを別のdivにラップし、同じ幅を両方のdivに適用することにより、純粋なCSSクロスブラウザーソリューションを実現できます。

#outer {
  overflow-y: auto;
  overflow-x: hidden;
  /*
   * width must be an absolute value otherwise the inner divs width must be set via
   * javascript to the computed width of the parent container
   */
  width: 200px;
}

#inner {
  width: inherit;
}

Codepenの例を表示するには、ここをクリックしてください


3

私の他の答えは現時点ではうまく機能していないようです(しかし、私はそれを操作できるようにしていきます)。

ただし、基本的には、コンテンツの幅を親のスクロール可能なペインの幅よりも少し小さく設定する必要があります。
そのため、スクロールバーが表示されても、コンテンツには影響しません。

このwidth、ブラウザにを介して実行させるのではなく、sをハードコーディングすることで、その目標を達成するためのよりハッキーな方法を示していpaddingます。
これが実行可能な場合、永続的なスクロールバーが必要ない場合は、これが最も簡単なソリューションです。


これは良い解決策ですが、Bootstrapを使用してレスポンシブなWebサイトに取り組んでいます。幅とすべてを自動化することが重要です。
Acemad 2013

(可能性の高い順に)次のいずれかでない限り:(パディングまたはマージンを使用して)他の回答を機能させる方法を誰かが見つけます。メディアクエリを使用して、パディングを選択的に適用できます。またはcss式は、最新のブラウザーに実装され、選択的にパディングを適用します。永続的なスクロールバーまたはJSを使用してスクロールバーを検出するのがよい方法だと思います
Hashbrown

1

編集:この回答は現時点では正しくありません。ここで何をしようとしていたかを確認するには、他の回答を参照してください。私はそれを修正しようとしていますが、あなたが援助を提供することができるなら、コメントでそうしてください、ありがとう!

を使用padding-rightすると、スクロールバーの突然の外観が緩和されます

パディングが移動していないことを示すchrome devtools

ドットからわかるように、テキストは、スクロールバーが存在するかどうかに関係なく、折り返す前にページ内の同じポイントに移動します。
これは、スクロールバーが導入されると、パディングがその後ろに隠れるため、スクロールバーがテキストを押し付けないためです。


3
スクロールバーの幅は、使用しているOSとブラウザによって異なります。20pxおよび40pxを測定できます
Lwyrn

2
まあ、すべての可能な値の最大値を使用するでしょう
Hashbrown 2013

1
一部のデバイス/ OSブラウザーのスクロールには幅さえありません。
Sergey Goliney、2015

0
.modal-dialog {
   position: absolute;
   left: calc(50vw - 300px);
}

ここで、300 pxはダイアログウィンドウの幅の半分です。

これは実際に私のために働いた唯一のものです。


0

Chromeでも同じ問題が発生しました。スクロールバーが常に表示されているときにのみ発生しました。(一般的な設定にあります)私はモーダルを持っていて、モーダルを開いたときに気づきました...

body {
    padding-left: 15px;
}

ボディに追加されます。これを防ぐために私は追加しました

body {
    padding-left: 0px !important;
}

0

最初の回答にコメントを追加できず、久しぶりです...しかし、そのデモには問題があります:

if(b.prop('scrollHeight')>b.height()){
    normalw = window.innerWidth;
    scrollw = normalw - b.width();
    $('#container').css({marginRight:'-'+scrollw+'px'});
}

b.prop( 'scrollHeight')は常にb.height()と等しく、

私はそれがこのようになるはずだと思います:

if(b.prop('scrollHeight')>window.innerHeight) ...

最後に私は方法をお勧めします:

html {
 overflow-y: scroll;
}

:root {
  overflow-y: auto;
  overflow-x: hidden;
}

:root body {
  position: absolute;
}

body {
 width: 100vw;
 overflow: hidden;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.