CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

青灯夜游
リリース: 2022-09-23 09:58:10
転載
2213 人が閲覧しました

フロントエンドのインタビューでは、CSS を使用してサイコロ/麻雀のレイアウトを実装する方法をよく尋ねられます。以下の記事では、CSSを使用して3Dサイコロを作成する方法(FlexおよびGridレイアウトで3Dサイコロを実装)を紹介しますので、ご参考になれば幸いです。

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

この記事から学ぶことができます:

  • 変換を使用して 3D 形状を実現する;
  • 3D サイコロの回転アニメーションを実装する;
  • フレックス レイアウトを使用してサイコロ レイアウトを実装します;
  • グリッド レイアウトを使用してサイコロ レイアウトを実装します。 [推奨学習: css ビデオ チュートリアル ]

1. Flex レイアウトを使用して 6 つの側面を実装する

まず、6 つの側面の HTML 構造を定義します。サイコロ:

<div class="dice-box">
  <div class="dice first-face">
    <span class="dot"></span>
  </div>
  <div class="dice second-face">
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="dice third-face">
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="dice fourth-face">
    <div class="column">
      <span class="dot"></span>
      <span class="dot"></span>
    </div>
    <div class="column">
      <span class="dot"></span>
      <span class="dot"></span>
    </div>
  </div>
  <div class="fifth-face dice">
    <div class="column">
      <span class="dot"></span>
      <span class="dot"></span>
    </div>
    <div class="column">
      <span class="dot"></span>
    </div>
    <div class="column">
      <span class="dot"></span>
      <span class="dot"></span>
    </div>
  </div>
  <div class="dice sixth-face">
    <div class="column">
      <span class="dot"></span>
      <span class="dot"></span>
      <span class="dot"></span>
    </div>
    <div class="column">
      <span class="dot"></span>
      <span class="dot"></span>
      <span class="dot"></span>
    </div>
  </div>
</div>
ログイン後にコピー

各サーフェスと各ポイントの基本スタイルを実装しましょう:

.dice {
  width: 200px;  
  height: 200px;  
  padding: 20px;  
  background-color: tomato;
  border-radius: 10%;
}
 
.dot {
   display: inline-block;
   width: 50px;
   height: 50px;
   border-radius: 50%;
   background-color: white;
}
ログイン後にコピー

効果は次のとおりです:

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

( 1 ) ポイント

HTML 構造は次のとおりです:

<div class="dice first-face">
  <span class="dot"></span>
</div>
ログイン後にコピー

最初の面を実装するには、それを水平方向と垂直方向の中央に配置するだけです:

  • justify- content:center: 点を主軸 (水平) の中心に合わせます。
  • align-items:center: 点を交差軸 (垂直) の中心に合わせます。

コードは次のように実装されます:

.first-face {
  display: flex;
  justify-content: center;
  align-items: center;
}
ログイン後にコピー

最初の面は次のようになります:

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

(2) 2ポイント

HTML 構造は次のとおりです:

<div class="dice second-face">
  <span class="dot"></span>
  <span class="dot"></span>
</div>
ログイン後にコピー

まず 2 番目の側の親要素をフレックス レイアウトに設定し、次の属性を追加します:

justify-content: space- between: フレックスコンテナの先頭と末尾に子要素を配置します。

.second-face {
   display: flex;
   justify-content : space-between;
}
ログイン後にコピー

現在のポイントの位置は次のとおりです:

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

現時点では、最初のポイントは正しい位置、つまり左上隅にあります。 2 番目の点は右下隅にある必要があります。そこで、align-self プロパティを使用して 2 番目の点の位置を個別に調整しましょう。

align-self: flex-end: 項目を Flex コンテナの端に揃えます。

.second-face .dot:nth-of-type(2) {
 align-self: flex-end;
}
ログイン後にコピー

2 番目の面は次のようになります:

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

(3) 3 つの点

HTML 構造は次のとおりです:

<div class="dice third-face">
  <span class="dot"></span>
  <span class="dot"></span>
  <span class="dot"></span>
</div>
ログイン後にコピー

3 番目の辺は、2 番目の辺に別の中心点を配置することで実現できます。

  • align-self: flex-end: 項目を Flex コンテナの最後に揃えます。
  • align-self: center: 項目を Flex コンテナの中央に揃えます。
.third-face {
 display: flex;
  justify-content : space-between;
}
 
.third-face .dot:nth-of-type(2) {
 align-self: center;
}
 
.third-face .dot:nth-of-type(3) {
 align-self: flex-end;
}
ログイン後にコピー

これで 3 番目の面は次のようになります:

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

最初の点を右上隅に置き、3 番目の点を配置​​したい場合左下隅に配置するには、最初の点の align-self を flex-end に変更できます。2 番目の点は変更されず、3 番目の点を設定する必要はありません。デフォルトは左端です。

.third-face {
 display: flex;
  justify-content : space-between;
}
 
.third-face .dot:nth-of-type(1) {
 align-self :flex-end;
}
 
