这不是关于特定编程问题的问题,而是关于检查不同概念。如果版主认为没有问题,请删除我的问题。
我需要在表td中显示100 png图像,图像是75x16 PNG。为了减少HTTP请求的数量,我在一个大的spritesheet中对所有166个图像(一次只显示大约100个)进行了分组,并使用IMG标记一次显示一个图像输出。这是代码:
CSS:
.sprites {background-image:url('folder/spritesheet.png');background-color:transparent;background-repeat:no-repeat;display:inline;}
#png3 {height:16px;width:75px;background-position:0px 0;}
#png5 {height:16px;width:75px;background-position:-75px 0;}
PHP:
$classy = "png" . $db_field['imageid'];
echo "<td>" , "<img src='transparent.gif' class='sprites' id='$classy' alt='alt' align='absmiddle'/>" , "</td>";
$ classy是一个基于SQL查询输出调用正确图像的变量。 transparent.gif是1px透明gif。这就是结果,图像在表格中正确显示:
页面加载速度显着增加,可能为50-60%。在我之前的一个问题中,人们对这是一种好的做法提出了一些担忧。但它确实有效。
我发现的唯一其他解决方案是使用jar压缩,但该概念仅适用于Firefox。这是用于使用jar压缩(PHP,无CSS)显示这些相同图像的代码:
$logo = "jar:http://www.website.com/logos.jar!/" . $db_field['imageid'] . ".png";
echo "<tr>" , "<td>" , "<img src='$logo' alt='alt' width='75' height='16'/>";
所有166个图像都在jar存档中压缩并上传到服务器,而jar是一个非实体存档,只提取被调用的图像,而不是全部。这个解决方案快速点亮,我从未见过更快的方式来显示那么多图像。这个概念是here,值得链接。与CSS精灵相比的另一个优点是,使用jar可以针对大小单独优化每个图像(例如,一个优化为64种颜色,另一种优化为128,32 ......取决于图像),并且无法优化大型spritesheet,因为它包含很多颜色。
那么,有没有人知道一个与jar一样快的解决方案?如果使用CSS精灵来显示内容是不好的做法 - 什么是良好的做法,给出相同的结果?这里的关键是网站的加载速度尽可能少的HTTP请求。
答案 0 :(得分:2)
这不是真正的专家,但我也分享了这些东西
HTTP请求
听说过“2个并发连接”(recent browsers have around 6-8)。加载很多东西意味着如果2个同时加载,其他人必须排队等候。将它加载到一个大块中更好。这是使用spriting的主要原因。除连接限制外,您还可以在一个图像中管理这些“相同用途”的图像。
<强>缓存强>
现在,我说了一大块,但你可能会问“这会让情况变得更糟吗?”不,因为我有一个王牌,这就是“缓存”的用武之地。只需一页加载就可以了,然后,噗!需要该图像的其余页面就像光速一样,可以让您远离另一个HTTP请求。永远不要低估缓存的力量。
图片强>
您可以做的其他事情是优化图像。我使用过Fireworks,我真的很喜欢它的图像优化工具。为了优化,我遵循以下个人指南,您可以在您的情况下使用:
图标的GIF,图片的JPG,透明的PNG。
删除未使用的颜色。是的,你可以在一些工具中做到这一点。缩小规模
永远不会调整html中的图片大小。已经调整了版本。
质量下降。是的,有这样的事情。将图像质量降低到合理的限度。失去太多会使你的形象太“混乱”或“块状”
渐进式加载图片。它的作用是“快速加载”模糊图像,然后在以后清除它。
避免使用动画图片。他们是一个臃肿,更不用说烦人了。
服务器技巧
存在连接限制 - 但这并不妨碍您using other domains or even subdomains!将您的内容分发到其他域或子域以增加连接数。对于图片,请为其指定一个或两个子域,例如说img1.mysite.com
和img2.mysite.com
或其他域mysite2.com
。它不仅对您的用户有益,而且有利于分配服务器负载。
另一种方法是使用内容分发网络(CDN)。 CDN拥有全球服务器网络,其中包含您网站资源的“缓存”版本。就像说我在亚洲,当我用CDN的资源查看你的网站时,它发现服务器中的资源最接近亚洲。
<强>标记式强>
不一定与速度和语义相关,但id
的使用应保留用于更重要的目的。如果您使用ID为其样式标记图像,如果有另一个元素需要相同的图像怎么办? ID必须是唯一的,不能使用两次。所以我建议改用多个类。
另外,ID优先于类。为避免意外覆盖,请使用类。详细了解CSS specificity。
.sprites {
background-image:url('folder/spritesheet.png');
background-color:transparent;
background-repeat:no-repeat;
display:inline;
height:16px; /*same width and heights? place them here instead*/
width:75px;
}
.png3 {
height:16px; /* in cases you need a different dimension, this will override */
width:75px;
background-position:0px 0;
}
.png5 {
background-position:-75px 0;
}
$classy = "png" . $db_field['imageid'];
echo <img src='transparent.gif' class='sprites {$classy}' alt='alt' align='absmiddle'/>";
答案 1 :(得分:0)
我在样式表中嵌入了小图片/图标:
.someicon{
background-image:url('data:image/png;base64,iVBORw0KGg....');
}
这适用于所有现代浏览器,并且不需要我创建精灵(甚至还可以保存一个额外的文件来加载)。
在开发过程中,图像通常在样式表中定义:
.someicon{
background-image:url('../images/someicon.png');
}
我有一个生成最终样式表的系统(包括将所有CSS合并为一个,用数据:url缩小和替换图像引用)每当我对样式表进行更改时都会自动生成。
这很好用,为我节省了大量的工作。使用gzip压缩时,CSS文件并不比添加在一起的单个文件大得多。优化PNG / JPG文件后,我的起始页面的CSS为63K未压缩。即使使用稍微小一点的精灵文件,我也可能不会为普通用户节省超过一秒的加载时间,所以我不打扰精灵。