主頁 > 企業開發 > 現代 CSS 解決方案:CSS 原生支持的三角函式

現代 CSS 解決方案:CSS 原生支持的三角函式

2023-05-25 14:04:28 企業開發

在 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 變數:

  1. x 軸方向是 0px80vw 的水平位移影片
  2. y 軸方向是 5 * sin(0deg) * 1em5 * 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 從 0deg360deg 的變化即可,就可以得到一個圓形影片效果:

完整的代碼,你可以戳這里: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 轉換

下一篇:返回列表

標籤雲
其他(159682) Python(38169) JavaScript(25452) Java(18129) C(15231) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7211) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5341) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4576) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1976) 功能(1967) Web開發(1951) HtmlCss(1944) C++(1922) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 現代 CSS 解決方案:CSS 原生支持的三角函式

    在 CSS 中,存在許多數學函式,這些函式能夠通過簡單的計算操作來生成某些屬性值,例如 : * calc():用于計算任意長度、百分比或數值型資料,并將其作為 CSS 屬性值。 * min() 和 max():用于比較一組數值中的最大值或最小值,也可以與任意長度、百分比或數值型資料一同使用。 * c ......

    uj5u.com 2023-05-25 14:04:28 more
  • 2D 轉換

    1.轉換 轉換(transform)是CSS3中具有顛覆性的特征之一,可以實作元素的位移、旋轉、縮放等效果。 轉換(transform)可以簡單理解為變形。 移動:translate 旋轉:rotate 縮放:scale 1.1 二維坐標系 2D轉換是改變在二維平面上的位置和形狀的一種技術。 1.2 ......

    uj5u.com 2023-05-25 14:04:12 more
  • 【一步步開發AI運動小程式】七、進行運動計時、計數

    > 隨著人工智能技術的不斷發展,阿里體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓**云上運動會、線上運動會、健身打卡、AI體育指導**等概念空前火熱。那么,能否將這些在APP成功應用的場景搬上小程式,分享這些概念的紅利呢?本系列文章就帶您一步一步從零開始開發一個AI運動小程式,本 ......

    uj5u.com 2023-05-25 14:03:53 more
  • 封裝vue基于element的select多選時啟用滑鼠懸停折疊文字以toolti

    相信很多公司的前端開發人員都會選擇使用vue+element-ui的形式來開發公司的管理后臺系統,基于element-ui很豐富的組件生態,我們可以很快速的開發管理后臺系統的頁面(管理后臺系統的頁面也不復雜,大多都是分頁查詢類需求和增刪改查)。但一個前端框架有優點,就必然會有一些缺點或bug存在,e... ......

    uj5u.com 2023-05-25 13:50:15 more
  • 【一步步開發AI運動小程式】七、進行運動計時、計數

    > 隨著人工智能技術的不斷發展,阿里體育等IT大廠,推出的“樂動力”、“天天跳繩”AI運動APP,讓**云上運動會、線上運動會、健身打卡、AI體育指導**等概念空前火熱。那么,能否將這些在APP成功應用的場景搬上小程式,分享這些概念的紅利呢?本系列文章就帶您一步一步從零開始開發一個AI運動小程式,本 ......

    uj5u.com 2023-05-25 13:33:47 more
  • 關于如何處理httpOnly的問題?

    寫這篇的目的是,今天在重新學習javascript時發現了HttpOnly這個標簽,所以專門的mark了下。 誰在什么時候發明了HttpOnly 2002年微軟為ie6的sp1創造了HttpOnly 什么是HttpOnly HttpOnly是包含在http回傳頭Set-Cookie里面的一個附加的f ......

    uj5u.com 2023-05-25 13:32:23 more
  • 關于如何處理httpOnly的問題?

    寫這篇的目的是,今天在重新學習javascript時發現了HttpOnly這個標簽,所以專門的mark了下。 誰在什么時候發明了HttpOnly 2002年微軟為ie6的sp1創造了HttpOnly 什么是HttpOnly HttpOnly是包含在http回傳頭Set-Cookie里面的一個附加的f ......

    uj5u.com 2023-05-25 09:16:50 more
  • Three.js 進階之旅:滾動控制模型影片和相機影片 &#129442;

    本文將學習如何使用滾動控制 ScrollControls 來控制模型的的影片播放和相機影片,通過滾動滑鼠滾輪或者上下移動觸摸板,來控制模型的影片播放進度或者相機的方位視角,從而呈現出驚艷的視覺效果。通過本文的閱讀和案例頁面的實作,你將學習到的知識包括:R3F 生態中的 ScrollControls、... ......

    uj5u.com 2023-05-25 09:16:10 more
  • Cesium開發案例整理

    >WebGL近幾年越來越被人們所關注,但是二三維開發難度也比普通web要高出許多,不管我們是在在開發或者是學習程序中,往往需要耗費大量的時間去查閱資料,和研究官方案例, >而大多二三維的包(openlayersjs,cesiumjs、threejs)都是外國的,如果英語水平好還行,否則讀起來正是連蒙 ......

    uj5u.com 2023-05-25 09:15:16 more
  • 記錄--按鈕級別權限怎么控制

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最近的面試中有一個面試官問我按鈕級別的權限怎么控制,我說直接v-if啊,他說不夠好,我說我們專案中按鈕級別的權限控制情況不多,所以v-if就夠了,他說不夠通用,最后他對我的評價是做過很多東西,但是都不夠深入,好吧,那今天我們就來深入深入。 ......

    uj5u.com 2023-05-25 09:14:55 more