纯CSS实现一个微信logo,须要几个标签?

博客已迁移至http://lwzhang.github.iocss

纯CSS实现一个微信logo并不难,难的是怎样用最少的html标签实现。我一直在想怎样用一个标签就能实现,最后仍是没想出来,就只好用两个标签了。
html

首先须要两个标签元素:git

<div class="bg">
        <div class="inner"></div>
    </div>

先画个背景:github

.bg {
        width: 300px;
        height: 300px;
        background-color: #08c406;
        border-radius: 10px;
        position: relative;
    }

再画个大的椭圆:微信

.inner {
        width: 180px;
        height: 150px;
        border-radius: 50%;
        background-color: #fff;
        position: absolute;
        top: 60px;
        left: 35px;
    }

小的椭圆利用.inner::before伪元素实现:spa

&::before {
        content: "";
        width: 140px;
        height: 120px;
        border-radius: 50%;
        background-color: #fff;
        position: absolute;
        top: 60px;
        left: 90px;
        border: 2px solid #08c406;
    }

下图时如今的结果:code

里面的四个圆怎么画呢?能够利用CSS3的box-shadow属性实现,通常重复性的东西都会用这个属性,由于它能够制造出无数个如出一辙的东西出来。orm

利用.bg::before伪元素实现这些圆:htm

&::before {
       content: "";
       position: absolute;
       width: 16px;
       height: 16px;
       border-radius: 50%;
       background-color: #08c406;
       top: 150px;
       left: 155px;
       z-index: 2;
       box-shadow: 70px 0 #08c406, -70px -50px 0 2px #08c406, 0 -50px 0 2px #08c406;
    }

::before自己会实现一个圆(一个小圆),而后利用box-shadow属性实现其它的三个圆。blog

来看看如今的效果:

如今就剩下两个角了,想一想还有哪些东西没用上?还有两个伪元素,分别是.bg::after.inner::after,恰好能够实现两个角。

这两个角其实就是日常的小三角,而后再旋转个45度,CSS实现小三角太常见了:

.bg::after {
        content: "";
        border-width: 30px 12px;
        border-style: solid;
        border-color: #fff transparent transparent transparent;
        position: absolute;
        top: 182px;
        left: 50px;
        transform: rotate(45deg);
    }

    .inner::after {
        content: "";
        border-width: 30px 10px;
        border-style: solid;
        border-color: #fff transparent transparent transparent;
        position: absolute;
        top: 155px;
        left: 200px;
        transform: rotate(-45deg);
    }

最终效果:

所有css代码:

@mixin pos($left, $top) {
      position: absolute;
      left: $left;
      top: $top;
    }

    .bg {
      width: 300px;
      height: 300px;
      background-color: #08c406;
      border-radius: 10px;
      position: relative;

      &::before {
       @include pos(155px, 150px);
       content: "";
       width: 16px;
       height: 16px;
       border-radius: 50%;
       background-color: #08c406;
       z-index: 2;
       box-shadow: 70px 0 #08c406, -70px -50px 0 2px #08c406, 0 -50px 0 2px #08c406;
      }

      &::after {
       @include pos(50px, 182px);
       content: "";
       border-width: 30px 12px;
       border-style: solid;
       border-color: #fff transparent transparent transparent;
       transform: rotate(45deg);
     }

     .inner {
       width: 180px;
       height: 150px;
       border-radius: 50%;
       background-color: #fff;
       @include pos(35px, 60px);

       &::before {
        @include pos(90px, 60px);
        content: "";
        width: 140px;
        height: 120px;
        border-radius: 50%;
        background-color: #fff;
        border: 2px solid #08c406;
       }

       &::after {
        @include pos(200px, 155px);
        content: "";
        border-width: 30px 10px;
        border-style: solid;
        border-color: #fff transparent transparent transparent;
        transform: rotate(-45deg);
       }
      }
    }

画这个logo最难的地方应该就是实现四个小圆的时候,由于CSS3不太熟的人可能不会想到利用box-shadow去实现。

你们还有其它的方法实现微信logo吗?有没有一个标签就能实现的?欢迎留下你的实现方式。