使用 CSS 将 div 的底部向内弯曲

Posted

技术标签:

【中文标题】使用 CSS 将 div 的底部向内弯曲【英文标题】:Curve bottom side of the div to the inside with CSS 【发布时间】:2018-06-13 23:00:08 【问题描述】:

我想用 CSS 弯曲这个矩形 div/background 的底边,所以结果是这样的:

有人知道如何实现吗?

.curved 
  margin: 0 auto;
  height: 400px;
  background: lightblue;
  border-radius:0 0 200px 200px;
<div class="container">
  <div class="curved"></div>
</div>

【问题讨论】:

【参考方案1】:

只需使用border-radius 并依靠一些溢出。您还可以考虑使用伪元素来避免额外的标记:

.container 
  margin: 0 auto;
  width: 500px;
  height: 200px;
  background: lightblue;
  position: relative;
  overflow: hidden;


.container:after 
  content: "";
  position: absolute;
  height: 80px;
  left: -10%;
  right: -10%;
  border-radius: 50%;
  bottom: -25px;
  background: #fff;
<div class="container">
</div>

如果你想要一个透明的形状,你也可以使用radial-gradient

body 
  background: pink;


.container 
  margin: 0 auto;
  width: 500px;
  height: 200px;
  background: radial-gradient(110% 50% at bottom, transparent 50%, lightblue 51%);
<div class="container">
</div>


这是使用clip-path的另一种方式

.container 
  margin: 0 auto;
  width: 500px;
  height: 200px;
  background-color: lightblue;
  position: relative;
  overflow: hidden;


.container:after 
  content: "";
  position: absolute;
  bottom: 0;
  right: -5%;
  left: -5%;
  height: 120px;
  background: #fff;
  -webkit-clip-path: ellipse(50% 60% at 50% 100%);
  clip-path: ellipse(50% 60% at 50% 100%);
<div class="container">
</div>

您也可以考虑使用 SVG:

.container 
  margin: 0 auto;
  width: 500px;
  height: 200px;
  background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64' width='64' height='48' fill='lightblue'><path d='M0 0 L0 16 C16 6 48 6 64 16 L64 0 Z' /></svg>") top center/auto 700px no-repeat;
<div class="container">
</div>

如果您还想在形状周围添加边框,下面是一个示例:

.container 
  margin: 0 auto;
  width: 500px;
  height: 200px;
  border: 2px solid #000;
  border-bottom: 0;
  background: lightblue;
  position: relative;
  overflow: hidden;


.container:after 
  content: "";
  position: absolute;
  height: 80px;
  left: -10%;
  right: -10%;
  border-radius: 50%;
  bottom: -62px;
  background: #fff;
  z-index: 2;


.container:before 
  content: "";
  position: absolute;
  height: 82px;
  left: -10%;
  right: -10%;
  border-radius: 50%;
  bottom: -62px;
  background: #000;
  z-index: 1;
<div class="container">
</div>


如果您想将图像或渐变作为具有透明度的背景,请使用mask-image

body 
  background: pink;


.container 
  margin: 0 auto;
  width: 500px;
  height: 200px;
  -webkit-mask-image: radial-gradient(110% 50% at bottom, transparent 50%, #fff 51%);
          mask-image: radial-gradient(110% 50% at bottom, transparent 50%, #fff 51%);
  background: linear-gradient(45deg,red,yellow,blue);
<div class="container">
</div>

【讨论】:

你认为这些中最兼容浏览器的方式是什么?【参考方案2】:

检查这个。我用 :after 伪元素创建了这个。如果背景是纯色会很有帮助。

.curved 
  margin: 0 auto;
  width: 300px;
  height: 300px;
  background: lightblue;
  position: relative;

.curved:after
  background: white;
  position: absolute;
  content: "";
  left:0;
  right:0;
  bottom: -25px;
  height: 50px;
  border-radius: 50% 50% 0 0;
<div class="container">
  <div class="curved"></div>
</div>

【讨论】:

以上是关于使用 CSS 将 div 的底部向内弯曲的主要内容,如果未能解决你的问题,请参考以下文章

CSS如何把DIV永远置于页面的底部?

CSS如何把DIV永远置于页面的底部

是否可以创建具有弯曲底部边缘的 UIView。

从底部向内滑动视图并模糊休息

如何将标签与 CSS 中 div 的“底部”对齐?

如何在android中创建弯曲的底部边框矩形?