在 CSS 中,存在許多數學函式,這些函式能夠通過簡單的計算操作來生成某些屬性值,例如 :
- calc():用于計算任意長度、百分比或數值型資料,并將其作為 CSS 屬性值,
- min() 和 max():用于比較一組數值中的最大值或最小值,也可以與任意長度、百分比或數值型資料一同使用,
- clamp():用于將屬性值限制在一個范圍內,支持三個引數:最小值、推薦值和最大值,
在現代 CSS 解決方案:CSS 數學函式一文中,我們詳細介紹了
- calc()
- min()
- max()
- clamp()
四個數學函式,
而本文,將給大家介紹一下最近各大瀏覽器也逐漸開始原生支持的三角函式:
- sin()
- cos()
- tan()
CSS 三角函式語法介紹
首先,我們來看看 CSS 三角函式的使用方式:
.box {
/* 設定元素的寬度為 sin(30deg) 的值 */
width: calc(sin(30deg) * 100px);
/* 設定元素的高度為 cos(45deg) 的值 */
height: calc(cos(45deg) * 100%);
/* 設定元素的透明度為 tan(60deg) 的值 */
opacity: calc(tan(60deg));
}
上述代碼中,我們使用了 calc() 函式進行了計算,然后通過 sin()、cos() 和 tan() 函式對計算結果進行了進一步的處理,從而實作了不同的效果,
需要注意的是,三角函式在 CSS3 中僅對弧度(radian)單位進行支持,如果想要在開發中使用三角函式,可以借助轉換函式 deg() 和 rad() 將角度(degree)和弧度進行轉換,
CSS3 的這些函式使得開發者可以更加方便處理一些復雜的數學問題,增強了 CSS 的表現力,
三角函式的運動軌跡
三角函式的運用,更多的是在影片當中,以正弦、余弦函式為例,其圖形如下:
我們通過一個簡單的例子,還原三角函式的圖形,以此來感受三角函式的作用,首先,我們實作一個黑色圓球:
<div class='g-single'></div>
.g-single {
width: 20px;
height: 20px;
background: #000;
border-radius: 50%;
}
效果如下:
我們可以通過 transfrom,借助 CSS @property 屬性,來構造一個三角函式的使用場景:
.g-single {
width: 20px;
height: 20px;
background: #000;
border-radius: 50%;
animation: move 5s infinite ease-in-out;
transform: translate(
calc(var(--dis) - 40vw),
calc(5 * sin(var(--angle)) * 1em)
);
}
@keyframes move {
0% {
--dis: 0px;
--angle: 0deg;
}
100% {
--dis: 80vw;
--angle: 1080deg;
}
}
上述的核心在于這一段代碼 -- transform: translate(calc(var(--dis) - 40vw), calc(5 * sin(var(--angle)) * 1em)),內部使用了兩個 CSS @property 變數:
- x 軸方向是
0px到80vw的水平位移影片 - y 軸方向是
5 * sin(0deg) * 1em到5 * sin(1080deg) * 1em的豎直影片
通過影片,動態的修改這兩個變數的值,我們就可以得到一個三角函式曲線影片圖形:
如果我們,設定多個一模一樣的小球,同一個運動軌跡,設定不同的 animation-delay,效果會上怎么樣呢?
<ul >
<li> </li>
// ... 一共 80 個 li
<li> </li>
</ui>
li {
animation: move 5s infinite ease-in-out;
transform: translate(
calc(var(--dis) - 40vw),
calc(5 * sin(var(--angle)) * 1em);
}
@for $i from 1 to $count {
li:nth-child(#{$i}) {
animation-delay: #{$i * 5 / $count * -1s};
}
}
@keyframes move {
0% {
--dis: 0px;
--angle: 0deg;
}
100% {
--dis: 80vw;
--angle: 1080deg;
}
}
這樣,就得到了這么一個影片,非常的類似三角函式影片的曲線:
完整的代碼,你可以戳這里:CodePen Demo -- CSS Cos/Sin Math function
快速實作圓弧軌跡影片
在之前,我們想實作一個圓弧影片,如下所示,還是稍微有點點麻煩的:
有了三角函式之后,類似的影片,可以節省部分代碼實作:
<div></div>
@property --angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
}
.g-single {
background: #000;
width: 20px;
height: 20px;
border-radius: 50%;
animation: move 3s infinite linear;
transform: translate(
calc(sin(var(--angle)) * 10vmin),
calc(cos(var(--angle)) * 10vmin)
);
}
@keyframes move {
0% {
--angle: 0deg;
}
100% {
--angle: 360deg;
}
}
核心就在于 transform: translate(calc(sin(var(--angle)) * 10vmin), calc(cos(var(--angle)) * 10vmin));,簡化一下這段代碼,運算式為:
transform: translate(sinX, conX),其中 X 為角度變化
如此,我們只需要動態設定 X 從 0deg 到 360deg 的變化即可,就可以得到一個圓形影片效果:
完整的代碼,你可以戳這里:CodePen Demo -- CSS Cos/Sin Math function - arc animation
基于這個技巧,我們可以嘗試實作一個旋轉的 Loading 影片,代碼也非常簡單:
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
@property --angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
}
ul {
position: relative;
}
li {
position: absolute;
inset: 0;
border-radius: 50%;
animation: move 3s infinite ease-in-out;
transform: translate(
calc(sin(var(--angle)) * 60px),
calc(cos(var(--angle)) * 60px)
);
}
@for $i from 1 to 11 {
li:nth-child(#{$i}) {
animation-delay: #{ $i * -0.15 }s;
background: #{hsl(100 + $i * 15, 80%, 60%)};
}
}
@keyframes move {
0% {
--angle: 0deg;
}
100% {
--angle: 360deg;
}
}
借助了 SASS 完成了部分重復性代碼,核心就是讓小圓以不同的速率進行旋轉影片,結果如下:
完整的代碼,你可以戳這里:CSS Cos/Sin Math function - Loading animation
嘗試使用三角函式實作波浪線
那么,三角函式還有什么作用嗎?
我們來嘗試點新奇的,借助三角函式實作曲線(波浪線),
對 box-shadow 足夠了解的同學應該知道,box-shadow 是支持多重陰影的,借助這個特性,出現了很多單標簽,借助 box-shadow 來繪圖的案例,
借助三角函式、以及box-shadow 是支持多重陰影的這兩個特性,我們就可以利用它們來實作波浪線,
當然,可以還需要借助 SASS 簡化手動書寫的代碼量,我們來看一個 DEMO:
<div></div>
<div></div>
<div></div>
@function shadowSet($vx, $vy, $color) {
$shadow: 0 0 0 0 $color;
@for $i from 0 through 50 {
$x: calc(2 * sin(#{$i * 15 * 1deg}) * #{$vy});
$y: $i * $vy;
$shadow: $shadow, #{$x} #{$y} 0 0 $color;
}
@return $shadow;
}
div {
margin: auto;
width: 10px;
height: 10px;
border-radius: 50%;
background: #f00;
box-shadow: shadowSet(3px, 3px, #f00);
}
div:nth-child(2) {
width: 6px;
height: 6px;
background: #fc0;
box-shadow: shadowSet(3px, 3px, #fc0);
}
div:nth-child(3) {
width: 4px;
height: 4px;
background: #000;
box-shadow: shadowSet(2px, 2px, #000);
}
這樣,我們就能得到 3 條波浪線:
單獨看其中一個,其實是這樣一坨 box-shadow 代碼:
好吧,這個方法確實一定程度上彌補了之前 CSS 無法有效繪制波浪線的缺陷,但是,缺點也非常明顯,編譯后的代碼量太多了!
完整的代碼,你可以戳這里:CSS Cos/Sin Math And box-shadow
曲線創意構想
有了繪制曲線的能力,我們就能利用它在 CSS 中創造許多有美感、藝術性的效果,
我們可以嘗試使用這些曲線,來制作書簽圖案:
代碼也不復雜,我就不貼完整的代碼了,感興趣的可以戳這里:CodePen Demo - CSS Cos/Sin Math And box-shadow - bookmark
熟悉我的讀者一定對 CSS-doodle 不陌生,袁川老師,也就是 CSS-doodle 庫的作者,在他的 Codepen 首頁背景板中,使用的就是使用了三角函式實作的一副純 CSS 畫作:
Codepen Demo -- border-radius
我之前也嘗試使用三角函式,實作了一副丑一點的:
Codepen Demo -- CSS-Doodle fish ?? & seaweed??
總結一下
CSS 原生支持的三角函式,給 CSS 打開了更多的可能性,
但是,我們也必須看到,各種數學函式的增加,導致 CSS 的復雜度也是愈來愈高,CSS 已經不再是非常純粹的負責樣式了,很多時候,很多計算也可以直接在 CSS 當中完成,其中利弊,可能不同的人會有不一樣的看法,至于好壞,交給時間給出答案吧,
好了,本文到此結束,希望對你有幫助 ??
更多精彩 CSS 技術文章匯總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏,
如果還有什么疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/553391.html
標籤:其他
上一篇:2D 轉換
下一篇:返回列表
