以下是 Fabrice Weinberg 的客座文章,Fabrice 是一位喜欢探索 CSS 和 Web 技术前沿的开发者。 这篇文章也不例外!
我想看一下媒体片段 URI 规范。 特别是 空间维度 部分。 时间维度部分已于去年在 Chrome 和 Firefox 中实现,但截至撰写本文时,空间维度在任何当前浏览器中都不受支持。
明确地说: 此主题处于高度实验阶段。 今天唯一可以使用它的方法是使用我编写的 polyfill,它仅在 Chrome 和 Firefox 中有效。 基本上:不要在生产环境中使用它!
为了让您了解它是什么,您可以将时间维度视为音频/视频标签开始播放其内容的偏移量。 您可以在 此处 找到一个工作示例。
空间维度是相同的概念,但用于图像。 我们可以描述我们想要显示的图像的精确部分。
它是如何工作的?
媒体片段 URI 是一种语法,可以使用它仅选择图像的特定部分。 它看起来像这样
#xywh=160,120,320,240 # => results in a 320x240 box at x=160 and y=120
#xywh=pixel:160,120,320,240 # => results in a 320x240 box at x=160 and y=120
#xywh=percent:25,25,50,50 # => results in a 50%x50% box at x=25% and y=25%
本质上,它是附加到媒体 URL 的哈希。
示例
如果将这些“片段”附加到这样的图像 URL
http://placekitten.com/500#xywh=160,120,320,240
结果将如下所示
如规范所述,我们得到一个大小为 320×240 的图像,其左上角偏移量为 160×120。
它有什么用?
CSS 精灵的改进
我不会说使用媒体片段来替换 CSS 精灵“更好”。 相反,它通过克服一个常见问题来扩展了可能性。 使用常规图像精灵不可能创建在多个轴上重复的重复背景。 即使是一个轴也很复杂。
使用媒体片段,我们将能够从精灵中的图像创建重复的 background-image
。
演示
对于 演示中的图像,我将 此图案 与一些 Twitter Bootstrap 图标组合在一起。 传统 CSS 精灵技术用于图标,而媒体片段用于重复背景。
图像动画
另一个用例是构建图像动画的可能性,如 Jon Skinner 为 Sublime Text 2 产品页面撰写的文章 以硬核方式制作动画 GIF 中所讨论的那样。 但我认为它在生产环境中不可用,因为我同意 JavaScript 更适合此类动画。 我只是喜欢将 CSS 推到极限。
创建 Polyfill
在寻找一种在当前浏览器中测试媒体片段 URI 的解决方案时,我寻找了一种模拟其行为的方法。 您可以在 示例 Pen 上查看完整的 polyfill。
Firefox
Firefox 的解决方案非常简单。 一个名为 -moz-image-rect 的 CSS 函数完全满足我们的需求,并且自 2011 年 3 月起在 Firefox(当时版本 4)中实现。
WebKit
对于 WebKit,有一个很棒的东西叫做 CSSCanvas(-webkit-canvas 绘制)。 您可以将其视为一个 background-image
,它是一个 canvas
,并且可以通过 JavaScript 访问。 但不好的地方是此功能没有发布的规范,因此在一段时间内它将仅限于 WebKit(尽管 Firefox 有类似的功能:-moz-element)。 当前 Google Chrome 版本 (23) 中也存在一个错误 错误 16199,该错误已在 Google Chrome Canary 中修复。 此错误不会影响 polyfill,因为仅在动画内容上正确刷新画布时才会出现问题。
代码示例
div {
background: -webkit-canvas(name_of_canvas);
}
然后在 JavaScript 中将此画布用作绘图上下文。
var ctx = document.getCSSCanvasContext("2d", "name_of_canvas", 100, 100);
我们在这里所做的是检索 CSS 中定义的画布的绘图上下文(其名称为“name_of_canvas”),并将其宽度和高度分别定义为 100px。
这是一个工作示例(出于显而易见的原因,仅限 WebKit)
结论
最后,我只是将这两种核心技术结合起来创建了 polyfill。 如果有人知道扩展浏览器支持的方法,我很乐意听到。
为什么这么费劲?
我喜欢尝试新事物。 新到它们甚至还没有出现在浏览器中! 我希望你也一样。 就此为止。 如果您有任何疑问,我将很乐意在评论中回答。
感谢 Tim Pietrusky 对本教程早期版本的评论和更正。
这看起来非常有用,感谢分享。 它让我想起了 WordPress 调整图像文件大小并为调整大小的版本生成新 URL 的方式。
超级酷!!谢谢。
此技术带来了网站浪费带宽的新颖和创新方式。 他们不再满足于仅仅将 800 万像素的图像压缩成 100×100 平方像素的缩略图(当然,使用浏览器),现在他们可以裁剪掉永远不需要的东西,而无需打开那些讨厌的图像编辑器!
我不同意——按照你的思路,我们应该去除任何锋利的工具,因为有些人会伤害自己(或他人)……对吧?
这不是关于“工具”,而是关于你如何使用它——当然,有些人会找到奇怪和/或糟糕的使用方式,但这并不能说明这项技术毫无用处。
我想知道服务器是否可以在这里提供帮助。如果它们只提供正在请求的图像部分,那将非常神奇。
@Chris
不,服务器在这里无能为力。#之后的任何内容都不会发送到服务器,也不能在那里处理。
Tomasz,我并不是说它只会用于愚蠢的目的,或者应该被淘汰……只是说这肯定会出现。
很容易编写一个PHP(我确定大多数其他服务器端语言)脚本,根据这些参数提供图像,这样你就不会浪费带宽。但是,在流量很大的网站上,这会在服务器上增加很多额外的处理。
很棒的内容,感谢你“**玩弄新事物**”。
非常酷,对于在无需上传裁剪后的图像以用于较小屏幕的情况下显示响应式图像很有用。尽管如此,带宽问题始终存在……
另一方面,上传几张针对较小屏幕的裁剪图像 *可能* 会导致更多HTTP调用,这对移动网络来说也是一个问题(延迟使其变慢)。
我期待着尝试一下,一旦它变得更主流一些。目前,我们只能满足于享受它的酷炫之处=)
非常有趣!感谢分享,
谢谢!但我很好奇——如果浏览器必须缓存整个大图像,然后才能显示给我裁剪区域?我之所以这样问,是因为如果不是这样——那么它可能用于媒体查询。
我从建议中不太清楚,但媒体片段是否也允许我们从动画gif/动画png中选择指定的帧/帧范围?如果是这样,我想到了至少两种用途
a) 通过在4个维度上使用gif和png进行雪碧图,进一步增强单个图像在减少http调用方面的能力
b) 使用单个动画gif或png作为动画按钮的基本(非动画)状态和悬停(动画)状态。我想理论上,也许你可以以某种方式在鼠标移出时从当前帧过渡到另一个帧。