今天的任務(wù)是做一個(gè)純CSS3的還算比較漂亮的抽獎(jiǎng)大轉(zhuǎn)盤,也就是下圖效果。
我只說思路和重要的CSS3代碼。
外盤
外盤是指有彩燈的深橙色圓環(huán),以及圓環(huán)的外邊線。
外盤設(shè)一個(gè)div.lottery-box作為容器,border-radius為50%,邊框厚度為20px,顏色就是深橙色。外邊線的淺橙色,用box-shadow: 0px 0px 0 4px #febd04;
來實(shí)現(xiàn)。
彩燈
HTML方面,用 div.lottery-box>ul.illumination>li*24 構(gòu)建。illumination就是彩燈的意思。也就是說我們弄24個(gè)li作為24盞燈。
CSS方面:
1、.illumination需要聲明list-style: none;
以及高度值。它的li的CSS先保證所有l(wèi)i位于ul的正中央,然后做成圓形:
display: block;
width: 8px;
height: 8px;
background: #fff;
position: absolute;
top: 50%;
left: 50%;
margin: -4px 0 0 -4px;
border-radius: 4px;
2、然后要用到transform: rotate(0deg) translateY(-136px);
,原理是讓彩燈li遠(yuǎn)離初始位置136px,然后每個(gè)彩燈都有不同的旋轉(zhuǎn)角度。居頂?shù)臒艟褪?deg,右側(cè)的第一個(gè)燈就是15deg,然后是30deg,類推下去。這樣大家就形成了一圈彩燈。
3、加閃爍動(dòng)畫。我設(shè)了一個(gè)四關(guān)鍵幀的動(dòng)畫,總是就是一頓亂閃。填充色先是白色,后是黃色,光圈也變來變?nèi)ァ?/p>
@keyframes twinkling{
0%{
background: #fefdfc;
border: 1px solid #fefdfc;
}
25%{
background: #fefdfc;
border: none;
box-shadow: 0px 0px 0 2px #eb6f21;
}
75%{
background: #fefe00;
border: 1px solid #fefe00;
}
100%{
background: #fefe00;
border: none;
box-shadow: 0px 0px 0 2px #eb6f21;
}
}
給li整體設(shè)上animation: twinkling 1.2s infinite ease-in-out;
,1.2秒一個(gè)周期。
然后,用:nth-child()選擇器給每個(gè)li設(shè)不同的角度值。
.illumination li:nth-child(1) {
-webkit-transform: rotate(0deg) translateY(-136px);
-moz-transform: rotate(0deg) translateY(-136px);
transform: rotate(0deg) translateY(-136px);
animation-delay: .6s;
}
然后,奇數(shù)li都設(shè)上animation-delay: .6s;
,這樣才是交錯(cuò)閃爍。
到此,彩燈完成。
扇面
扇面更有意思,比彩燈的知識(shí)還冷僻一些。
HTML方面:新建ul.lottery-sector作為ul.illumination的兄弟元素,然后里面六個(gè)li作為扇區(qū)。
CSS方面:
1、容器CSS如下,保證它是圓形的就行了。
.lottery-sector {
list-style: none;
width: 250px;
height: 250px;
position: absolute;
overflow: hidden;
top: 0;
border-radius: 50%;
border: 4px solid #febd04;
}
2、li的CSS是關(guān)鍵。原理就兩句:transform-origin: 100% 100%;transform: rotate(0deg) skew(30deg);
也就是以右下角為變形中心,先旋轉(zhuǎn),然后傾斜。比如第一個(gè)li(就是左上角的那個(gè)扇區(qū)),旋轉(zhuǎn)角度是0也就是不旋轉(zhuǎn),然后傾斜30度,這樣它就向左傾斜了30度,形成了平行四邊形,這個(gè)四邊形的右下角的角度就是——60度。到此,第一個(gè)li成了一個(gè)平行四邊形,其中有用的部分就是它的右下角。雖然它是平行四邊形,但是被ul一裁剪,就形成了一個(gè)扇形。這就是我們最終要的扇形。第二個(gè)li也是一樣的道理,也是要它的扇形,只不過它旋轉(zhuǎn)了60度。
.lottery-sector li {
margin: 0;
width: 125px;
height: 125px;
position: absolute;
transform-origin: 100% 100%;
}
.lottery-sector li:nth-child(1) {
background-color: #FEFEFE;
transform: rotate(0deg) skew(30deg);
}
.lottery-sector li:nth-child(2) {
background-color: #FFF0D0;
transform: rotate(60deg) skew(30deg);
}
.lottery-sector li:nth-child(3) {
background-color: #FEFEFE;
transform: rotate(120deg) skew(30deg);
}
/* 還有三個(gè)li從略 */
獎(jiǎng)品名稱
HTML方面,新建ul.lottery-gift作為ul.sector的兄弟元素,然后里面六個(gè)li作為扇區(qū)。
CSS方面,原理是在li中正常寫字和放圖,比如<li><br>理財(cái)金<br>100元</li>
,然后分別做定位和旋轉(zhuǎn),即可。
.lottery-gift {
list-style: none;
width: 250px;
height: 250px;
position: absolute;
top: 0;
}
.lottery-gift li {
position: absolute;
display: block;
margin: 0;
width: 125px;
height: 125px;
color: #F44336;
font-size: 14px;
line-height: 1.4;
font-weight: bold;
text-align: center;
list-style: none;
}
.lottery-gift li:nth-child(1) {
top: 28px;
transform: rotate(300deg);
}
.lottery-gift li:nth-child(2) {
top: -11px;
left: 65px;
}
.lottery-gift li:nth-child(3) {
top: 28px;
left: 127px;
transform: rotate(60deg);
}
指針
指針你可以做一張圖,也可以繼續(xù)用CSS3來制作。指針分成兩部分:一個(gè)尖角,和一個(gè)圓盤。
1、尖角的做法,設(shè)寬高為0,只用border去形成:
#triangle-up {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
2、圓盤的做法跟上文彩燈的原理是一樣的:
彩燈的圓環(huán)以及毛邊,用一個(gè)div來做;
“點(diǎn)擊抽獎(jiǎng)”的深色背景,和亮黃色的環(huán),用另一個(gè)div來做。
指針旋轉(zhuǎn)動(dòng)畫
理論上應(yīng)該由js庫(kù)來操縱旋轉(zhuǎn),因?yàn)檫@涉及到概率計(jì)算的問題。如果非要純CSS3來控制旋轉(zhuǎn),可以是:
1、關(guān)鍵幀:0%是0deg,100%是360deg,先讓指針勻速的轉(zhuǎn)動(dòng),然后JS向后臺(tái)發(fā)送請(qǐng)求,等待服務(wù)器返回是否中獎(jiǎng)。只要沒有返回,就一直一圈又一圈的轉(zhuǎn)。
2、當(dāng)服務(wù)器返回結(jié)果,其結(jié)果最好是旋轉(zhuǎn)角度,也就是說,到底是停到那個(gè)扇區(qū),假定停到30度,那么我們計(jì)算一個(gè)角度數(shù)值,就是1800+30,也就是再旋轉(zhuǎn)1830度就停,為什么要有1800呢?因?yàn)槟阋屩羔樎0。∵@個(gè)值需要JS動(dòng)態(tài)生成,所以這就是麻煩所在,需要js動(dòng)態(tài)生成@keyframes。可以寫一段CSS插入DOM。
3、這個(gè)1830度,可以設(shè)animation: zhuanzhuanzhuan 4s forwards ease-in-out;
,其中forwards表示停在最終一幀,ease-in-out表示先慢后快最后慢。
謝謝大家觀看。