老 Trent 在 使用内嵌 box-shadow
发布了一篇关于简单而优雅效果的快速技巧文章。其中一项技术最终在图像顶部产生了渐晕效果。就像这样

是的,您可以在 Photoshop 中做到这一点,但通过 CSS 完成它意味着 1) 它是非破坏性的 2) 可以通过编程方式更改 3) 非常一致
当我第一次看到这个示例时,我想,嘿,这很酷,但为什么要用包装 div 呢?浏览器允许在 <img>
元素上使用 box-shadow
,所以为什么不直接在它上面使用内嵌 box-shadow 呢。这样 HTML 会更简洁。
<img src="amazinglandscape.jpg" alt="ooooh ahhhh" class="vignette">
.vignette {
-webkit-box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
-moz-box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
}
事实证明,您可以在图像上使用内嵌 box-shadow,只是浏览器将其设置在图像后面,这意味着如果您使用完全不透明的图像(如果您想对其进行渐晕,这很可能),您根本看不到阴影。Trent 说
虽然这看起来很没用,但当您考虑其他类型的内容时,它确实是有道理的。例如,如果您内嵌阴影,您可能不希望它遮盖其中的文本。
我还同意 Trent 的另一个观点:也许 box-shadow 的官方规范应该更改,以便在直接应用于图像时,阴影应该在顶部。遗憾的是,规范和实现都没有这样做。
然后我想,等等,我们先不要使用包装元素。毕竟,保持我们的 HTML 免于非语义包装器是一个崇高的目标。为什么不在图像上使用伪元素,我们可以强制它位于顶部并与图像完全相同的大小,然后在该元素上设置内嵌 box-shadow 呢?
.vignette:after {
-webkit-box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
-moz-box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
content: "";
}
当我正在为此制作演示时,它一直无法正常工作,把我搞得晕头转向。有一分钟,我想,我想知道 :before 和 :after 伪元素是否在内联元素* 上不起作用,但 我证明了它们在 span 上起作用,因此可以排除。
然后我 从 Nicholas Gallagher 那里得知
没有具有“空”内容模型的元素支持通过伪元素生成的 内容
Nicholas 基本上是指任何没有 innerHTML
的元素。想想
<br />
<br />
<input />
<img />
这显然是因为 规范没有解释如何处理这种类型的元素。
就像内嵌 box-shadow 一样,它有一定的道理。您可以将 :before 伪元素视为在标签内,但在其他内容之前,将 :after 伪元素视为在标签内,但在其他内容之后。
<div>
<!-- :before pseudo element -->
Hi! I'm content!
<!-- :after pseudo element -->
</div>
<img /> <!-- Where would pseudo content go? -->
对于 jQuery 用户,Tim Wright 解释说
它是 :after 更像 jQuery 的 .append() 而不是 .after(),所以您不能将某个东西塞到
<img>
的中间
如果您在想,伙计,只要将伪元素放在该元素的 AFTER 或 BEFORE 就可以了,您并不孤单。问题是这与它在其他元素上的工作方式不一致,并且规范没有涵盖它。为了使事情变得更复杂,这实际上是 Opera 的做法。
总之……关于如何干净地完成它的想法就这些了。我们只要使用包装 div 就可以了
<div class="vignette">
<img src="handsomepeople.jpg" alt="ooooh ahhhh">
</div>
.vignette {
-webkit-box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
-moz-box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
box-shadow: inset 0px 0px 85px rgba(0,0,0,0.4);
line-height: 0; /* ensure no space between bottom */
display: inline-block; /* don't go wider than image */
}
.vignette img {
position: relative;
z-index: -1; /* position beneath */
}
一个可能是理想的、也可能很烦人的副作用?使用 div 覆盖,您无法右键单击保存图像或将其拖动到桌面。非常原始的图像保护。
相关
- 另一种技术 由 Dudley Storey 提供,它让您将图像作为渐晕元素的背景图像。可能更适合一次性使用,但对于只需要在任何地方使用它而无需一直更改 CSS 的网站来说,更难使用。
* 顺便说一下,我在阅读 Introducing HTML5 时,了解了一个有趣的观点。在 HTML5 中,内联元素和块元素之间实际上没有区别。所有元素都是内联的,除非由浏览器或用户样式表另行指定。
感谢这篇文章。我不知道您可以在 box shadow 中指定“内嵌”!迫不及待地想试试。
您演示了如何做到这一点,这确实很酷,它确实是一种巧妙的技术。从概念上讲,我不太喜欢使用 CSS 来实际“修改”图像。在您在图像周围应用普通阴影或边框时情况不同,但实际上对图像内容进行样式设置对我来说听起来不太合适。我认为图像内容不需要样式设置。如果需要,它应该作为图像本身的一部分。
这当然只是一种观点,我可以看到您如何使用此技术创建酷炫的悬停效果等等。
快速提醒 - 似乎较高的模糊值会导致速度下降。
在您的演示页面上,只需使用滚轮滚动页面,就会对浏览器造成明显的压力。当我在网络检查器中关闭模糊时,一切又恢复正常。
这是一个不错的效果,并且很容易设置样式,但请谨慎使用。
是的,如果您有像这样多个 box shadow,它会使事情变得非常缓慢。
我曾经尝试在内容列的背景上使用渐晕效果(使用类似 45px 模糊),它运行得非常慢,以至于我不得不将其删除。希望将来我们会看到性能改进,它看起来真的很棒。
我喜欢内嵌 box shadow。我发现自己现在在 CSS 中进行的设计比在 Photoshop 中更多。
第三种选择(截至 2010 年 IMO 最佳选择):为渐晕创建一个透明 png 并使用绝对定位进行覆盖。现在所有浏览器都支持,是非破坏性的/可编程的,可以为您提供更多艺术控制,并且可以用于悬停效果。
但是,它也会
…创建额外的 http 请求,
…占用更多带宽,
…是额外的标记(与包装 div 不同,它不那么容易通过编程方式修改 - 包装 div 可以通过简单地注释掉 css 规则来有效地忽略)
最重要的是,css 方法提供更一致的结果:模糊始终为 85px(或任何其他值)。使用图像覆盖,如果您有多种图像尺寸,您要么需要制作多个覆盖图像,要么处理一些阴影比其他阴影更大(并且分辨率不同)。
我不完全同意您的观点。只需将 .PNG 覆盖放在精灵中,就可以减少带宽占用。额外的 http 请求也消失了。至于额外的标记。我不认为这是一个大问题。您可以使用 jQuery 做一些花哨的事情来创建标记,这样当您处理文件时,它在您的标记中不可见。
至于不同的尺寸。我同意你的观点。使用 .PNG 比使用 CSS 更难做到这一点。但更一致的结果?我不知道,因为 Box Shadow 的渲染在不同的浏览器中是不同的。甚至不同的操作系统也是如此。我可能会将渐晕用于缩略图,缩略图通常具有相同的尺寸。所以,目前,我也会使用 .PNG。
你说得对,但我从未说过我是纯粹主义者。由于 CSS3 在全球 50% 的浏览器中要过几年才能得到支持……我的版本只有一行额外的代码就能实现。当然,如果 CSS3 按预期工作会很不错,但由于您知道是谁,它并没有按预期工作。
Rick - 说得好。我认为主要优势在于一致性。虽然它可能在不同浏览器中不一致,但它将 页面 上的每个图像保持一致 - 并且更容易实现。
j - 绝对正确。
使用 JS 动态创建包装元素可能是不错的选择,以保持标记整洁。只需使用类来查找图像。反正它不是必要的内容,所以使用 JS 来生成它不会影响可访问性。
我当时在想一些 jQuery 代码,类似于;
…将是一个更易于管理的解决方案。
这正是我在想的。没有理由为了这样的效果而弄乱标记。
与 div 标签相比,带“vignette”类的 figure 标签更符合 HTML5,因为它是语义标记。顺便说一句,文章写得很好。
我之前甚至都没听说过 figure 标签...我可是读了不少关于 HTML5 的文章...好吧,你每天都会学到新东西!
我同意 figure 标签。读完你第三段之后,我就是这么想的,不过是因为我最近一直在使用 figure 标签。
文章写得非常好,讨论了各种方法,最后还给出了最终想法。
看起来伪元素可以用在 input 标签等元素上...这有点让人失望。
是否可以将图像用开始和结束标签括起来?这样似乎可行?老实说,我不确定这是否有效。
非常巧妙,但我还是觉得 Photoshop 是最好的选择。使用 Photoshop 只有在你不能使用图层的情况下才算破坏性操作。它也不比 Photoshop 更一致——多个浏览器,只有一个 Photoshop。你提到的唯一真正优势是可以以编程方式实现它。
我认为它真正有用的时候是在对旧网站进行改造。有趣的文章。
关于你最后一点关于 HTML5 中的内联元素——这意味着你可以在任何其他元素中包裹任何元素吗?例如,你通常不能将 <a> 包裹在 <div> 中,但在 HTML5 中合法吗?
你不能将 *任何* 元素包裹在任何其他元素中,但 <a> 的特定情况是正确的:http://html5doctor.com/block-level-links-in-html-5/
浏览器已经有了这种行为很多年了——只是现在它成为了标准的一部分:)
这可以用一个元素实现(到目前为止,我只在 FF 中测试过,我认为它在其他浏览器中也应该可以工作)。只需将图像设置为背景并应用内阴影。标记更清晰,但需要你指定尺寸。
当使用两个元素时,你可以使用径向渐变创建更好的暗角效果。
谢谢。
使用这种技术你无法保存页面上的图像。
感谢你分享,Chris。技术上考虑周全,而且肯定有效。
但作为设计师和摄影师,CSS3 内阴影完美地展示了真实的暗角效果 *不应该* 是什么样子。
内阴影:从侧面开始,具有渐变不透明度的纯色图层
暗角:从中心到角落径向负清晰度渐变
我知道你的目标不是绘制真实的暗角效果,而是用 CSS 展示一个简单的暗角效果。所以再次感谢你分享!
真的很棒。这样就可以摆脱“哦,我忘记给图像添加内阴影了...” 而且悬停效果也很酷 .vignette:hover {…}
需要注意的是,Windows 上的 Chrome 在结合内 inset box-shadow 和圆角边框时存在问题。这里有一个例子:http://darcrobotics.org/?page=11
这个 bug 已经提交了,你可以在此处查看这个问题的解决情况(缺乏进展):http://jordandobson.com/_expirements/css/vignette/
简单的图像保护?在 Mac 上的 Safari 中,你仍然可以轻松地将图像拖放到桌面。
我不明白为什么这很优雅,因为我记得我们在 PS7 中做这些内阴影的时候还是青少年,没有人真正喜欢它。也许内阴影在其他一些情况下更有用?:)
不过我非常喜欢新的页脚...
在查看了这篇文章之后,我自己探索了一段时间,看看我是否可以想出更接近实际暗角效果的东西。
我研究了各种创建暗角风格照片的方法,并将详细信息和代码发布在这里:http://cl.ly/3Nxc。
我基本上使用 CSS 渐变来创建这种效果。我认为效果很好。我希望你或任何其他人发现它有用!
很久以前,我尝试使用 top: 0; bottom: 0; & a width 作为基于 background-image 的伪列的替代方法。它似乎工作得很好,但很多人都告诉我,我不应该期望它在未来也能工作。
你怎么认为?
你基本上在你的 top: 0; left: 0; bottom: 0; right: 0; 中使用了相同的技术。
我一直都在用,我觉得它很有道理。我不确定为什么有人会认为它会被移除。它确实非常有效,是你应该使用的东西!
我想要的不仅仅是内容上的 box-shadow,而是真正的前景图像!
我曾经有一个项目,他们希望在每个用户个人资料照片的底部角落添加一个装饰元素。不是合法的水印,只是一个装饰性的东西。我可以使用前景图像来实现这一点,而不必在模板中添加额外的 div。
它也可能用于将内 inset box shadow 作为蒙版。
苹果正在为 Safari 开发的蒙版功能现状如何?
这就是你想要使用 ::before 和 ::after 来创建这类“前景图像”的地方。这类似于我用来叠加 CSS3 渐变图像的方法。
不幸的是,你不能使用内 inset box shadow 作为蒙版,因为它不被认为是“图像”…而且你必须使用带有蒙版的图像。
Safari 中的蒙版功能非常棒。而且从我在 Firefox 中看到的 CSS + SVG 蒙版演示来看,它的效果也很不错。这里有一个使用蒙版来重新创建苹果 iOS 选项卡栏的例子:http://cl.ly/2Hyj - 确保你在 Webkit 中查看它。
Safari 中的性能真的很差!
我不知道为什么,但所有通过 CSS 进行的阴影操作在我的 Safari /iMac 2.3GHz-CoreDuo 上性能都很差。
我的 Safari 安装版本有问题吗?还是其他人也发现了同样的问题?
不是的…box-shadow 的性能确实很糟糕…大约 20-30 像素的模糊就会开始导致 Safari 变慢。这就是我尝试使用 CSS3 渐变的原因之一。
不过,问题在于它不符合 W3C 标准,至于担心 Photoshop 会破坏性操作,只需确保你保存了原始文件,这并不难,伙计们!
我能理解为什么要尽可能地摆脱 Photoshop 和破坏性操作。你有没有遇到过客户要求你修改,但无法提供源文件,因为旧的设计师保留了它们?此外,现在是 2010 年,社交网络的时代。许多图像是由没有技术技能的用户提交的,他们无法添加暗角或阴影。然后还有更快地工作的能力。HTML5/CSS3 不会很快取代 Photoshop,但由于它只需几行代码就可以让原本平淡的设计变得更加精致,我们已经看到网页设计向前迈出了一步...
很棒的解释。现在我知道为什么 :before 或 :after 会遇到问题,以及为什么任何这样的空元素会遇到问题。
我真的很喜欢“超级原始的图像保护”:)
感谢你分享!我真的很喜欢你的文章和 lynda.com 课程。我觉得我能与你产生共鸣,这使得学习材料更容易。
很棒的文章!我以前不知道你可以这样做。我希望在我的下一个网页画廊网站中使用它。感谢 Chris!