校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 如何在CSS中繪制曲線圖形及展示動畫

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

熱門標簽:山東電銷機器人軟件 申請400電話移動 成都企業(yè)外呼系統(tǒng) 常州電話外呼系統(tǒng)招商 洛陽防封卡外呼系統(tǒng)廠家 智能語音電銷機器人客戶端 南通電銷外呼系統(tǒng)軟件 上海400電話辦理到易號網(wǎng) 廣州防封電銷機器人廠家

理解 box-shadow

首先,回顧一下box-shadow這個屬性?;緦傩杂梅ň褪墙o元素創(chuàng)造一層陰影。

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

使用陰影復制圖像/投影圖像

當 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、有什么用?

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

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

您可能感興趣的文章:
  • js css3實現(xiàn)圖片拖拽效果
  • 原生js和css實現(xiàn)圖片輪播效果
  • 利用CSS、JavaScript及Ajax實現(xiàn)圖片預(yù)加載的三大方法
  • BootStrap 圖片樣式、輔助類樣式和CSS組件的實例詳解
  • 利用CSS、JavaScript及Ajax實現(xiàn)圖片預(yù)加載的方法
  • 基于cssSlidy.js插件實現(xiàn)響應(yīng)式手機圖片輪播效果
  • 詳解CSS不定寬溢出文本適配滾動
  • 詳解盒子端CSS動畫性能提升
  • 詳解CSS玩轉(zhuǎn)圖片Base64編碼

