用CSS画一个色子

362 阅读5分钟

上一次用css画了一个彩色方块,又想画一个更有意思的方块,于是我想到了色子,六个面,不同的点数,画一个这个应该会挺有意思的。

理论知识准备

要写色子每个面上的点,就需要用到一个新的知识点,flex弹性盒子布局。接下来就是知识点输出:

  • flex属性:让多个元素一行排列,顶端对齐;多个块级元素之间没有缝隙;不会脱标,占据位置。

display: flex;  将当前元素添加flex属性,转换为弹性容器,子元素成为弹性盒子,可以对弹性容器里的弹性盒子进行弹性布局。

  • justify-content  主轴对齐方式,默认从左到右排列
  • justify-content: flex-start;  默认值,起点到终点
  • justify-content: flex-end;  终点到起点
  • justify-content: center;  沿主轴居中排列
  • justify-content: space-between;  第一个元素在起点,最后一个元素在终点,剩余空间均匀分布在弹性盒子之间
  • justify-content: space-around;  沿主轴均匀排列,父元素剩余空间均分在弹性盒子两侧,整体效果,两边窄,中间宽
  • justify-content: space-evenly;  沿主轴均匀排列,弹性盒子的间距以及与容器的间距相等
  • align-items  侧轴对齐方式
  • align-items: strench;  默认值,当弹性盒子没有高度时,拉伸成父盒子高度
  • align-items: flex-start;  沿着侧轴方向,从起点到终点排列
  • align-items: flex-end;  沿着侧轴方向,从终点到起点排列
  • align-items: center;  沿着侧轴方向居中排列
  • flex-direction  改变主轴方向
  • flex-direction: row;  默认主轴方向,从左到右
  • flex-direction: row-reverse;  改变主轴方向为从右到左
  • flex-direction: column;  改变主轴方向为从上到下
  • flex-direction: column-reverse;  改变主轴方向为从下到上
  • flex注意点:
  • 当块级元素作为弹性盒子(子元素),没有设置宽度时,宽度由父级100%变成由实际内容撑开
  • 当行内元素作为弹性盒子(子元素),可以直接设置宽高
  • 当行内元素作为弹性容器(父元素),可以直接设置宽高

理论知识已经准备好了,接下来就开始画出我们的色子。

一点

先在html里写出一点的色子结构。我们在每一个面和点的命名时,可以写两个类名,一个用于单独修改自身样式,一个用于样式复用。

      <!-- 点数为1的布局 -->
      <div class="pointOne side">
        <div class="row circle"></div>
      </div>

使用less写出样式,给父盒子flex属性后,再让中间的圆点水平垂直居中。

// 一点
// 每一个面的样式,复用
.side {
  width: 200px;
  height: 200px;
  margin: 100px auto;
  padding: 10px;
  background-color: #fff;
  border-radius: 20px;
  box-shadow: 0 0 5px 8px #f6f6f6 inset;
}
// 点的样式,复用
.circle {
  width: 40px;
  height: 40px;
  background-color: #333;
  border-radius: 50%;
}
.pointOne {
  display: flex;
  justify-content: center;
  align-items: center;
}

色子的一点样式就出来了

image.png

两点

先在html里写出两点的色子结构

<!-- 点数为2的布局 -->
      <div class="pointTwo side">
        <div class="row1 circle"></div>
        <div class="row2 circle"></div>
      </div>

用less写出样式让两个点沿主轴两端排列,再给第一个点侧轴起始位置,第二个点侧轴末尾位置。

// 点数为2的布局
.pointTwo {
  display: flex;
  justify-content: space-between;

  .row1 {
    align-self: flex-start;
  }
  .row2 {
    align-self: flex-end;
  }
}

色子的两点样式就出来了

image.png

三点

先在html里写出三点的色子结构

<!-- 点数为3的布局 -->
      <div class="pointThree side">
        <div class="row1 circle"></div>
        <div class="row2 circle"></div>
        <div class="row3 circle"></div>
      </div>

