HTML+CSS畫一朵嚮日葵

来源:http://www.cnblogs.com/shb190802/archive/2017/09/08/7493265.html
-Advertisement-
Play Games

前幾天看到一張圖片,倔強的嚮日葵。(BGM,《倔強》) 看著挺有感觸,就想用CSS做一個嚮日葵。 最終效果圖如下: 演示地址: http://suohb.com/work/sunflower.html 主要的難點就在花瓣的處理上,css暫時沒有做到這樣的尖角圓弧。 我想到的做法是用兩個橢圓的部分弧度 ...


前幾天看到一張圖片,倔強的嚮日葵。(BGM,《倔強》)

 

看著挺有感觸,就想用CSS做一個嚮日葵。

最終效果圖如下:

演示地址

http://suohb.com/work/sunflower.html

 

 

主要的難點就在花瓣的處理上,css暫時沒有做到這樣的尖角圓弧。

我想到的做法是用兩個橢圓的部分弧度截取出來,拼接成一個花瓣樣式。

原理如下:

CSS部分

 1 .petal{
 2     position:absolute;
 3     width:50px;
 4     height:130px;
 5     transform-origin:50% 150%;
 6     opacity:.9;
 7 }
 8 .petal > div:nth-child(1){
 9     position:absolute;
10     left:0;
11     top:0;
12     width:50%;
13     height:100%;
14     overflow:hidden;
15 }
16 .petal > div:nth-child(1) > div{
17     position:absolute;
18     left:0;
19     top:-20px;
20     width:160px;
21     height:250px;
22     background:#F00;
23     border-radius:50%;
24     box-shadow: 0 0 5px #000;
25 }
26 .petal > div:nth-child(2){
27     position:absolute;
28     left:50%;
29     top:0;
30     width:50%;
31     height:100%;
32     overflow:hidden;
33 }
34 .petal > div:nth-child(2) > div{
35     position:absolute;
36     right:0;
37     top:-20px;
38     width:160px;
39     height:250px;
40     background:#F00;
41     border-radius:50%;
42     border-radius:50%;
43     box-shadow: 0 0 5px #000;
44 }

HTML部分:

1 <div class="petal">
2     <div>
3         <div></div>
4     </div>
5     <div>
6         <div></div>
7     </div>
8 </div>

這樣就畫出一個花瓣,

 

然後我們將花瓣使用js創建出來,新增一個花瓣外層div#box;將生成的花瓣插入裡邊。花瓣的的transform-origin屬性為正下方一段距離。複製並旋轉

代碼如下:

 1 function addPetal(){
 2     var len = 21 ,
 3         i = 0 ,
 4         scale = 1 ,
 5     var fragment = document.createDocumentFragment();
 6     for(i = 0 ; i < len ; i ++){
 7         fragment.appendChild(getOnePetal(scale,Math.round(360/len*i)));
 8     }
 9     box.appendChild(fragment);
10 }
11 function getOnePetal(size,deg){
12     var div = document.createElement("div");
13     div.className = "petal" ;
14     div.innerHTML = "<div><div></div></div><div><div></div></div>";
15     div.style.left = 155 + "px";
16     div.style.top = 0 ;
17     div.style.transform = "rotate("+deg+"deg) scale("+size+")";
18     return div ;
19 }

 

現在基本上已經看出嚮日葵的輪廓,我們將花瓣多複製幾層,越向內層越小。給花瓣加點陰影有寫層次感。

 

到這裡就完成一大半了,然後做嚮日葵中心部分,畫一個漸變色圓,給他加一些線條。

先在嚮日葵中心圓上部話一般圓形div,只要border。設置tranform-origin到嚮日葵的中心位置。複製這個圓並旋轉。得到下圖:

這也是一個很有意思的圖形。給中心圓加上overflow:hidden;放在嚮日葵中心

做到這裡主要難點都已經做完了。接下來就是把花瓣主色調改成黃色漸變,花瓣角度做一點隨機處理,中心加一些花蕊,就得到了一顆嚮日葵。

 

 

更多特效請關註這個微信公眾號

 

