demo を確認してください
2つのdiv
があり、最初のdiv
はスクロールバーを表示するために使用され、2番目のdiv
はdiv
の内部コンテンツの回転に使用されます。
私の質問は、内部のコンテンツがオーバーフローしていなくてもスクロールバーが表示される理由です。
デモをチェックして、ここで私が間違っていることと、この問題を克服する方法またはこれを達成するための代替方法を教えてください。
[〜#〜] html [〜#〜]
<div style="width: 1096px; height: 434px; overflow: auto; position: relative; border:solid 5px #555555">
<div id="RotationDiv">
<img style="left: 54px; top: 337px; width: 326px; height: 422px; position: absolute;" src="http://fc01.deviantart.net/fs70/f/2012/304/6/b/walfas_custom___vending_machine_2_by_grayfox5000-d5jljhe.png" />
</div>
</div>
[〜#〜] css [〜#〜]
#RotationDiv {
-ms-transform-Origin: 539px 539px;
-webkit-transform-Origin: 539px 539px;
width: 434px;
height: 1096px;
overflow: visible;
-ms-transform: rotate(90deg);
-webkit-transform: rotate(90deg);
background-color:Red;
}
transform
を使用しているため、要素の視覚的なフォーマットモデルを変更します。
[〜#〜] mdn [〜#〜] から:
CSS変換プロパティを使用すると、CSSビジュアルフォーマットモデルの座標空間を変更できます。これを使用すると、設定された値に応じて要素を平行移動、回転、拡大縮小、および傾斜させることができます。
[〜#〜] mdn [〜#〜] からの行:
座標空間を変更することにより、CSS変換は、通常のドキュメントフローを中断することなく、影響を受けるコンテンツの位置と形状を変更します。このガイドでは、変換の使用の概要を説明します。
W3C から:2モジュールの相互作用
このモジュールは、これらのプロパティが適用される要素の視覚的なレンダリングに影響するCSSプロパティのセットを定義します。これらの効果は、[CSS21]の ビジュアルフォーマットモデル に従って要素のサイズと位置が決定された後に適用されます。これらのプロパティの値によっては、 包含ブロック の作成、および/または スタッキングコンテキスト の作成が行われます。
したがって、以下のディメンションを持つ親要素があります。
width: 1096px;
height: 434px;
今、あなたはを使用してその要素を変換しています
-webkit-transform: rotate(90deg);
そのため、ここでは、要素は視覚的に変換されますが、文字通りではありません。つまり、要素を変換しても、静的要素が取るようにドキュメント上のスペースを物理的に占有します。より良い方法であなたを理解させる図を共有します。
したがって、要素をこのように変換しましたが、変換された要素のheight
が原因で垂直方向のスペースが使用されましたが、視覚的には変換されましたが、文字通りではありません...
だから、今、解決策は何ですか?子要素でposition: absolute;
を使用し、とにかく親でposition: relative;
を使用しています。
#RotationDiv {
-ms-transform-Origin: 539px 539px;
-webkit-transform-Origin: 539px 539px;
width: 434px;
height: 1096px;
position: absolute;
overflow: visible;
-ms-transform: rotate(90deg);
-webkit-transform: rotate(90deg);
background-color:Red;
}
テストケースを持って、私は以下のようなスタイルを持っています
.parent .transformed {
height: 200px;
width: 200px;
background: #f00;
-moz-transform: rotate(120deg);
-webkit-transform: rotate(120deg);
transform: rotate(120deg);
-moz-transform-Origin: 300px 300px;
-webkit-transform-Origin: 300px 300px;
transform-Origin: 300px 300px;
}
.parent .static {
background: #00f;
height: 200px;
width: 200px;
}
ここでは、.transformed
のclass
を持つ要素を変換しています。そのため、要素はtransform
を実行し、Originも変更していますが、次のボックスは上に移動しません、変換された要素はフローのリテラルスペースを占有するため、position: absolute;
のようにフローから抜け出すことはできませんが、それは別の概念です。
したがって、position: absolute;
を使用する必要があります。そうしないと、div
が垂直方向にスペースを占有するため、スクロールバーが表示されます...
あなたがコメントしたように、はい、IEはまだabsolute
が配置されている要素が同じ次元にまだ存在するので、スクロールバーを表示します。
まず、要素を変換して親コンテナに設定します。また、overflow
は必要ないので、最初の質問は、overflow
を使用する理由よりも、auto
を使用する必要がある場合です$ var] _? hidden
を使用できます。
親にhidden
ではなく、変換された要素の下にコンテンツを配置することを楽しみにしている場合、同じサイズをoverflow: hidden;
に設定して別の要素内に変換された要素をラップすることをお勧めしますposition: absolute;
プロパティをこのブロックに移動します。 - デモ
それでも幸せではない場合は?では、なぜtransform
要素全体なのでしょうか? transform
関連画像のみ- Demo
これは、まだ垂直プロパティを使用しているためです(hmore009がコメントで述べたように)。
ここを見てみると、それが何をしているのかを見ることができますので、これは本当です。
したがって、コンテナの高さと幅は次のとおりです。
width: 1096px;
height: 434px;
これで正しいことを行い、それらを変換#RotationDiv
に交換しました:
width: 434px;
height: 1096px;
コンテナをoverflow: hidden;
に変更する場合、これはうまく機能します。これは、余分な高さを表示できないことを意味します。
しかし、おそらくオーバーフローの原因がわからないために、何らかの理由でそれをしたくないと思います。それでは、何が起こっているかを詳しく見てみましょう。
#RotationDiv
から高さを削除すると、オーバーフローはなくなります。それは少し有線ではないですか?いいえ、高さは変換と垂直の高さの両方に使用されていました。
#RotationDiv
にコンテナと同じ高さを指定すると、オーバーフローがないことがわかります。
1px
をその高さに追加すると、オーバーフローが発生します。うーん、高さが原因であるに違いありません。コンテナの垂直方向の高さにまだ高さが使用されているように見えます。
コンテナにoverflow: hidden;
を指定するか、それを完全に削除するという1つのオプションを見てきました。これにより、コンテナ内のスクロールが停止します。
または、画像エディタ(無料のオンラインエディタがあります)を入手して、そのような画像を反転することもできます。この方法でそれを行うことで多くの問題を節約できます。
それ以外の場合は、#RotationDiv
のみを削除して、コンテナbackground: red;
を指定するだけで画像を反転できます。
トランスフォームを使用してそれを行う方法:
overflow: auto;
を外し、不要なdiv
を削除し、img
に変換を設定します。
どうやってやりたいかはあなた次第です。多くの方法があります。私が言う最良の方法は、変換を使用せず、画像エディター(Photoshopなど)を使用して画像を反転するだけです。
まあ私もオーバーフローを引き起こす問題を抱えていた
私の問題は水平スケーリングが水平オーバーフローを引き起こしたことでしたので、私は水平スケーリングを垂直スケーリングに変更するだけで問題を解決しました(または問題tbhをバイパスしました)
このバグに対する私の理解は、共通の解決策がないため、回避することです。