当前位置: 首页 > Web前端 > HTML5

前端日常实践:166#视频演示如何使用CSS制作SafariLOGO

时间:2023-04-05 01:45:50 HTML5

效果预览按右侧“点击预览”按钮可在当前页面预览,点击链接可全屏预览。https://codepen.io/comehop??e/pen/rgmPLR互动视频本视频为互动视频,您可以随时暂停视频,编辑视频中的代码。请使用chrome、safari、edge打开观看。https://scrimba.com/p/pEgDAM/c2LBPPtg源码下载日常前端实战系列完整源码请到github下载:https://github.com/comehop??e/front-end-daily-challenges代码解读容器基本属性Safari浏览器的LOGO是一个圆规的形状,主要有两个元素,一个是表盘周围的刻度线,一个是中间的指针。所以我们定义dom结构如下,其中.marks代表刻度线,.pointer代表指针。.marks中有4个元素,代表刻度线。有几十个实际的刻度线。这里只定义了4个。目的是促进写作风格。样式写好后会使用JavaScript批量生成勾号:

让作品显示在页面中央,背景为页面是黑色的:body{margin:0;高度:100vh;显示:弹性;对齐项目:居中;证明-内容:中心;background-color:black;}LOGO容器是一个白色的圆角正方形。作品将使用em作为长度单位。如果要修改LOGO的大小,只需要修改这里的font-size属性即可。使用flexlayout将子元素.marks和.pointer居中:.safari{font-size:10px;宽度:15em;高度:15em;背景色:雪;边界半径:25%;填充:1em;显示:弹性;对齐项目:居中;justify-content:center;}绘制刻度线首先绘制刻度线所在的刻度盘,用线性渐变的蓝色渐变色填充:.marks{width:inherit;高度:继承;背景图像:线性渐变(hsl(191、98%、55%)、hsl(220、88%、53%));border-radius:50%;}再次绘制刻度线。画圆的技巧是先将一组元素旋转一个小角度(使用rotate()函数),然后沿旋转方向移动元素(使用translate()函数)。这里变量--rotate-deg用于存储旋转角度:.marks{display:flex;对齐项目:居中;证明内容:中心;}.marks跨度{位置:绝对;宽度:0.1em;高度:0.9em;背景色:雪;变换:旋转(var(--rotate-deg))translateY(6em);}.marksspan:nth-??child(1){--rotate-deg:0deg;}.marksspan:nth-??child(2){--rotate-deg:90deg;}.marksspan:nth-child(3){--rotate-deg:180deg;}.marksspan:nth-child(4){--rotate-deg:270deg;}现在可以看到4条刻度线分别位于表盘的上下左右边缘。用Javascript批量生成刻度线因为刻度线很多,为了减少代码量,我们使用JavaScript批量生成刻度线。在此之前,删除html中声明元素的4行代码:
删除中刻度线角度的设置CSS代码:/*.marksspan:nth-child(1){--rotate-deg:0deg;}.marksspan:nth-child(2){--rotate-deg:90deg;}.marksspan:nth-child(3){--rotate-deg:180deg;}.marksspan:nth-child(4){--rotate-deg:270deg;}*/然后用js批量创建60个刻度线:constMARKS_COUNT=60Array(MARKS_COUNT).fill('').forEach((x,i)=>{letspan=document.createElement('span')span.style.setProperty('--rotate-deg',i*360/MARKS_COUNT+'deg')document.querySelector('.marks').appendChild(span)})这里稍微复杂一点的表达式是i*360/MARKS_COUNT+'deg',其中360/MARKS_COUNT是将圆的360度数分成若干份(即份数与刻度线数),然后将每份的角度乘以每份的下标值i,得到每条刻度线它应该旋转的角度。接下来,设置刻度线的细节,使刻度线的长度交错。代表刻度线长度的变量是--h,长线的长度是0.9em,短线的长度是0.5em。为了对齐刻度线,使用变量--y来存储偏移量,使得长线偏移6em,短线偏移6.2em。同时修改height属性和translateY()函数,让它们引用这2个变量的值。因为刻度线的长度是交错的,所以使用:nth-child(odd)和:nth-child(even)设置两组不同的参数值:.marksspan{height:var(--h);转换:旋转(var(--rotate-deg))translateY(var(--y));}.marksspan:nth-??child(odd){--h:0.9em;--y:6em;}.marksspan:nth-child(even){--h:0.5em;--y:6.2em;}至此,刻度线绘制完成。绘制指针指针由2个三角形组成,对于这种成对元素,通常绘制伪元素。先确定指针的大小,利用flex将其子元素(即2个伪元素)垂直排列:.pointer{position:absolute;宽度:1.4em;高度:12em;显示:弹性;flex-direction:column;}画三角形的技巧就是让容器的尺寸为0宽0高,然后用3个边框组成一个三角形。如果您不理解这段代码,请自己尝试一下。这里还定义了一个变量——c,用来存储两个三角形的颜色,分别是红色和白色:.pointer::before,.pointer::after{content:'';border-bottom:6emsolidvar(--c);左边框:0.7em固体透明;border-right:0.7emsolidtransparent;}.pointer::after{transform:rotate(180deg);}.pointer::before{--c:crimson;}.pointer::after{--c:snow;}到这里,指针的绘制就完成了,整个LOGO的造型也完成了。最后,添加一点动画,让指针像指南针一样转动。原理很简单,就是让指针在30度到50度之间来回摆动:.pointer{transform:rotate(30deg);动画:旋转1sease-in-out无限交替;}@keyframesrotate{to{transform:rotate(50deg);}}你完成了!