CSS sprites 精灵

CSS sprites,被称为 CSS 精灵,也叫图像精灵。


图像精灵

图像精灵是单个图像中包含的图像集合。

包含许多图像的网页可能需要很长时间才能加载,同时会生成多个服务器请求。

使用图像精灵将减少服务器请求的数量并节约带宽。


sprites - 简单的例子

我们使用以下单幅图像("navsprites.gif")而不是使用三幅单独的图像:

通过使用 CSS,我们可以仅显示所需图像的某个部分。

在下面的例子中,CSS 指定了显示 "navsprites.gif" 图像的哪部分:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <style>
  5. #home {
  6. width: 46px;
  7. height: 44px;
  8. background: url(/images/img_navsprites.gif) 0 0;
  9. }
  10. #next {
  11. width: 43px;
  12. height: 44px;
  13. background: url(/images/img_navsprites.gif) -91px 0;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <img id="home" src="/images/img_trans.gif" width="1" height="1">
  19. <img id="next" src="/images/img_trans.gif" width="1" height="1">
  20. </body>
  21. </html>
例子解释:
  • <img id="home" src="trans.gif"> - 仅定义小的透明图像,因为 src 属性不能为空。而实际显示的图像将是我们在 CSS 中指定的背景图像。
  • width: 46px; height: 44px; - 定义我们要使用的图像部分
  • background: url(navsprites.gif) 0 0; - 定义背景图片及其位置(left 0px, top 0px)

图像精灵 - 创建导航列表

我们希望使用 sprites("navsprites.gif")来创建一个导航列表。

我们将使用 HTML 列表,因为它可以是链接,同时还支持背景图片:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <style>
  5. #navlist {
  6. position: relative;
  7. }
  8. #navlist li {
  9. margin: 0;
  10. padding: 0;
  11. list-style: none;
  12. position: absolute;
  13. top: 0;
  14. }
  15. #navlist li, #navlist a {
  16. height: 44px;
  17. display: block;
  18. }
  19. #home {
  20. left: 0px;
  21. width: 43px;
  22. background: url('/images/img_navsprites.gif') 0 0;
  23. }
  24. #prev {
  25. left: 63px;
  26. width: 42px;
  27. background: url('/images/img_navsprites.gif') -47px 0;
  28. }
  29. #next {
  30. left: 129px;
  31. width: 42px;
  32. background: url('/images/img_navsprites.gif') -91px 0;
  33. }
  34. </style>
  35. </head>
  36. <body>
  37. <ul id="navlist">
  38. <li id="home"><a href="/css/css-course.html"></a></li>
  39. <li id="prev"><a href="/css/css-intro.html"></a></li>
  40. <li id="next"><a href="/css/css-syntax.html"></a></li>
  41. </ul>
  42. </body>
  43. </html>
例子解释:
  • #navlist {position:relative;} - 位置设置为相对,以允许在其中进行绝对定位
  • #navlist li {margin:0;padding:0;list-style:none;position:absolute;top:0;} - 外边距和内边距设置为 0,删除 list-style,并且所有列表项都均为绝对定位
  • #navlist li, #navlist a {height:44px;display:block;} - 所有图片的高度均为 44px

现在开始为每个特定部分设置定位和样式:

  • #home {left:0px;width:46px;} - 一直向左定位,图像宽度 46px
  • #home {background:url(/images/img_navsprites.gif) 0 0;} - 定义背景图片及其位置(left 0px, top 0px)
  • #prev {left:63px;width:43px;} - 向右定位 63px(#home 宽度 46px + 项目之间的一些额外空间),宽度 43px。
  • #prev {background:url(‘/images/img_navsprites.gif’) -47px 0;} - 定义背景图片向右 47px(#home 宽度 46px + 1px 分隔线)
  • #next {left:129px;width:43px;} - 向右定位 129px(#prev 开始是 63px + #prev 的宽度是 43px + 多余的空格),宽度 43px。
  • #next {background:url(‘/images/img_navsprites.gif’) -91px 0;} - 定义背景图片向右 91px(#home 宽度 46px + 1px 分隔线+ #prev 宽度 43px + 1px 分隔线)

图像精灵 - 悬停效果

现在,我们要向导航列表中添加悬停效果。

提示::hover 选择器可用于所有元素,而不仅限于链接。

我们的新图像("navsprites_hover.gif")包含三幅导航图像和三幅用于悬停效果的图像:

因为这是一幅图像,而不是六个单独的文件,所以当用户将鼠标悬停在图像上时,不会有加载延迟

我们仅添加三行代码来实现悬停效果:

代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <style>
  5. #navlist {
  6. position: relative;
  7. }
  8. #navlist li {
  9. margin: 0;
  10. padding: 0;
  11. list-style: none;
  12. position: absolute;
  13. top: 0;
  14. }
  15. #navlist li, #navlist a {
  16. height: 44px;
  17. display: block;
  18. }
  19. #home {
  20. left: 0px;
  21. width: 43px;
  22. background: url('/images/img_navsprites_hover.gif') 0 0;
  23. }
  24. #prev {
  25. left: 63px;
  26. width: 42px;
  27. background: url('/images/img_navsprites_hover.gif') -47px 0;
  28. }
  29. #next {
  30. left: 129px;
  31. width: 42px;
  32. background: url('/images/img_navsprites_hover.gif') -91px 0;
  33. }
  34. #home a:hover {
  35. background: url('/images/img_navsprites_hover.gif') 0 -45px;
  36. }
  37. #prev a:hover {
  38. background: url('/images/img_navsprites_hover.gif') -47px -45px;
  39. }
  40. #next a:hover {
  41. background: url('/images/img_navsprites_hover.gif') -91px -45px;
  42. }
  43. </style>
  44. </head>
  45. <body>
  46. <ul id="navlist">
  47. <li id="home"><a href="/css/css-course.html"></a></li>
  48. <li id="prev"><a href="/css/css-intro.html"></a></li>
  49. <li id="next"><a href="/css/css-syntax.html"></a></li>
  50. </ul>
  51. </body>
  52. </html>
例子解释:

#home a:hover {background: transparent url(‘img_navsprites_hover.gif’) 0 -45px;} - 我们为所有三个悬停图像指定相同的背景位置,仅向下 45 像素。