我喜欢 Erik D. Kennedy 的文章 创建精美 UI 的 7 条规则(第 2 部分)。其中,他的规则 4 是:学习将文本叠加在图像上的方法。我认为我们可以看一下他的所有要点,用代码实现它们,并记录任何技术问题。
着色
图像应为深色,并且没有太多对比度强的边缘。
选择图像取决于您,但假设它不是特别暗。您可以使用图像编辑程序将其变暗,或者使用 CSS 叠加透明颜色。也许最干净的方法是使用多个背景,但这 并不是很明显如何实现。诀窍是使用不渐变化的渐变(不会从一种颜色逐渐过渡到另一种颜色,只是纯色)。
.darken {
background-image:
linear-gradient(
rgba(0, 0, 0, 0.5),
rgba(0, 0, 0, 0.5)
),
url(shoes.jpg);
}
查看 CodePen 上的示例 使用多个背景使图像变暗,由 Chris Coyier (@chriscoyier) 创建。
虽然黑色叠加最简单且最通用,但您当然也可以找到彩色叠加。
事实上,使用这种方法,您可以从 CSS 的舒适区域中随意进行着色。
查看 CodePen 上的示例 使用多个背景使图像变暗,由 Chris Coyier (@chriscoyier) 创建。
白色文本
文本必须是白色 - 我敢你找到一个干净且简单的反例。真的。只有一个。
我发现这一点也是正确的,至少在试图保持优雅时是这样。垃圾杂志倾向于 使用黄色。
查看 CodePen 上的示例 myPMGB,由 Chris Coyier (@chriscoyier) 创建。
全页面图像
将文本放在图像上的一个不可避免的方式是,当您将整个屏幕填充为背景图像时。 我们之前已经介绍了如何实现这一点,最佳做法是
body {
background: /* do whatever tinting and stuff here */;
/* This will ensure everywhere is covered */
background-size: cover;
}
查看 CodePen 上的示例 zxqdev,由 Chris Coyier (@chriscoyier) 创建。
顺便说一句,如果您想像这样覆盖整个屏幕,然后能够向下滚动以获取更多内容,您可以将顶部区域设置为具有 height
为 100vh
单位。
查看 CodePen 上的示例 myPMvp,由 Chris Coyier (@chriscoyier) 创建。
浏览器支持略有不同。您可能需要使用固定高度的备用方案,或者使用 JavaScript 来实现。
文本框
这非常简单且非常可靠。制作一个略透明的黑色矩形,然后涂上一些白色文本。如果叠加层足够不透明,您可以在下面使用几乎任何图像,文本仍然完全清晰可见。
适用于任何对比度强的颜色组合。
查看 CodePen 上的示例 使用多个背景使图像变暗,由 Chris Coyier (@chriscoyier) 创建。
对于单行文本,这很容易。但如果文本有任何换行的可能性,它就更难了。您可以将标题保留为 display: block;
,但它可能不如 inline
优雅。但是对于内联,您需要确保换行符周围的间距不显得笨拙。
我们之前已经介绍过这一点。我认为 box-decoration-break
是未来的方向。
.title {
background-color: black;
color: #fff;
display: inline;
padding: 0.5rem;
-webkit-box-decoration-break: clone;
box-decoration-break: clone;
}
查看 CodePen 上的示例 使用 box-decoration-break 进行多行填充,由 Chris Coyier (@chriscoyier) 创建。
模糊
一种非常有效的方法是模糊一部分底层图像,使叠加文本清晰可见。
一种方法是让该区域的一部分继承相同的背景,将其定位到相同的位置(固定附件是一种方法),然后对其进行模糊。
.module {
background: url(http://s3-us-west-2.amazonaws.com/s.cdpn.io/3/skyscrapers.jpg);
background-attachment: fixed;
overflow: hidden;
}
.module > header {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
padding: 20px 10px;
background: inherit;
background-attachment: fixed;
}
.module > header::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: inherit;
background-attachment: fixed;
-webkit-filter: blur(12px);
filter: blur(12px);
}
查看 CodePen 上的示例 yyOodm,由 Chris Coyier (@chriscoyier) 创建。
这使用了色条以及模糊,但您并不一定要使用它。您可以将其模糊到足以使其正常工作。
查看 CodePen 上的示例 ZYWXEY,由 Chris Coyier (@chriscoyier) 创建。
Erik 将像这样仅软化图像的一部分称为遮罩。
遮罩是一种摄影器材,可以使光线更柔和。现在它也是一种视觉设计技巧,用于软化图像,使叠加文本更清晰可见。
底部渐变
底部渐变是指您有一个图像,该图像在底部微妙地向黑色渐变,然后在其上写有白色文本。
这可能非常明显,因为我们一直在使用渐变进行着色,但是…
.module {
background:
linear-gradient(
to bottom,
rgba(0, 0, 0, 0),
rgba(0, 0, 0, 0.6)
),
url(skyscrapers.jpg);
}
查看 CodePen 上的示例 ByKwaq,由 Chris Coyier (@chriscoyier) 创建。
如果您将其与一些文本阴影相结合,您可能会使用更少的图像黑暗度。
.title {
text-shadow: 0 1px 0 black;
}
最后…
- 找到其他方法并尝试结合这些技巧非常有趣。
- 我相信您会发现这些演示在某些浏览器中无法正常工作。也许我们可以使用评论区讨论备用方案。
我喜欢模糊选项。作为一名摄影爱好者,模糊会让人联想到景深(即使模糊 != 散焦),这对我很有吸引力。但是,我觉得模糊应该“渐变化”,以便从图像到模糊部分平滑过渡。
很棒的文章。许多设计师在这一点上做错了。
以前我不知道
box-decoration-break
,但我很高兴知道它的存在。您在这篇文章中使用了简单的
background-image
,但我认为它并不适合移动设备(尤其是在您使用全屏背景图像时)。也许您可以写一篇关于如何实现响应式背景图像的文章。我一直在使用绝对定位的背景容器和picture
来实现它。感谢分享这些很棒的技巧!
嗨,Mihkel,
您提到的响应式
background-image
技术听起来很有趣,您可以发布一个 CodePen 示例吗?为什么不直接在 CSS 中声明不同的媒体查询来定义不同的
background-image
要求呢?我今天晚些时候会创建一个 CodePen 并在这里回复您。
使用 CSS 媒体查询绝对是一种选择。但在我的情况下,图像通常来自 WordPress,这意味着我需要使用 PHP 将 CSS 内联。(我讨厌内联 CSS。)
关于模糊技术,将“.module > header::before”的宽度和高度设置为 150% 可以帮助更均匀地将模糊分布到整个标题区域。
是的!好主意。在没有黑色条的示例中,我最终使用了一些 scale() 操作来实现相同的效果。
很有趣的文章。我一直想知道如何在内联元素有背景时消除它们的垂直空间。我通常使用块级父元素的 `line-height` 属性来降低行间距。但是,如果设计要求行间距更大,那么我就会遇到麻烦。因此感谢您指出这个特性(`box-decoration-break`)。另外,图像的颜色色调是原始的。我也有自己的方法之一(http://thecsscoder.com/blog/css/color-splash/)。模糊 + 倾斜效果非常巧妙。
我很高兴你写了这篇文章。文字覆盖在图像上是我最近一直在尝试的,这些例子看起来更容易实现。
我之前用过的方法现在看起来很笨拙,但它更像是这样
这里有一些使用该方法的例子 -
http://codepen.io/jekrb/pen/bNdMBZ
http://codepen.io/jekrb/pen/yyeQov
我在为那些仍然使用旧浏览器的老客户的网站上使用类似的方法。
我使用嵌套的块级元素作为背景,而不是使用 `:before` 或 `:after` 选择器。我喜欢这种方法,因为它在各种浏览器中都能很好地工作,而且工作量也不大。它还能让你对背景元素进行动画处理。
我真的想看看一些例子,其中图像不是 CSS 中的背景,而是一个作为内容一部分的普通 `IMG` 标签,然后应用覆盖效果。
我通常使用绝对定位的标题,它位于一个相对定位的父容器内,就像这样
http://codepen.io/dalton/pen/VYaMGB
我正在为一个商业网站制作视频背景,我不得不使用白色文字(看起来最好),但视频是鲜艳的颜色。我尝试了几种不同的方法,最后决定使用轻微的文字阴影,大约 80 像素的模糊程度,这样阴影就不明显了,但能使文字更加突出。
很棒的文章!
还有一些技巧可以添加到工具箱中
感谢 Codepen 用户 Kseso
如果你想在覆盖文本的单词之间强制换行,而不需要额外的元素(或创建它们的脚本),你可以使用 `word-spacing` 属性来强制文本换行。你只需要在每个单词之后添加一整个窗口的空格,使用 `word-spacing: 100vw`。
感谢我用 Kseso 的作品和这篇文章中的例子进行的尝试
如果你有带背景的内联块级文本,并且你想要除了标准 1.4em 之外的行间距,背景会以难看的形式重叠。但是,你可以使用单色渐变技术来创建恰好大小的背景图像。
http://codepen.io/AmeliaBR/pen/myPBNg?editors=110
关于 Chris 的关于兼容性的问题
当你使用图形效果来确保基本可读性时,这是一个棘手的问题;如果效果不起作用,你最终可能会得到难以阅读的白色文本,覆盖在浅色的图像上。
我的内联颜色块示例(上面)通过在 `span` 上设置一个备用纯色背景,并在其上覆盖透明的背景渐变来确保基本的可读性。在 IE9 模拟器上的结果并不那么漂亮,但它是可读的,并且具有相同的整体设计。(IE8 在设计的其他方面崩溃,但同样仍然可读。)
但是,如果你使用分层背景图像来应用着色覆盖层,那么用普通的 CSS 备用规则来修复就更难了。你需要要么有一个单独的图像文件备用(例如,服务器生成的着色图像,需要做很多额外的工作),要么你必须用纯色替换整个英雄图像。
另一个选择是使用
@supports
规则来测试渐变支持(或滤镜、文字阴影,或你用来创建对比度的任何其他东西),否则使用完全不同的字体颜色和背景设置。当然,这个问题在于 IE 和 Safari 不支持 `@supports`,所以即使它们支持渐变和文字阴影,它们也会得到你的旧版浏览器备用效果。我认为只需要在 Photoshop 中构建我们想要的每个图像,然后挂到我们的网站上就可以了。
这是一篇很棒的文章。对 SEO 非常有用,这也是最佳实践。这正成为一种非常流行的技术。
感谢这篇文章。我目前正在做一个项目,其中我使用了相同的方法。你真的节省了我很多时间,否则我需要花费很多时间来尝试。
很棒的技巧(尤其是喜欢图像模糊那个!)
我用过的另一个技巧是给文本设置一个非常微妙的阴影。
除非你真的在寻找它,否则它是不明显的,但它可以使文本稍微更容易阅读。
当然,你也可以将这些技巧结合起来。这个笔使用了深色背景渐变和带阴影的白色文本的组合,在悬停/聚焦时得到强调
查看笔 响应式会议列表 by Michiel Bijl (@Michiel) on CodePen.
我喜欢这篇文章!:)
值得一提的是,一旦 CSS 混合模式有了更好的浏览器支持,对图像进行着色就会变得不那么“hacky”了。
Lea Verou 在很久以前发布了 一个片段,它使用几行 CSS 对图像进行着色。Dudley Storey 在 他的文章 中进一步阐述了它,并提供了更多示例和许多值得查看的资源的链接。
—S
这篇文章正好是我在寻找的时候出现的。谢谢您。
在 Safari 和 IE9 中不起作用 -
我非常喜欢带有半透明颜色或淡色渐变的例子。
我一直觉得,对图像的一部分进行模糊处理,使其成为前景内容,感觉就像有一种光学错觉,就像有什么东西覆盖了照片中的镜头(比如不小心用手指挡住了边缘,或者镜头上粘了一些东西):)
对于 `100vh`,我通常也指定填充,以防浏览器不支持 `vh`,或者更常见的情况是,内容太大而无法显示在视窗中。当然,我使用的是 `min-height` 而不是 `height`。
至于将背景颜色应用到一段文本,我最近遇到了这种方法,使用 `box-shadow`。
box-shadow: -15px 0 0 0px white, 15px 0 0 0px white;
- via Sophie Shepard
看起来它可能比 `box-decoration-break: clone` 有更广泛的支持
非常好的文章。清晰、简洁且非常有用。谢谢!
你的模糊演示中有一些信息缺失
1. 为了获得干净、清晰的模糊部分边界,你需要将生成的內容向上定位 20 像素左右,而不是从头部元素的顶部开始
2. 头部元素需要设置 `overflow` 属性值为 `hidden`。
3. 并且 `h1` 元素需要在 `z-index` 上更高(按照当前的写法,我的文本一直在被模糊掉)
实际的页面标记揭示了所有这些。
希望这对某些人有所帮助!
哦,我的意思是向上,而不是向下。
例如,`top: -20px`
哦,嘿,评论区在这里仍然开放。
我在我的 当前网站设计 中使用黑底白字的覆盖效果。设计可能不是最好的,但我喜欢它的外观。我看了天气频道后受到了启发。
除了使用 `100vh` 之外,另一种更兼容浏览器的实现方法是将 `html`、`body` 和你的容器的高度都设置为 `100%`。这里有一个 Codepen。
http://codepen.io/Orangestar12/pen/qEqpov