成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

如何在CSS中繪制曲線圖形及展示動畫

瀏覽:127日期:2022-06-02 16:25:21
目錄
  • 理解 box-shadow
    • 使用陰影復(fù)制圖像/投影圖像
  • 在陰影坐標中運用三角函數(shù)
    • 三角函數(shù)
    • 如何在 CSS 中使用三角函數(shù) sin/cos
    • 控制顏色及初始方向
    • 控制顏色
  • 在 css-doodle 中使用
    • 總結(jié)

      理解 box-shadow

      首先,回顧一下box-shadow這個屬性。基本屬性用法就是給元素創(chuàng)造一層陰影。

      再簡單提一下,本文會用到的關(guān)于陰影的第一個技巧:

      使用陰影復(fù)制圖像/投影圖像

      當 box-shadow 的第三、第四個參數(shù)模糊半徑和擴張半徑都為 0 的時候,我們可以得到一個和元素大小一樣的陰影:

      div {    width: 80px;    height: 80px;    border: 1px solid #333;    box-sizing: border-box;    box-shadow: 80px 80px 0 0 #000;}

      得到如下結(jié)果:

      陰影可以是多重的

      第二個技巧則是,box-shadow是允許多重陰影的,并且他們的坐標是可以完全掌控的。

      是的,我們可以像下面這樣給一個元素定義多重陰影,并且利用陰影的第一、第二個參數(shù)控制它相對于元素的坐標:

      div {    width: 80px;    height: 80px;    border: 1px solid #333;    box-sizing: border-box;    box-shadow:80px 80px 0 0 #000,70px 70px 0 0 #000,...60px 60px 0 0 #000;}

      在陰影坐標中運用三角函數(shù)

      繼續(xù)。接下來,我們嘗試在陰影的坐標中引入三角函數(shù)。

      為啥是三角函數(shù),不是圓的標準方程或者橢圓的標準方程或者其他圖形函數(shù)呢?當然也是可以的,只是這里借助三角函數(shù)的cos或sin可以實現(xiàn)直接使用 CSS 實現(xiàn)起來很困難的曲線。

      帶著疑問,先繼續(xù)向下,假設(shè)我們要實現(xiàn)這樣一條曲線:

      使用 CSS 的話,有什么辦法呢?

      可能的一些辦法是clip-path,或者一些奇技淫巧,使用text-decoration里的波浪下劃線wavy,或者是使用漸變疊加。

      當然,還有一種辦法是本文將提到的使用box-shadow及 三角函數(shù)。

      三角函數(shù)

      咳咳,簡單回顧下三角函數(shù)里面的 sin、cos 曲線圖像變換,還沒有全部還給老師。

      如果我們有一個 1x1 的 div,它的多重陰影,能夠按照像正弦/余弦函數(shù)的圖像一樣進行排布,連起來不就是一條曲線嗎?

      如何在 CSS 中使用三角函數(shù) sin/cos

      想法不錯,但是 CSS 本身并沒有提供三角函數(shù)。這里,我們需要借助 Sass 來在 CSS 中實現(xiàn)簡單的三角函數(shù)。

      還好,已經(jīng)有前人幫忙把這個工作做完了:

      • trigonometry in sass
      • 在Sass中實現(xiàn)三角函數(shù)計算

      簡單而言,就是借助三角函數(shù)的泰勒展開式,使用 Sass 函數(shù)模擬實現(xiàn)三角函數(shù)的 sin()、cos()、tan():

      由于展開式是無限長的,使用 Sass 函數(shù)模擬時,不可能得到一個非常精確的值,但是在日常作圖下已經(jīng)完全夠用了,以下是使用 Sass 函數(shù)模擬實現(xiàn)三角函數(shù)的 sin()、cos()、tan():

      @function fact($number) {    $value: 1;    @if $number>0 {@for $i from 1 through $number {    $value: $value * $i;}    }    @return $value;} @function pow($number, $exp) {    $value: 1;    @if $exp>0 {@for $i from 1 through $exp {    $value: $value * $number;}    }    @else if $exp < 0 {@for $i from 1 through -$exp {    $value: $value / $number;}    }    @return $value;} @function rad($angle) {    $unit: unit($angle);    $unitless: $angle / ($angle * 0 + 1);    @if $unit==deg {$unitless: $unitless / 180 * pi();    }    @return $unitless;} @function pi() {    @return 3.14159265359;} @function sin($angle) {    $sin: 0;    $angle: rad($angle);    // Iterate a bunch of times.    @for $i from 0 through 20 {$sin: $sin + pow(-1, $i) * pow($angle, (2 * $i + 1)) / fact(2 * $i + 1);    }    @return $sin;} @function cos($angle) {    $cos: 0;    $angle: rad($angle);    // Iterate a bunch of times.    @for $i from 0 through 20 {$cos: $cos + pow(-1, $i) * pow($angle, 2 * $i) / fact(2 * $i);    }    @return $cos;} @function tan($angle) {    @return sin($angle) / cos($angle);}

      由于上面最終計算 sin、cos 泰勒展開的時候,只使用了 20 層循環(huán),所以當傳入的值太大的時候,則會產(chǎn)生較大誤差。經(jīng)測試,傳入數(shù)值在 [-20, 20] 以內(nèi),精度還是非常高的。

      而以 sin 函數(shù)為例,x 取值在 [-π, π] 之間,已經(jīng)能覆蓋所有 sin(x) 的取值范圍,所以 [-20, 20] 這個范圍是完全夠用的,我們只需要盡量讓傳入的 x 值落在這個區(qū)域范圍內(nèi)即不會產(chǎn)生太大誤差。

      好,鋪墊了那么多,接下來使用上述的 sin 函數(shù)試一下,假設(shè)我們有這樣一個結(jié)構(gòu):

      div {    width: 1px;    height: 1px;    background: #000;    border-radius: 50%;}

      我們再借助 Sass 實現(xiàn)一個 50 層的循環(huán),當然其中陰影的 x 坐標使用了 sin 函數(shù):

      @function shadowSet($vx, $vy) {    $shadow : 0 0 0 0 #000;         @for $i from 0 through 50 {$x: sin($i / 8) * $vx;$y: $i * $vy; $shadow: $shadow, #{$x} #{$y} 0 0 rgba(0, 0, 0, 1);    }         @return $shadow;} div {    width: 1px;    height: 1px;    background: #000;    border-radius: 50%;    box-shadow: shadowSet(4px, 1px);}

      上面sin($i / 8),這里除以 8 是為了讓整個sin(x) 傳入的作用域的取值范圍為 [0, 6.25],當而 sin(x) 的作用域為 [0,2π] 時剛好可以畫一條完整的單次曲線。這個 8 是可以根據(jù)循環(huán)的次數(shù)不同而進行調(diào)整的。

      實際,我們得到的box-shadow如下:

      {    box-shadow:    0 0 0 0 black, 0.4986989335px 1px 0 0 black, 0.989615837px 2px 0 0 black,    1.4650901163px 3px 0 0 black, 1.9177021544px 4px 0 0 black, 2.3403890918px 5px 0 0 black,    2.7265550401px 6px 0 0 black, 3.0701740089px 7px 0 0 black, 3.3658839392px 8px 0 0 black,    3.6090703764px 9px 0 0 black, 3.7959384774px 10px 0 0 black, 3.9235722281px 11px 0 0 black,    3.9899799464px 12px 0 0 black, 3.9941253622px 13px 0 0 black, 3.9359437875px 14px 0 0 black,    3.8163431264px 15px 0 0 black, 3.6371897073px 16px 0 0 black, 3.4012791593px 17px 0 0 black,    3.1122927876px 18px 0 0 black, 2.7747401278px 19px 0 0 black, 2.3938885764px 20px 0 0 black,    1.9756811944px 21px 0 0 black, 1.5266439682px 22px 0 0 black, 1.0537839735px 23px 0 0 black,    0.5644800322px 24px 0 0 black, 0.0663675689px 25px 0 0 black, -0.4327805381px 26px 0 0 black,    -0.9251752496px 27px 0 0 black, -1.4031329108px 28px 0 0 black, -1.8591951521px 29px 0 0 black,    -2.286245275px 30px 0 0 black, -2.677619305px 31px 0 0 black, -3.0272099812px 32px 0 0 black,    -3.3295620582px 33px 0 0 black, -3.5799574329px 34px 0 0 black, -3.7744887692px 35px 0 0 black,    -3.9101204707px 36px 0 0 black, -3.9847360499px 37px 0 0 black, -3.9971711559px 38px 0 0 black,    -3.9472317429px 39px 0 0 black, -3.8356970987px 40px 0 0 black, -3.6643076841px 41px 0 0 black,    -3.4357379737px 42px 0 0 black, -3.1535547213px 43px 0 0 black, -2.8221613023px 44px 0 0 black,    -2.446729px 45px 0 0 black, -2.03311631px 46px 0 0 black, -1.58777752px 47px 0 0 black,    -1.1176619928px 48px 0 0 black, -0.630105724px 49px 0 0 black, -0.1327168662px 50px 0 0 black;}

      實際得到的圖像如下:

      控制顏色及初始方向

      看看上面 Sass 實現(xiàn)的這個方法@function shadowSet($vx, $vy),其中$vx,$vy用于控制圖像的振幅及松散程度,我們再添加一個控制初始方向的$direction,控制陰影層數(shù)的 $count, 控制顏色的 $color:

      @function shadowSet($vx, $vy, $direction, $count, $color) {    $shadow : 0 0 0 0 $color;         @for $i from 0 through $count {$x: sin($i / 8) * $vx * $direction;$y: $i * $vy; $shadow: $shadow, #{$x} #{$y} 0 0 $color;    }         @return $shadow;}.line {    width: 1px;    height: 1px;    margin: 10vh auto;    background: #000;    border-radius: 50%;    box-shadow: shadowSet(4px, 1px, 1, 50, #000);} .reverseline {    width: 1px;    height: 1px;    margin: 10vh auto;    background: #000;    border-radius: 50%;    box-shadow: shadowSet(8px, 2px, -1, 100, red);}

      控制顏色

      再進一步,我們可以借助 Sass 的各種顏色函數(shù),實現(xiàn)顏色的變化:

      @function shadowSetColor($vx, $vy, $direction, $count, $color) {    $shadow : 0 0 0 0 $color;         @for $i from 0 through $count { $color: lighten($color, .5); $x: sin($i / 8) * $vx * $direction;$y: $i * $vy; $shadow: $shadow, #{$x} #{$y} 0 0 $color;    }         @return $shadow;} .colorline {    width: 5px;    height: 5px;    margin: 10vh auto;    background: green;    border-radius: 50%;    box-shadow: shadowSetColor(8px, 2px, -1, 100, green);}

      上面,借助了lighten這個函數(shù),通過改變顏色的亮度值,讓顏色變亮,創(chuàng)建一個新的顏色。

      當然,Sass 中還有很多其他顏色函數(shù):

      • adjust-hue($color,$degrees):通過改變一個顏色的色相值,創(chuàng)建一個新的顏色;
      • lighten($color,$amount):通過改變顏色的亮度值,讓顏色變亮,創(chuàng)建一個新的顏色;
      • darken($color,$amount):通過改變顏色的亮度值,讓顏色變暗,創(chuàng)建一個新的顏色;
      • saturate($color,$amount):通過改變顏色的飽和度值,讓顏色更飽和,從而創(chuàng)建一個新的顏色
      • desaturate($color,$amount):通過改變顏色的飽和度值,讓顏色更少的飽和,從而創(chuàng)建出一個新的顏色;

      OK,看看這次的效果:

      @function fact($number) {    $value: 1;    @if $number>0 {@for $i from 1 through $number {    $value: $value * $i;}    }    @return $value;}

      在 css-doodle 中使用

      OK,前面所有的鋪墊都是為了在實際的一些創(chuàng)意想法中去使用它。

      在 css-doodle 中,由于是利用 Web Component 特性。在需要三角函數(shù)的時候,可以直接使用 JavaScript 提供的 Math 函數(shù),會更加的方便。

      Web Components 是一套不同的 Web 技術(shù),允許您創(chuàng)建可重用的定制元素(它們的功能封裝在您的代碼之外)并且在您的web應(yīng)用中使用它們。

      袁川老師,也就是 css-doodle 庫的作者,在他的 Codepen 首頁背景板中,使用的就是使用上述技巧實現(xiàn)的一副純 CSS 畫作:

      html, body {    height: 100%;    margin: 0;  display: flex;  align-items: center;  justify-content: center;  background: #000; } 
      <style>  css-doodle {    --color: @p(#010059, #52437b, #ff7a8a, #fcf594)@p([2-9a-d])@lp();    --rule: (      :doodle {@grid: 8 / 120vmin 80vmin;max-width: 100vw;background: linear-gradient(#ff7a8a, #fcf594);filter: hue-rotate(-22deg);overflow: hidden;      }      @size: @r(4vmin, 15vmin);      mix-blend-mode: multiply;      transform: translate(@m2(@r(-80%, 100%)));      border-radius: 50%;      --n: @p(-1, 1);      --c: var(--color);      box-shadow: @m100(calc(@sin(@n() / 10) * 1.8vmin * @var(--n))calc(@n() * 1vmin) 0@var(--c)      );      background: @m(@p(0, @ri(500)), (radial-gradient(var(--color) 50%, transparent 0)@r(100%) @r(100%) / @r(1px, 3px) @lr()no-repeat      ));      background-color: var(--color);    );  }   </style><css-doodle use="var(--rule)" click-to-update></css-doodle>

      我也嘗試使用這個技巧,做了一副

      總結(jié)

      有幾點,有必要提一下的。

      1、為什么一定要使用box-shadow,直接堆疊 div 不行么?

      可以,使用多重box-shadow只是因為這樣可以更省標簽,一個 div 搞定。更甚,愿意折騰,使用多重漸變也是可以的。

      2、上述兩個 Demo 都是純 CSS 畫出來的嗎?

      是的。雖然借助了 css-doodle 庫,但是本質(zhì)都是 CSS 代碼,只是這個庫封裝好了很多拿來即用的函數(shù)。css-doodle

      3、有什么用?

      額,有沒有用是一個哲學(xué)問題。至少我覺得還是挺有意思的。

      以上就是如何在CSS中繪制曲線圖形及展示動畫的詳細內(nèi)容,更多關(guān)于在CSS中繪制曲線圖形及展示動畫的資料請關(guān)注其它相關(guān)文章!

      標簽: CSS HTML
      相關(guān)文章:
      成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
      热久久一区二区| 视频精品一区二区| 欧美激情综合网| 久久精品国产久精国产| 91性感美女视频| 欧美日精品一区视频| 中文字幕佐山爱一区二区免费| 福利一区福利二区| 久久国产精品一区二区三区四区| 久久久久久久久一| 国产又粗又猛又爽又黄91精品| 国产精品欧美久久| 久久久噜噜噜久噜久久综合| 理论片日本一区| 国产日韩欧美一区| 久久亚洲一区二区三区四区| 国产精品福利一区| 国产很黄免费观看久久| 久久久久九九九| 国产精品电影院| 你懂的视频一区二区| 日韩视频一区二区| 亚洲国产精品精华液网站| 国内精品久久久久久久影视蜜臀| 日韩欧美精品在线视频| 久久99精品一区二区三区| 美日韩在线观看| 爽爽淫人综合网网站| 欧美吻胸吃奶大尺度电影 | 日本成人在线不卡视频| 在线观看一区二区精品视频| 久久精品国产亚洲a| 欧美日本乱大交xxxxx| 国产寡妇亲子伦一区二区| 欧美成人激情免费网| 欧美1区视频| 亚洲人成网站影音先锋播放| 国产精品毛片一区二区三区 | 日韩不卡在线观看日韩不卡视频| 色婷婷综合久色| 国产一区二区看久久| 日韩欧美在线不卡| 91片在线免费观看| 亚洲精选在线视频| 狼狼综合久久久久综合网 | 一区二区三区中文字幕电影| 久久久久久一区二区| 精品中文av资源站在线观看| 精品欧美黑人一区二区三区| 欧美日韩喷水| 亚洲制服丝袜一区| 欧美日韩卡一卡二| 99国产精品久久久久| 亚洲视频在线观看一区| 在线午夜精品| 久久精品国产亚洲a| 欧美变态口味重另类| 亚洲性感美女99在线| 精品一区二区在线播放| 一区在线视频观看| 国产酒店精品激情| 欧美日韩一视频区二区| 日本一区二区三区在线观看| 国产精品毛片在线看| 欧美日韩日本国产亚洲在线| 亚洲一区二区三区视频在线播放| 久久久av水蜜桃| 国产精品一卡二| 中文字幕的久久| 亚洲青涩在线| 日韩高清不卡一区二区| 日韩一区二区三区三四区视频在线观看| 在线亚洲精品福利网址导航| 高清国产一区二区三区| 国产精品美女久久久久aⅴ| 免费精品视频| 国产成人免费视频网站| 久久亚洲精精品中文字幕早川悠里| 亚洲国产精品综合| 精品一区二区三区免费毛片爱| 亚洲国产精品激情在线观看| 久久综合狠狠综合久久综青草| 风间由美一区二区三区在线观看 | 久久久亚洲精华液精华液精华液| 国产一区二区三区自拍| 天天综合网 天天综合色| 日韩精品一区二区三区视频在线观看| 亚洲午夜黄色| 韩国av一区二区三区| 中文字幕一区二区三区四区不卡 | 91麻豆精品91久久久久同性| 韩日精品视频| 韩国精品免费视频| 成人欧美一区二区三区1314| 欧美日本国产视频| 久久精品五月婷婷| 欧美淫片网站| 免费精品视频在线| 国产精品久久久久一区二区三区| 欧美综合欧美视频| 欧美久久久久久| 九九精品一区二区| 中文字幕在线观看不卡| 91福利精品视频| 亚洲性视频h| 国产精品66部| 亚洲成av人片在线| 国产日产亚洲精品系列| 欧美日韩五月天| 亚洲色图自拍| 99re6这里只有精品视频在线观看| 日韩中文字幕麻豆| 国产精品久久久久桃色tv| 欧美日韩国产综合一区二区三区| 亚洲乱码视频| www.一区二区| 久久99精品国产.久久久久| 亚洲激情五月婷婷| 精品久久国产老人久久综合| 日本精品一区二区三区四区的功能| 亚洲欧美一级二级三级| 国产一区二区按摩在线观看| 亚洲五码中文字幕| 久久久精品日韩欧美| 欧美日韩午夜精品| 欧美中文日韩| 狠狠色综合一区二区| av在线播放不卡| 久久97超碰国产精品超碰| 一区二区高清免费观看影视大全| 久久久91精品国产一区二区精品| 欧美精品一二三区| 久久天天狠狠| 韩国精品一区二区三区| www.日韩在线| 国产成人av一区二区三区在线观看| 日韩高清一级片| 亚洲另类在线制服丝袜| 国产精品久久久久婷婷二区次| 精品成人在线观看| 欧美日韩精品一区二区三区| 另类av一区二区| 亚洲日本无吗高清不卡| 欧美承认网站| 不卡的电影网站| 国产精品99久久久久久久vr| 久久精品国产99国产精品| 亚洲成在人线在线播放| 中文字幕中文字幕在线一区| 久久综合久久综合亚洲| 日韩欧美中文一区| 欧美日韩一区久久| 91国在线观看| 色狠狠一区二区| 久久一区二区精品| 亚洲欧美电影在线观看| 国产视频一区欧美| 99国产精品99久久久久久粉嫩| 欧美日韩在线精品| 你懂的国产精品| 午夜久久影院| 亚洲欧美伊人| 欧美大片一区| 色综合色狠狠综合色| 成人午夜激情视频| 高清shemale亚洲人妖| 成人一区二区视频| 国产成人在线视频网址| 国产精品99久久久久久似苏梦涵| 极品尤物av久久免费看| 九九久久精品视频| 国产一二精品视频| 国产经典欧美精品| 成人精品视频一区二区三区尤物| 国产不卡一区视频| 成人精品亚洲人成在线| 99久久婷婷国产精品综合| www.成人在线| 欧美一区1区三区3区公司| 99视频在线精品| 91影视在线播放| 色综合天天综合| 国产精品对白刺激久久久| 亚洲一级特黄| 亚洲精品少妇| 亚洲免费大片| 国产精品免费区二区三区观看| 国产亚洲一区在线| 免费亚洲网站| 色婷婷综合久久| 欧美日韩国产片| 日韩精品一区二区三区四区视频| 久久免费偷拍视频| 国产色91在线| 中文字幕一区二区三区在线不卡 | 在线成人av网站| 精品久久一区二区三区| 国产无人区一区二区三区| 亚洲色图视频网| 午夜欧美视频在线观看|