通常、positionをfixedにした要素の親要素のoverflowをhiddenにしても、はみ出した部分は隠れません。
HTML
<div class="parent"> <div class="child"></div> </div>
CSS
.parent { position: fixed; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 160px; height: 160px; background: red; overflow: hidden; } .child { position: fixed; top: 50%; left: 50%; width: 160px; height: 160px; background: blue; }
DEMO
なぜならば、positionをfixedにした要素は、ビューポートによって定められた初期の包含ブロックに対して相対配置されるからです。
もしも、positionをabsoluteに変更できるのであれば、はみ出した部分を隠すことができます。
CSS
.parent { position: fixed; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 160px; height: 160px; background: red; overflow: hidden; } .child { position: absolute; top: 50%; left: 50%; width: 160px; height: 160px; background: blue; }
DEMO
これが一番簡単な解決方法ですが、のっぴきならない理由で、どうしても、positionをfixedにしなければならない場合もなくはないです。
そんな時は、親要素のtransform, perspective, filterを明示的にnone以外に指定してあげれば、それが包含ブロックとして機能するようになるため、はみ出した部分が隠れるようになります。
transform: scale(1)を明示的に指定
CSS
.parent { position: fixed; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 160px; height: 160px; background: red; transform: scale(1); overflow: hidden; } .child { position: fixed; top: 50%; left: 50%; width: 160px; height: 160px; background: blue; }
DEMO
perspective: 0を明示的に指定
CSS
.parent { position: fixed; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 160px; height: 160px; background: red; perspective: 0; overflow: hidden; } .child { position: fixed; top: 50%; left: 50%; width: 160px; height: 160px; background: blue; }
DEMO
filter: blur(0)を明示的に指定
CSS
.parent { position: fixed; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 160px; height: 160px; background: red; filter: blur(0); overflow: hidden; } .child { position: fixed; top: 50%; left: 50%; width: 160px; height: 160px; background: blue; }
DEMO
個人的には、transform: scale(1)が手軽なのでおすすめです。