仅用一个HTML标签,实现带动画的抖音Logo(二)

简介: 接上文。

开搞开搞


先来测量一下抖音 logo 中 音符 的长宽比,为了等会给音符留出一定的空间


980bf6be183f2ef248a3bf62d074a59b.png


特地用截图工具圈出了红色音符的部分,得到的宽高是 248 * 285,计算一下宽高比就约等于 248/285 = 0.87,那我们就要在中间留出一个宽高比为 0.87 的矩形位置给音符


打地基


那就先打地基!


<style>
  .douyin {
    width: 100px;
    aspect-ratio: 0.87;  /* 宽高比 0.87 */
    border-radius: 25%;
    padding: 20px calc(20px + 100px / 0.87 * 0.13 / 2);  /* 四周留白,中间腾出位置给音符 */
    background-color: #000;
  }
</style>
<div class="douyin" />


这里需要解释一下 padding 的值的设定,20px 是我随便设置的一个边距大小,既然顶部和底部都是 20px,而且本身整体元素的宽高比又不是 1:1(整体不是正方形),那为了视觉上的居中和整体宽高的 1:1,我们需要将左右边距增大至整体宽度与高度相等


因此 100px / 0.87 拿到的就是整体的高度,再乘以 0.13 拿到的就是宽高的差值,因为要平均分到两边,所以还要除以 2


现在妥妥是个正方形了,当前的效果:


ef4cbc110b4946b3766db4c69fdb3956.png

这里为了让等会的音符只在图中的那块儿区域绘制,我们给外部容器设置一下 display: grid,等会还需要借助 grid 布局的能力


.douyin::before, 
.douyin::after {
  content: '';
  grid-area: 1/1;  /* 居中展示 */
}


画1/4圆环


如何画圆环?用一个简单的例子来演示一下:


<style>
  .demo {
    /* demo 是一个正方形 */
    background: 
      radial-gradient(
        100% 100% at 100% 100%, 
        transparent 0 50%,
        red 50% 100%,
        transparent,
      );
  }
</style>
<div class="demo"/>


我们就得到了一个这样的图形:


8499ba06d677609f75ce55ccc91363b5.png


怎么得到这样的 1/4圆环 的呢?我们把样式拆解一下:


100% 100% at 100% 100%


at 的左侧 表示圆(或椭圆)在横向、竖向的半径长度;at 的右侧 表示圆形在坐标轴上的位置


那对应到这个图上就是:


5f593d2d25c70227b67b0d8457ced355.png

transparent 0 50%


radial-gradient() 函数除了第一个参数,其余的参数都表示 颜色及渐变程度


因此 transparent 0 50% 表示从 圆心 开始到 半径为一半长度的位置 颜色为 透明


这里怕大家看不出来,我把 transparent 改成 blue,放效果图给大家看:


77e6a72aefef3d526db40c5510441f55.png


red 50% 100%


原理同上一个,从半径为 50% 的位置一直到半径为 100% 的部分,显示红色

效果图为:


fd0ca23b3be114efe15a83a5d143f517.png


其实只有 黄色箭头 所指出的这个区域是我们代码造成的,那为什么一直到正方形的左上角都是红色呢?因为radial-gradient() 函数需要最后设置一个 color-stop,请看下面

transparent


这也是函数的最后一个参数,表示渐变以透明色 为结束,即从上一个位置(red 50% 100%)的结束位置开始一直到容器的边缘,都显示为透明


现在再来看看效果:


1cff584c237705e01bb0dae7429cf36b.png


这样一个 1/4圆环 就画好了


那么回到我们的正文来


.douyin::before, 
.douyin::after {
  content: '';
  grid-area: 1/1;  /* 居中展示 */
+ background: 
+    radial-gradient(
+      100% 100% at 100% 100%, 
+      transparent 0 50%, 
+      #08fff9 50% 100%, 
+      transparent
+    );
}


现在咱们存放音符的容器是一个宽高比为 0.87 的长方形,如果按照我们刚刚画矩形的代码来,最后出来的应该是这样的:


8c653759bdc25a73f5bb706e06a8223a.png


很明显,圆环的两端宽度不一致,此时我们可以利用 background-size 对其进行压缩,以此得到一个宽度一致的圆环,我摆烂了,懒得计算了,直接控制台微调吧


0c69ea50f736db9f521a867dfa537c97.png


这下差不多等宽了,且大概是一个标准的 1/4圆环,然后咱们要把它放到左侧中间靠下一点的位置,代码如下:


