側面が斜めの形状(レスポンシブ)


90

下の画像のように、片側のみ(たとえば、下側)に傾斜したエッジがあり、他のエッジはまっすぐな形状を作成しようとしています。

斜めの辺を持つCSS div

borderメソッド(コードは以下に示す)を使用してみましたが、形状の寸法が動的であるため、このメソッドを使用できません。

.shape {
    position: relative;
    height: 100px;
    width: 200px;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    height: 0px;
    width: 0px;
    left: 0px;
    bottom: -100px;
    border-width: 50px 100px;
    border-style: solid;
    border-color: tomato tomato transparent transparent;
}
<div class="shape">
    Some content
</div>


背景にグラデーションを使用してみました(以下のコードのように)が、寸法が変わるとめちゃくちゃになります。下のスニペットの形にカーソルを合わせると、私が何を意味するかがわかります。

傾斜した側面でこの形状を作成し、動的サイズをサポートするにはどうすればよいですか?

回答:


126

片側だけが傾斜したエッジを持つ形状を作成するには、多くの方法があります。

次のメソッドは、質問ですでに述べたように動的サイズをサポートできません。

  • のピクセル値を使用したボーダートライアングル法border-width
  • 角度構文を使用した線形グラデーション(45度、30度など)。

動的サイズをサポートできるメソッドを以下に示します。


方法1-SVG

ブラウザの互換性

SVGは、polygonsまたはpaths を使用して形状を生成するために使用できます。以下のスニペットはを使用していpolygonます。必要なテキストコンテンツは、図形の上に配置できます。

長所

  • SVGはスケーラブルなグラフィックを生成するように設計されており、すべての寸法の変更に対応できます。
  • ボーダーとホバー効果は、最小限のコーディングオーバーヘッドで実現できます。
  • 画像またはグラデーションの背景も形状に提供できます。

短所

  • IE8-はSVGをサポートしていないため、ブラウザーサポートがおそらく唯一の欠点ですが、RaphaelやVMLなどのライブラリを使用することで軽減できます。さらに、ブラウザのサポートは、他のオプションよりも悪くはありません。

方法2-グラデーションの背景

ブラウザの互換性

線形グラデーションを使用して形状を作成することはできますが、質問で述べた角度は使用できません。角度を指定する代わりに、to [side] [side]構文(valsのおかげ)を使用する必要があります。辺を指定すると、コンテナの寸法に基づいてグラデーション角度が自動的に調整されます。

長所

  • コンテナの寸法が動的であっても、形状を実現および維持できます。
  • グラデーションの色を変えることでホバー効果を加えることができます。

短所

  • カーソルが図形の外側でコンテナ内にある場合でも、ホバー効果がトリガーされます。
  • 境界線を追加するには、トリッキーなグラデーション操作が必要です。
  • グラデーションは、幅(または高さ)が非常に大きい場合にギザギザのコーナーを生成することで知られています。
  • 図形に画像の背景を使用することはできません。

方法3-スキュー変換

ブラウザの互換性

この方法では、疑似要素が追加、傾斜、および配置され、エッジの1つが傾斜/傾斜しているように見えます。上部または下部のエッジが傾斜している場合、傾斜はY軸に沿っている必要があります。回転はX軸に沿っている必要があります。transform-origin傾斜側とは反対側を持っている必要があります。

長所

  • ボーダーでも形が作れます。
  • ホバー効果は形状内に制限されます。

短所

  • 要素が傾斜している場合、Y軸のオフセットは増加するwidthにつれて増加し、逆も同様です(スニペットでwidthto 200pxを増加してみてください)。詳細については、こちらをご覧ください

方法4-透視変換

ブラウザの互換性

この方法では、メインコンテナーが少し遠近法でX軸またはY軸に沿って回転します。適切な値をに設定transform-originすると、片側のみに傾斜エッジが生成されます。

上面または下面が傾斜している場合、回転はY軸に沿っている必要があり、そうでない場合、回転はX軸に沿っている必要があります。transform-origin傾斜側とは反対側を持っている必要があります。

長所

  • ボーダーで形を作ることができます。
  • 形状を維持するために、寸法が比例して増加する必要はありません。

短所

  • コンテンツも回転されるため、正常に見えるように逆回転する必要があります。
  • 寸法が静的でない場合、テキストの配置は面倒です。

方法5-CSSクリップパス

ブラウザの互換性

この方法では、ポリゴンを使用してメインコンテナーを必要な形状にクリップします。ポリゴンのポイントは、傾斜したエッジが必要な側に応じて変更する必要があります。

