CSS动画实例:SierPinski地毯

      设页面中有<div class=”shape”></div>,若定义.shape的样式规则为:

  .shape

  {

     width: 100px;

     height: 100px;

     background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),

                   #f00 90deg,  transparent 0 );

     border: 1px solid #000;

  }

      可在页面中显示如图1所示的图形,在边长为100px的正方形中有一个边长为33.33px的红色填充的正方形。

CSS动画实例:SierPinski地毯

图1  一个红色填充正方形

      其中,conic-gradient是圆锥渐变。和线性渐变(linear-gradient)、径向渐变(radial-gradient)不同的是,目前不是所有的主流浏览器都支持圆锥渐变。本实例中的效果在“360安全浏览器12”中会得到呈现,但IE 11和Microsoft Edge上会不呈现。其他的主流浏览器没有进行一一测试,请读者自行测试好了。

若定义.shape的样式规则为:

  .shape

  {

     width: 100px;

     height: 100px;

     background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),

                      #f00 90deg,  transparent 0 )

                 calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3);

     border: 1px solid #000;

  }

      可在页面中显示如图2所示的图形,在边长为100px的正方形中有9个红色填充的正方形,这是由于背景大小设置为calc(100% / 3) calc(100% / 3),分成了9等分的缘故。

 CSS动画实例:SierPinski地毯

图2  9个红色填充正方形

若定义.shape的样式规则为:

  .shape

  {

     width: 100px;

     height: 100px;

     background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),

                      #f00 90deg,  transparent 0 )

                 calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9);

     border: 1px solid #000;

  }

      可在页面中显示如图3所示的图形,在边长为100px的正方形中有81个大小相同的红色填充的正方形,这是由于背景大小设置为calc(100% / 9) calc(100% / 9),分成了81等分的缘故。

CSS动画实例:SierPinski地毯

图3  大小相同的81个红色填充正方形

若定义.shape的样式规则为:

  .shape

  {

     width: 100px;

     height: 100px;

     background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),

                      #f00 90deg,  transparent 0 )

                 calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),

                 conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),

                      #f00 90deg,  transparent 0 )

                 calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9);

     border: 1px solid #000;

  }

      可在页面中显示如图4所示的图形,在边长为100px的正方形中有81个大小不同的红色填充的正方形,这是图2和图3两个背景图像叠加的缘故。

 CSS动画实例:SierPinski地毯

图4  大小不同的81个红色填充正方形

若定义.shape的样式规则为:

  .shape

  {

     width: 100px;

     height: 100px;

     background: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),

                      #f00 90deg,  transparent 0 )

                 calc(100px / 3) calc(100px / 3) / 100% 100% ,

                 conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),

                      #f00 90deg,  transparent 0 )

                 calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),

                 conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),

                      #f00 90deg,  transparent 0 )

                 calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9);

     border: 1px solid #000;

  }

      可在页面中显示如图5所示的图形。对这个图形熟悉吗?它就是SierPinski地毯。

 CSS动画实例:SierPinski地毯

图5  SierPinski地毯

      定义关键帧展示SierPinski地毯的生成过程。编写的HTML文件内容如下。

CSS动画实例:SierPinski地毯
<!DOCTYPE html>
<html>
<head>
<title>SierPinski地毯</title>
<style>
  .container
  {
    margin: 0 auto;
    width: 450px;
    height:450px;
    position: relative;
    display:flex;
    justify-content:center;
    align-items:center;
    background:#d8d8d8;
    border: 4px solid rgba(255, 0, 0, 0.9);
    border-radius: 10%;
  }
  .shape 
  {
    position: absolute;
    width: 243px;
    height: 243px;
    border: 1px solid rgba(255, 0, 255, 0.9);
    --sq: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
                         #fff 90deg, transparent 0);
    background: var(--sq) 81px 81px / 100% 100%,
         var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
         var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9),
         var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 27) calc(100% / 27);
    background-color: #000;
    animation: anim 8s linear infinite;
  }
  @keyframes anim
  {
    0%,24%  {     background: var(--sq) 81px 81px / 100% 100%; }
    25%,49% 
    {     
       background: var(--sq) 81px 81px / 100% 100%,
            var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3);  
    }
    50%,74% 
    {
        background: var(--sq) 81px 81px / 100% 100%,
            var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
            var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9);
    }
    75%,100% 
    {
        background: var(--sq) 81px 81px / 100% 100%,
            var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
            var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9),
            var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 27) calc(100% / 27);
    }
  }