.douyin::before, 
.douyin::after {
  content: '';
  grid-area: 1/1;  /* 居中展示 */
  background: 
    radial-gradient(
      100% 100% at 100% 100%, 
      transparent 0 50%, 
      #08fff9 50% 100%, 
      transparent
    )
+   left 52%/41% 36% no-repeat;
}


有内味儿了,有没有?


d724cc2d0e47b07620ca1b1ce82fe1be.png


画半圆


原理都相似,就放一个半圆的生成以及位移过程图吧:


17bc5424a7d71c00cf36a375bd3c3d9b.jpg


代码如下,也不过多解释各种数值的意义了,因为我全是微调的:


.douyin::before, 
.douyin::after {
  content: '';
  grid-area: 1/1;  /* 居中展示 */
  background: 
    radial-gradient(
      100% 100% at 100% 100%, 
      transparent 0 50%, 
      #08fff9 50% 100%, 
      transparent
    ) left 52%/41% 36% no-repeat,
+   radial-gradient(
+     50% 100% at top,
+     transparent 44%,
+     #08fff9 45% 98%,
+     transparent 
+   ) 0 100%/73% 31% no-repeat;
}


画长条


长条可能跟圆环和半圆不太一样,它用到的是 linear-gradient() 线性函数,我们也不搞花里胡哨的操作,就直接把整个区域都铺满颜色,然后通过横纵缩放得到一个长方形吧


.douyin::before, 
.douyin::after {
  content: '';
  grid-area: 1/1;  /* 居中展示 */
  background: 
    radial-gradient(
      100% 100% at 100% 100%, 
      transparent 0 50%, 
      #08fff9 50% 100%, 
      transparent
    ) left 52%/41% 36% no-repeat,
    radial-gradient(
      50% 100% at top,
      transparent 44%,
      #08fff9 45% 98%,
      transparent 
    ) 0 100%/73% 31% no-repeat,
+   linear-gradient(#08fff9, #08fff9) 66% 0/20% 70% no-repeat;
}


效果过程动画如下:


9069cf70f4bae9cb5dceafe72baa8222.jpg


画半径稍大一些的1/4圆环


再次略过讲解,直接看代码:


.douyin::before, 
.douyin::after {
  content: '';
  grid-area: 1/1;  /* 居中展示 */
  background: 
    radial-gradient(
      100% 100% at 100% 100%, 
      transparent 0 50%, 
      #08fff9 50% 100%, 
      transparent
    ) left 52%/41% 36% no-repeat,
    radial-gradient(
      50% 100% at top,
      transparent 44%,
      #08fff9 45% 98%,
      transparent 
    ) 0 100%/73% 31% no-repeat,
    linear-gradient(#08fff9, #08fff9) 66% 0/20% 70% no-repeat,
+   radial-gradient(
+     100% 100% at 100% 0,
+     transparent 0 58%,
+     #08fff9 58.5% 99%,
+     transparent 
+   ) 100% 0/47% 41.8% no-repeat;
}


效果图如下:


9a979b80f024e1f2aa16ab8bdb2238f6.jpg


到此为止,一个音符就画好了,离成功只剩一步之遥


相关文章
|
22天前
|
移动开发 搜索推荐 HTML5
如何使用HTML5的语义化标签来提高网站的可访问性?
【4月更文挑战第1天】如何使用HTML5的语义化标签来提高网站的可访问性?
24 1
|
7天前
|
前端开发 JavaScript 开发者
html标签的样式
【4月更文挑战第19天】html标签的样式
10 2
|
11天前
|
前端开发 搜索推荐 数据安全/隐私保护
HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
18 1
|
18天前
|
JavaScript
Vue移动 HTML 元素到指定位置 teleport 标签
Vue移动 HTML 元素到指定位置 teleport 标签
|
22天前
|
移动开发 搜索推荐 开发者
HTML5中的语义化标签有哪些?
【4月更文挑战第1天】HTML5中的语义化标签有哪些?
9 0
HTML5中的语义化标签有哪些?
|
25天前
|
存储 移动开发 前端开发
html的常用标签
【4月更文挑战第1天】html的常用标签
22 4
|
1月前
如何在HTML中添加标签
如何在HTML中添加标签【2月更文挑战第26天】
34 5
|
1月前
HTML标签
【2月更文挑战第16天】HTML标签。
22 3
|
1月前
|
移动开发 搜索推荐 HTML5
HTML语义化标签
HTML语义化标签