Web图片财富的加载与渲染时机,微信小程序支付

  这二日开发微信小程序,在装置背景图片时,发今后wxss里面安装 background-image:(url)
属性,不管是开发工具照旧线上都没办法儿突显。经过查资料发现,background-image
只好用网络url也许base64图片编码 , 本地图片只可以用
image标签src属性才行。当然
image标签src属性也足以动用互连网url只怕base64图片编码。

那二日开发微信小程序,在装置背景图片时,发未来wxss里面安装background-image:(url)
属性,不管是开发工具依旧线上都无法儿出示。经过查资料发现,background-image不得不用网络url恐怕base64图片编码
, 本地图片只可以用 image标签src属性才行。当然
image标签src属性也得以运用网络url或然base64图片编码。

Web图片财富的加载与渲染时机

2017/07/27 · JavaScript
· 渲染

初稿出处: Leechikit   

此文切磋页面中的图片能源的加载和渲染时机,使得大家能更好的治本图片财富,幸免不供给的流量和增强用户体验。

壹 、通过 JS 的帮衬,可以让图片在普通荧屏和 Retina 显示器下做到自动适配:

  上边通过 image 标签src属性设置,达成背景图显示

  下边通过 image 标签src属性设置,落成背景图突显

浏览器的行事流程

要研商图片能源的加载和渲染,大家先要领会浏览器的干活原理。以Webkit电动机的做事流程为例:

澳门葡京 1

从上海教室可观察,浏览器加载3个HTML页面后展开如下操作:

  • 解析HTML —> 构建DOM树
  • 加载样式 —> 解析样式 —> 创设样式规则树
  • 加载javascript —> 执行javascript代码
  • 把DOM树和样式规则树匹配营造渲染树
  • 测算成分位置进行布局
  • 绘制

从上航海用体育场所大家无法很直观的看来图片能源从如曾几何时候开端加载,下图标出图片加载和渲染的空子:

  • 解析HTML【遇到<img>标签加载图片】 —> 营造DOM树
  • 加载样式 —> 解析样式【遇到背景图片链接不加载】 —>
    营造样式规则树
  • 加载javascript —> 执行javascript代码
  • 把DOM树和体制规则树匹配营造渲染树【加载渲染树上的背景图片】
  • 测算成分地方展开布局
  • 制图【早先渲染图片】

<img class=”photo” src=”./photo.jpg”
style=”width:300px;height:200px;” />

  界面结构:

  界面结构:

图表加载与渲染规则

页面中不是有所的<img>标签图片和样式表背景图片都会加载。

<script type=”text/javascript”>

<view class='set-background'>
    <image class='background-image' src='{{item.countryPic}}'></image>
    <view class='background-content'>
        <view class="set-background-avatar" background-size="cover">
            <image class="post-specific-image" src="{{item.picture}}"></image>
        </view>
    </view>
</view>
<view class='set-background'>
  <image class='background-image' src='{{item.countryPic}}'></image>
  <view class='background-content'>
    <view class="set-background-avatar" background-size="cover">
      <image class="post-specific-image" src="{{item.picture}}"></image>
    </view>
  </view>
</view>

display:none

JavaScript

<style> .img-purple { background-image: url(../image/purple.png);
} </style> <img src=”../image/pink.png”
style=”display:none”> <div class=”img-purple”
style=”display:none”></div>

1
2
3
4
5
6
7
<style>
.img-purple {
    background-image: url(../image/purple.png);
}
</style>
<img src="../image/pink.png" style="display:none">
<div class="img-purple" style="display:none"></div>

图表能源请求如下:澳门葡京 2

设置了display:none属性的要素,图片不会渲染出来,但会加载。

原理

把DOM树和样式规则树匹配营造渲染树时,会把可渲染成分上的富有属性(如display:none属性和background-image属性)结合一起出现到渲染树。

当解析渲染树时会加载<img>标签成分上的图形,发现成分上有background-image质量时会加载背景图片。

当绘制时意识成分上有display:none本性,则不计算该因素地点,也不会绘制该因素。

JavaScript

