在 Medium 上,Jon Moore 最近将“非矩形页眉”确定为 微型趋势。 就像:它还没有流行起来,但你等着瞧,孩子。
我们说的是页眉(或更一般地,任何容器元素)具有非矩形形状。
例如 **梯形**

或更 **复杂几何形状**


或 **圆形/椭圆形**

甚至 **屁股形状**

我认为这些也会越来越流行。 所以让我们抢先一步,讨论一下编码这些页眉的几种方法。 因为说实话,它们确实看起来很棒。
图像
也许创建上面任何非矩形页眉最简单的方法是在页眉顶部添加一个图像。
但这里有一些问题
- 响应行为? 这些蒙版通常是全宽的,定义形状的多个宽度(例如 srcset)变得很繁琐,或者会造成光栅资产的像素化。
- 这是一个完全独立的文件,需要从服务器获取——对于简单的形状来说似乎很浪费。
- 如果您必须从设计程序重新导出图像文件,那么在浏览器中进行迭代的速度很慢。
我们可以一次解决所有这些问题。 您可能已经知道这个问题要怎么解决。
SVG
与从 Sketch 导出 JPG 相比,使用内联 SVG 性能更高、易于响应且易于迭代设计。 事实上,对于大多数情况来说,这是我推荐使用的方式。 多功能、跨浏览器、矢量,而且很棒。
对于像这样的倾斜背景,您需要做出一个选择:随着屏幕宽度的变化,角度还是两侧之间的高度差应该保持不变?
如果您希望角度保持不变,请将 SVG 的高度设置为 vw

如果您希望高度差保持不变,请将 SVG 的高度设置为像素

您不必只选择一个——我们可以对它进行响应式样式,因为 SVG 元素受媒体查询的影响。 请查看此几何风格页眉在 700 像素以下和 700 像素以上宽度时的效果。
天啊,还有什么好说的呢? 哦,我们甚至可以制作屁股形状。
(也许用贝塞尔曲线做更合适,但您明白我的意思!)
还有一点值得注意,那就是如果您想完全在 CSS 中创建 SVG 背景,您可以保存 SVG 并将其 URL 引用到伪元素中。
header::after {
content: "";
position: absolute;
bottom: 0;
width: 100%;
height: 100px;
background: url(divider.svg);
}
如果您在不同的场景中使用 `divider.svg` 作为重复元素,您也可以根据需要对其进行不同的颜色填充
header::after polygon {
fill: white;
}
但这里有一个问题:如果页眉下面的部分具有复杂的背景怎么办? 在到目前为止的所有示例中,我们都只是假设了一个纯白色背景。 如果有一个精美的渐变,或者另一个背景图像或者其他东西怎么办? 然后呢?
clip-path
如果您在页眉下方有一个中等复杂的背景,那么此属性将派上用场,因此您希望蒙版是从非矩形页眉内部完成的,而不是由之后的元素完成的。
与类似的 SVG 语法一样,如果您想将以上响应行为从角度保持不变更改为高度差保持不变,您可以将计算的高度更改为简单的百分比。
clip-path 最大的缺点是什么? 浏览器支持不是很好。 但是,根据您的非矩形页眉或 div 的重要程度,它可能被视为渐进增强。 在这种情况下,就用 clip-path 尽情发挥吧!
border-radius
现在,到目前为止,我们只提到了适用于生成我上面列出的所有形状的方法。 但是,如果我们知道希望页眉具有什么特定的形状,我们可能可以使用更简单的方法。
例如,凸椭圆页眉非常适合使用 `border-radius`。
而凹椭圆页眉只需在页眉之后的元素上设置 border-radius 即可。
section {
border-bottom-left-radius: 50% 20%;
border-bottom-right-radius: 50% 20%;
}
这种方法的另一个好处是,页眉下面部分的背景仍然可以使用背景图像。
transform: skew
如果我们知道想要创建一个梯形页眉,我们可以使用 CSS 变换来倾斜整个页眉。
这会产生一个副作用,即倾斜倾斜元素的任何子元素,因此您需要在页眉中添加一个子元素来进行倾斜,其他所有元素都将放在兄弟元素中。


Stripe 的主页设计使用了这种方法,而且更巧妙的是,他们包含了几个子跨度(每个跨度都是一个色块),这些跨度与父元素一起倾斜,创造出更复杂、更鲜艳的效果。
哪个最好?
就我而言,SVG 通常是首选。 但是,如果您在页眉下方有一个更复杂的背景,那么最佳选择取决于形状。 在这种情况下,我会调查 `skew` 或 `border-radius` 是否能够满足所需的艺术指导,或者浏览器支持是否足够好,以便使用 `clip-path`。
允许复杂 BG 在下方 | 浏览器支持 | 可创建的形状 | |
---|---|---|---|
图像 | 否 | 是 | 所有 |
SVG | 否 | 是 | 所有 |
Clip-path | 是 | 否 | 所有 |
Border-radius | 是 | 是 | 仅椭圆形 |
Transform: skew | 是 | 是 | 仅梯形 |

