CSS 可以创建多色梯形吗?

Can CSS create a multi-colored trapezoid?

我正在考虑更新一个 2005 网站,该网站使用两个图像来创建页面的顶部和底部框架。这些图像是一个简单的双色梯形,每个彩色区域周围都有一个边框。下图和上图一模一样,只是倒过来了。

我知道如何使用 CSS 边框创建梯形,如下所示:

#trapezoid {
    border-bottom: 100px solid #889cb0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    height: 0;
    width: 100px;
}
<div id="trapezoid"></div>

并使用轮廓模拟边框 属性,但是如何堆叠形状并使它们看起来像一张图片?或者有没有办法不用堆叠单个形状来创建图片?

这就是我想要的:

当然可以。您可以使用 clip-path 属性。


.top {
   clip-path: polygon(3.5% 0%, 96.5% 0%, 100% 100%, 0% 100%);
   -webkit-clip-path: polygon(3.5% 0%, 96.5% 0%, 100% 100%, 0% 100%);
   background-color: #889cb0;
   width: 360px;
   height: 20px;
   margin-left: 20px;
 }

 .bottom {
   clip-path: polygon(5% 0%, 95% 0%, 100% 100%, 0% 100%);
   -webkit-clip-path: polygon(5% 0%, 95% 0%, 100% 100%, 0% 100%);
   background-color: #d8e0e8;
   width: 400px;
   height: 30px;
 }
<div class="top">
</div>
<div class="bottom">
</div>


这里也有一个 Codepen,因此您可以尝试使用这些值并了解它是如何工作的。

CSS 方法:变换和梯度

您可以用 tranksform: perspective and a linear-gradient 实现形状。渐变也可以在中间创建线条。外线只要用一个border,四边的宽度根据需要调整就可以了。

这是一个工作示例:

.trapezoid {
  width: 500px;
  height: 50px;
  transform: perspective(5px) rotateX(1deg);
  margin: 50px;
  background: linear-gradient(to bottom, #889cb0, #889cb0 40%, #465b6c 40%, #465b6c 45%, #d8e0e8 45%);
  border-top: 3px solid #465b6c;
  border-bottom: 2px solid #465b6c;
  border-right: 4px solid #465b6c;
  border-left: 4px solid #465b6c;
}

.flipped {
  transform: perspective(5px) rotateX(-1deg);
  background: linear-gradient(to top, #889cb0, #889cb0 40%, #465b6c 40%, #465b6c 45%, #d8e0e8 45%);
  border-top-width: 2px;
  border-bottom-width: 3px;
}
<div class="trapezoid"></div>
<div class="trapezoid flipped"></div>

查看浏览器对 3D transformations and linear gradients 的支持。

SVG 方法

虽然您要求 CSS 解决方案,但我强烈建议您对形状使用 SVG。它们在语义上更适合您的用例、可扩展、响应迅速并提供更好的浏览器支持。

这是一个工作示例:

.trapezoid {
  width: 604px;
  height: 54px;
}

.trapezoid polygon {
  stroke-width: 2;
  stroke: #465b6c
}

.trapezoid .top {
  fill: #889cb0;
}

.trapezoid .bottom {
  fill: #d8e0e8;
}

.trapezoid.flipped {
  margin-top: 30px;
  transform: rotate(180deg);
}
<svg viewbox="-2 -2 604 54" class="trapezoid">
  <polygon points="60,0 540,0 600,50 0,50" class="bottom" />
  <polygon points="60,0 540,0 564,20 36,20" class="top" />
</svg>

<svg viewbox="-2 -2 604 54" class="trapezoid flipped">
  <polygon points="60,0 540,0 600,50 0,50" class="bottom" />
  <polygon points="60,0 540,0 564,20 36,20" class="top" />
</svg>

查看浏览器对 SVG 的支持。