CSS新特性:sin()和cos()三角函数创造时钟效果
Firefox和Safari最新版本已支持CSS三角函数!这为CSS带来了强大的数学运算能力,拓展了无限可能。本教程将重点介绍sin()和cos()函数,并以此创建一个时钟。虽然tan()等其他三角函数也即将推出,但sin()和cos()函数非常适合实现沿圆周排列文本的目标,这在六年前Chris在CSS-Tricks上使用Sass mixin实现过,现在让我们用最新的技术重新实现它。
目标效果(目前仅Firefox和Safari支持):
我们将文本字符沿圆周排列,形成钟面。初始HTML结构如下:
<div class="clock"> <div class="clock-face"> <time datetime="12:00">12</time><time datetime="1:00">1</time><time datetime="2:00">2</time><time datetime="3:00">3</time><time datetime="4:00">4</time><time datetime="5:00">5</time><time datetime="6:00">6</time><time datetime="7:00">7</time><time datetime="8:00">8</time><time datetime="9:00">9</time><time datetime="10:00">10</time><time datetime="11:00">11</time> </div> </div>
接下来,为.clock
容器添加基本样式,使用<time></time>
标签并添加datetime
属性:
.clock { --_ow: clamp(5rem, 60vw, 40rem); --_w: 88cqi; aspect-ratio: 1; background-color: tomato; border-radius: 50%; container-type: inline; display: grid; height: var(--_ow); place-content: center; position: relative; width: var(--_ow); }
这只是为了创建基本形状和背景颜色,方便观察效果。注意,我们将宽度值存储在CSS变量中,稍后会用到。
现在,添加一个变量--_r
来存储圆的半径,它等于圆的宽度的一半,使用calc()
函数实现:
.clock { --_w: 300px; --_r: calc(var(--_w) / 2); /* rest of styles */ }
数学计算:圆周是360度,时钟有12个数字,每个数字间隔30度(360 / 12)。数学上,圆从3点钟开始,所以12点实际上是-90度,也就是270度(360 - 90)。
添加变量--_d
设置每个数字的度数值,以30度递增:
.clock time:nth-child(1) { --_d: 270deg; } .clock time:nth-child(2) { --_d: 300deg; } .clock time:nth-child(3) { --_d: 330deg; } /* ... rest of the numbers ... */
现在,使用sin()和cos()函数计算每个数字的X和Y坐标:
X坐标公式:半径 (半径 * cos(度数))
--_x: calc(var(--_r) + (var(--_r) * cos(var(--_d))));
Y坐标公式:半径 (半径 * sin(度数))
--_y: calc(var(--_r) + (var(--_r) * sin(var(--_d))));
为数字添加基本样式,使其绝对定位并使用计算出的坐标:
.clock-face time { --_x: calc(var(--_r) + (var(--_r) * cos(var(--_d)))); --_y: calc(var(--_r) + (var(--_r) * sin(var(--_d)))); --_sz: 12cqi; display: grid; height: var(--_sz); left: var(--_x); place-content: center; position: absolute; top: var(--_y); width: var(--_sz); }
为了更精确地定位,在计算半径时,需要减去数字的大小:
--_r: calc((var(--_w) - var(--_sz)) / 2);
更改颜色,使其更美观。
接下来,添加时针、分针和秒针:
添加HTML结构:
<div class="arm hours"></div> <div class="arm minutes"></div> <div class="arm seconds"></div>
添加样式:
.arm { /* ... styles ... */ } .seconds { /* ... styles ... */ } .minutes { /* ... styles ... */ } .hours { /* ... styles ... */ } @keyframes turn { /* ... animation ... */ }
最后,使用JavaScript设置当前时间:
// ... JavaScript code to set initial time ...
添加浏览器兼容性处理:
@supports not (left: calc(1px * cos(45deg))) { /* fallback styles */ }
最终效果:一个完整的CSS时钟!目前仅支持Firefox和Safari浏览器。
此外,还可以将时钟改造成圆形图片库或其他创意图案。
以上是使用新的CSS SIN()和COS()三角函数创建时钟的详细内容。更多信息请关注PHP中文网其他相关文章!