仅用一个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


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


相关文章
|
1月前
|
移动开发 JavaScript Java
关于Android中如何过滤HTML标签
关于Android中如何过滤HTML标签
37 0
HTML基础知识(1)常用标签的使用 h、p、img、meta、a、iframe...
该博客文章详细介绍了HTML的基础知识,包括注释、标签属性、常用标签、实体、图片引入、meta标签、内联框架、超链接的使用,并通过代码示例和测试结果截图展示了这些元素在网页中的应用效果。
HTML基础知识(1)常用标签的使用 h、p、img、meta、a、iframe...
|
11天前
|
移动开发 搜索推荐 前端开发
HTML结构的基本标签
HTML结构的基本标签
|
26天前
|
数据采集 缓存 自然语言处理
PHP将HTML标签转化为图片
通过这个方法,PHP后端能够实现将HTML内容转化为图片的功能。这种方式虽然牵涉到一些额外的安装和配置,但能够相对灵活且稳定地解冀转换需求,适用于需要在后端动态生成图片的场景。
26 1
|
4天前
HTML lable标签
HTML lable标签
|
4天前
|
移动开发 HTML5
HTML lable标签
HTML lable标签
|
1月前
|
搜索推荐 前端开发 SEO
SEO需要了解的8大html标签
SEO需要了解的8大html标签
35 2
|
1月前
HTML【详解】表格 table 标签(table的属性,语义化表格,简易表格,合并单元格)
HTML【详解】表格 table 标签(table的属性,语义化表格,简易表格,合并单元格)
69 0
HTML【详解】表格 table 标签(table的属性,语义化表格,简易表格,合并单元格)
|
1月前
|
XML 数据采集 机器学习/深度学习
使用 XPath 定位 HTML 中的 img 标签
使用 XPath 定位 HTML 中的 img 标签
|
1月前
HTML【详解】超链接 a 标签的四大功能(页面跳转、页内滚动【锚点】、页面刷新、文件下载)
HTML【详解】超链接 a 标签的四大功能(页面跳转、页内滚动【锚点】、页面刷新、文件下载)
25 0