長所

  • コンテナが動的にサイズ変更されているときでも、形状を維持できます。
  • ホバー効果は、形状の境界内で完全に制限されます。
  • 画像は形状の背景としても使用できます。

短所

  • ブラウザーのサポートは現在非常に貧弱です。
  • ボーダーは、絶対的に配置された要素を形状の上に配置し、それに必要なクリップを与えることによって追加できますが、動的にサイズ変更するときにポイントを超えてうまく適合しません。

方法6-キャンバス

ブラウザの互換性

キャンバスを使用して、パスを描画することで形状を作成することもできます。以下のスニペットにはデモがあります。必要なテキストコンテンツは、図形の上に配置できます。

長所

  • コンテナの寸法が動的であっても、形状を実現および維持できます。ボーダーも追加できます。
  • pointInpathメソッドを使用すると、ホバー効果を図形の境界内に制限できます。
  • 画像またはグラデーションの背景も形状に提供できます。
  • DOMの操作を必要としないため、リアルタイムのアニメーション効果が必要な場合の選択が適切です。

短所

  • Canvasはラスターベースであるため、ポイント*を超えてスケ​​ーリングすると、角度の付いたエッジがピクセル化またはぼやけます。

*-ピクセレーションを回避するには、ビューポートのサイズを変更するたびに形状を再描画する必要があります。ここにその例がありますが、それはオーバーヘッドです。


35

ボーダー法を試してみましたが、形状の寸法が動的であるため、この方法は使用できません。


方法7-ビューポートユニット (ボーダーRedux

ブラウザの互換性

ビューポートユニットはCSS3の優れた革新です。通常、パーセンテージ値を使用してプロパティを動的にすることができますが、border-widthsに対して(s に対してもfont-size)行うことはできません。

代わりにビューポート単位を使用すると、ビューポートの寸法と比較して、オブジェクトのサイズとともに境界の幅を動的に設定できます

注:パーセント値は、ビューポート(ウィンドウの可視領域)ではなく、親オブジェクトを参照します。

メソッドをテストするには、次のスニペットフルページを起動し、水平方向と垂直方向の両方にサイズ変更します。

.shape {
    position: relative;
    height: 20vh;
    width: 40vw;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    left: 0px;
    right: 0px;
    top: 20vh;
    border-width: 10vh 20vw;
    border-style: solid;
    border-color: tomato tomato rgba(0,0,0,0) rgba(0,0,0,0);
}
<div class="shape">Some content</div>

長所 -(1)すべてが動的であり、ブラウザーの対象範囲は広い。

短所 -(1)OSがでスクロールバー処理する方法に注意する必要がありますoverflow: auto;


3
Chromeの最新バージョンではギザギザに見えます。
Mr_Green、2015年

ほんとだ!これをスムーズにレンダリングするには、ブラウザエンジンがまだ少し時間がかかると思います。Firefoxでは、ビューポートユニットの代わりにピクセルを使用してこの手法を使用する場合にもこの問題がありますが、透明ではなくrgba(,,, 0)を使用することで修正できます。幸い、現在、他のオプションがあります;)
Andrea Ligios、2015年

1

私の解決策は、このページの上の、Andrea Ligiosによる方法7-ビューポートユニットと呼ばれるものに触発されています。

height:10vwナビゲーションウィンドウの幅を変更するとき、高さ()にも「水平」単位を使用して、指定された比率を台形に保ちました。これをメソッド7b-ビューポート幅と呼ぶことができます。

さらに、div1つと:afterセレクターの代わりに2つのネストされたを使用すると、私の意見では、テキストコンテンツのスタイルをより適切に調整できます(例:text-alignなど)。

.dtrapz {
  position: relative;
  margin: 10px 40vw;
  width: 0;
  height: 10vw;
  border: none;
  border-right: 20vw solid #f22;
  border-bottom: 5vw solid transparent;
}

.dtcont {
  position: absolute;
  width: 20vw;
  height: 10vw;
  text-align: center;
  color: #fff;/* just aesthetic */
}
<div class="dtrapz">
  <div class="dtcont">Some content</div>
</div>


@ Downvoterこんにちは!私の答えのどこが間違っているか教えてください。これが理にかなっている場合は編集または削除できます!私は専門家ではありませんが、これは多くのページに適用でき、幅のみに応じて長いテキストコンテンツで動作する可能性があるようです:)
MattAllegro
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.