<style> .img-yellow { background-image: url(../image/yellow.png);
} </style> <div style=”display:none”> <img
src=”../image/red.png”> <div class=”img-yellow”></div>
</div>

1
2
3
4
5
6
7
8
9
<style>
.img-yellow {
    background-image: url(../image/yellow.png);
}
</style>
<div style="display:none">
    <img src="../image/red.png">
    <div class="img-yellow"></div>
</div>

图表能源请求如下:
澳门葡京 3

设置了display:none质量成分的子成分,样式表中的背景图片不会渲染出来,也不会加载;而<img>“标签的图纸不会渲染出来,但会加载。

原理

澳门葡京 ,正如上面所说的,营造渲染树时,只会把可渲染成分产出到渲染树,那就表示有不足渲染成分,当匹配DOM树和体裁规则树时,若发现3个要素的性格上有display:none,浏览器会认为该因素的子成分是不行渲染的,因而不会把该因素的子元素产出到渲染树上。

当解析渲染树时渲染树上没有设置了display:noneWeb图片财富的加载与渲染时机,微信小程序支付。属性成分的子成分,因而不会加载该因素中子元素的背景图片。

当绘制时也因为渲染树上没有设置了display:none属性成分的子成分,因而该因素中子成分的背景图片不会渲染出来。

$(document).ready(function () {

  wxss样式:

  wxss样式:

双重图片

JavaScript

.img-blue { background-image: url(../image/blue.png); } <div
class=”img-blue”></div> <img src=”../image/blue.png”>
<img src=”../image/blue.png”>

1
2
3
4
5
6
.img-blue {
    background-image: url(../image/blue.png);
}
<div class="img-blue"></div>
<img src="../image/blue.png">
<img src="../image/blue.png">

图表能源请求如下:
澳门葡京 4

页面中多少个<img>标签或样式表中的背景图片图片路径是同三个,图片只加载二次。

原理

浏览器请求能源时,都会先判断是还是不是有缓存,若有缓存且未过期则会从缓存中读取,不会再也请求。先加载的图样会蕴藏到浏览器缓存中,前面再一次呼吁同路线图片时会直接读取缓存中的图片。

 if (window.devicePixelRatio > 1) {

.set-background {
    display: flex;
    flex-direction: column;
    align-items: center;
    height: 150px;
}
.set-background-avatar {
    width: 220px;
    height: 150px;
}
.background-content {
    position: absolute;
    z-index: 1;
}
.background-image {
    width: 225px;
    height: 150px;
    opacity: 0.8;
}
.post-specific-image {
    width: 215px;
    height: 150px;
    vertical-align: middle;
}
.set-background {
  display: flex;
  flex-direction: column;
  align-items: center;
  height: 150px;
}
.set-background-avatar {
  width: 220px;
  height: 150px;
}
.background-content {
  position: absolute;
  z-index: 1;
}
.background-image {
  width: 225px;
  height: 150px;
  opacity: 0.8;
}
.post-specific-image {
  width: 215px;
  height: 150px;
  vertical-align: middle;
}

不设有成分的背景图片

.img-blue { background-image: url(../image/blue.png); } .img-orange{
background-image: url(../image/orange.png); }

1
2
3
4
5
6
.img-blue {
    background-image: url(../image/blue.png);
}
.img-orange{
    background-image: url(../image/orange.png);
}

图片资源请求如下:澳门葡京 5

不存在成分的背景图片不会加载。

原理

不存在的要素不会现出到DOM树上,由此渲染树上也不会有不存在的因素,当解析渲染树时不恐怕解析不设有的要素,不设有的要素上的图形自然不会加载也不会渲染。

     var images = $(“img.photo”); 

  呈现结果:

  展现结果:

伪类的背景图片

.img-green { background-image: url(../image/green.png); }
.img-green:hover{ background-image: url(../image/red.png); }

1
2
3
4
5
6
.img-green {
    background-image: url(../image/green.png);
}
.img-green:hover{
    background-image: url(../image/red.png);
}

触发hover前的图纸财富请求如下:
澳门葡京 6

触发hover后的图样能源请求如下:
澳门葡京 7

当接触伪类的时候,伪类样式上的背景图片才会加载。

原理

触发hover前,DOM树与体制规则树匹配的是无hover状态选取器.img-green的样式,因而渲染树上background-image质量的值是url(../image/green.png),解析渲染树时加载的是green.png,绘制时渲染的也是green.png

触发hover后,因为.img-green:hover的先行级相比高,由此DOM树与体制规则树匹配的是有hover状态选取器.img-green:hover的体制,渲染树上background-image属性的值是url(../image/red.png),解析渲染树时加载的是red.png,绘制时渲染的也是red.png

     images.each(function(i) { 

澳门葡京 8,别骂我,作者是德棍!

澳门葡京 9

应用

       var x1 = $(this).attr(‘src’);            

总结

占位图

当使用样式表中的背景图片作为占位符时,要把背景图片转为base64格式。那是因为背景图片加载的各种在标签后面,背景图片可能会在&lt;img&gt;标签图片加载成功后才起来加载,达不到想要的效率。

       var x2 = x1.replace(/(.*)(\.\w+)/, “$1@2x$2”);

上述所述是小编给大家介绍的微信小程序支付背景图展现效果,希望对大家具有协理,尽管我们有别的疑问请给自家留言,我会及时还原大家的。在此也非凡感激大家对剧本之家网站的辅助!

预加载

广大光景里图片是在改动或接触状态后才显得出来的,例如点击三个Tab后,二个装置display:none藏匿的父成分变为显示,这么些父成分里的子成分图片会在父成分呈现后才起来加载;又如当鼠标hover到图标后,改变图标图片,图片会在hover上去后才起来加载,导致现身闪一下那种不团结的体会。

在那种现象下,大家就供给把图纸预加载,预加载有很多样方法:

  1. 一旦小图标,能够统百分之十百事可乐图,在转移状态前就把装有图标都二头加载了。
  2. 接纳上文讲到的,设置了display:none属性的因素,图片不会渲染出来,但会加载。把要预加载的图样加到设置了display:none的因素背景图或“标签里。
  3. 在javascript创建img对象,把图片url设置到img对象的src属性里。

    1 赞 3 收藏
    评论

澳门葡京 10

            $(this).attr(‘src’, x2);

您可能感兴趣的稿子:

  • 微信小程序
    图片相对定位(背景图片)

        });

    }

 });

