90度回転したい場合、テキスト以外の要素でもこれは可能ですが、CSSの多くの興味深いものと同様に、少しずるがしこく必要があります。私のソリューションは、CSS 2仕様に従って技術的に未定義の動作も呼び出します。そのため、Chrome、Firefox、Safari、およびEdgeで動作することをテストおよび確認しましたが、将来的には機能しないとは約束できません。ブラウザのリリース。
短い答え
このようなHTMLが与えられた場合、回転させたい場所.element-to-rotate
...
<div id="container">
<something class="element-to-rotate">bla bla bla</something>
</div>
... 回転する要素の周りに2つのラッパー要素を導入します。
<div id="container">
<div class="rotation-wrapper-outer">
<div class="rotation-wrapper-inner">
<something class="element-to-rotate">bla bla bla</something>
</div>
</div>
</div>
...次に、次のCSSを使用して反時計回りに回転します(またはtransform
時計回りの回転に変更する方法についてはコメントアウトされています)。
.rotation-wrapper-outer {
display: table;
}
.rotation-wrapper-inner {
padding: 50% 0;
height: 0;
}
.element-to-rotate {
display: block;
transform-origin: top left;
/* Note: for a CLOCKWISE rotation, use the commented-out
transform instead of this one. */
transform: rotate(-90deg) translate(-100%);
/* transform: rotate(90deg) translate(0, -100%); */
margin-top: -50%;
/* Not vital, but possibly a good idea if the element you're rotating contains
text and you want a single long vertical line of text and the pre-rotation
width of your element is small enough that the text wraps: */
white-space: nowrap;
}
スタックスニペットのデモ
p {
/* Tweak the visuals of the paragraphs for easier visualiation: */
background: pink;
margin: 1px 0;
border: 1px solid black;
}
.rotation-wrapper-outer {
display: table;
}
.rotation-wrapper-inner {
padding: 50% 0;
height: 0;
}
.element-to-rotate {
display: block;
transform-origin: top left;
/* Note: for a CLOCKWISE rotation, use the commented-out
transform instead of this one. */
transform: rotate(-90deg) translate(-100%);
/* transform: rotate(90deg) translate(0, -100%); */
margin-top: -50%;
/* Not vital, but possibly a good idea if the element you're rotating contains
text and you want a single long vertical line of text and the pre-rotation
width of your element is small enough that the text wraps: */
white-space: nowrap;
}
<div id="container">
<p>Some text</p>
<p>More text</p>
<div class="rotation-wrapper-outer">
<div class="rotation-wrapper-inner">
<p class="element-to-rotate">Some rotated text</p>
</div>
</div>
<p>Even more text</p>
<img src="https://i.stack.imgur.com/ih8Fj.png">
<div class="rotation-wrapper-outer">
<div class="rotation-wrapper-inner">
<img class="element-to-rotate" src="https://i.stack.imgur.com/ih8Fj.png">
</div>
</div>
<img src="https://i.stack.imgur.com/ih8Fj.png">
</div>
これはどのように作動しますか?
上記で使用した呪文に直面した混乱は合理的です。多くのことが進行中であり、全体的な戦略は単純ではなく、理解するにはCSSのトリビアに関する知識が必要です。ステップバイステップで見ていきましょう。
私たちが直面する問題の核心は、transform
CSSプロパティを使用して要素に適用される変換がすべて、レイアウトが行われた後に発生することです。つまり、transform
要素で使用しても、その親や他の要素のサイズや位置にはまったく影響しません。transform
動作のこの事実を変更する方法は絶対にありません。したがって、要素を回転させ、その親の高さを回転に反映させる効果を作成するには、次のことを行う必要があります。
- どういうわけか、高さが幅に等しい他の要素を作成します
.element-to-rotate
.element-to-rotate
ステップ1の要素に正確にオーバーレイするなどの変換を記述します。
手順1の要素はです.rotation-wrapper-outer
。しかし、どのようにしてその高さを.element-to-rotate
の幅と等しくすることができますか?
ここでの戦略の重要な要素はpadding: 50% 0
on .rotation-wrapper-inner
です。このエクスプロイトは、仕様の奇抜な詳細ですpadding
。そのパーセンテージはpadding-top
、およびpadding-bottom
であっても、常に要素のコンテナーの幅のパーセンテージとして定義されます。これにより、次の2ステップのトリックを実行できます。
- 私たちは、セット
display: table
に.rotation-wrapper-outer
。これにより、幅に合わせて縮小されます。つまり、その幅は、コンテンツの固有の幅に基づいて、つまりの固有の幅に基づいて設定され.element-to-rotate
ます。(サポートしているブラウザーでは、を使用してこれをより明確に実現できますが、width: max-content
2017年12月の時点でmax-content
は、まだEdgeではサポートされていません。)
- 我々は、セット
height
の.rotation-wrapper-inner
へのパディングを設定し、その後、0を50% 0
(50%のトップと50%底、です)。これにより、親の幅の100%に等しい垂直方向のスペースが占有されます。これは、手順1のトリックにより、の幅に等しくなり.element-to-rotate
ます。
次に、子要素の実際の回転と配置を実行するだけです。当然、transform: rotate(-90deg)
回転を行います。transform-origin: top left;
回転した要素の左上隅を中心に回転を発生させるために使用します。これにより、回転した要素が描画された場所の真上に残るため、後続の変換が推論しやすくなります。次に、を使用translate(-100%)
して、回転前の幅に等しい距離だけ要素を下にドラッグできます。
上の50%の上部パディングをオフセットする必要があるため、それでも位置が正しくわかりません.rotation-wrapper-outer
。私たちは、それが確実にすることによって、それを達成.element-to-rotate
持っているdisplay: block
(そうマージンがそれに正常に動作すること)し、その後-50%適用margin-top
割合のマージンがあることに注意してください- また、親要素の幅に関連して定義します。
以上です!
なぜこれは完全に仕様に準拠していないのですか?
仕様(太字の鉱山)におけるパーセンテージのパディングとマージンの定義からの次の注記のため:
パーセンテージは、'padding-top'および'padding-bottom'の場合でも、生成されたボックスの包含ブロックの幅を基準に計算されます。包含ブロックの幅がこの要素に依存する場合、結果のレイアウトはCSS 2.1で定義されていません。
全体のトリックは、内側のラッパー要素のパディングをその子の幅に依存するコンテナーの幅に相対的にすることを中心に展開されたため、この条件に到達し、未定義の動作を呼び出しています。現在、4つの主要なブラウザーすべてで動作しますが、親.rotation-wrapper-inner
では.element-to-rotate
なく兄弟になるように変更するなど、私が試した、仕様に準拠しているように見えるいくつかの調整とは異なります。