Erik Kennedy 是一位独立的 UX/UI 设计师,也是 Learn UI Design 的创建者,这是一门关于屏幕视觉设计的实用在线视频课程。 包括颜色、排版、流程等等。 超过 30 多节课的 16 个小时的视频。
我希望您在浏览器支持类别中更具体一些。 除了 Microsoft 浏览器(IE 和 Edge)之外,所有浏览器都支持 clip-path。
目前 FF 在 clip-path:polygon() 和 % 单位方面存在问题。 但将在 FF53 中解决。
我也没有看到 clip-path 在 iOS 上工作。
哇,非常感谢您与我们分享这个!
很棒的文章,Chris! 我一直在关注整个趋势,它是我为自定义构建的主题和模板设置的标志。 您刚给了我很多东西可以操作。 甚至没有想到“屁股”形状,哈哈,谢谢!
我同意这是一篇很棒的文章;)
它是 Erik Kennedy 写的,他在我们底部链接的课程中还有更多东西要教!
如果您尝试使用具有复杂背景的 SVG,裁剪可能是一个可行的选择。
https://mdn.org.cn/en-US/docs/Web/SVG/Tutorial/Clipping_and_masking
嗨,Erik,
很棒的文章!:)
我刚为我们即将推出的新服务实现了这个非矩形标题。我选择了圆形/椭圆形,并使用了带有微妙动画的 clip-path :)
https://juststickers.in/app-icon-stickers/
我认为我受到了 Chris 关于非矩形标题的推文的启发。是他做的,还是转发了一些相关的推文。无论如何,我对非矩形方法非常满意。它在 2017 年刷新了网页的外观。:)
有趣的话题。感谢您提供很棒的想法(一如既往)。:)
transform: skew 方法看起来不错,但我几周前试过,它确实有一些缺点:当您动画化(CSS 过渡/动画)倾斜元素内部的东西时,整个元素渲染得很糟糕(比如没有平滑或抗锯齿),尤其是在字体方面。在 Windows 和 Linux 上的 Firefox 中检查过。动画结束后,一切看起来又恢复正常了。
如果标题形状必须有阴影怎么办?
box-shadow 将与 transform: skew 完美配合,请参见示例→http://i.imgur.com/X5DRAEw.png
您还可以使用过滤器,例如 webkit-filter: drop-shadow。这样阴影就会跟随元素的形状。我今天刚遇到这种情况,将其用于动画波浪。:)
如果您没有使用倾斜,您可以使用 CSS 过滤器(drop-shadop)或 SVG 过滤器(更复杂)。
2Alex
同意。Box-shadow 与直线边缘配合使用。但在带有 border-radius 的示例中,最好使用 filter: drop-shadow。
很棒的文章!我非常喜欢它!
可以使用 CSS 线性渐变实现简单的几何形状:http://codepen.io/anon/pen/ygwGzg
使用渐变的透明部分 (rgba(255, 255, 255, 0)),可以显示标题下方的一个背景。
另一种方法是使用 transform: skew,无需额外的元素。我们可以倾斜标题,然后取消倾斜所有子元素:http://codepen.io/anon/pen/OWqrBV
我们最近选择使用倾斜的伪元素,效果最好,但它只适用于简单的对角线标题。
嗨,各位,你们在这方面做得非常棒!
请注意,只有一件事,也许我只是工作过度或其他什么原因,但背景 SVG 的颜色变化是如何工作的(填充技巧)?我尝试过好几次,并查阅了一些相关信息,似乎作为 CSS 背景图像,它不是 DOM 的一部分,因此不能像那样使用它。我是否遗漏了什么显而易见的东西?
非常感谢!
喜欢这个!感谢分享!
遗憾的是,macOS 上 Safari 中的 SVG 在视网膜设备上并不完美。不过,我没有测试过 Chrome。我将其归咎于清晰的屏幕。
没错,作者没有解决这个问题令人惊讶,因为它很容易解决 - 只需创建形状,使其在底部“块状”(可能相当于 4 像素,然后将 SVG 的 margin-bottom 设置为例如 -2 像素。
现在我对自己设计的选择感到非常肯定 <:)
https://yourweb.expert
过去,我使用 CSS 伪元素,以背景叠加的方式取得了一些成功。
这里有一些可能的技巧的快速演示:http://codepen.io/ndorfin/pen/egqOLG?editors=0100
我使用 SVG 方法创建了一个 mixin。它对 SVG 进行编码并将其设置为伪元素的背景图像。这允许以自包含的方式快速使用,而无需额外的内联标记。
https://github.com/josephfusco/angled-edges
哈哈,我刚开始在过去一个月内解决这个问题。很高兴我来到这里,这样我就不必苦苦挣扎,自己想办法了。我在 2 月 1 日发布了这个概念 https://dribbble.com/shots/3259225-Arctic-Explorer-site