css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题

原创 2015年06月09日 19:48:14

最近在负责一个微信H5 App项目,遇到一个郁闷的问题,手机浏览器查看网页时图标都是模糊的,有锯齿,电脑浏览器显示则是正常。大概知道是分辨率适配等类型的问题,后来网上查找了一些办法,大部分的解决方案都是设计一套放大1倍的图标,再压缩显示。

我们都知道<img>标签可以通过固定宽高的方式来压缩大图,从而得到高清的显示效果,而图标一般用背景图来呈现,怎么搞呢?好吧,css3出了一个很牛逼的属性background-size可以直接设置背景图的宽高,直接解决了前者的疑惑。

那么问题来了,我们的网页不可能每个图标都独立一张图片来加载,那样每张图片将会是一个http请求开销,我们一般的做法是把多张小图片拼在一张大图里,然后通过sprite(精灵)background-position定位的方法来解决,只要加载一张大图,就可以完成多个图标的显示,减少http请求开销,提高性能。所以,我们也希望把放大1倍的高清图标也拼在一张大图里,通过background-position来定位到每个对应的图标上,并进行压缩。网上找了很多方法,终于找到了一个靠谱的方案:

1)首先,我们要准备两张排成一行(必须排成一行,下面解释)的图片,一张是原始大小,另一张是放大1倍的大小

(map-icon.png)

(map-icon@2x.png)


2) 最初的写法,主要是在电脑浏览器上显示,我们使用原图map-icon.png即可

/*
  //网页标签:
  <a class="control"><span class="car"></span></a>
  <a class="control"><span class="position"></span></a>
*/

/* 装载图标的容器,固定宽高,内距设为0 */
.control { display: block; text-decoration: none; padding: 0; width: 30px; height: 30px; }

/* 图标标签,宽高自动填充 */
.car,
.position,
.zoom-in,
.zoom-out {
	display: block; 
	width: 100%; 
	height: 100%; 
	background: url(images/map-icon.png) no-repeat;
}
.car { background-position: 0 0; }
.position { background-position: -30px 0; }
.zoom-in { background-position: -60px 0; }
.zoom-out { background-position: -90px 0; }


3) 问题是,我们怎么知道background-size属性值要设置为多少?后来找到有一个公式:
高分辨率图像宽度 / 目标图像宽度 = X
原始Sprites图像宽度 / x = background-size的宽度值
   好吧,公式的原理我们就不在这里展开了,直接写上去试试:

   60 / 30 = 2  即放大倍数

   7张60x60的大图总宽度 420

   420 / 2 = 210  即background-size的宽

   而background-size的高,我们这里设置为auto即可,然后换上@2x的大图进行压缩

   还有,我们必须在外层声明一个Media Queries,该Media Queries专门针对Retina屏幕设备显示器

/* 移动端媒体查询像素比 */
@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min--moz-device-pixel-ratio: 2),
only screen and (-o-min-device-pixel-ratio: 2/1),
only screen and (min-device-pixel-ratio: 2) {
.car,
.position,
.zoom-in,
.zoom-out {
	background: url(images/map-icon@2x.png) no-repeat;
        background-size: 210px auto;
}
/* 注意这里还是按30像素大小的位置来查找 */
.car { background-position: 0 0; }
.position { background-position: -30px 0; }
.zoom-in { background-position: -60px 0; }
.zoom-out { background-position: -90px 0; }
}
  相反,貌似也可以给定高度的值,宽度取auto自适应,但我尝试过,不太容易成功。我们以后就直接用一行图标排开,给背景图宽赋值就行了!

  最后,给出使用此方案的前后效果图:

(处理前)  


(处理后)



相关文章推荐

html5实现图片自适应手机屏幕页面的css

html5实现图片自适应手机屏幕页面的css html5写手机页面,读取图片,如果图片大于手机屏幕的宽度,就显示100%屏幕,如果小于,就显示原图。 CSS的max-width就能实现了,...

【图片】纯CSS3制作背景图

演示地址:点我 CSS3制作背景图 .patterns { width: 200px; height: 200px;...
  • zuncle
  • zuncle
  • 2017年02月08日 16:46
  • 638

纯css3实现点击缩略图切换背景图

1:html页面部分: html> html lang="en"> head> meta charset="UTF-8"> title>纯css3实现背景图片切换效果title>...

css3动画,一张背景图两行图片

这个css3动画的实现和上一篇的css3动画的实现原理是一样的。不同的是这个动画的背景图片是一张两行图片的背景图。不用过原理还是一样的。最终要的是对背景图片的位置坐标的计算,一定要设置正确。 ...

css3 svg 背景图 data:image/svg+xml;base64

css3 svg 背景图 data:image/svg+xml;base64 background: #fff url(data:image/svg+xml;base64

CSS3 背景图 插入 SVG 或图片 base64

css3 有个冷门功能可以样式里直接写入图片 不需要引用外部图片,而是直接在样式里写data:image/svg+xml;charset=utf-8,...
  • Aiamal
  • Aiamal
  • 2016年12月29日 23:08
  • 210

H5 CSS3网页优惠券

H5 CSS3网页优惠券
  • lidysun
  • lidysun
  • 2017年04月13日 11:16
  • 1434

手机端触摸滑动(H5+CSS3+JS+Swiper)

当你遇到这样一个项目,要求如下: 1. 手机端实现触摸滑动 2. 实现点击滑动 3. 在来回切换每一屏的时候 动画能够重新执行 4. 在汉堡菜单里点击某一项,实现滑动到相应的屏。(菜单页左右切...
  • ChenYH0
  • ChenYH0
  • 2017年02月11日 16:18
  • 1791

手机自适应网页设计(html5/css3控制)

HTML5/CSS3手机自适应

【H5】手机浏览器分批次多张上传图片(文件),包含进度条

描述 本文所描述的上传文件主要是应用于手机端,PC端可以酌情改造。 应用场景: 手机浏览器一次上传多张图片或者文件,将文件每5个拆分为一组上传。上传进度条为手机端上传至后台所用时间不包含后台耗时。 选...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题
举报原因:
原因补充:

(最多只允许输入30个字)