タイトルで述べたように、vw
cssだけでスクロールバーなしで計算することは可能ですか?
たとえば、私の画面の幅は1920px
。です。vw
戻ります1920px
、素晴らしい。しかし、私の実際の体幅はのようなものにすぎません1903px
。
1903px
cssのみで値を取得する方法はありますか(の直接の子だけでなくbody
)、またはこれにはJavaScriptが絶対に必要ですか?
タイトルで述べたように、vw
cssだけでスクロールバーなしで計算することは可能ですか?
たとえば、私の画面の幅は1920px
。です。vw
戻ります1920px
、素晴らしい。しかし、私の実際の体幅はのようなものにすぎません1903px
。
1903px
cssのみで値を取得する方法はありますか(の直接の子だけでなくbody
)、またはこれにはJavaScriptが絶対に必要ですか?
width: calc(100vw - scrollbarWidth)
ここで、「scrollbarWidth」は15pxのような固定値です
回答:
これを行う1つの方法は、calcを使用することです。私の知る限り、100%はスクロールバーを含む幅です。だからあなたがそうするなら:
body {
width: calc(100vw - (100vw - 100%));
}
100vwからスクロールバーの幅を引いたものが得られます。
たとえば、ビューポートの50%(スコルバー幅の50%を引いたもの)の正方形が必要な場合は、高さでもこれを行うことができます。
.box {
width: calc(50vw - ((100vw - 100%)/2))
height: 0
padding-bottom: calc(50vw - ((100vw - 100%)/2))
}
body
あるか、と同じ幅の要素である場合にのみ機能しますbody
(そうでない場合100%
は、間違った要素の幅を参照します)。その場合、単にパーセンテージを使用できます。私が何かを逃していない限り?
100vw - (100vw - 100%) = 100vw - 100vw + 100% = 100%
何かが恋しいですか?
これを行うには、ドキュメントが読み込まれたら、JavaScriptの行を追加してCSS変数を定義します。
document.documentElement.style.setProperty('--scrollbar-width', (window.innerWidth - document.documentElement.clientWidth) + "px");
次に、CSSvar(--scrollbar-width)
で、さまざまな幅のスクロールバーの有無にかかわらず、さまざまなブラウザに必要な調整を行うために使用できます。必要な場合は交換し、水平スクロールバーのために類似した何かを行うことができますinnerWidth
とinnerHeight
してclientWidth
とclientHeight
。
vw
、仕様によれば、スクロールバーの存在を認識していません。したがって、それらを考慮に入れることはできません。
overflow-y: scroll
vsに設定しても、overflow-y: auto
vwユニットの計算値は変わらないようです。具体的には、サイトで3.82vwに設定したものがあり、コンピューターの幅は1920pxです。オーバーフロー自動で、3.82vw = 73.344px、次にオーバーフロースクロールを試してみました。これも73.344pxを出力しますが、正しければ実際には72.6946pxを出力するはずです
Webkitブラウザーはスクロールバーを除外し、その他のブラウザーは返された幅にスクロールバーを含めます。もちろん、これは問題につながる可能性があります。たとえば、高さを動的に追加するajaxを使用して動的にコンテンツを生成した場合、ページの視覚化中にSafariがレイアウトから別のレイアウトに切り替わる可能性があります...わかりました、それは頻繁には発生しませんが、に注意してください。モバイルでは、問題が少なく、スクロールバーの原因は通常表示されません。
そうは言っても、問題がすべてのブラウザでスクロールバーなしでビューポートの幅を正確に計算することである場合、私が知る限り、良い方法は次のとおりです。
width = $('body').innerWidth();
以前に設定したこと:
body {
margin:0;
}
に設定されている場合vw
、ユニットはoverflow-y
スクロールバーを考慮しません。overflow-y
auto
に変更するoverflow-y: scroll;
と、vw
単位はスクロールバー付きのビューポートになります。次に、calc()を使用して、vw値からスクロールバーのサイズを減算できます。スクロールバーの幅を定義することもできるので、ブラウザに依存しません。
考慮すべき唯一の欠点。コンテンツが画面に収まる場合は、とにかくスクロールバーが表示されます。考えられる解決策は、javascriptでからに変更するauto
ことscroll
です。
overflow-x
ですか?
overflow-y: scroll;
コードを「calc」で混乱させることなく機能することがわかった唯一の方法は、コンテナ要素のサイズを100vwにすることです。オーバーフローのコンテナの周りにラッパーを追加します-x; これにより、スクロールバーがコンテンツの上にあるかのように、コンテナが全角になります。
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html{ overflow-y: scroll; }
html, body{ padding:0; margin: 0;}
#wrapper{ overflow-x: hidden; }
.row{ width: 100vw; }
.row:after{ clear: both; content: ''; display: block; overflow: hidden; }
.row-left{ background: blue; float: left; height: 40vh; width: 50vw; }
.row-right{ background: red; float: right; height: 40vh; width: 50vw; }
</style>
</head>
<body>
<div id="wrapper">
<div class="row">
<div class="row-left"></div>
<div class="row-right"></div>
</div>
</div>
</body>
</html>
ケースがスライダーに似ている場合:多くの回答に投稿されているように、幅100%はスクロールバーを考慮しませんが、100vwは考慮します。ウィンドウの幅を取る必要があり、すでにウィンドウ幅が100%のコンテナ内にネストされている(または自然なブロック幅がそのような)要素が多数ある場合は、次を使用できます。
100vw =スクロールバーのある画面の幅100%=スクロールバーのない画面の幅
画面幅を測定するときは、常にcalc(100%-50px)を使用することをお勧めします。スクロールバーが直接表示されるWindowsブラウザーでも、macOSブラウザーと比較すると画面幅の戻り方が異なります。
私の場合、div 100wh-230pxを設定する必要があり、その余分なスクロール幅で同じ問題に直面していました:
width: calc(100vw - (100vw - 100%) - 230px);
これは私の解決策ではありませんが、全角ではなく相対要素で絶対値を使用してドロップダウン全角メニューを作成するのに役立ちます。
:rootのcss varでスクロールして、それを使用する必要があります。
:root{
--scrollbar-width: calc(100vw - 100%);
}
div { margin-right: var(--scrollbar-width); }