Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 99午夜高清在线视频在观看,另类一区二区三区,韩国精品一区二区三区在线观看

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          手把手教你H5實現工廠游戲的CSS動畫效果「實踐」

          手把手教你H5實現工廠游戲的CSS動畫效果「實踐」


          者:吳冠禧 WecTeam

          轉發連接:https://mp.weixin.qq.com/s/u5GHsA0vHz8A_MmGslRw2g

          源:量子位
          鏈接:https://mp.weixin.qq.com/s/IIWgNvqp0jxcD-J_CikV8w

          HTML不是編程語言,但這并不妨礙精通它的大佬玩出花來。

          普通的前端,用HTML+CSS制作網頁,元素簡單,工具豐富。

          大佬級前端,用HTML+CSS繪畫,全程不用PS、AI這種圖形化的圖片編輯器,單純敲一行行代碼純手工繪制。

          把代碼轉換之后,就變成了鮮嫩的水果:

          或者畫出洛可可風格的古典女性肖像:

          還有弗拉芒巴洛克肖像風格的人物畫像,充滿了中世紀的禁欲感:

          現代的也有,比如這位在粉色燈光下的著禮服的妹子:

          以及充滿者50年代氣息的復古風人物海報:

          曲線、光影、漸變,每個元素都相當復雜。

          而且,創作過程中不用SVG,只用Atom文本編輯器和Chrome開發者工具。

          也就是說,畫面上的每一條曲線和漸變、每一處高光和陰影、每一根頭發和睫毛、每一片蕾絲和褶皺,都是一行行代碼從頭敲出來的!

          如此精細程度和創造力,讓學美術的網友感嘆“學畫畫不如寫代碼”,讓學計算機的同學覺得“別人寫的這么藝術,一定是我的教科書打開方式不對”。

          真·交叉學科大佬。

          這個項目也一度登上了GitHub Trending排行榜第二名:

          并且Issues里都是諸多用戶的膜拜:厲害!崇拜!太棒了!

          它們的作者,是灣區前端大神Diana Smith小姐姐,她目前是企業及軟件開發商Atlassian的一名資深Web開發。

          繪制過程

          Diana在專門討論CSS的網站CSS-Tricks寫下了詳細的教程。

          畫出這樣一個圖形分成幾步?

          如果不用CSS,一般都是直接嵌入這個特殊的圖形。

          如果用CSS,那么就從黑色矩形開始,然后在兩側加上上兩個

          與白色背景顏色匹配的邊框半徑元素。



          先畫出一個黑色矩形,然后兩邊用圓弧遮擋。有了基礎形狀后,下一步就是給它添上漸變的背景。但是如果用矩形方式填充,得到的效果就是這樣的:

          Diana的辦法是:在保留矩形的同時,加上兩個彎曲的div,把凹進去的部分也填充上。

          最后完整的代碼是這樣的:

          div{
            width: 500px;
            height: 350px;
            background: #000;
            position: relative;
          
            &::after, &::before{
              width: 20%;
              height: 100%;    
              position: absolute;
              top: 0;
              z-index:2;
              content: "";    
          
              background: #1e5799; 
          background: -moz-linear-gradient(top, #1e5799 0%, #7db9e8 100%); 
          background: -webkit-linear-gradient(top, #1e5799 0%,#7db9e8 100%);
          background: linear-gradient(to bottom, #1e5799 0%,#7db9e8 100%); 
          filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); 
            }
          
            &::after{
              border-radius: 100% 0% 0% 100%;   
              right: 0;
            }
          
            &::before{
              border-radius: 0 100% 100% 0;   
              left: 0;
            }   
          }
          
          body{
            background: #1e5799; 
          background: -moz-linear-gradient(top, #1e5799 0%, #7db9e8 100%); 
          background: -webkit-linear-gradient(top, #1e5799 0%,#7db9e8 100%); 
          background: linear-gradient(to bottom, #1e5799 0%,#7db9e8 100%); 
          filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); 
          }

          你也可以去這個完成查看CSS樣式的實際運行效果:

          https://codepen.io/jean-jordan/pen/KeKaBw

          剛剛我們畫的那幅畫像不像人的脖子?好的,我們再回到人像畫上,Diana繪制人物的脖子也是類似的過程。

          在上面這張圖里,我們看到了Diana如何逐步改形狀,最終得到了油畫中人物的脖子。

          但是僅僅會畫各種幾何形狀,是無法生成藝術品的,Diana總結了她在繪圖中的5個重要CSS屬性。

          1、邊界半徑(border-radius)

          邊界半徑是為了讓矩形的邊角過渡得更自然,對于大多數網頁開發者來說,只需一個參數border-radius,可以設定不同的半徑數值。

          border-radius: 15px 10px 40px 30px / 40px 10px 15px 30px;

          2、盒子陰影(box-shadow)

          對多個盒子陰影進行分層是增加深度的最佳方法之一。框陰影將粘附到html容器的邊緣,也會沿著邊界半徑定義的邊緣。

          box-shadow: 6px -11px 20px 1px red, -15px -15px 5px -10px blue, inset 5px 5px 35px 10px green;

          開發者可以指定模糊半徑,以及陰影是向內延伸還是向外延伸。

          3、變形(transform)

          變形的主要方式有:旋轉(rotate)、縮放(scale)和傾斜(skew)

          transform: rotate(-45deg)
          transform: scale(0.7, 1.3)
          transform: skew(25deg, 30deg);

          此外還有透視,讓物體產生遠小近大的視覺效果,或者是僅僅為畫出一個梯形。

          transform: perspective(10px) rotateY(5deg);

          4、線性梯度(linear-gradient)和徑向梯度(radial-gradient)

          線性梯度用于定義一個方向上的漸變效果,徑向梯度用于定義圓和橢圓形的漸變效果

          background-image: linear-gradient(0deg, blue, transparent 60%),
          radial-gradient(circle at 70% 30%, purple, transparent 40%);

          5、層疊(overflow)

          層疊是一種將大量雜亂元素填充到一個整齊的包中的方法,可以創建一些有趣的形狀。在變形那部分的基礎上使用hidden參數,可以把邊緣遮蓋起來。

          overflow: hidden;

          以上5種元素缺一不可,隨便少一種都會產生怪異的效果。

          從左至右分別是缺少邊界半徑、陰影、變形、梯度、層疊的效果(點擊查看大圖)

          不過即使這樣,也很有抽象藝術的美感,仿佛在看畢加索的作品。

          只適用于Chrome

          不過,由于這是一個純個人藝術創作,Diana小姐姐并不關心瀏覽器適配性。

          因此,這些代碼在Chrome里可以完美展現,但如果用其他瀏覽器打開,可能就會出現不一樣的效果。

          比如,MAC上的Safari瀏覽器打開,妹子的眼睛就方了:

          肩膀上的高光,變成了一個大圈圈:

          胸前的禮服上,也被潑了一道墨:

          如果用早期的Chrome打開,會出現驚悚的頭身分離的效果:

          早期的Opera瀏覽器,打開之后臉方了:

          Windows 7上從IE 6到IE 11,顯示出來的都是這個鬼樣子:

          濃重的線條,甚至有點抽象藝術的感覺。

          同樣是早期IE,放到Mac上也一樣鬼畜,這是IE 5.1.7的效果:

          還有人試了試,在Windows 98系統的IE 7瀏覽器打開,會變成非常像素風的樣子:

          最恐怖的是三星手機上的夜間模式打開:

          連人種都變了啊!

          其他的幾張畫,換個瀏覽器打開也比較鬼畜。

          妹子你bra里的鋼圈出來了啊!

          拉夫領變得透明而有光澤,領口的蕾絲干脆斷掉了,仿佛是逃難時期的肖像畫。

          最后,如果你在iPhone上裝了Chrome,出來的也是Safari的效果,想看完整效果的話,請在安卓手機或者電腦的Chrome上打開。

          因此,有不少網友都覺得,這幾幅畫可以當成瀏覽器測試項目,一試就能知道內核用的是誰家的。

          反向繪圖

          CSS太難,學不會?不要緊,雖然我們不能把代碼變成圖片,但是可以把圖片變成代碼啊。

          沒錯,就是ASCII藝術,早在DOS時期,就有人用命令行界面來顯示圖片。直到今天已成為一種流行的互聯網文化。

          用單色字符來畫出世界名畫已經不算新鮮事。最近又有個碼農開發了一個新的項目Primg,讓任何一幅畫都可以用質數來表示。

          比如蒙拉麗莎,就可以用一個3萬位的質數二進制方式繪制出來。

          CSS 中,存在許多數學函數,這些函數能夠通過簡單的計算操作來生成某些屬性值,例如 :

          • calc():用于計算任意長度、百分比或數值型數據,并將其作為 CSS 屬性值。
          • min() 和 max():用于比較一組數值中的最大值或最小值,也可以與任意長度、百分比或數值型數據一同使用。
          • clamp():用于將屬性值限制在一個范圍內,支持三個參數:最小值、推薦值和最大值。

          現代 CSS 解決方案:CSS 數學函數[1]一文中,我們詳細介紹了

          • 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 class="g-multi">
            <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[2]

          快速實現圓弧軌跡動畫

          在之前,我們想實現一個圓弧動畫,如下所示,還是稍微有點點麻煩的:

          有了三角函數之后,類似的動畫,可以節省部分代碼實現:

          <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[3]

          基于這個技巧,我們可以嘗試實現一個旋轉的 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[4]

          嘗試使用三角函數實現波浪線

          那么,三角函數還有什么作用嗎?

          我們來嘗試點新奇的,借助三角函數實現曲線(波浪線)。

          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[5]

          曲線創意構想

          有了繪制曲線的能力,我們就能利用它在 CSS 中創造許多有美感、藝術性的效果。

          我們可以嘗試使用這些曲線,來制作書簽圖案:

          代碼也不復雜,我就不貼完整的代碼了,感興趣的可以戳這里:CodePen Demo - CSS Cos/Sin Math And box-shadow - bookmark[6]

          熟悉我的讀者一定對 CSS-doodle 不陌生,袁川[7]老師,也就是 CSS-doodle 庫的作者,在他的 Codepen 首頁背景板中,使用的就是使用了三角函數實現的一副純 CSS 畫作:

          Codepen Demo -- border-radius[8]

          我之前也嘗試使用三角函數,實現了一副丑一點的:

          Codepen Demo -- CSS-Doodle fish & seaweed[9]

          總結一下

          CSS 原生支持的三角函數,給 CSS 打開了更多的可能性。

          但是,我們也必須看到,各種數學函數的增加,導致 CSS 的復雜度也是愈來愈高。CSS 已經不再是非常純粹的負責樣式了,很多時候,很多計算也可以直接在 CSS 當中完成。其中利弊,可能不同的人會有不一樣的看法。至于好壞,交給時間給出答案吧。

          好了,本文到此結束,希望對你有幫助 :)

          更多精彩 CSS 技術文章匯總在我的 Github -- iCSS[10] ,持續更新,歡迎點個 star 訂閱收藏。

          如果還有什么疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

          參考資料

          [1]

          現代 CSS 解決方案:CSS 數學函數: https://github.com/chokcoco/iCSS/issues/177

          [2]

          CodePen Demo -- CSS Cos/Sin Math function: https://codepen.io/Chokcoco/pen/dyqggwK

          [3]

          CodePen Demo -- CSS Cos/Sin Math function - arc animation: https://codepen.io/Chokcoco/pen/jOedxXJ

          [4]

          CSS Cos/Sin Math function - Loading animation: https://codepen.io/Chokcoco/pen/PoyVyEL

          [5]

          CSS Cos/Sin Math And box-shadow: https://codepen.io/Chokcoco/pen/oNPaayq

          [6]

          CodePen Demo - CSS Cos/Sin Math And box-shadow - bookmark: https://codepen.io/Chokcoco/pen/oNamQyr

          [7]

          袁川: https://codepen.io/yuanchuan/pens/popular?cursor=ZD0xJm89MCZwPTc=

          [8]

          Codepen Demo -- border-radius: https://codepen.io/yuanchuan/pen/dBroLP

          [9]

          Codepen Demo -- CSS-Doodle fish & seaweed: https://codepen.io/Chokcoco/pen/WNNLOXV

          [10]

          Github -- iCSS: https://github.com/chokcoco/iCSS

          作者:SbCo

          來源:微信公眾號:iCSS前端趣聞

          出處:https://mp.weixin.qq.com/s/MbGWvJGZQ3lZEzLZhpGdmA


          主站蜘蛛池模板: 69福利视频一区二区| 国产无线乱码一区二三区| 国产一区在线mmai| 精品亚洲AV无码一区二区三区| 亚洲av午夜福利精品一区| 一区二区三区四区视频| 亚洲欧美日韩一区二区三区 | 色窝窝免费一区二区三区| 在线观看国产一区二三区| 精品久久综合一区二区| 一区二区三区无码高清视频| 中文字幕一区二区三区免费视频| 国精品无码一区二区三区左线| 久久国产午夜一区二区福利| 日韩国产免费一区二区三区| 国产一区二区三区免费看| 夜夜添无码一区二区三区| 最新欧美精品一区二区三区| 国产日韩精品一区二区三区| 狠狠色婷婷久久一区二区 | 国产成人精品一区二三区熟女| 加勒比精品久久一区二区三区| 国产成人无码一区二区在线播放 | 精品女同一区二区| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产午夜精品一区二区三区嫩草| 香蕉久久一区二区不卡无毒影院| 亚洲.国产.欧美一区二区三区| 一区二区三区AV高清免费波多| 日韩免费无码一区二区三区| 色噜噜一区二区三区| 亚洲男女一区二区三区| 国产综合无码一区二区三区| 少妇一夜三次一区二区| 国产熟女一区二区三区四区五区 | 美女福利视频一区| 国产一区二区三区亚洲综合| 99精品国产高清一区二区| 一区二区国产精品| 国产福利一区二区| 亚洲欧美一区二区三区日产|