この問題を解決するために私が見つけた最善の方法は、同じサイズの非表示のラッパー内に要素を配置することです。ラッパーは持つ必要がoverflow: hidden
あり、要素はラッパーの端の外側ではなく、ラッパーの端の外側にプッシュする必要があります<body>
。
このソリューションの秘訣は、実際には何も画面から離れないため、ブラウザがビューポートのサイズを大きくして補正しようとしないことです。代わりに、ラッパーは画面の端に置かれ、サイドバーは画面の内側にあります。ラッパーを不透明度マップと考えてください。
また、ラッパーを0にサイズ変更して、ドキュメントの上に非表示にならず、意図しないクリックを取得しないようにする必要があります。
これが実際の解決策の例です。私はjQueryを使用してCSSを操作しましたが、JavaScriptライブラリー(またはなし)でうまくいきます。サイドバーラッパーが縮小されない限り、「クリッカー」divはクリックできないことに注意してください。
$('.sidebar-inner').on('click', function() {
$(this).css('right', -250);
$(this).closest('.sidebar-outer').css('width', 0);
});
$('.clicker').on('click', function() {
alert('CLICKED!');
});
body
{
background-color: red;
font: 12pt sans-serif;
}
.sidebar-outer
{
position: absolute;
top: 0px;
right: 0px;
bottom: 0px;
width: 250px;
-webkit-transition: width 0.2s ease-out;
-moz-transition: width 0.2s ease-out;
transition: width 0.2s ease-out;
overflow: hidden;
z-index: 999;
}
.sidebar-inner
{
position: absolute;
top: 0px;
right: 0px;
bottom: 0px;
width: 250px;
padding: 10px;
box-sizing: border-box;
-webkit-transition: right 0.2s ease-out;
-moz-transition: right 0.2s ease-out;
transition: right 0.2s ease-out;
background-color: cornflowerblue;
cursor: pointer;
}
.clicker
{
position: absolute;
width: 50px;
height: 50px;
top: 10px;
right: 10px;
padding: 10px;
background-color: green;
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="sidebar-outer">
<div class="sidebar-inner">
Click to hide
</div>
</div>
<div class="clicker">Click me!!</div>