CSS Sprites 是一种技术,它使用背景图像、一组宽度和高度,并调整背景位置以仅显示需要显示的部分。这样,您可以使用单个图像显示许多不同的图形,从而节省服务器请求并加快页面加载时间。
“精灵”是单个组合的图形。我们可以使用相同的理论,只是不使用 background-image 来显示图形,而是在 HTML 本身中使用图像(内联图像)。
为什么?
我不知道我是否有完美的答案。这主要只是一个概念证明和如何使用 CSS 的演示剪辑属性。虽然,内联图像与具有背景的 div 本质上不同。图像为“内容”,而空 div 则不是。
CSS 剪辑
理论是使用剪辑CSS 的属性来修剪图像,以仅显示需要显示的部分。准备图像与创建任何其他 CSS 精灵相同
您可以使用常规 HTML 显示它,并为其提供我们将使用的几个类名
<img src="images/arrow-sprite.png" alt="arrow" class="clip pos-1" />
为了使用 CSS 剪辑,元素**必须**是绝对定位的,因此我们将使用通用“clip”类执行此操作,并应用一些默认/必需的顶部和左侧值。然后,我们将为精灵中的每个不同图像设置一个类名。每个图像一个位置类名
.clip { position: absolute; top: 0; left: 0; }
.pos-1 { clip:rect(0 48px 48px 0); }
.pos-2 { clip:rect(0 96px 48px 48px); left: -48px; }
.pos-3 { clip:rect(48px 48px 96px 0); top: -48px; }
.pos-4 { clip:rect(48px 96px 96px 48px); top: -48px;
left: -48px; }
请注意为不同位置应用的负顶部和左侧值。这对于将图像移回预期显示的标准位置是必要的。您从顶部和左侧剪切掉多少图像,就将其向上和向左移动多远。这是因为图像将占用与整个精灵相同的空间,只是它的一部分不会出现。但是由于绝对定位,这个额外的空间不会影响任何其他东西,我们可以将其轻轻推回原位而不会影响任何其他东西。
每个“位置”都遵循简写形式的矩形模式,就像边距或填充使用简写形式一样:顶部、右侧、底部、左侧。**公平警告…**这写起来可能有点奇怪。写顶部、左侧、底部、右侧,就像 X、Y 坐标,感觉更自然,但这并不是它的工作原理。
它必须使用绝对定位,这一点有点限制。如果您想将图像保留为文档常规流的一部分,您可以始终将图像包装在具有相对定位的 div 中。
<div class="clipwrapper">
<img src="images/arrow-sprite.png" alt="arrow" class="clip pos-1" />
</div>
.clipwrapper { position: relative; height: 48px; width: 48px; }
相同服务器的使用
浏览器足够智能,知道如果在页面上的多个位置使用相同的图像,它仍然只需要加载一次。与传统的 CSS 精灵一样高效。看,只有一个资源
浏览器兼容性
这在 IE 6、7 和 8 以及我尝试过所有好的浏览器中都有效。这使得它在各方面都绝对可用。
注意:CSS 规范要求在 clip 属性中的值之间使用逗号,但显然旧版 IE 不喜欢它们,并且在较新的浏览器中没有它们也能正常工作。
我几天前刚注意到 Facebook 使用这种方法来为其缩略图圆角。
很棒的教程。
哦,我甚至不知道这种技术存在,更不用说它从 IE6 开始就有效了。不过,我想知道是否有需要它的情况?
就我而言,我仅在可以将其视为有价值内容的情况下才使用内联图像,并且大多数情况下是大照片或缩略图。组合它们没有意义,然后您将丢失该内容。
插入用于圆角的图像?如果您需要创建也需要垂直和水平调整大小的框,否则使用精灵。
很棒的文章,有用的东西。:) 我喜欢 CSS。
我认为 IMG 不是图标的正确元素。
可以说确实如此。
但是,无论如何,我可以想到许多使用它的方法。我以前从未听说过,所以感谢您提供一篇很棒的文章。
我可以想到许多滥用它的方法。它可能以前从未被听说过,因为通常有更相关的方法来实现它。
哇,我喜欢不校对我的帖子。
Sprites 通过将 HTTP 请求降至最低来减少加载时间。一个包含几个额外像素的文件比许多单个文件使用更少的服务器资源。此外,由于整个文件一次加载,因此过渡非常快速——当访问者将鼠标悬停在元素上时,网站不会犹豫,等待悬停状态下载。
当然,所有精灵都必须使用相同的调色板,但一点一致性并不会造成伤害。
这是一项需要掌握的伟大技术,感谢 Chris 提供的资源。
一如既往地切中要害,Chris!
我最近在一个即将发布的网站上使用了这种技术,在该网站上,我对帖子中图像的格式/大小没有控制权。(从 Joomla 导入到 WP,新帖子没问题。)
我使用
width + height
缩小图像,然后将它们保留在具有clip()
的透明 PNG 叠加层后面。效果很好,尽管有些图像确实很大,目前会导致不必要的加载——但这只是暂时的。干杯!
如果该 Anything Slider 像这种方法一样使用 1 张图像,那就太好了。
“顶部右侧底部左侧”按顺时针方向,而不是遵循矩形。您可以在矩形上向任何方向移动。
我也学习了 TRouBLe 的首字母缩略词以及顺时针技巧——可能对以这种方式学习的人有所帮助 :)
我以前从未听说过,但这确实是一个不错的技巧!
您好,
我认为您应该在 rect 括号中使用逗号分隔值,否则您将遇到验证错误……
不过,这是一项很棒的小技巧!
您的博客继续大放异彩。
为像我这样的新手开发者提供高质量的内容。
感谢您没有令人失望。
简洁的小技巧,并且很高兴知道它在所有主要浏览器中都有效。我将在我的下一个项目中尝试它。
我最初听到 clip 属性时确实想过这样做,但越想越不明白为什么要用它。如果图像属于内容,那么在上下文中只有一个精灵图像有意义。如果 CSS 被关闭,那么图像的含义就会丢失,因为它会显示精灵图中的所有其他图像。
完全同意——这是我看到这种方法时首先想到的事情。
关闭 CSS,您的网站将变成一团糟,显示许多相同的图片,并在不同位置显示多种操作。
视觉效果还可以,但这里受损的是内容 :)
现在是2009年,如果您的 CSS 被关闭,那么您将遇到更大的问题。任何值得一提的浏览器(甚至移动浏览器)都支持 CSS。
为什么有人会想要关闭 CSS?除了可能快速检查 HTML 的整洁性之外,我想不出其他任何理由……
我倾向于同意其他所有人:谁会关闭 CSS?如果没有 CSS,我们仍然会使用表格构建网站。
我能想到的唯一会关闭 CSS 的人是一些试图弄清楚网站是如何构建的开发人员,而且他们都足够聪明,能够弄清楚是什么。
这是一个很棒的工具,我计划在不久的将来实施它。
RSS 阅读器。它会关闭 CSS。
必须爱表格……:D
感谢您的撰写。我目前正在我的网站上以这种方式显示页脚图像,因为我不想让它们单独加载。
感谢这个!即使它是内联特定的,它也是迄今为止我读到的关于 CSS 精灵和 clip() 的更好的解释之一。很棒的东西!
你好,尝试为 IE 添加一些 png 透明度修复。
顺便说一句,不错的教程。
值得注意的是,CSS 规范中记录的语法是 clip: rect( 10px, 10px, 10px, 10px);
但这在 IE6 中不起作用,在 IE6 中,您必须省略 , 分隔符。
已确认!我正要来这里提到这个技巧。它不仅限于 IE6。通常,IE 会忽略推荐的逗号分隔语法,但会识别可选的空格分隔值。
我不得不想想我遇到的多少其他 IE 兼容性问题都与之相关……
我使用 clip 命令修剪宽屏 YouTube 视频缩略图顶部和底部的黑线。
有效 - 是的,HTML 的有效用法 - 否。根据 HTML 标准,每个图像(元素)都应该可以在没有 CSS(标记的视觉扩展)的情况下使用 - 因此,没有裁剪的图像完全没有用,例如对于需要辅助功能的人员。因此,不要裁剪,而是使用占位符透明 gif 并使用精灵作为其背景 - 因此,当回退到仅 HTML 模式时,它不会破坏一切。
最终找到了一个很棒的用途。我需要用不同语言的图形按钮。这样,我就可以切换到正确的语言,而无需在数据库表中存储多个图形。
谢谢!
您只需将 overflow:hidden; 添加到 clipwrapper,然后完全删除 clip CSS(保留顶部和左侧),它就可以正常工作;)
~ Chris
说得好。如果您使用包装器技术,这是一个不错的选择。
再次学到了一些新东西!!很棒的教程,并且以某种方式很好地“揭示”了 CSS 技巧……从未听说过 clip 属性^^……(我应该感到羞愧,其他人也一样 *g*)
酷!就在昨天,我不得不像这样剪裁图像,因为我不知道 clip。今天我将以这种方式进行。
“注意:CSS 规范要求在 clip 属性中的值之间使用逗号,但显然旧版 IE 不喜欢它们,并且在较新的浏览器中不使用它们也能正常工作。”
所以事实证明它在好的浏览器中实现得很糟糕。
干得好。看到精灵在行动总是好的,并且很高兴看到一个稍微不同的角度。
非常有趣!它可以在很多情况下提供帮助!谢谢;)
我认为这种内联精灵技术毫无用处。
使用带有负缩进的 span 进行文本图像替换和精灵是一个具有相同效果的标签。如果您使用锚点,则只有一个标签。
在这种技术中,您始终需要使用两个标签,如果 CSS 被关闭 - 向所有这些漂亮的精灵问好。
Chris,CSS 就是你!我以前从未听说过一个名为“clip”的属性。
关于 clip 的一个很好的教程(它还可以用于更改 div 内的背景色和前景颜色),但除非它像四个箭头一样简单,否则您将难以处理可访问的 alt 属性。
向 Chris 致敬!很棒的发现……如果巧妙地使用,它可以减少大量的 http 请求。哇!
巧妙地使用精灵也意味着要照顾浏览器内存。
不错!我在很多领域都见过这种技术。
太棒了!我甚至都不知道你可以这样做!!!
不错的技术,雅虎首页上的侧边栏也用到了,学习了!
好文章!但在使用 css 验证器 (jigsaw.w3.org) 检查时,它会给出以下 4 个错误
.pos-1 – 值错误:clip 形状定义中的无效分隔符。它必须是逗号。: rect(0 48px 48px 0)
.pos-2 – 值错误:clip 形状定义中的无效分隔符。它必须是逗号。: rect(0 96px 48px 48px)
.pos-3 – 值错误:clip 形状定义中的无效分隔符。它必须是逗号。: rect(48px 48px 96px 0)
.pos-4 – 值错误:clip 形状定义中的无效分隔符。它必须是逗号。: rect(48px 96px 96px 48px)
请帮忙找到解决方案。
不错,谢谢!
另一种方法是使用一个 1x1px 的透明 img 并对其应用一个类来创建精灵
”
请参见此处:http://cssglobe.com/post/3028/creating-easy-and-useful-css-sprites
Chris,这很棒 - 很高兴知道它在 IE6 中有效。
这对我来说是一个“啊哈!”时刻。前几天一直在玩,想知道是否可以做到这一点。谢谢。
非常聪明!很棒的教程;)
几天前我对 clip 属性了解不多,而您却带来了很酷的技巧……感谢分享……好文章……
有趣,以前从未听说过clip,不过这种技术似乎没什么用,你可以完全避免使用clip,只需在容器上使用overflow: hidden; 即可。效果完全一样。
这不是一个适用于精灵图的好技术。
它未能将内容与样式分离。
考虑一下当样式表不受支持或不可用时会发生什么。
不过,这是一篇关于clip属性用法的优秀教程。
我今天刚刚学习了一种新技术,感谢Chris分享。
我不喜欢使用CSS精灵图。它们对我来说太复杂了。而且计算它们对我来说也是一项艰巨的任务。带宽限制日益减少,我们的连接速度越来越快。我宁愿有四个5kb的图像,而不是一个带有大量代码的5kb的图像。
此致。
很棒的文章。我很高兴我找到了这篇,我之前在使用CSS精灵图、背景定位、png和IE 6时遇到了很多麻烦。
有一个自动创建CSS精灵图的工具——在Web Optimizer内部(http://code.google.com/p/web-optimizator/)。它支持所有已知的背景图像使用案例和问题。
你提出了为什么有人会选择这种方法而不是background-image的问题,我有一个答案:使用内联图像符合那些必须使用屏幕阅读器的用户的可访问性标准;背景图像不能有alt文本,并且在高对比度或其他视觉受损模式下通常完全隐藏。从语义上讲,这样做是有道理的。即使像text-indent:-9999px或常用的hack也无法在高对比度或其他模式下工作,因此内联精灵图在这方面有优势。
我感谢这篇文章是2009年写的,但我希望我能在其中找到我问题的答案。
我有一张图片(250×250)。我想将其水平和垂直都分成5份(共25块)。与其为每个位置定义一个类(.pos1,.pos2,… .pos24,.pos25),我希望能通过定义列和行的CSS来减少CSS代码。这意味着我只需要定义10个类(.c1,.c2 … .c5和.r1,.r2 … .r5),然后将这些类应用于每个img元素来表示其位置(class=”clip c1 r1″,class=”clip c1 r2″等)。
对于列,我将指定right和left值。对于行,我将指定top和bottom值。我认为这是一个绝妙的想法。然而,我很快就遇到了问题,因为clip属性指定了所有边(顶部、右侧、底部和左侧)。
有没有办法从clip属性中省略一个或多个边?否则,我可能也需要为每个位置编写一个类定义。