可以采用不同的方法来创建这种形状。下面是对可能性的详细描述:
基于 SVG 的方法:
SVG
是创建此类形状的推荐方法。它提供了简单性和可扩展性。以下是几种可能的方法:
1-使用路径元素:
我们可以使用SVG
'path
元素来创建这个形状,并用一些纯色、渐变或图案填充它。
只有一个属性d
用于定义path
元素中的形状。此属性本身包含许多短命令和这些命令正常工作所必需的少量参数。
以下是创建此形状的必要代码:
<path d="M 0,0
L 0,40
Q 250,80 500,40
L 500,0
Z" />
path
以下是上述代码中使用的命令的简要说明:
M
命令用于定义起点。它出现在开头并指定绘图的起点。
L
命令用于绘制直线。
Q
命令用于绘制曲线。
Z
命令用于关闭当前路径。
输出图像:
工作演示:
svg {
width: 100%;
}
<svg width="500" height="80" viewBox="0 0 500 80" preserveAspectRatio="none">
<path d="M0,0 L0,40 Q250,80 500,40 L500,0 Z" fill="black" />
</svg>
2- 剪辑:
剪辑意味着删除或隐藏元素的某些部分。
在这种方法中,我们使用 SVG 的clipPath
元素定义一个剪切区域,并将其应用于矩形元素。剪切区域之外的任何区域都将被隐藏。
下面是必要的代码:
<defs>
<clipPath id="shape">
<path d="M0,0 L0,40 Q250,80 500,40 L500,0 Z" />
</clipPath>
</defs>
<rect x="0" y="0" width="500" height="80" fill="#000" clip-path="url(#shape)" />
以下是上述代码中使用的元素的简要说明:
defs
element 用于定义元素/对象以供以后在 SVG 文档中使用。
clipPath
元素用于定义剪辑区域。
rect
元素用于创建矩形。
clip-path
属性用于链接之前创建的剪切路径。
工作演示:
svg {
width: 100%;
}
<svg width="500" height="80" viewBox="0 0 500 80" preserveAspectRatio="none">
<defs>
<clipPath id="shape">
<path d="M0,0 L0,40 Q250,80 500,40 L500,0 Z" />
</clipPath>
</defs>
<rect x="0" y="0" width="500" height="80" fill="#000" clip-path="url(#shape)" />
</svg>
基于 CSS 的方法:
1-使用伪元素:
我们可以使用::before
或::after
伪元素来创建这个形状。创建它的步骤如下:
- 创建一个具有
::before
OR::after
伪元素的图层,其宽度和高度大于其父级。
- 添加
border-radius
以创建圆形。
- 添加
overflow: hidden
父项以隐藏不必要的部分。
所需的 HTML:
我们所需要的只是一个div
可能有一些类的元素,比如shape
:
<div class="shape"></div>
工作演示:
.shape {
position: relative;
overflow: hidden;
height: 80px;
}
.shape::before {
border-radius: 100%;
position: absolute;
background: black;
right: -200px;
left: -200px;
top: -200px;
content: '';
bottom: 0;
}
<div class="shape"></div>
2-径向渐变:
在这种方法中,我们将使用 CSS3 的radial-gradient()
函数在元素上绘制这个形状作为背景。但是,这种方法不会产生非常清晰的图像,并且可能会有一些锯齿状的角落。
所需的 HTML:
仅需要具有某些类的单个div
元素,即
<div class="shape"></div>
必要的CSS:
.shape {
background-image: radial-gradient(120% 120px at 50% -30px, #000 75%, transparent 75%);
}
工作演示:
.shape {
background: radial-gradient(120% 120px at 50% -30px, #000 75%, transparent 75%) no-repeat;
height: 80px;
}
<div class="shape"></div>
基于 JavaScript 的方法:
虽然在这种情况下不需要,但为了完整起见,我也添加了这种方法。这在某些情况下也很有用:
HTML5 画布:
我们可以使用路径函数在 HTML5 Canvas 元素上绘制这个形状:
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(0, 40);
ctx.quadraticCurveTo(311, 80, 622, 40);
ctx.lineTo(622, 0);
ctx.fill();
<canvas id="canvas" width="622" height="80"></canvas>
以下是上述代码中使用的方法的简要说明:
beginPath()
用于创建新路径。创建新路径后,未来的绘图命令将被定向到路径中。
moveTo(x, y)
将笔移动到x
和指定的坐标y
。
lineTo(x, y)
x
从当前画笔位置到和指定的点绘制一条直线y
。
quadraticCurveTo(cp1x, cp1y, x, y)
x
使用和指定的y
控制点从当前笔位置到指定的点绘制一条cp1x
曲线cp1y
。
fill()
使用非零或奇偶缠绕规则填充当前路径。
有用的资源: