减少HTTP请求来加快页面响应速度的三种做法,CSS Sprites|内联图片|合并脚本和CSS

简介: 版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/79175665 Web页面的响应速度对一个网站至关重要,响应得快,用户的反馈肯定是好评;响应的慢,用户会敬而言之。
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/79175665

Web页面的响应速度对一个网站至关重要,响应得快,用户的反馈肯定是好评;响应的慢,用户会敬而言之。性能黄金法则告诉我,用户响应时间的80%-90%花费在为页面加载脚本、样式表,以及图片。那么如果能够在这三个方面做出调整,那么页面响应速度就能够得到大幅度的提高。

1)CSS sprites

在我最初的认知里,我以为CSS sprites就是图片地图,但其实并不是这样。图片地图主要应用于在一张图片上链接多个URL。CSS sprites和图片地图有相似之处,那就是都需要把多个图片合并成一张。

来看这样一张导航效果图,如图1。

图1

它的背景图片是这样的,如图2。

这里写图片描述

该怎么实现这样的效果呢?

来看页面导航条的HTML元素构成:

<ul>
<li class="nav_1"></li>
<li class="nav_2"></li>
<li class="nav_3"></li>
<li class="nav_4"></li>
<li class="nav_5"></li>
</ul>

首先,需要为五个<li>标签指定 background-image,代码如下:

ul li {
    background-image: url(../ec_good_index.png);
    background-repeat: no-repeat;
    display: block;
    background-size: 63px 378px;
    width: 63px;
    height: 63px;
}

background-size很重要,因为图2中的图片实际大小是150*900,比我们想要的背景图要大,如果不设置background-size,那么就无法取到想要的图片导航。

接着,我们为每个li标签指定background-position,它是CSS sprites的核心,通过background-position,可以将li标签放到背景图期望的位置上,代码如下:

ul li.nav_1 {
    background-position: 0 0;
}
ul li.nav_2 {
    background-position: 0 -63px;
}
ul li.nav_3 {
    background-position: 0 -126px;
}
ul li.nav_4 {
    background-position: 0 -189px;
}

图片在y轴的向下的方向上递增,也就是说背景图上的第一个位置为0,0,那么第二个位置就是0,-63,也就是说第二张导航图在第一张的下方,偏移63像素,也就是第二章导航图的高度。第三张为-126,依次类推。

如果背景图上的图标是横向排列的,position坐标就有所不同,你可以实践一下。

CSS sprites是一种优秀的解决方案——更少的图片,更短的响应时间——对导航栏、链接等提供大量图片有很大的改善。在上例中,使用一张背景图,比使用5个背景图显然要少4次HTTP请求,很明显就可以缩短响应时间。

2)内联图片

通过使用data:URL模式可以在页面中展示图片还无需任何额外的HTTP请求,它的主要用例就是lazyload 的解决方案。在lazyload 中,图片在初始化时就使用的是data:URL的模式,请看的初始化参数,代码清单1。

 $.fn.lazyload = function(options) {
        var elements = this;
        var $container;
        var settings = {
            event           : "scroll",
            effect          : "show",
            data_attribute  : "original",
            placeholder     : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"
        };

    if ($self.is("img")) {
      $self.attr("src", settings.placeholder);
    }
})(jQuery, window, document);

lazyload 在初始加载时的请求,截图如下,可以看得出,并没有发送HTTP请求。

这里写图片描述

data:URL的好处就是数据就在其URL自身当中,一个image可以通过<img src="data:image/png;base64,base64字符串"/>的方式进行表示——但,请尽量不要在表示大图片时使用它,因为base64编码后的内容也会比较大。

另外,比较遗憾的是,在我写这篇博客时,没有找到方法来通过Java代码把一个图片文件转成base64的字符串。

3)合并脚本和css

在我的传统观念里,代码一定要模块化,也就是说最好脚本、css要分开,通过不同的文件来减少代码之间的影响。但合并脚本和css后,网站的响应速度的确是有了大幅度的提升——我被迫接受把本和样式表合并在一起的观念,这很痛苦。

但经过尝试后,我发现,把很多脚本合并在一个脚本也能很好的保持代码的模块化,经过反复的调整,最终形成了自己并不完善的规范,但自我感觉还不错。

