如何使用css3绘制任意角度扇形+动画

本文详细介绍了如何使用CSS3来绘制任意角度的扇形,并通过动画实现扇形的动态开合效果。核心原理是利用两个旋转的半圆进行角度拼接。文章还提供了一种适用于扇形位置变化的解决方案,通过调整旋转中心和使用transform-origin属性,使得扇形在不同位置仍能正确显示。最后,展示了JavaScript如何配合实现扇形在画布上的平移动画。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考自:

http://jingyan.baidu.com/article/c910274be4dd69cd371d2d48.html


这里只是做下原理解释

原理:使用两个半圆做角度拼接。

比如想绘制一个缺口朝右,缺口弧度30度角的扇形


那么将由一个旋转65度角的半圆A+一个旋转-65度角的半圆B组合而成。

代码:

<style>
.outer{
position: absolute;
width: 200px;
height: 200px;
transform: rotate(65deg);
clip: rect(0px,100px,200px,0px);/* 这个clip属性用来绘制半圆,在clip的rect范围内的内容显示出来,使用clip属性,元素必须是absolute的 */
border-radius: 100px;
background-color: yellow;
/*-webkit-animation: an1 2s infinite linear;*/
}


.pie{
    position: absolute;
width: 200px;
height: 200px;
transform: rotate(-65deg);
clip: rect(0px,100px,200px,0px);
border-radius: 100px;
background-color: yellow;
/*-webkit-animation: an2 2s infinite linear;*/
}

</style>

<div class="outer"></div>
 <div class="pie"></div>

这样可以绘制0-360任意角度的扇形了。


然后,我们要绘制一个会动的扇形,比如这个缺口一开一合,向贪吃蛇一样。

css3提供了animation属性,本文只考虑chrome,因此只加了-webkit-animation,需要兼容的同学另行处理。

1.解开上面两个css中注释掉的部分:-webkit-animation

然后增加如下css

/**动画*/
@-webkit-keyframes an1{
       0% {transform: rotate(0deg);}
       50%{transform: rotate(90deg);}
       100%{transform: rotate(0deg);}
}


@-webkit-keyframes an2{
       0% {transform: rotate(0deg);}
       50%{transform: rotate(-90deg);}
       100%{transform: rotate(0deg);}
}


这样让A半圆在2秒内从0旋转到90在旋转到0

让B半圆在2秒内从0旋转到-90在旋转到0

刚好完成一次开闭的动作。


ps:

上面的半圆是通过clip产生的,假设我的场景是这个扇形的位置是变化的,比如贪吃蛇的场景,那么使用clip就不合适了。

下面采取另外一种方法

<style>
.outer{
position: absolute;
width: 100px;
height: 200px;
border-radius: 100px 0 0 100px; /* 绘制半圆,采用只绘制左上角,左下角的方法,因此需要将宽度设置为高度的一半*/
transform: rotate(0deg);
transform-origin: 100% 50%;/* 这个很重要,需要设置旋转中心,默认旋转中心是元素的中间,但是我们绘制的是半圆,因此旋转中心应该是 100%宽度,50%高度*/
background-color: yellow;
-webkit-animation: an1 1s infinite linear;
}


.pie{
    position: absolute;
width: 100px;
height: 200px;
transform: rotate(0deg);
transform-origin: 100% 50%;
border-radius: 100px 0 0 100px;
background-color: yellow;
-webkit-animation: an2 1s infinite linear;
}


/**动画*/
@-webkit-keyframes an1{
       0% {transform: rotate(0deg);}
       50%{transform: rotate(90deg);}
       100%{transform: rotate(0deg);}
}


@-webkit-keyframes an2{
       0% {transform: rotate(0deg);}
       50%{transform: rotate(-90deg);}
       100%{transform: rotate(0deg);}
}


.ct{
position: absolute;
width: 200px;
height: 200px;
}


</style>

<div class="ct" id="ctx">
  <div class="outer"></div>
  <div class="pie"></div> 
 </div>

<script type="text/javascript">
 
 var left = 0;
 var ctx = document.getElementById("ctx");


 setInterval(function () {
  left+=10;
  if(left>400){
  left=0;
  }
  ctx.style.left=left+"px";
 },1000);
</script>

效果可以看到,一个会动的圆形在往右边一动,缺口一开一合.



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值