CSS实现扇形和三角(记第一次写博客(*^_^*)
前言:
网页,APP里经常要画写圆形,三角形,扇形。方法当然有很多,用css或者js如何实现呢?正好在笔试中遇到一题画抽奖轮盘,可我一时却想不起怎么画扇形,查阅资料把问题解决后,在博客里记录下加深记忆和理解,下面进入正题
一、先画出一个转盘,而转盘不就是很多扇形拼接而成的吗?那怎么去画一个扇形呢?效果如下

看上去是不是无从下手,那就让我来分析下
假设有如下HTML:
<div class="sector"> <div class="inner"></div> </div>
则下面的CSS就可以生成上面那个30°的扇形:
.sector { width: 300px; height: 300px; position: absolute; clip: rect(0 300px 300px 150px);//利用clip裁剪 overflow: hidden; } .inner { width: 100%; height: 100%; background: currentColor; position: absolute; clip: rect(0 150px 300px 0); transform: rotate(30deg); border-radius: 50%; }
看着这两段代码应该稍微的理解这个扇形的形成了吧
- 外面容器原本是个正方形,但通过
clip剪裁只显示右半部分; - 子元素同样尺寸,但通过
clip剪裁只显示左半部分。然后通过适当旋转露出我们想要的扇形区域;
- 外面容器原本是个正方形,但通过
原理示意图如下:

有了一个扇形一整个转盘还远吗?相信你也会了,但是我还是想给出我的成果(●ˇ∀ˇ●)
下面就是一整个转盘的html结构(过于冗余,折叠)
1 <div class="sector"> 2 <div class="inner"></div> 3 </div> 4 <div class="sector"> 5 <div class="inner"></div> 6 </div> 7 <div class="sector"> 8 <div class="inner"></div> 9 </div> 10 <div class="sector"> 11 <div class="inner"></div> 12 </div> 13 <div class="sector"> 14 <div class="inner"></div> 15 </div> 16 <div class="sector"> 17 <div class="inner"></div> 18 </div> 19 <div class="sector"> 20 <div class="inner"></div> 21 </div> 22 <div class="sector"> 23 <div class="inner"></div> 24 </div> 25 <div class="sector"> 26 <div class="inner"></div> 27 </div> 28 <div class="sector"> 29 <div class="inner"></div> 30 </div> 31 <div class="sector"> 32 <div class="inner"></div> 33 </div> 34 <div class="sector"> 35 <div class="inner"></div> 36 </div>
下面是转盘样式的css代码,只需要给每个外部容器偏移个角度,错开他们的位置
.sector:nth-of-type(1) { transform: rotate(0);//偏移角度 color: #9ED110; } .sector:nth-of-type(2) { transform: rotate(30deg); color: #9ED110; } .sector:nth-of-type(3) { transform: rotate(60deg); color: #9ED110; } .sector:nth-of-type(4) { transform: rotate(90deg); color: #9ED110; } .sector:nth-of-type(5) { transform: rotate(120deg); color: #9ED110; } .sector:nth-of-type(6) { transform: rotate(150deg); color: #9ED110; } .sector:nth-of-type(7) { transform: rotate(180deg); color: #9ED110; } .sector:nth-of-type(12) { transform: rotate(330deg); color: #EDE604; }
是不是觉得上面有些麻烦,重复做着类似的事,所以我想着用js实现试下,如果要修改扇形数量,颜色等,也不需要复杂的操作
1 color=['pink','yellow','#66ccff'] 2 for(var i=1;i<=12;i++){ 3 var sector=document.createElement('div') 4 sector.className='sector'//为每个外部容器添加类 5 sector.style.transform="rotate("+30*(i-1)+"deg)"//设计偏移角度 6 var inner=document.createElement('div') 7 inner.style.backgroundColor=color[i%3] 8 inner.className='inner' 9 sector.appendChild(inner) 10 }
到此圆盘已经基本做完了,以下成果展示:

二、接下来就是要画转盘上的指针了,这里就涉及到css实现三角形,顺带复习下
border-width: 0 20px 40px 20px; border-style: solid; border-color: transparent transparent #ff9933 transparent;//以上就可以实现一个向上的三角形
三、以上就可以合成一个转盘,下面是完整代码(包括简单让转盘转起来)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style type="text/css"> 7 .sector { 8 width: 100%; height: 100%; 9 position: absolute; 10 clip: rect(0 300px 300px 150px); 11 overflow: hidden; 12 } 13 .inner { 14 width: 100%; height: 100%; 15 position: absolute; 16 clip: rect(0 150px 300px 0); 17 transform: rotate(30deg); 18 text-align: left; 19 border-radius: 50%; 20 } 21 22 #wrap,.center{ 23 position: absolute; 24 left: 0; 25 top: 0; 26 right: 0; 27 bottom: 0; 28 margin: auto; 29 } 30 #wrap{ 31 width: 300px; 32 height: 300px; 33 } 34 .center{ 35 width: 40px; 36 height: 40px; 37 background-color: #ff9933; 38 border-radius: 50%; 39 } 40 .tran{ 41 width: 0; 42 height: 0; 43 border-width: 0 20px 40px 20px; 44 border-style: solid; 45 border-color: transparent transparent #ff9933 transparent; 46 margin-top:-20px; 47 transform-origin:bottom center; 48 transition:transform 3s cubic-bezier(.2,.93,.43,1); 49 } 50 </style> 51 </head> 52 <body> 53 <div id="wrap"> 54 <div class="center"> 55 <div class="tran"></div> 56 </div> 57 </div> 58 <script type="text/javascript"> 59 color=['pink','yellow','#66ccff'] 60 for(var i=1;i<=12;i++){ 61 var wrap=document.querySelector('#wrap') 62 var center=document.querySelector('.center') 63 var sector=document.createElement('div') 64 sector.className='sector' 65 sector.style.transform="rotate("+30*(i-1)+"deg)" 66 var inner=document.createElement('div') 67 inner.style.backgroundColor=color[i%3] 68 inner.className='inner' 69 sector.appendChild(inner) 70 wrap.insertBefore(sector,center) 71 } 72 var center=document.querySelector('.center') 73 var tran=document.querySelector('.tran') 74 var r=720 75 center.onclick=function(){//让转盘转起来 76 r=Math.random()*1000+r 77 tran.style.transform="rotate("+r+"deg)" 78 } 79 </script> 80 </body> 81 </html>
完整预览图:

到此初步预习了扇形和三角形的画法,当然这个转盘还没有完全实现,包括转盘每个区的概率,转盘上的文字等,后面会逐步完善。第一次写博客,排版也不是很满意,后面在改善嘿嘿,如果大佬有什么意见或者看法可以私聊我O(∩_∩)O

浙公网安备 33010602011771号