前几天看到一张图片,倔强的向日葵。(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 function getOneDot(size,deg){
176 var div = document.createElement("div");
177 div.className = "dot" ;
178 div.style.transform = "rotate(" deg "deg) scale(" size ")";
179 return div ;
180 }
181 addPetal();
182 </script>
183 </body>
184 </html>