</style>
</head>
<body>
<div class="container">
    <div class="shape"></div>
</div>
</body>
</html>
View Code

      在浏览器中打开包含这段HTML代码的html文件,可以呈现出如图6所示的动画效果。

CSS动画实例:SierPinski地毯 

图6  SierPinski地毯的生成(一)

      若在上面代码里.shape的样式定义中加上一句“background-blend-mode: difference;”,则呈现出如图7所示的动画效果。

CSS动画实例:SierPinski地毯 

图7  SierPinski地毯的生成(二)

      将SierPinski地毯作为一个立方体各面的图案,定义关键帧使得这个立方体旋转起来。编写如下的HTML文件。

CSS动画实例:SierPinski地毯
<!DOCTYPE html>
<html>
<head>
<title>3D立方体</title>
<style>
  .container
  {
    margin: 0 auto;
    width: 450px;
    height:450px;
    position: relative;
    display:flex;
    justify-content:center;
    align-items:center;
    background:#d8d8d8;
    border: 4px solid rgba(255, 0, 0, 0.9);
    border-radius: 10%;
    perspective: 1000px;
  }
  .cube 
  {
    display: block;
    width: 243px;
    height: 243px;
    transform-style: preserve-3d;
    will-change: transform;
    animation: rotate 10s linear infinite;
  }
  .side 
  {
    position: absolute;
    width: 100%;
    height: 100%;
    --sq: conic-gradient(from 270deg at calc(100% / 3) calc(100% / 3),
                         #f00 90deg, transparent 0);
    background: var(--sq) 81px 81px / 100% 100%,
         var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 3) calc(100% / 3),
         var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 9) calc(100% / 9),
         var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 27) calc(100% / 27),
         var(--sq) calc(100% / 6) calc(100% / 6) / calc(100% / 81) calc(100% / 81);
    background-color: #fff;
  }
  .side:nth-child(1) 
  {
     transform: translateZ(121.5px);
  }
  .side:nth-child(2) 
  {
     transform: translateZ(-121.5px);
  }
  .side:nth-child(3) 
  {
     transform: rotateY(90deg) translateZ(121.5px);
  }
  .side:nth-child(4)
  {
     transform: rotateY(-90deg) translateZ(121.5px);
  }
  .side:nth-child(5) 
  {
     transform: rotateX(90deg) translateZ(121.5px);
  }
  .side:nth-child(6) 
  {
     transform: rotateX(-90deg) translateZ(121.5px);
  }
  @keyframes rotate 
  {
      100%  { transform: rotateX(1turn) rotateY(1turn) rotateZ(1turn); }
  }
</style>
</head>
<body>
<div class="container">
  <div class="cube">
    <div class="side"></div>
    <div class="side"></div>
    <div class="side"></div>
    <div class="side"></div>
    <div class="side"></div>
    <div class="side"></div>
  </div>
</div>
</body>
</html>
View Code

      在浏览器中打开包含这段HTML代码的html文件,可以呈现出如图8所示的动画效果。

 CSS动画实例:SierPinski地毯

图8  SierPinski地毯图案立方体的旋转(一)

       同样,若在上面代码里.side的样式定义中加上一句“background-blend-mode: difference;”,则呈现出如图9所示的动画效果。

CSS动画实例:SierPinski地毯 

图9  SierPinski地毯图案立方体的旋转(二)

上一篇:一篇文章让你看懂顺序表(c)


下一篇:【LeetCode】【Math】Sum of square numbers