具有异常边框的部分

Sections with unusual borders

我最近 运行 进入了一个 PSD 模板,该模板具有不寻常的三角形边框。我知道如何使用纯 CSS 自行创建三角形,但问题是(仅出于兴趣)关于此图像:

这些是由已经切割成这样的背景创建的,还是我可以使用相同的 CSS 来创建?

从技术上讲,您 可以 使用纯 CSS3 构建类似的东西,但这并不意味着它是个好主意。

更有可能的是,该模板使用透明的 PNG 图像,这些图像被定义为该部分的 :before:after 伪元素的 background-image。另一种选择可能是使用 <canvas> 或 SVG。

当然,在没有看到标记和 CSS 的情况下,几乎不可能确定这位设计师是如何处理它的。当然,您可以很容易地检查源代码来自己找到答案...

有多种方法可以实现这种形状。使用 clip-path、CSS 三角形、SVG、Canvas 和图像背景是其中的一部分。每种方法都有自己的优点和缺点。在不完全了解您的需求的情况下,我们无法提出建议。您应该选择最适合您需要的方法。通常我 会建议使用 SVG 来创建这样复杂的 paths/shapes.

下面是使用 CSS 和 SVG clip-path 功能创建此内容的几个示例片段。它不是 100% 完全如您所愿,但我会将微调部分留给您。

您还需要调整内容位置,使其部分内容也不会被剪裁。在代码片段中,我使用了 padding-top 来实现这一点。您也可以使用定位等其他方法。


使用CSS:

使用CSS clip-path,您可以创建多边形路径并将元素裁剪成所需的形状。这种方法的主要缺点是 the poor browser support for CSS clip-paths。目前只有 Webkit 驱动的浏览器支持 CSS clip-path 特性。

.unusual-border{
  box-sizing: border-box;
  height: 200px;
  width: 100%;
  padding-top: 10%;
  background: rgb(74,139, 207);
  -webkit-clip-path: polygon(0% 25%, 40% 5%, 55% 20%, 60% 15%, 75% 25%, 100% 10%, 100% 100%, 0% 100%);
  clip-path: polygon(0% 25%, 40% 5%, 55% 20%, 60% 15%, 75% 25%, 100% 10%, 100% 100%, 0% 100%);
}

/* Just for demo */
body{
  background: url(http://lorempixel.com/600/400/abstract/1);
}
*{
  margin: 0;
  padding: 0;
}
<div class="unusual-border">Some content</div>


使用 SVG:

SVG clip-path 在工作上与 CSS 版本非常相似,除了它比 CSS 版本有更好的浏览器支持。

.unusual-border {
  box-sizing: border-box;
  height: 200px;
  width: 100%;
  padding-top: 10%;
  background: rgb(74, 139, 207);
  -webkit-clip-path: url("#unusual-border");
  clip-path: url("#unusual-border");
}

/* Just for demo */

body {
  background: url(http://lorempixel.com/600/400/abstract/1);
}
* {
  margin: 0;
  padding: 0;
}
<svg width="0" height="0">
  <defs>
    <clipPath id="unusual-border" clipPathUnits="objectBoundingBox">
      <path d="M0,0.25 0.4,0.05 0.55,0.2 0.6,0.15 0.75,0.25 1,0.1 1,1 0,1z" />
    </clipPath>
  </defs>
</svg>
<div class="unusual-border">Some content</div>

注意: IE 不支持剪辑路径(任一版本)。如果您希望支持 IE,那么您可以使用纯 SVG 路径元素(不是 clipPath)来创建背景图像(或)使用图像(或)对多个元素使用复杂的 CSS 转换。我 当然不推荐使用 CSS 转换 和多个元素。