最終完整代碼:

  1 <!doctype html>
  2 <html>
  3 <head>
  4 <meta http-equiv="Pragma" content="no-cache" />
  5 <meta http-equiv="Cache-Control" content="no-cache" />
  6 <meta http-equiv="Expires" content="0" />
  7 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  8 <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no" />
  9 <style type="text/css">
 10 .petal{
 11     position:absolute;
 12     width:50px;
 13     height:130px;
 14     transform-origin:50% 150%;
 15     opacity:.9;
 16 }
 17 .petal > div:nth-child(1){
 18     position:absolute;
 19     left:0;
 20     top:0;
 21     width:50%;
 22     height:100%;
 23     overflow:hidden;
 24 }
 25 .petal > div:nth-child(1) > div{
 26     position:absolute;
 27     left:0;
 28     top:-20px;
 29     width:160px;
 30     height:250px;
 31     background-image:linear-gradient(95deg,#fef10c 0%,#ffc701 8%,#fef10c 15%,#ffc701 20%);
 32     box-shadow:0 0 10px rgba(0,0,0,.3);
 33     border-radius:50%;
 34 }
 35 .petal > div:nth-child(2){
 36     position:absolute;
 37     left:50%;
 38     top:0;
 39     width:50%;
 40     height:100%;
 41     overflow:hidden;
 42 }
 43 .petal > div:nth-child(2) > div{
 44     position:absolute;
 45     right:0;
 46     top:-20px;
 47     width:160px;
 48     height:250px;
 49     background-image:linear-gradient(-95deg,#fef10c 0%,#ffc701 8%,#fef10c 15%,#ffc701 20%);
 50     box-shadow:0 0 10px rgba(0,0,0,.3);
 51     border-radius:50%;
 52 }
 53 #box{
 54     width:370px;
 55     height:370px;
 56     margin: 0 auto;
 57     position: relative;
 58 }
 59 .pistilShadow{
 60     position:absolute;
 61     left: 180px;
 62     top:195px;
 63     width:120px;
 64     height:120px;
 65     border-radius:50%;
 66     transform:translate(-50%,-50%);
 67     box-shadow: -5px 5px 80px #bd3d0e;
 68 }
 69 .pistil{
 70     position:absolute;
 71     left: 180px;
 72     top:195px;
 73     width:160px;
 74     height:160px;
 75     border-radius:50%;
 76     transform:translate(-50%,-50%);
 77     box-shadow: 0 0 80px #bd3d0e inset;
 78     background:#325302;
 79     overflow:hidden;
 80 }
 81 .pistilLine{
 82     position:absolute;
 83     left:20%;
 84     top:-50%;
 85     transform-origin: center bottom;
 86     width:60%;
 87     height:100%;
 88     border-radius:50%;
 89     border:solid 1px #2f1307;
 90 }
 91 .pistil2{
 92     position:absolute;
 93     left: 180px;
 94     top:195px;
 95     width:60px;
 96     height:60px;
 97     border-radius:50%;
 98     transform:translate(-50%,-50%);
 99     box-shadow: 0 0 25px #bd3d0e inset;
100     background:#325302;
101 }
102 .dot{
103     position:absolute;
104     left:28px;
105     top:0;
106     width:4px;
107     height:4px;
108     border-radius:50%;
109     background:#fded00;
110     box-shadow: 0 0 15px #fded00 inset;
111     transform-origin:center 30px;
112 }
113 </style>
114 </head>
115 <body>
116 <div id="box"></div>
117 <script>
118 
119 function addPetal(){
120     var len = 21 ,
121         layer = 3 ,
122         i = 0 ,
123         j = 0 ,
124         changeScale = 0.1 ,
125         scale = 1 ,
126         div;
127     var fragment = document.createDocumentFragment();
128     var pistil = document.createElement("div");
129     pistil.className = "pistil" ;
130     var pistil2 = document.createElement("div");
131     pistil2.className = "pistil2" ;
132 
133     for(j = 0 ; j < layer ; j ++){
134         for(i = 0 ; i < len ; i ++){
135             fragment.appendChild(getOnePetal(scale,Math.round(360/len*i + Math.random()*10)));
136         }
137         div = document.createElement("div");
138         div.className = "pistilShadow" ;
139         fragment.appendChild(div);
140         len -= 5 ;
141         scale -= changeScale ;
142         changeScale += changeScale ;
143     }
144     len = 40 ;
145     for(var i = 0 ;i < len ; i ++){
146         div = document.createElement("div");
147         div.className = "pistilLine" ;
148         div.style.transform = "rotate("+Math.round(360/len*i)+"deg)" ;
149         pistil.appendChild(div);
150     }
151     len = 30;
152     scale = 1 ;
153     changeScale = 0.15 ;
154     for(j = 0 ; j < layer ; j ++){
155         for(i = 0 ; i < len ; i ++){
156             pistil2.appendChild(getOneDot(scale,Math.round(360/len*i+j*10)));
157         }
158         len -= 4 ;
159         scale -= changeScale ;
160     }
161     fragment.appendChild(pistil);
162     fragment.appendChild(pistil2);
163 
164     box.appendChild(fragment);
165 }
166 function getOnePetal(size,deg){
167     var div = document.createElement("div");
168     div.className = "petal" ;
169     div.innerHTML = "<div><div></div></div><div><div></div></div>";
170     div.style.left = 155 + "px";
171     div.style.top = 0 ;
172     div.style.transform = "rotate("+deg+"deg) scale("+size+")";
173     return div ;
174 }
175 	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用途 jQuery.trim()函數用於刪除指定字元串開頭和結尾的空格。 $.trim()函數將刪除指定字元串開頭和結尾的所有的換行符、空格,以及製表符。 語法 jQuery.trim(str) 參數 str:要去除前後空格的字元串 返回值 jQuery.trim()方法返回去除了前後空格的字元串 ...
  • substring 方法用於提取字元串中介於兩個指定下標之間的字元 substring(start,end) 開始和結束的位置,從零開始的索引 返回值是一個新的字元串,該字元串值包含 stringObject 的一個子字元串 substring 方法返回的子串包括 start 處的字元,但不包括 e ...
  • 1.DOM內部插入append()與appendTo() 動態創建的元素是不夠的,它只是臨時存放在記憶體中,最終我們需要放到頁面文檔並呈現出來。那麼問題來了,怎麼放到文檔上? 這裡就涉及到一個位置關係,常見的就是把這個新創建的元素,當作頁面某一個元素的子元素放到其內部。針對這樣的處理,jQuery就定 ...
  • 近日壓力山大,找找樂子,看有沒有好的東西可以研究研究,剛好看到我的螞蟻森林居然可以種樹了,很好奇,難道馬雲真會種樹? 二話不說,利用本人專業所學(遙感專業,有木有同行??),來監測監測那些樹木長得如何了?是不是真有,二話不說,直接上圖!! 註意,這裡是螞蟻森林種植的大概範圍,我從高德地圖查詢到的,內 ...
  • [1]坐標定位 [2]四個坐標系 [3]圖形變換 [4]居中變換 ...
  • 說到原生瀏覽器事件函數處理相容,大家可能會想到addEventListener().....以及attachEvent()....相信看了下文,會給你提供不一樣的更優雅的實現方式,希望下文會對你有幫助~~~~~ 總結:以上方法也是jquery源碼中Event模塊中add的方法的借鑒來源,資料來源於此 ...
  • 創建畫布,驗證瀏覽器相容性我就省去了,也很簡單網上有代碼。 然就是蛇對象 食物 移動 控制方向 吃到食物 吃到自己 基本功能大概就是這樣。可能還不算完美,後面有時間繼續優化一下! ...
  • 撰文為何 身為一個前端開發者,ECMAScript(以下簡稱ES)早已廣泛應用在我們的工作當中。瞭解ECMA機構流程的人應該知道,標準委員會會在每年的6月份正式發佈一次規範的修訂,而這次的發佈也將作為當年的正式版本。以後的改動,都會基於上一版本進行修改。所以,我們這次就基於ES6的版本對ES7、ES ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...