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のトリビアに関する知識が必要です。ステップバイステップで見ていきましょう。
私たちが直面する問題の核心は、transformCSSプロパティを使用して要素に適用される変換がすべて、レイアウトが行われた後に発生することです。つまり、transform要素で使用しても、その親や他の要素のサイズや位置にはまったく影響しません。transform動作のこの事実を変更する方法は絶対にありません。したがって、要素を回転させ、その親の高さを回転に反映させる効果を作成するには、次のことを行う必要があります。
- どういうわけか、高さが幅に等しい他の要素を作成します.element-to-rotate
- .element-to-rotateステップ1の要素に正確にオーバーレイするなどの変換を記述します。
手順1の要素はです.rotation-wrapper-outer。しかし、どのようにしてその高さを.element-to-rotateの幅と等しくすることができますか?
ここでの戦略の重要な要素はpadding: 50% 0on .rotation-wrapper-innerです。このエクスプロイトは、仕様の奇抜な詳細ですpadding。そのパーセンテージはpadding-top、およびpadding-bottomであっても、常に要素のコンテナーの幅のパーセンテージとして定義されます。これにより、次の2ステップのトリックを実行できます。
- 私たちは、セットdisplay: tableに.rotation-wrapper-outer。これにより、幅に合わせて縮小されます。つまり、その幅は、コンテンツの固有の幅に基づいて、つまりの固有の幅に基づいて設定され.element-to-rotateます。(サポートしているブラウザーでは、を使用してこれをより明確に実現できますが、width: max-content2017年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なく兄弟になるように変更するなど、私が試した、仕様に準拠しているように見えるいくつかの調整とは異なります。