Div(位置:固定)の幅を100%(親divに関連する)にしようとしています。しかし、いくつかの問題があります...
編集:最初の問題は、継承を使用することで解決されますが、それでも動作しません。問題は、100%/継承幅を取る複数のdivを使用していることだと思います。 jsfiddleアップデートで2番目の問題を見つけることができます: http://jsfiddle.net/4bGqF/7/
フォックスの例
#container {
width: 800px;
}
#fixed {
position: fixed;
width: 100%;
}
そして、html
<div id="container">
<div id="fixed">Sitename</div>
<p>
blaat
</p>
</div>
または、試してみることができます: http://jsfiddle.net/4bGqF/
問題は、固定要素が常にウィンドウ/ドキュメントの幅を使用していることです。誰がこれを修正する方法を知っていますか?
JScrollPaneプラグインを使用しているため、固定要素を修正することはできません。スクロールバーがあるかどうかはコンテンツに依存します。
どうもありがとう!
PS:2つのdivのテキストは互いに重なり合っています。これは単なる例であるため、実際には問題ではありません。
2番目の問題が何であるかはわかりません(編集に基づいています)が、width:inherit
をすべての内部divに適用すると、動作します: http://jsfiddle.net/4bGqF/ 9 /
サポートする必要があるブラウザとwidth:inherit
をサポートしていないブラウザ向けのJavaScriptソリューションを検討することをお勧めします。
多くの人がコメントしているように、レスポンシブデザインでは幅を%
width:inherit
はCSS幅ではなく計算された幅を継承します。つまり、子コンテナはwidth:100%
を継承します
しかし、ほとんどの場合、レスポンシブデザインはmax-width
も設定するので、
#container {
width:100%;
max-width:800px;
}
#contained {
position:fixed;
width:inherit;
max-width:inherit;
}
これは、スティッキーメニューが「スタック」するたびに元の親の幅に制限されるという私の問題を解決するのに非常に満足のいく働きをしました。
ビューポートが最大幅より小さい場合、親と子の両方がwidth:100%
に準拠します。同様に、ビューポートが広い場合、両方ともmax-width:800px
に準拠します。
既に応答しているテーマで動作し、固定された子要素も変更せずに親コンテナを変更できます。エレガントで柔軟です。
ps:IE6/7がinherit
を使用しないことは個人的には重要ではないと思います
このCSSを使用します。
#container {
width: 400px;
border: 1px solid red;
}
#fixed {
position: fixed;
width: inherit;
border: 1px solid green;
}
#fixed要素は親の幅を継承するため、その100%になります。
JQueryで解決することもできます。
var new_width = $('#container').width();
$('#fixed').width(new_width);
これは、レイアウトがレスポンシブであり、inherit
ソリューションが機能していなかったため、とても役に立ちました。
固定位置はビューポートに関連してすべてを定義することになっているので、position:fixed
は常にそれを行います。代わりに、子divでposition:relative
を使用してみてください。 (私はあなたが他の理由で固定位置を必要とするかもしれないことを知っていますが、そうなら-あなたは実際に幅を一致させることはできませんinherit
なしでJSなし
大規模なアプリでの再描画の問題を修正する際に遭遇した小さなハックを次に示します。
親で-webkit-transform: translateZ(0);
を使用します。もちろん、これはChromeに固有です。
http://jsfiddle.net/senica/bCQEa/
-webkit-transform: translateZ(0);
固定位置は少しトリッキーです(実際には不可能です)が、位置:スティッキーはトリックを美しくやっています:
<div class='container'>
<header>This is the header</header>
<section>
... long lorem ipsum
</section>
</div>
body {
text-align: center;
}
.container {
text-align: left;
max-width: 30%;
margin: 0 auto;
}
header {
line-height: 2rem;
outline: 1px solid red;
background: #fff;
padding: 1rem;
position: sticky;
top: 0;
}
これが私が使ったトリックです。
例えば。私はこのHTMLを持っていました:
<div class="head">
<div id="fx">123</div>
</div>
.head内で#fx
を固定するため、回避策は、次のようにposition:absoluteを使用して#fx
のコンテナとして追加のdivを追加することです。
<div class="head">
<div class="area_for_fix">
<div id="fx">123</div>
</div>
</div>
CSSは次のとおりです。
.head {
min-width:960px;
width:960px;
nax-width:1400px;
height:300px;
border: 1px solid #000;
position:relative;
margin:0 auto;
margin-top:50px;
padding:20px;
text-align:right;
height:1500px;
}
.area_for_fix {
position:absolute;
right:0;
width:150px;
height:200px;
background-color:red;
}
#fx {
width:150px;
height:75px;
background-color:#ccc;
position:fixed;
}
重要:#fx
にtop
およびleft
を設定しない場合は、.area_for_fix
にこれらの属性を設定します。
このソリューションは次の基準を満たしています
私の知る限り、この基準はJavascriptなしでは満たせません(残念ながら)。
このソリューションではjQueryを使用していますが、Vanilla JSに簡単に変換することもできます。
function fixedHeader(){
$(this).width($("#wrapper").width());
$("#header-filler").height($("#header-fixed").outerHeight());
}
$(window).resize(function() {
fixedHeader();
});
fixedHeader();
#header-fixed{
position: fixed;
background-color: white;
top: 0;
}
#header-filler{
width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="wrapper">
<div id="header-fixed">
This is a nifty header! works even when resizing the window causing a line break
</div>
<div id="header-filler"></div>
[start fluff]<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
[end fluff]
</div>
これには簡単な解決策があります。
親divには固定位置を使用し、コンテンツには最大幅を使用しました。
固定位置はブラウザウィンドウに対してのみであるため、他のコンテナについて考える必要はありません。
.fixed{
width:100%;
position:fixed;
height:100px;
background: red;
}
.fixed .content{
max-width: 500px;
background:blue;
margin: 0 auto;
text-align: center;
padding: 20px 0;
}
<div class="fixed">
<div class="content">
This is my content
</div>
</div>