</script>

Retina.js 提供了更为圆满的缓解方案,自动匹配显示屏分辨率的同时,还是能检查和测试服务器上是不是享有当前图片的
@2X 版本,以决定是或不是替换。

优点:

操作不难

一般而言显示器下不会加载 @2X 的大尺寸图片,节约带宽

缺点:

Retina 显示屏下,标准图片和 @2X 图片都会被加载

图形在呈现进度中会被重绘

多少老版本浏览器下存在包容难题

贰 、CSS 背景图片–Meta Queries + background-size

由此 Meta Queries 判断设备的蝇头展现像素比,借使过量等于1.5的话,为
#logo 设定一张 200*80px 的背景图片 logo@2x.png,然后通过安装
background-size 让背景图显示为 logo 该有的尺寸。那里的体现像素比大家选择1.5 作为阈值,是为着适配除苹果以外的高分辨率设备,比如Samsung的 Android
Pad。

@media only screen and (-webkit-min-device-pixel-ratio: 1.5),

       only screen and (min–moz-device-pixel-ratio: 1.5), /*
注意那里的写法比较奇特 */

       only screen and (-o-min-device-pixel-ratio: 3/2),

       only screen and (min-device-pixel-ratio: 1.5) {

    #logo { 

        background-image: url(./logo@2x.png);

        background-size: 100px auto;

    }}

这样,对于普通的展现设备恐怕不协理 Meta Queries
的浏览器,会显得专业的背景图,对于帮忙 Meta Queries 的 Retina
设备,会议及展览示 @2X 的背景图。( IE⑥ 、柒 、8 均不辅助 Meta Queries 和
background-size )

优点:

只会加载匹配当前设施的最适图片

跨浏览器包容

缺点:

假诺背景图片很多来说,须要编写制定万分冗长的代码

叁 、CSS 背景图片–image-set

#logo {

    background: url(./logo.png) 0 0 no-repeat;

    background-image: -webkit-image-set(url(./logo.png) 1x,
url(./logo@2x.png) 2x);}

优点:

让图片的链接地址在 CSS 中特别集中,代码的保险资金下跌

可以让浏览器获取各个尺码的图形文件,依照荧屏分辨率或是其余一些因素接纳万分的图片举办展示,在图片的协作上得以做到进一步智能

缺点:

image-set 今后只是 CSS4 的2个草案,近期唯有 Webkit 内核的 Safari 6+ 和
Chrome 21+ 帮忙该属性

四 、使用 SVG 可缩放矢量图形

与只可以记录制素音信的位图比较,矢量图在分化分辨率下的适配有着天然的优势,最近大多数现代浏览器都曾经支撑基于
XML 的 SVG 格式图形的来得,网页中有的线条简单的 Logo
、图标或独特字形,假使转成矢量的 SVG 格式来展现,在 Retina
屏下的适配也就化解了。

营造 SVG 格式图片,能够使用 Adobe Illustrator
或免费的替代软件 inkscape 。

行使 SVG 格式图片,能够像大家利用其余格式的图片相同,用 HTML 的
<img> 标签引用,或用 CSS 的 background-image 、 content:url()
属性,须求注意的是,无论用哪类情势,最佳定义一下图形的尺码。

<img src=”example.svg” width=”300″ height=”200″ />

/* Using background-image */

.image {

    background-image: url(example.svg);

    background-size: 300px 200px; 

    width: 300px;

    height: 200px;}

 /* Using content:url() */

.image-container:before {

    content: url(example.svg);

    /* width and height do not work with content:url() */

}

借使急需般配 IE六 、七 、8 或是其余部分不协理 SVG 的浏览器,需求额外用到 PNG
格式的图纸副本)。

在 HTML 的 <img> 标签中,扩展3个 PNG 格式图片的自定义属性

<img src=”example.svg” data-png-fallback=”example.png” />

然后引入 jQuery 和 Modernizr 判断当前浏览器是或不是援助 SVG ,不协理的话使用
PNG 替换 SVG 。

$(document).ready(function(){

    if(!Modernizr.svg) {

        var images = $(‘img[data-png-fallback]’);

        images.each(function(i) {

            $(this).attr(‘src’, $(this).data(‘png-fallback’));

        });

    }});

引入 Modernizr ,将 CSS 改写成以下情势即可:

.image {

    background-image: url(example.png);

    background-size: 30p0x 200px;}

 .svg {

    .image {

        background-image: url(example.svg); 

    }}

为了得到最好的跨浏览器包容效果,幸免在 Firefox 和 Opera
下出现光栅难点,制作的 SVG 图片最小要高达父容器的尺码。

优点:

能够适配任意分辨率

护卫资金较低

矢量图能够无限伸缩,越发面向未来

缺点:

不符合复杂的图形,复杂的矢量图形恐怕会招致文件过大

不一致的抗锯齿算法,可能会推动不相同的浏览感受

IE⑥ 、柒 、8,早期的 Android 浏览器,及任何部分较老的浏览器无法提供对 SVG
的原生援助,使用 <img> 标签的点子恐怕会造成浏览器下载 SVG 文件

  1. Favicon

Favicon 的 Retina 适配相比易于,恐怕你的现行反革命 Favicon 在 Retina
下就曾经显得得可怜清晰,假若不是这么,使用 ico 编辑工具,创设一个富含
16*16 和 32*32 二种内建图像的 ico 文件,替换现有的 Favicon
即可,浏览器会根据分辨率的轻重缓急活动匹配内建图像的尺寸。

至于 ico 编辑工具,Windows 下推荐应用 IconXP ,Mac 下推荐 Apple’s Icon
Composer(Graphic Tools in Xcode 中)

 

摘自hxxie2000

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website