用less写出样式让三个点沿主轴均匀排列,再让三个点在侧轴上也均匀排列。

// 点数为3的布局
.pointThree {
  display: flex;
  justify-content: space-between;

  .row1 {
    align-self: flex-start;
  }
  .row2 {
    align-self: center;
  }
  .row3 {
    align-self: flex-end;
  }
}

色子的三点样式就出来了

image.png

四点

先在html里写出四点的色子结构,由于四点与前三个样式有一定区别,这里我们可以写两个横向的盒子,一个盒子里装两个点,方便我们书写样式。

<!-- 点数为4的布局 -->
      <div class="pointFour side">
        <div class="row1">
          <div class="column circle"></div>
          <div class="column circle"></div>
        </div>
        <div class="row2">
          <div class="column circle"></div>
          <div class="column circle"></div>
        </div>
      </div>

用less写出四点的样式,首先我们给横向的盒子父级100%的宽度,然后再让盒子里的两个点位于盒子两端;这一步结束后还没有达到四点的样式效果,这时我们在表示这个面的盒子里加一个flex属性,再改变主轴方向,让两个横向盒子也排列于盒子上下两端。

// 点数为4的布局
.pointFour {
  display: flex;
  flex-direction: column;
  justify-content: space-between;

  .row1,
  .row2 {
    display: flex;
    justify-content: space-between;
    width: 100%;
  }
}

色子的四点样式就出来了

image.png

五点

先在html里写出五点的色子结构,和四点结构的思路差不多,给每一行的点都包裹一个横向的盒子,那么在五点结构里就需要三个横向的盒子,结构如下。

<!-- 点数为5的布局 -->
      <div class="pointFive side">
        <div class="row1">
          <div class="column circle"></div>
          <div class="column circle"></div>
        </div>
        <div class="row2">
          <div class="column circle"></div>
        </div>
        <div class="row3">
          <div class="column circle"></div>
          <div class="column circle"></div>
        </div>
      </div>

用less写出五点样式的思路也和四点样式的思路差不多,给第一行和第三行里的点一个space-between让其两端排列,给第二行里的点沿主轴居中;再改变主轴方向,让三个横向盒子竖着均匀排列。

// 点数为5的布局
.pointFive {
  display: flex;
  flex-direction: column;
  justify-content: space-between;

  .row1,
  .row2,
  .row3 {
    display: flex;
    justify-content: space-between;
    width: 100%;
  }

  .row2 {
    justify-content: center;
  }
}

色子的五点样式就出来了

image.png

六点

先在html里写出六点的色子结构,这个的结构和五点的结构只有一个差别,就是第二行包裹了两个点,其他的结构都是一样的。

<!-- 点数为6的布局 -->
      <div class="pointSix side">
        <div class="row1">
          <div class="column circle"></div>
          <div class="column circle"></div>
        </div>
        <div class="row2">
          <div class="column circle"></div>
          <div class="column circle"></div>
        </div>
        <div class="row3">
          <div class="column circle"></div>
          <div class="column circle"></div>
        </div>
      </div>

用less写出样式让三个点沿主轴均匀排列,再让三个点在侧轴上也均匀排列。

// 点数为6的布局
.pointSix {
  display: flex;
  flex-direction: column;
  justify-content: space-between;

  .row1,
  .row2,
  .row3 {
    display: flex;
    justify-content: space-between;
    width: 100%;
  }

色子的六点样式就出来了

image.png

立方体色子

接下来我们就要把这六个面拼成一个立方体,这才有一个色子的样子嘛。

这里的拼接方式和上一篇文章的彩色方块的拼接方式相同,就不过多赘述了;只需分清色子各个面的朝向,按照一点在前的角度来观察的话,应该是一点在前,六点在后,两点在左,五点在右,三点在下,四点在上;按照这个顺序来移动和旋转色子的每个面。

拼接完成后记得给色子加一个动画效果,这样才能完整地观察到色子的每个面,动画效果的添加也与上一篇文章相同。

最后来看看完成后的效果:

Video_2022-07-13_104953.gif