単一のdivの正多角形変換を実現する純粋なCSS

単一のdivの正多角形変換を実現する純粋なCSS

前回の記事では、beforeとafterの擬似要素を使用してMaterial Designスタイルのボタンを作成する方法を紹介しました。重要な技術は、境界線の幅とdiv本体の幅と高さをうまく利用することです。そのため、この記事では別の効果を追加します。それは、純粋にCSSを使用して「単一の」divを正三角形から正八角形に変換し(単一のdivは最大で正八角形にすることができます)、最後にアニメーション効果を使用して正多角形変換アニメーションに変換することです。正多角形は多くの三角関数の計算を必要とするため、便宜上、ここでは正多角形の辺を一律に100pxに設定しています。

正三角形

正三角形は疑似要素を必要としません。div 自体の境界線の幅を設定することで作成できます。まずは正三角形の辺の長さと中心線を見てみましょう。辺の長さが 100px の場合、中心線は 87px (100 x sin (60) = 87) に丸められます。

したがって、div の長さと幅を 0 に設定し、下の境界線の幅を 87 px、左右の境界線の幅を 50 px (色は透明に設定) に設定すると、美しい三角形を作成できます。

幅:0;
高さ:0;
境界線の幅:0 50px 87px ;
境界線スタイル:solid;
境界線の色:透明 透明 #095; 

四角

正方形が一番簡単です。長さと幅を同じ値に設定するだけです。ただし、実際には他の 2 つの方法があります。1 つ目は、長さと幅を 0 に設定し、上、下、左、右の境界線を 50 ピクセルに設定する方法です。2 つ目は、高さを 0、幅を 100 ピクセルに設定し、片側の幅を 100 に設定する方法です。どちらも可能です。

.a{
幅:100ピクセル;
高さ:100px;
背景:#c00;
}
.b{
幅:0;
高さ:0;
境界線の幅:50px;
境界線スタイル:solid;
境界線の色:#095;
}
.c{
幅:100ピクセル;
高さ:0;
境界線の幅:0 0 100px;
境界線スタイル:solid;
境界線の色:#069;
} 

正五角形

正五角形を作るには、基本的な三角関数を使用する必要があります。まずは正五角形を分解し、元の div を上側の三角形として使用し、疑似要素を使用して下側の台形を作成します。正五角形の各辺の角度は 108 度なので、三角関数を使用して、上側の三角形の高さは 59px (100 x cos (54))、幅は 192px (100x sin (54) x 2) であると計算できます。下側の台形の高さは 95px (100 x sin (72))、長辺の幅は上側の三角形と同じ 192px です。

原理を理解したら、擬似要素を使ってマッチングさせて制作してみましょう!

.a{
      位置:相対;
  幅:0;
  高さ:0;
  境界線の幅:0 81px 59px;
      境界線スタイル:solid;
  border-color:transparent 透明 #069;
}
.a:前{
  位置:絶対;
  コンテンツ:"";
  上:59px;
  左:-81px;
  幅:100ピクセル;
  高さ:0;
  背景:なし;
  境界線の幅:95px 31px 0;
  境界線スタイル:solid;    
  border-color:#069 透明 透明;
    }

正六角形

正六角形の各角度は 120 度です。純粋に CSS の観点から見ると、正五角形の三角形を変更することで正六角形を作成できます。つまり、2 つの台形の組み合わせになります。台形の長辺は 200px (100 x cos(60) x 2 + 100)、台形の高さは 87px (100 x sin(60)) です。

つまり、正五角形の CSS を少し変更するだけで、正六角形を作成できます。

.a{
      位置:相対;
    幅:100ピクセル;
    高さ:0;
    境界線の幅:0 50px 87px;
      境界線スタイル:solid;
    境界線の色:透明 透明 #f80;
}
.a:前{
  位置:絶対;
  コンテンツ:"";
    上:87px;
    左:-50px;
    幅:100ピクセル;
    高さ:0;
  背景:なし;
    境界線の幅:87px 50px 0;
  境界線スタイル:solid;    
    border-color:#f80 透明 透明;
    } 

正七角形

正七角形から始めて、後続の擬似要素を使用する必要があります。正七角形は、元のdivを上部の三角形、擬似要素を中間の台形、別の擬似要素を下の台形として使用して、3つのメモリブロックに分割する必要があるためです。正七角形の角度は特殊です。整数ではなく、128と4/7度です。小数点第2位は約128.57なので、計算結果は下の図のようになります。重要な点は、長さと幅を明確に知っておく必要があることです。


長さと幅が決まったら、CSS で書き始めることができます。

.a{
      位置:相対;
    幅:0;
    高さ:0;
    境界線の幅:0 90px 43px;
      境界線スタイル:solid;
    境界線の色:透明 透明 #09c;
}
.a:前{
  位置:絶対;
  コンテンツ:"";
    上:140ピクセル;
    左:-112px;
    幅:100ピクセル;
    高さ:0;
    境界線の幅:78px 62px 0;
  境界線スタイル:solid;    
    border-color:#09c 透明 透明;
    }
  .a:後{
    位置:絶対;
    コンテンツ:"";
    上:43px;
    左:-112px;
    幅:180ピクセル;
    高さ:0;
    境界線の幅:0 22px 97px;
    背景:なし;
    境界線スタイル:solid;
    境界線の色:透明 透明 #09c;
  } 

正八角形

正八角形は、実は正七角形の上の三角形を台形にし、さらに真ん中の台形を長方形にすることで作られます。正八角形の角度は135度で、計算された各領域の長さと幅は下の図のようになります。


同じ原理を理解すれば、CSS でそれを実行するのがはるかに簡単になります。

.a{
      位置:相対;
    幅:100ピクセル;
      高さ:0;
      境界線の幅:0 71px 71px;
      境界線スタイル:solid;
    境界線の色:透明 透明 #f69;
}
.a:前{
  位置:絶対;
  コンテンツ:"";
    上:171ピクセル;
      左:-71px;
      幅:100ピクセル;
      高さ:0;
      境界線の幅:71px 71px 0;
  境界線スタイル:solid;    
      境界線の色: #f69 透明 透明;
    }
  .a:後{
      位置:絶対;
      コンテンツ:"";
      上:71px;
      左:-71px;
      幅:242px;
      高さ:0;
      境界線の幅:0 0 100px;
      背景:なし;
      境界線スタイル:solid;
      境界線の色:透明 透明 #f69;
  } 

まとめ

上記は、純粋に CSS を使用して作成された単一の div の正多角形変換です。熟練者であれば、実際にアニメーション効果を追加して、以下の例のような変換アニメーションを作成することもできます。ただし、以下の例では、サイズ変換によって生じる緩いジョイントを回避するために、別の div を使用して外側にラップし、サイズ変換アニメーションを実行します。参考にしてください。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  DockerのTLS(SSL)証明書の有効期限の問題を解決する

>>:  JavaScript データ プロキシとイベントの詳細な分析

推薦する

Web ページの HTML コードの説明: 順序付きリストと順序なしリスト

このセクションでは、HTML のリスト要素について学習します。リストは、Web サイトのデザインにお...

MySQL における一般的な高度な SQL ステートメント

MySQL 高度な SQL ステートメント kgc を使用します。 テーブルlocation(Reg...

Tomcatディレクトリ構造の詳細な説明

目次ディレクトリ構造binディレクトリconfディレクトリlibディレクトリwebapps ディレク...

CSSフローティングとフローティング解除について

フロートの定義要素を通常のドキュメント フローから外し、要素を左また​​は右に近づけます。親要素の端...

CSS3は、欠けた角の長方形、折り畳まれた角の長方形、欠けた角の境界線を実装しています。

序文数日前、偶然、コーナーの四角形が欠落している機能に遭遇しました。最初に頭に浮かんだのは、必要な場...

ElasticSearch と ElasticSearch-Head の Docker デプロイメントの実装

この記事では主にDockerを使ってElasticSearch:バージョン6.8.4をデプロイする方...

テーブルを使用してフォームコントロールの形式を調整し、見栄えを良くします。

自分でウェブページを書きたいので、HTML 言語についても少し勉強しています。これは、大学時代にウェ...

要素テーブルの多層ネスト表示の実践

複数の注文を含むリストが必要です。各注文は一意にすることも、複数の注文を結合することもできます。各注...

MySQLの場合の使用例分析

まず、データベース テーブルを作成します。 テーブル `t_demo` を作成します ( `id` ...

Vue + 要素の動的複数ヘッダーと動的スロット

目次1. 需要2. 効果3. すべてのコード1. 需要ユーザーが自分でテーブルを構成できるようになり...

Dockerコンテナとホストマシン間の8時間の差の問題を解決する

デプロイに docker-compose を使用すると、出力ログと関連イベントが検証されて出力される...

HTML で入力プロンプトのテキスト スタイルを変更するためのサンプル コード

多くのウェブサイトでは、入力ボックスにヒントテキストが表示されています。入力ボックスにヒントテキスト...

Linux でログインタイムアウト後に非アクティブなユーザーを自動的にログアウトする

方法1: .bashrcまたは.bash_profileファイルを変更するこれは、ホーム ディレクト...

JavaScript Promise の徹底解説

目次1. Promise とは何ですか? 2. なぜ Promise が存在するのでしょうか? 3つ...

Web面接でよくある質問:リフローとリペイントの原理と違い

目次ブラウザのレンダリングメカニズムリフローと再塗装リフロー逆流を引き起こす行為:再描画再描画を引き...