• RETINA显示屏下ICON优化方法


    便于理解,先来了解几个名词:

    • dpi(dots per inch),每英寸的点数,用来测量任何设备的硬件分辨率。一个21”的屏幕可以拥有1680 X 1050 的分辨率,27”的屏幕也可以拥有相同的分辨率,那么大屏幕比小屏幕的dpi小。
    • dip(device independent pixels),设备独立像素,与160 dpi显示屏上的1px相等, 又称dp。
    • dppx(dots per ‘px’),每px单位上的点数。由于CSS英寸与CSS像素的固定比是1:96,那么1dppx=96dpi。
    • Device pixel ratio (DPR)是物理像素与CSS像素的比率。

    方法一:media queries & background-size

    查看demo

    /*
    ** 注意:background-size的值是sprite.png的尺寸,而不是每个icon的尺寸
    */
    .sprite-icon{
        background-image:url(sprite.png);
        background-size:98px 65px;       
    }
    
    /*
    ** 每个icon的background-positon只需写一次,即icon相对与1x图片的位置,在@2x图片中的位置也是这个
    */
    .icon-1{
        background-position:0 0;
    }
    .icon-2{
        background-position:-33px 0;
    }
    .icon-3{
        background-position:-66px 0;
    }
    .icon-4{
        background-position:0 -33px;
    }
    .icon-5{
        background-position:-33px -33px;
    }
    .icon-6{
        background-position:-66px -33px;
    }
    
    /* 
    ** 2x图片要是1x图片的准确2倍
    ** sprite中图标之间的间隙,也应是2倍
    ** 每个图标无需重新写background-position
    */
    @media (min-resolution:2dppx), /* Standard syntax */
    (-webkit-min-device-pixel-ratio:2)  /* Safari & Android Browser */
    {
        .sprite-icon{
            background-image:url(sprite@2x.png); 
        }  
    }
    

    方法二:background-image:img-set( url(a.png) 1x, url(a@2x.png) 2x )

    媒体查询(media queries)已经可以解决高密度显示问题,为什么还需要image-set? 问的好。 使用image-set的两个主要好处:

    • 与媒体查询不同的是,image-set没有告诉浏览器使用哪个图片,而是提供了一些选项。我希望将来在低网速下使用高密度设备,能够告诉浏览器使用低分辨率图片。如果浏览器能够根据当前的网络状况智能地选择使用的图片,那就更好了。 媒体查询的问题是没有给浏览器任何自由裁决权,它明确的指明,如果像素密度大于1或者2,浏览器就使用特定的图片。 我知道,这只是理论上(更是“意淫“出来)的好处。如今支持“image-set”的浏览器只是简单将图片源与显示密度相匹配,并没有提供额外的功能。但我坚信,同一张图片需要不同分辨率时,让浏览器去选择合适的图片是方向。
    • CSS编码好处:将不同分辨率的图片源集中在一起。

    查看demo

    /* ** 注意: ** 图片要求:2x图片要是1x图片的准确2倍,sprite中图标之间的间隙也应是2倍 ** 无需写background-size,浏览器自动处理 ** */ .sprite-icon{ background-image:url(sprite.png); background-image: -webkit-image-set( url('sprite.png') 1x, url('sprite@2x.png') 2x ); }
    
    /* ** 每个icon的background-positon只需写一次,即icon相对与1x图片的位置,在@2x图片中的位置也是这个 */ .icon-1{ background-position:0 0; } .icon-2{ background-position:-33px 0; } .icon-3{ background-position:-66px 0; } .icon-4{ background-position:0 -33px; } .icon-5{ background-position:-33px -33px; } .icon-6{ background-position:-66px -33px; }
    

    方法三: media queries & background-size,适用于仅部分图标提供了2x图,且icon位置不对应,可能是由工具生成的sprite。

    查看demo

    .sprite-icon{
        background-image:url(more.png);
    }
    .icon-1{
        background-position:0 0;
    }
    .icon-2{
        background-position:-33px 0;
    }
    .icon-3{
        background-position:-66px 0;
    }
    .icon-4{
        background-position:0 -33px;
    }
    .icon-5{
        background-position:-33px -33px;
    }
    .icon-6{
        background-position:-66px -33px;
    }
    .icon-7{
        background-position:0 -66px;
    }
    
    /* 
    ** 每个icon的backgroud-size是2x图片的一半
    ** 每个icon的backgroud-position是相对与2x图片的位置除以2
    */
    @media (min-resolution:2dppx), /* Standard syntax */
    (-webkit-min-device-pixel-ratio:2)  /* Safari & Android Browser */
    {
        .icon-1{
            background-image:url(portion@2x.png); 
            background-size:197px 65px;
            background-position:0 0;
        }
        .icon-2{
            background-image:url(portion@2x.png); 
            background-size:197px 65px;
            background-position:-33px 0;
        }
        .icon-3{
            background-image:url(portion@2x.png); 
            background-size:197px 65px;
            background-position:-66px 0;
        }
        .icon-4{
            background-image:url(portion@2x.png);
            background-size:197px 65px;
            background-position:-99px -33px;
        }
        .icon-5{
            background-image:url(portion@2x.png); 
            background-size:197px 65px;
            background-position:-132px -33px;
        }
        .icon-6{
            background-image:url(portion@2x.png);
            background-size:197px 65px;
            background-position:-165px -33px;
        }
    
    }
  • 相关阅读:
    Windows创建和使用IP安全策略(IPSec)
    SPOJ LCS2(Longest Common Substring II-后缀自动机向父亲更新)
    poj1125 Floyd算法
    Unity-动态显示窗口制作思路
    Unity-UI架构优化小技巧
    Unity脚本启动顺序调整方法
    Unix/Linux编程实践教程阅读笔记-终端注销代码-来自第二章P54-P57的笔记
    Unix/Linux编程实践教程阅读笔记-who指令实现的优化-来自第二章P48-P54的笔记
    Unix/Linux编程实践教程阅读笔记-who指令的实现(Mac下的实现)-来自第二章P25-P44的笔记
    Unity定制脚本模版--自动添加头部注释
  • 原文地址:https://www.cnblogs.com/sunshq/p/4221037.html
Copyright © 2020-2023  润新知