一般拿到这种需求想到可能存在几种方案:
方案一:直接贴图,图片和内容之间的衔接,需要注意
// sass文件
body{
margin:0;
padding:0;
background: #efefef;
.curves-wrapper{
background:#fff;
.curves-before{
100%;
img{
100%;
height:0.667rem;
}
position: relative;
top:-0.667rem;
}
.curves{
position: relative;
top: -0.3rem;
background: #FFFFFF;
text-align: center;
}
}
.curves-after{
100%;
img{
100%;
height:0.667rem;
}
}
}
在html中引入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./curves.css">
</head>
<body>
<div class="curves-wrapper">
<div class="curves-before">
<img src="./imgs/ct.png">
</div>
<div class="curves">
YOUR CONTENT
</div>
</div>
<div class="curves-after">
<img src="./imgs/cb.png">
</div>
</body>
</html>
效果展示如下:

方案二:纯css实现上下的弧度
scss文件 直接利用vscode中的live sass compiler编译一下即可
body{
margin:0;
padding:0;
background: #efefef;
.div-ani2 {
position: relative;
align-items: center;
min-height: 9vw;
background-color: rgb(27, 112, 240);
overflow: hidden;
margin-top:2vh;
&:after {
content: "";
position: absolute;
left: 50%;
min- 300vw;
min-height: 300vw;
background-color: #fff;
animation-name: rotate;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
&:after {
bottom: -6vw;
border-radius: 50%;
transform: translate(-50%, -2%) rotateZ(180deg);
}
}
.div-ani2-content{
height:10vw;
line-height:10vw;
100vw;
background-color: rgb(27, 112, 240);
text-align:center;
}
.div-ani2-bottom {
position: relative;
align-items: center;
min-height: 9vw;
background-color: rgb(27, 112, 240);
overflow: hidden;
margin-bottom:2vh;
&:before {
content: "";
position: absolute;
left: 50%;
top: 72%;
min- 300vw;
min-height: 300vw;
background-color: #fff;
animation-name: rotate;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
&:before {
bottom: 12vh;
border-radius: 50%;
transform: translate(-50%, -2%) rotateZ(180deg);
}
}
// 原理即整个圆形定位在不同位置,overflow:hidden
.div-ani3 {
margin-top:90vw;
position: relative;
align-items: center;
min-height: 15vh;
background-color: #f01b5a;
30vw;
margin-left:35vw;
margin-bottom:20vw;
&:after {
content: "";
position: absolute;
left: 50%;
min- 100vw;
min-height: 100vw;
background-color: #f16369;
animation-name: rotate;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
&:after {
bottom: 1vh;
border-radius: 50%;
transform: translate(-50%, -2%) rotateZ(180deg);
}
}
}
直接在html中引入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./curves.css">
</head>
<body>
<div class="div-ani2"></div>
<div class="div-ani2-content">
your content
</div>
<div class="div-ani2-bottom"></div>
<div class="div-ani3">
</div>
</body>
</html>
效果图如下:

纯css实现的原理即是,设置一个超级大的圆形,只显示其中的一小部分;将全部内容展示出来就了解其原理了
// html
<div class="div-ani3"></div>
// sass 原理即整个圆形定位在不同位置,overflow:hidden .div-ani3 { margin-top:90vw; position: relative; align-items: center; min-height: 15vh; background-color: #f01b5a; 30vw; margin-left:35vw; margin-bottom:20vw; &:after { content: ""; position: absolute; left: 50%; min- 100vw; min-height: 100vw; background-color: #f16369; animation-name: rotate; animation-iteration-count: infinite; animation-timing-function: linear; } &:after { bottom: 1vh; border-radius: 50%; transform: translate(-50%, -2%) rotateZ(180deg); } }
展示图:
其中下面哪个小部分既是我们要的效果图:
参考文章地址:https://www.cnblogs.com/coco1s/archive/2017/07/18/7197662.html