$(function() {
    YUNM.init("/components/common/ec.frag.xml", {
        debug : true, // 调试模式 【true|false】
        callback : function() {
            // 初始化页面中的组件
            initEnv();

            doBody();

            // 共同的顶级的
            doSome();

            doSwiper();

            quickNavigation();
            // 放在最后,安卓的微信、在移动网络下会阻塞
            // 微信朋友圈分享、发送给朋友、主动扫描二维码
            // TODO 如果有主动分享的需求,减少签名的请求
            weixinShare();
        }
    });
});

对于css来说,关键的就是在写css时,一定要从dom书的顶级到子集一层层扩展。

.weui-cells_form .weui-cell__ft {
    font-size: 12px
}

好了,到此为此,三种做法是点到了,但文章写得很散漫。希望自己在接下来有时间的话,重新来整理这篇文章,为读者展示一个更好的阅读体验。


每一天都在进步,就感觉生活很有劲。

相关文章
|
19天前
|
前端开发
页面无法滑动-CSS: touch-action属性
页面无法滑动-CSS: touch-action属性
19 0
|
14天前
|
UED 开发者 容器
【专栏】Flexbox是CSS3的全新布局模式,提供灵活响应式的页面设计
【4月更文挑战第27天】Flexbox是CSS3的全新布局模式,提供灵活响应式的页面设计。其特点包括灵活性、响应式和易理解,通过主轴和交叉轴控制元素排列对齐。核心概念有容器和项目,常用于导航栏、卡片布局、响应式设计、表格和表单布局。关键属性如flex-direction定义主轴方向,justify-content和align-items控制对齐,flex属性调整项目伸缩,order改变排序。在实践中,要关注响应式、代码维护和浏览器兼容性,以优化布局和用户体验。
|
2天前
|
API Apache Android开发
对于Android的http请求的容错管理
对于Android的http请求的容错管理
|
2天前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
`requests` 库是 Python 中用于HTTP请求的强大工具。要开始使用,需通过 `pip install requests` 进行安装。发送GET请求可使用 `requests.get(url)`,而POST请求则需结合 `json.dumps(data)` 以JSON格式发送数据。PUT和DELETE请求类似,分别调用 `requests.put()` 和 `requests.delete()`。
13 2
|
3天前
|
API
http代理ip请求并发数是什么?有什么用?
HTTP代理IP请求并发数指单个客户端对API或代理IP同时发起的请求数量,分为API链接请求并发和IP最大连接数。并发是瞬时同时请求,不同提供商限制不同。高并发请求的代理IP服务商能更好地应对程序压力。选择时应考虑这一因素。
|
3天前
|
Go
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
|
5天前
|
API UED Python
使用Python进行异步HTTP请求的实践指南
使用Python进行异步HTTP请求的实践指南
19 4
|
10天前
|
移动开发 前端开发 JavaScript
【专栏:HTML与CSS实战项目篇】使用HTML5与CSS3制作一个动态表单验证页面
【4月更文挑战第30天】本文介绍了使用HTML5和CSS3创建动态表单验证页面的方法。首先,简述HTML5用于构建网页内容,CSS3用于描述样式。接着,分四步展示实现过程:1) 设计包含输入框和提示信息的表单结构;2) 使用CSS3创建样式,增强视觉效果;3) 使用JavaScript监听输入事件,动态验证表单并显示错误信息;4) 测试和调试确保跨平台兼容性。通过学习,开发者能掌握创建带验证功能的表单,提升用户体验。
|
10天前
|
前端开发 测试技术 UED
【专栏:HTML 与 CSS 实战项目篇】实现一个在线产品展示页面
【4月更文挑战第30天】本文介绍了使用HTML和CSS创建吸引人的在线产品展示页面的实战步骤,包括页面设计规划、HTML结构搭建、CSS样式设计、具体页面实现、交互效果添加、优化与提升。通过简洁布局、产品列表和详情页设计,实现易用且具吸引力的展示效果。优化图片和代码,提升性能,以助企业在数字时代脱颖而出。
|
10天前
|
前端开发 UED 开发者
【专栏:HTML与CSS实战项目篇】制作一个响应式图片画廊
【4月更文挑战第30天】本文介绍了如何使用HTML和CSS创建响应式图片画廊。响应式画廊能根据用户设备屏幕大小自动调整布局。首先规划结构,包含一个图片容器和每张图片元素,并为图片提供替代文本。接着设计样式,设置图片大小、间距和视觉效果。然后通过媒体查询实现响应式设计,根据不同屏幕尺寸调整图片排列。同时考虑性能优化,如压缩图片和使用懒加载技术。最后,测试和调试确保画廊在各种设备上正常工作。这个过程强调了响应式设计和用户体验的重要性。