.third-face .dot:nth-of-type(2) {
 align-self :center;
}
ログイン後にコピー

3 番目の面は次のようになります。

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

(4) 4 つのポイント

HTML 構造は次のとおりです。

<div class="dice fourth-face">
  <div class="column">
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="column">
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
</div>
ログイン後にコピー

4 つの点に直面して、それをそれぞれ 2 列の 2 行に分割できます。 1 つの行は flex-start にあり、もう 1 つの行は flex-end にあります。そして、justify-content: space-between を追加して、サイコロの左側と右側に配置します。

.fourth-face {
 display: flex;
 justify-content: space-between
}
ログイン後にコピー

次に、2 つの列ポイントをそれぞれレイアウトする必要があります:

    列をフレックス レイアウトに設定します;
  • 列にフレックス方向を設定して、ポイントは垂直に配置されます。
  • justify-content を space-between に設定すると、最初のポイントが上部に、2 番目のポイントが下部に作成されます。
  • .fourth-face .column {
     display: flex;
      flex-direction: column;
      justify-content: space-between;
    }
    ログイン後にコピー
4 番目の面は次のようになります。

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

(5) 5 つのポイント

HTML 構造は次のとおりです。 :

<div class="fifth-face dice">
  <div class="column">
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="column">
    <span class="dot"></span>
  </div>
  <div class="column">
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
</div>
ログイン後にコピー

5 面と 4 面の違いは、中央に余分なドットがあることです。したがって、4 番目の辺に基づいて中央に列を追加できます。スタイルは次のとおりです:

.fifth-face {
 display: flex;
 justify-content: space-between
}
 
.fifth-face .column {
 display: flex;
  flex-direction: column;
  justify-content: space-between;
}
ログイン後にコピー

5 番目の辺は次のようになります:

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

また、修正する必要があります。中間点を調整するには、justify-content を center に設定して垂直方向の中央に配置します:

.fifth-face .column:nth-of-type(2) {
 justify-content: center;
}
ログイン後にコピー

これで、5 番目の辺は次のようになります:

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

(6 ) 6 つのポイント

HTML 構造は次のとおりです。

<div class="dice sixth-face">
  <div class="column">
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="column">
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
</div>
ログイン後にコピー

6 面目のレイアウトは 4 面目とほぼ同じですが、各列が異なります。もう 1 つの要素があります。レイアウトは次のように実装されます:

.sixth-face {
 display: flex;
 justify-content: space-between
}
  
.sixth-face .column {
 display: flex;
  flex-direction: column;
  justify-content: space-between;
}
ログイン後にコピー

6 番目の面は次のようになります:

CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

2. 使用 Grid 布局实现六个面

骰子每个面其实可以想象成一个 3 x 3 的网格,其中每个单元格代表一个点的位置:

+---+---+---+
| a | b | c |
+---+---+---+
| d | e | f |
+---+---+---+
| g | h | i |
+---+---+---+

要创建一个 3 x 3 的网格,只需要设置一个容器元素,并且设置三个大小相同的行和列:

.dice {
    display: grid;
    grid-template-rows: 1fr 1fr 1fr;
    grid-template-columns: 1fr 1fr 1fr;
}
ログイン後にコピー

这里的 fr 单位允许将行或列的大小设置为网格容器可用空间的一部分,这上面的例子中,我们需要三分之一的可用空间,所以设置了 1fr 三次。

我们还可以使用 repeat(3, 1fr) 将 1fr 重复 3 次,来代替 1fr 1fr 1fr。还可以使用定义行/列的grid-template速记属性将上述代码进行简化:

.dice {
    display: grid;
    grid-template: repeat(3, 1fr) / repeat(3, 1fr);
}
ログイン後にコピー

每个面所需要定义的 HTML 就像是这样:

<div class="dice">
  <span class="dot"></span>
  <span class="dot"></span>
  <span class="dot"></span>
  <span class="dot"></span>
</div>
ログイン後にコピー

所有的点将自动放置在每个单元格中,从左到右:

1CSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)

现在我们需要为每个骰子值定位点数。开始时我们提到,可以将每个面分成 3 x 3 的表格,但是这些表格并不是每一个都是我们需要的,分析骰子的六个面,可以发现,我们只需要以下七个位置的点:

+---+---+---+
| a | | c |
+---+---+---+
| e | g | f |
+---+---+---+
| d | | b |
+---+---+---+

我们可以使用grid-template-areas属性将此布局转换为 CSS:

.dice {
  display: grid;
  grid-template-areas:
    "a . c"
    "e g f"
    "d . b";
}
ログイン後にコピー

因此,我们可以不使用传统的单位来调整行和列的大小,而只需使用名称来引用每个单元格。其语法本身提供了网格结构的可视化,名称由网格项的网格区域属性定义。中间列中的点表示一个空单元格。

下面来使用grid-area属性为网格项命名,然后,网格模板可以通过其名称引用该项目,以将其放置在网格中的特定区域中。:nth-child()伪选择器允许单独定位每个点。

