CSS:画扇形

来自:https://github.com/haizlin/fe-interview/issues/527

在这里插入图片描述

四个半圆叠加,过半调整 z-index
<div class="container">
  <div class="fan-1"></div>
  <div class="fan-2"></div>
  <div class="fan-3"></div>
  <div class="fan-4"></div>
</div>
.container {
    width: 200px;
    height: 200px;
    position: relative;
    border-radius: 100%;
}

div {
  width: 50%;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
}

.fan-1,
.fan-3 {
  background: #CC9999;
}

.fan-2,
.fan-4 {
  background: white;
}

.fan-1,
.fan-2 {
  border-radius: 100px 0 0 100px;
  transform-origin: 100% 50%;
  z-index: 2;
}

.fan-3,
.fan-4 {
  z-index: 1;
  left: 50%;
  border-radius: 0 100px 100px 0;
  transform-origin: 0% 50%;
}

.fan-4 {
  animation: rotate-2 2s linear both infinite;
}

.fan-2 {
  animation: rotate-1 2s linear both infinite;
}

.fan-3 {
  animation: zIndex 2s linear both infinite;
}

@keyframes zIndex {
  from {
    z-index: 1;
  }

  50% {
    z-index: 1;
  }

  50.000001% {
    z-index: 2;
  }

  to {
    z-index: 2;
  }
}

@keyframes rotate-1 {
  from {
    transform: rotate(0);
  }

  50% {
    transform: rotate(0);
  }

  to {
    transform: rotate(180deg);
  }
}

@keyframes rotate-2 {
  from {
    transform: rotate(0);
  }

  50% {
    transform: rotate(180deg);
  }

  to {
    transform: rotate(180deg);
  }
}
clip-path 切多边形, border-radius 裁剪
<div class="sector"></div>
.sector {
  display: inline-block;
  margin: 20px;
  background: #CC9999;
  width: 100px;
  height: 100px;
  border-radius: 100%;
  animation: sector 4s linear both infinite;
  transform: rotate(45deg);
}

@keyframes sector{
  from {
    clip-path: polygon(50% 50%, 0% 0%, 0% 0%);
  }
  25% {
    clip-path: polygon(50% 50%, 0% 0%, 100% 0%);
  }
  25.000001% {
    clip-path: polygon(50% 50%, 0% 0%, 100% 0%, 100% 0%);
  }
  50%{
    clip-path: polygon(50% 50%, 0% 0%, 100% 0%, 100% 100%);
  }
  50.000001%{
    clip-path: polygon(50% 50%, 0% 0%, 100% 0%, 100% 100%, 100% 100%);
  }
  75%{
    clip-path: polygon(50% 50%, 0% 0%, 100% 0%, 100% 100%, 0% 100%);
  }
  75.000001%{
    clip-path: polygon(50% 50%, 0% 0%, 100% 0%, 100% 100%, 0% 100%, 0% 100%);
  }
  to{
    clip-path: polygon(50% 50%, 0% 0%, 100% 0%, 100% 100%, 0% 100%, 0% 0%);
  }
}
静态:

先画一个圆,外加两个绝对定位的半圆
扇形可以通过两个半圆作为遮罩旋转来露出相应的角度实现
这只能切出180°以内的扇形
超过180°的扇形,就把圆作为底色,两个遮罩作为扇形的组成部分

想获得不同度数的扇形,改变 mask 样式里的度数即可。

<div class="contain">
	<div class="main"></div>
	<div class="mask1 common"></div>
	<div class="mask2 common"></div>
</div>
.contain {
	position: relative;
	width: 200px;
	height: 200px;
}
.main {
	height: 100%;
	background: lightgreen;
	border-radius: 100px;
}
.common {
	position: absolute;
	top: 0;
	width: 50%;
	height: 100%;
}
.mask1 {
	transform: rotate(83deg);
	border-radius: 100px 0 0 100px;
	left: 0;
	transform-origin: right center;
	background: red;
}
.mask2 {
	transform: rotate(-76deg);
	transform-origin: left center;
	left: 100px;
	border-radius: 0 100px 100px 0;
	background: blue;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 CSS3 中的 transform 属性和 transition 属性来实现点击扇形展开效果。 首先,需要将扇形的 HTML 结构设置为一个 div 容器和多个子元素,每个子元素代表一个扇形。容器需要设置为圆形,并将所有子元素都设置为绝对定位,位置重合在圆心上。 然后,通过设置每个扇形的 transform 属性,将其旋转到对应的位置。需要注意的是,每个扇形应该以圆心为中心旋转,角度根据扇形数量平均分配。 最后,通过设置容器的 transform 属性,在点击扇形时将其展开。可以使用 transition 属性来实现平滑的动效果。 以下是一个示例代码: ``` .container { position: relative; width: 200px; height: 200px; border-radius: 50%; background-color: gray; } .item { position: absolute; top: 50%; left: 50%; width: 50px; height: 50px; margin-top: -25px; margin-left: -25px; transform-origin: 0% 0%; transition: transform 0.2s; } .item:nth-child(1) { transform: rotate(0deg) translate(100px) rotate(-90deg); } .item:nth-child(2) { transform: rotate(45deg) translate(100px) rotate(-45deg); } .item:nth-child(3) { transform: rotate(90deg) translate(100px) rotate(0deg); } .item:nth-child(4) { transform: rotate(135deg) translate(100px) rotate(45deg); } .item:nth-child(5) { transform: rotate(180deg) translate(100px) rotate(90deg); } .item:nth-child(6) { transform: rotate(225deg) translate(100px) rotate(135deg); } .item:nth-child(7) { transform: rotate(270deg) translate(100px) rotate(180deg); } .item:nth-child(8) { transform: rotate(315deg) translate(100px) rotate(225deg); } .item:hover { transform: scale(1.2); } .container:hover .item { transform: translate(-50%, -50%) scale(1.2); } ``` 在 HTML 中,扇形的容器和子元素可以这样定义: ``` <div class="container"> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> </div> ``` 在 CSS 中,需要定义每个子元素的 transform 属性,以及容器的 transform 属性和 transition 属性。当鼠标悬停在子元素上时,可以通过设置其 transform 属性来实现放大效果;当鼠标悬停在容器上时,可以通过设置所有子元素的 transform 属性来实现展开效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值