標簽:廣安 混顯 賀州 鶴壁 邵陽 萊蕪 貴州 滄州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《如何在CSS中繪制曲線圖形及展示動畫》,本文關(guān)鍵詞  如,何在,CSS,中,繪制,曲線,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《如何在CSS中繪制曲線圖形及展示動畫》相關(guān)的同類信息!
  • 本頁收集關(guān)于如何在CSS中繪制曲線圖形及展示動畫的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产亚洲1区2区3区| 风流少妇一区二区| 国产一区美女在线| 丁香婷婷综合色啪| 欧美一a一片一级一片| 日韩久久免费av| 国产精品久久久久9999吃药| 五月天亚洲婷婷| 国产美女在线观看一区| 精品国产一区二区精华| 中文字幕一区二区在线播放| 无吗不卡中文字幕| 大白屁股一区二区视频| 欧美色图12p| 国产日韩欧美精品一区| 一区二区三区91| 国产主播一区二区| 欧美日韩夫妻久久| 国产精品天干天干在线综合| 亚洲va国产va欧美va观看| 国产乱理伦片在线观看夜一区 | 中文字幕一区三区| 日韩电影在线看| 91在线一区二区| 亚洲精品一区二区三区精华液| 亚洲人成精品久久久久久| 九九视频精品免费| 在线观看精品一区| 中文字幕的久久| 蜜臀av一区二区| 欧美在线不卡一区| 国产精品色一区二区三区| 日韩一区欧美二区| 色域天天综合网| 亚洲国产高清aⅴ视频| 日本少妇一区二区| 欧美亚洲综合一区| 亚洲图片另类小说| 国产激情视频一区二区三区欧美| 欧美高清视频不卡网| 亚洲日本va午夜在线影院| 国产麻豆一精品一av一免费 | 精品亚洲成a人| 欧美日韩国产高清一区| 一区精品在线播放| 国产美女一区二区| 日韩美女视频一区二区在线观看| 亚洲综合色噜噜狠狠| aaa国产一区| 中文字幕av一区 二区| 精品一区二区三区不卡| 欧美日韩aaa| 亚洲一区二区四区蜜桃| 91天堂素人约啪| 国产精品网站在线观看| 国产精品一区二区你懂的| 日韩欧美第一区| 免费观看一级欧美片| 欧美人牲a欧美精品| 一区二区三区日本| 色噜噜狠狠色综合欧洲selulu| 国产精品剧情在线亚洲| 成人免费视频国产在线观看| 久久精品人人爽人人爽| 国产美女主播视频一区| 久久综合色一综合色88| 蜜臀av亚洲一区中文字幕| 欧美二区三区91| 日本视频一区二区三区| 国产精品欧美精品| 粉嫩高潮美女一区二区三区| 国产欧美日韩另类一区| 国产乱妇无码大片在线观看| 亚洲精品一区二区三区福利| 国产精品一区三区| 久久精品人人爽人人爽| 成人深夜在线观看| 成人免费在线视频| 91免费视频观看| 一区二区三区美女| 欧美最猛性xxxxx直播| 污片在线观看一区二区| 欧美一级日韩不卡播放免费| 免费在线观看精品| 精品国产网站在线观看| 国产精品99久久久久| 国产精品污www在线观看| 97精品久久久午夜一区二区三区| 亚洲色图一区二区三区| 欧美三级中文字幕在线观看| 视频一区视频二区中文字幕| 日韩女优制服丝袜电影| 国产一区二区导航在线播放| 2019国产精品| 99精品视频一区| 亚洲成av人片一区二区三区| 欧美一区二区在线免费播放| 激情丁香综合五月| 国产精品乱码一区二区三区软件| 91福利在线看| 日本不卡高清视频| 久久尤物电影视频在线观看| 白白色 亚洲乱淫| 亚洲国产精品影院| 欧美成人激情免费网| 不卡欧美aaaaa| 亚洲精品高清在线| 欧美成人a∨高清免费观看| 国产91露脸合集magnet| 亚洲美女淫视频| 日韩欧美在线不卡| 成人美女在线视频| 夜夜爽夜夜爽精品视频| 精品欧美乱码久久久久久 | 亚洲同性同志一二三专区| 欧美在线观看视频一区二区| 久久精品99国产国产精| 成人欧美一区二区三区在线播放| 欧美丰满少妇xxxbbb| 风间由美性色一区二区三区| 五月天亚洲精品| 国产精品嫩草久久久久| 555www色欧美视频| hitomi一区二区三区精品| 日本大胆欧美人术艺术动态 | 在线观看91精品国产入口| 九九精品一区二区| 亚洲男人的天堂在线观看| 欧美成人在线直播| 欧美午夜精品免费| 国产99久久久国产精品潘金网站| 一区二区高清视频在线观看| 精品黑人一区二区三区久久| 在线精品国精品国产尤物884a| 久久99国产精品久久99| 国产综合色在线| 亚洲一二三区视频在线观看| 久久久www免费人成精品| 欧美人妇做爰xxxⅹ性高电影| 成人午夜视频在线观看| 日日摸夜夜添夜夜添亚洲女人| 国产精品私人影院| 精品国产第一区二区三区观看体验 | 91精品国产aⅴ一区二区| 成人18视频日本| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲国产wwwccc36天堂| 国产三级三级三级精品8ⅰ区| 欧美二区三区91| 日本电影亚洲天堂一区| 国产精品1区二区.| 免费看日韩a级影片| 亚洲午夜电影在线| 亚洲视频香蕉人妖| 欧美极品另类videosde| 日韩欧美国产系列| 欧美日韩色一区| 91麻豆视频网站| 国产成人精品三级麻豆| 人禽交欧美网站| 亚洲一区二区三区自拍| 国产精品久久久久三级| 久久久亚洲精品一区二区三区| 91精品国产色综合久久久蜜香臀| 91成人免费网站| 91丨九色丨尤物| 成人av在线看| 豆国产96在线|亚洲| 黄色成人免费在线| 久草在线在线精品观看| 老司机精品视频在线| 日本亚洲欧美天堂免费| 亚洲1区2区3区4区| 亚瑟在线精品视频| 亚洲国产精品一区二区久久| 亚洲人成在线播放网站岛国| 国产精品电影一区二区三区| 国产精品美女久久久久久2018| 日韩视频在线你懂得| 欧美一卡二卡在线| 91精品午夜视频| 日韩精品一区二区三区在线播放 | 激情久久久久久久久久久久久久久久| 免费在线欧美视频| 日本va欧美va欧美va精品| 日日夜夜精品视频免费| 亚洲最新视频在线播放| 亚洲一区中文在线| 亚洲成人av在线电影| 亚洲成人福利片| 日韩综合在线视频| 免费观看久久久4p| 久久99精品视频| 精品亚洲porn| 成人午夜电影久久影院| 99久久精品国产麻豆演员表| 欧美本精品男人aⅴ天堂| 欧美videos大乳护士334| 精品国产一二三区| 中文字幕不卡的av|