.dot:nth-child(2) {
    grid-area: b;
}
 
.dot:nth-child(3) {
    grid-area: c;
}
 
.dot:nth-child(4) {
    grid-area: d;
}
 
.dot:nth-child(5) {
    grid-area: e;
}
 
.dot:nth-child(6) {
    grid-area: f;
}
ログイン後にコピー

现在六个面的样式如下:

可以看到,1、3、5的布局仍然是不正确的,只需要重新定位每个骰子的最后一个点即可:

.dot:nth-child(odd):last-child {
    grid-area: g;
}
ログイン後にコピー

这时所有点的位置都正确了:

对于上面的 CSS,对应的 HTML分别是父级为一个p标签,该面有几个点,子级就有几个span标签。代码如下:

<div class="dice-box">
  <div class="dice first-face">
    <span class="dot"></span>
  </div>
  <div class="dice second-face">
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="dice third-face">
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="dice fourth-face">
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="fifth-face dice">
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <div class="dice sixth-face">
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
</div>
ログイン後にコピー

整体的 CSS 代码如下:

.dice {
  width: 200px;  
  height: 200px;  
  padding: 20px;  
  background-color: tomato;
  border-radius: 10%;
  display: grid;
  grid-template: repeat(3, 1fr) / repeat(3, 1fr);
  grid-template-areas:
    "a . c"
    "e g f"
    "d . b";
}
 
.dot {
  display: inline-block;
  width: 50px;
  height: 50px;
  border-radius: 50%;
  background-color: white;
}
 
.dot:nth-child(2) {
  grid-area: b;
}
 
.dot:nth-child(3) {
  grid-area: c;
}
 
.dot:nth-child(4) {
  grid-area: d;
}
 
.dot:nth-child(5) {
  grid-area: e;
}
 
.dot:nth-child(6) {
  grid-area: f;
}
 
.dot:nth-child(odd):last-child {
  grid-area: g;
}
ログイン後にコピー

3. 实现 3D 骰子

上面我们分别使用 Flex 和 Grid 布局实现了骰子的六个面,下面来这将六个面组合成一个正方体。

首先对六个面进行一些样式修改:

.dice {
  width: 200px;  
  height: 200px;  
  padding: 20px;
  box-sizing: border-box;
  opacity: 0.7;
  background-color: tomato;
  position: absolute;
}
ログイン後にコピー

定义它们的父元素:

.dice-box {
  width: 200px;
  height: 200px;
  position: relative;
  transform-style: preserve-3d;
  transform: rotateY(185deg) rotateX(150deg) rotateZ(315deg);
}
ログイン後にコピー

其中,transform-style: preserve-3d;表示所有子元素在3D空间中呈现。这里的transform 的角度不重要,主要是便于后面查看。

此时六个面的这样的:

看起来有点奇怪,所有面都叠加在一起。不要急,我们来一个个调整位置。

首先将第一个面在 Z 轴移动 100px:

.first-face {
  transform: translateZ(100px);
}
ログイン後にコピー

第一面就到了所有面的上方:

因为每个面的宽高都是 200px,所以将第六面沿 Z 轴向下调整 100px:

.sixth-face {
  transform: translateZ(-100px);
}
ログイン後にコピー

第六面就到了所有面的下方:

下面来调整第二面,将其在X轴向后移动 100px,并沿着 Y 轴旋转 -90 度:

.second-face {
  transform: translateX(-100px) rotateY(-90deg);
}
ログイン後にコピー

此时六个面是这样的:

下面来调整第二面的对面:第五面,将其沿 X 轴的正方向移动 100px,并沿着 Y 轴方向选择 90 度:

.fifth-face {
  transform: translateX(100px) rotateY(90deg);
}
ログイン後にコピー

此时六个面是这样的:

下面来调整第三面,道理同上:

.third-face {
  transform: translateY(100px) rotateX(90deg);
}
ログイン後にコピー

此时六个面是这样的:

最后来调整第五面:

.fourth-face {
  transform: translateY(-100px) rotateX(90deg);
}
ログイン後にコピー

此时六个面就组成了一个完整的正方体:

下面来为这个骰子设置一个动画,让它转起来:

@keyframes rotate {
  from {
    transform: rotateY(0) rotateX(45deg) rotateZ(45deg);
  }
  to {
    transform: rotateY(360deg) rotateX(45deg) rotateZ(45deg);
  }
}
 
.dice-box {
  animation: rotate 5s linear infinite;
}
ログイン後にコピー

最终的效果如下:

在线体验:

3D 骰子-Flex:https://codepen.io/cugergz/pen/jOzYGyV

3D 骰子-Grid:https://codepen.io/cugergz/pen/GROMgEe

(学习视频分享:css视频教程web前端

以上がCSS フレックスおよびグリッド レイアウトを使用して 3D ダイスを実装する手順を段階的に説明します (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:jb51.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート