HTML5 有一个新的属性,contenteditable,可以应用于任何元素,允许它直接在浏览器窗口中进行编辑。想想带有预定义值的文本输入,但它实际上可以是任何元素。表单元素(如文本输入)支持 :focus 伪类,这使我们能够在单击或以其他方式导航到这些元素时对其进行样式设置。给一个元素一个contenteditable属性意味着它现在也支持 :focus 伪类,这打开了一些有趣的功能!
我们将利用这个小技巧在一些内容中制作一个扩展的图像(就像没有覆盖层的灯箱)。
更新:更棒的是,您可以给属性一个tabindex属性,就像您对表单元素所做的那样,它允许在没有可编辑性的情况下 :focus。本文已更新为采用这种方式。

HTML5 标记
HTML5 有不错的元素可以包含带标题的图像。
<section class="image-gallery">
<figure>
<img src="images/img-1.jpg" alt="jump, matey" />
<figcaption">Jump!</figcaption>
</figure>
</section>
我们只需要给 figure 元素 tabindex,以便它可以处于焦点。
<figure tabindex=1>
给每个后续的 figuretabindex值高一个,图像就可以通过键盘很好地从一个到另一个进行切换!
图像
图像将是“全尺寸”。

这意味着它们将在页面上进行常规显示时进行缩小,并在我们进行神奇的 CSS 扩展时进行放大。对于不支持此功能的浏览器来说,这可能是一种带宽浪费。权衡取舍由您决定。
CSS
正常显示
figure {
width: 120px;
float: left;
margin: 0 20px 0 0;
background: white;
border: 10px solid white;
-webkit-box-shadow: 0 3px 10px #ccc;
-moz-box-shadow: 0 3px 10px #ccc;
-webkit-transform: rotate(5deg);
-moz-transform: rotate(5deg);
-webkit-transition: all 0.7s ease;
-moz-transition: all 1s ease;
position: relative;
}
figcaption {
text-align: center;
display: block;
font-size: 12px;
font-style: italic;
}
figure img {
width: 100%; /* Scale down */
}
这部分 :focus 不是 CSS3,但阴影、变换和过渡是。悬停状态将稍微旋转图像,而 :focus 样式(当单击图像时)将扩展它,再次旋转它,并确保它使用 z-index 位于顶部。
figure:hover {
-webkit-transform: rotate(-1deg); -moz-transform: rotate(1deg);
-webkit-box-shadow: 0 3px 10px #666; -moz-box-shadow: 0 3px 10px #666;
}
figure:focus {
outline: none;
-webkit-transform: rotate(-3deg) scale(2.5); -moz-transform: rotate(-3deg) scale(2.5);
-webkit-box-shadow: 0 3px 10px #666; -moz-box-shadow: 0 3px 10px #666;
z-index: 9999;
}
浏览器兼容性
HTML5contenteditable属性在 Firefox 3.6+、Safari 4+、Chrome 和 Opera(仅测试 10.6)中受支持。请注意,该属性将级联到所有子元素。在我们的演示中,让图像和图片标题可编辑没有多大意义,因此我们可以单独关闭它们的编辑功能。
<figure contenteditable="true">
<img src="images/img-1.jpg" alt="jump, matey" contenteditable="false" />
<figcaption contenteditable="false">Jump!</figcaption>
</figure>
如果您忘记关闭图像的可编辑性,Firefox 看起来可能会有点怪异,因为它会给您图像提供调整大小的句柄。更新:使用tabindex的另一个原因。

Opera 尊重子元素不可编辑,但仍然会对它们运行拼写检查,并会用红色下划线标出它发现的拼写错误的单词,这可能有点奇怪。
我们的演示还依赖于变换来“工作”,但变换仅在当前的 WebKit 浏览器和 Firefox 4+ 中受支持。Firefox 3.6 支持变换,但不支持过渡。
回退是图像不会扩展,但这当然没什么大不了的。
演示和下载
相关
- 如果您正在寻找纯 CSS 灯箱(包括覆盖层),请查看 Stu Nicholls 版本.
- 如果您需要您的灯箱完全跨浏览器兼容,请使用 JavaScript,例如 jQuery 的 Colorbox 插件。
鸣谢
非常感谢 Adrian Sinclair,他联系了我关于这个想法,并帮助我完成了所有的事情。
酷
我们可以旋转 z 坐标(3D)中的图像吗?
如果我没记错,使用
-moz-transform: matrix(a, c, b, d, tx, ty)
据我所知,3D 变换在规范中,但目前在任何稳定浏览器中都不可用。
现在还无法下载…… ;-)
无论如何谢谢。
我个人不喜欢这种技术,因为您可以从灯箱中移除图像(因为 content editable 属性)。
但这仍然很有趣,是您可以在没有 JavaScript 的情况下做到的另一件事。
必须喜欢它……而且没有 JS!
contenteditable 有一些不必要的副作用,比如当您单击图像并按下键(如“a”)时,图像将被字符“a”替换。
不使用 contenteditable,考虑使用 tabindex=”-1″,它也应该使其可聚焦(似乎在 Chrome 6 上有效)
好主意!浏览器支持似乎是一样的。我更新了文章和下载内容以使用此选项,因为它更简洁,并且可以很好地添加键盘导航。我认为我只需要使用 1-4 的 tabindex 值,而不是 -1,因为为什么不能让它们可以被切换到……
使用 :focus 来赋予特定样式,并且演示很好。
但如果您想使随机元素可聚焦,contenteditable 是错误的属性。您应该使用 tabindex=”0″。查阅一下。:)
哦,我看到有人之前提到了 tabindex。使用 tabindex=”-1″(或任何负值,如 HTML5 所述)将起作用,但元素无法通过顺序焦点导航访问,而使用 tabindex=”0″ 则可以。因此,如果您想让它与焦点导航一起使用(而不是单击),请使用 tabindex=”0″。
很棒的文章。我不知道 contenteditable 或 tableindex。您的演示不像在 IE 中那样令人兴奋。可怜的 IE。它什么时候才能赶上?
这篇文章很好地利用了 CSS3 功能,太棒了。那么您认为考虑到如今 IE 用户的显著数量,我们应该何时最终转向 CSS3?
我不确定这是否相关,但有一个叫做 CSS3PIE 的东西,它声称使用 Javascript 来使 CSS3 特性在 IE 中可用。但是,我使用它的经验非常糟糕(也就是说,我无法让它工作)。
我相信 PIE 只处理 3 个 CSS3 属性……border-radius、线性渐变和阴影。而且我让它工作得很好。不过它在 z-index 上存在问题,而且我相当确定它在表单元素上根本不起作用。
使用 PIE 时,最重要的是要记住,即使你是在 CSS 文件中声明它,它也必须相对于 HTML 文件。所以,不是(../images/PIE.htc),而是(images/PIE.htc)。我猜想这就是你遇到的问题。
我的错误可能就在这里。但我确实在 PIE 手册中阅读了这些说明,并确实将路径设置为相对于 HTML 文档的。
不过我还会再试一次。感谢你的建议。
啊,我找到了原因!因为在本地它不起作用(出于某种原因,即使它应该起作用,因为它只是 JS?),但是当我把它放到服务器上时,它就可以正常工作了。
很酷的东西 :)
PIE 是 IE css3 的*解决方案*。强烈推荐。
所以,我认为抗锯齿问题主要来自次像素渲染技术没有像 HTML5 那样处于领先地位,对吧?因为即使使用 ClearType,图像的破碎看起来也相当不专业。别误会我,我喜欢这个概念,但就像大多数 HTML5 东西一样,它还没有准备好用于主流使用。
抗锯齿问题是 Chrome(以及 Webkit,推测)在图像上的问题,以及 Firefox 在文本上的问题(但有趣的是,Chrome 在文本上显示得很好,而 Firefox 在图像上显示得很好)。
这与次像素渲染无关 - 它们只是没有对旋转的图像(Chrome)或文本(FF)进行抗锯齿处理。锯齿状边缘是抗锯齿伪影。
很棒的示例,没有 JS,只有纯 html5 和 css3 - 我喜欢它。谢谢。
大多数 CMS 编辑器是否具有在用户放置图像时调整图像大小的功能?如果没有,那么这可能就是使用 img 上的可编辑内容的用途。假设客户上传了一张非常大的图像,然后将其放置在内容中,并且你让所有 img 标签的 contenteditable 设置为 true,你可以使用 javascript 在他们使用边界框调整图像大小后获取高度和宽度,并将这些数字用于 img 的显示大小。有道理吗?
还有人知道 HTML5 IE shiv 是否处理这些新属性?或者它只是处理元素?我还没有使用过它,只听说过它。如果它可以处理,你可以使用 CSS PIE 和 shiv,让除了 CSS3 transform 之外的所有东西在 IE 中都能正常工作。至少这是我的想法。
当然,仅仅为了让 IE 工作起来有点像其他浏览器,你需要经历很多麻烦。
好的,回复我自己,以及任何关心的人。shiv 确实可以让属性正常工作。对于 IE7,如果你在图像上设置了 contenteditable 为 true,你需要为它设置一个 min-height,否则你将无法调整 img 的高度。我没有在 6 中尝试过。IE8 在没有 min-height 的情况下工作得很好。
忽略我上面评论中的“可以使用 PIE 和……”。我的思维空白了。没有 transform,即使有了可用的焦点也毫无意义。
感谢你查看 shiv 是否处理新的属性,我一直在想这个问题。
顺便说一句,Chris,这篇文章很棒!
抱歉,但为什么你不添加 -o- 和无前缀规则?
这样,当浏览器支持没有前缀的属性时,你就不会看到效果了!
我来这里是想问这个问题。“transform”而不是仅仅“ -moz/-webkit-transform”是未来证明的好方法吗?
从 HTML5 规范中要注意的几点
tabindex="-1"是为了允许使用 Javascript 和鼠标点击来使元素获得焦点,但不允许通过按 Tab 键来实现。
正整数是可以的,如果元素按顺序排列在 HTML 中,所有零也是可以的。
我想说的第二点是使用figure/figcaption组合是有争议的。
以下是规范对 figure 的描述
Figure 可以包含图像、视频、表格、代码片段等等。此外,它是一个分区根,这意味着它可以有自己的大纲,即标题和副标题,section和article如果需要的话。
除了section在使用div的地方使用,将所有图像包裹在figure中,可能是 HTML5 代码中最常见的错误。
我想我并不觉得这里有任何特定的元素被滥用了……但感谢你对规范的研究,这绝对值得考虑。
有趣的是,HTML5 规范一直在根据人们的实际使用情况进行调整。在一段时间内,aside元素不被认为适合用作侧边栏,但现在被允许了。
绝对的。HTML 规范的伟大之处在于,实现基本上是先于规范的,而且应该如此。
我在 http://derekjohnson.posterous.com/ 上写了一些关于 figure 的想法,这些想法基于我对规范的理解,但如果带标题的图像通常用 figure/figcaption 标记,我会支持规范更改以反映这一点。
我们最不希望看到的是 HTML5 陷入与 XHTML2 相同的境地。
附注:感谢你帮我整理了我过度使用代码标签的问题。
我同意 Chris 的观点,对于带有标题或标签的图像,还有什么比<figure>和<figcaption>更具有语义性的?我绝对不认为每张图像都应该用<figure>包裹,但如果它与标题配对,那么使用
更有意义。你关于对 tabindex 使用全零的观点很好,因为我发现 tabindex 可以用作 contenteditable(我最初使用的)的替代方案,我认为能够通过图像进行 Tab 键操作对可用性来说是件好事,因为使用屏幕阅读器的用户可能会最常使用 Tab 键操作,而且如果他们的视力不好(如果他们使用屏幕阅读器,这很可能),他们最需要图像缩放功能。
为了呼应关于 tabindex 为零的评论,对标准 Tab 键顺序使用零更容易维护。尝试跟踪相对于所有可聚焦元素的当前 Tab 键索引值是一件很痛苦的事情,尤其是在混合使用 ARIA 和标准小部件时。
我找到了一种方法,可以让它在 IE 中工作,如果启用了 javascript,cssSandPaper 是一个 javascript 中的 css“插件”,它允许在 IE 中使用 transform,使用过滤器(用于让 IE6 加载 png24 和 IE 中的透明度),我不太清楚如何使用它,但值得一试!
我喜欢这个,尤其是 tabindex 的改进。
这也及时地提醒了我,不知何故,我需要覆盖 WordPress 的图库输出以使用这种结构(我不是程序员,PHP 或其他)。
谢谢,Karl
非常好的主意。
感谢你写这篇文章。
我尝试通过在背景中添加一个叠加效果来改进它
http://www.creativejuiz.fr/trytotry/lightbox-with-tabindex-and-css3/
希望你会访问它。
谢谢,Geoffrey。
嘿,Chris!很棒的文章!但有一个小语法错误 :)
“此处的 :focus 部分不是 CSS3,但阴影、transform 和过渡是”。
不过,文章很棒!谢谢!
为什么你不使用-o-transform, -o-transition和box-shadow属性来让它在 Opera 上也能工作?
我在演示中添加了所有这些前缀,但它们在 Opera 10.6 中都没有起作用。
这些对我来说很好用(Opera 10.60 在 Debian Linux 上)。您尝试过清空缓存或重新加载 CSS 文件吗?请访问 https://css-tricks.org.cn/examples/ExpandingCaptionedImages/css/style.css 并按 F5(或 Mac 上的命令,可能是 Cmd+R)一次或两次,这对我有用。
还有…… CSS 属性
-o-box-shadow
不存在,Opera 使用常规的box-shadow
(也适用于border-radius
,但不适用于transform
和transition
– 它们使用-o-
供应商前缀)。嘿,Chris,
不错的教程 :)
很高兴看到这是在没有使用 JavaScript 的情况下构建的,别误会,我真的很喜欢 JavaScript,但减少下载时间对于 SEO 来说越来越有益。
IE 和 html5/CSS3 太可惜了 :(
我真的很想使用所有这些新功能来构建网站,但直到 IE 追赶上来之前,这都是不可能的,因为很大一部分 Web 用户仍然使用 IE,而且网站看起来并不像我希望的那样好。+大多数我为其设计网站的人使用 IE,所以我无法向他们推销其网站所包含的惊人功能!
看起来像是全面的 Wuffoo 战场!!!LOL
像往常一样,好文章!!
太棒了!谢谢 :)
也许它之前就被命名了,但我没有找到它……
Safari 5 对阴影和字体做了些奇怪的事情……让我称之为“baa”(糟糕的反锯齿)。
我认为 baa 不是 Webkit 问题,因为它不会出现在 Chome 5 中。它在调用 transition-methode 时出现。动画结束后,一切又恢复正常。
无论如何。它很棒。谢谢,Chris。
我认为这有可能拥有某些基本的 Internet Explorer 功能。Internet Explorer 8 会将 :focus 应用于任何元素(不仅仅是输入),因此它将在没有 tabindex 的情况下工作。
这需要一些操作(很多 IE 特定的边距和位置),但我很快就将它拼凑起来,它在 IE8 中工作得很好。通过一些努力,您可能能够实现与 Firefox 3.5 中相同的支持水平。
http://jsfiddle.net/kPpq8/1/
太棒了,一如既往,Chris。我在 7 月从明尼苏达州北部获得的数据页面上试用了它。(我现在住在纽约市,热得要死。)
有趣的是,当我添加一个 Vimeo 视频链接时,Zoomed 类型在 Safari 中没有聚焦。但在 Firefox 中可以。
请看这里:http://kennethbsmith.com/bonus/holidays/mn0710/(没有视频)
以及包含视频:http://kennethbsmith.com/bonus/holidays/mn0710/index02.html(Zoomed 照片上的标题类型是 Wack)
是什么导致了这种情况?为什么插件会这样?
希望您度过一个美好的夏天,因为您应得的。感谢您的教程。
PS:我还没有听说 Brett 今年是否会演奏,您听说过吗?
Firefox 3.6 没有动画。Chrome 6 没有抗锯齿。一半的访问者(IE)根本看不到。
如何使用 Flash,它具有所有功能并在 98% 的浏览器中工作?并做一个简单的回退,而不是把一切都搞砸?
在 iOS 的 Safari 中效果很好,但无法返回到正常比例!
救命!
我喜欢这种扩展图像的方式,但是如果我想在 figcaption 中添加超链接怎么办?单击锚点标签后,焦点会丢失,我无法找到使其工作的方法。