wenju
wenju
  • 发布:2015-09-07 12:18
  • 更新:2015-09-09 14:02
  • 阅读:12982

关于MUI懒加载的几个疑问??

分类:MUI

之前的项目没有用懒加载,有几个问题困扰着:

1.用户上传的照片不是正方形的,那么用了懒加载后,图片要显示成正方形就会拉伸,如上图;如何像朋友圈的图片展示一样,截取图片的中间展示
2.用户的头像不一定上传,所以如果懒加载失败,没有回调,如何设置懒加载失败后,给一个默认图,失败的默认图和懒加载中的默认图不一样.
3.上拉加载更多数据后 到底是调lazyloadApi.addElements(); 还是lazyLoadApi.refresh(true)?

  1. <img data-lazyload='网络地址'/> 图片一开始会有灰色的边 然后加载完图后灰色的边会才会去掉?网上说是没有设置src,得默认给src设置一张透明图才行.
  2. var lazyLoadApi = mui('#pullrefresh .mui-scroll').imageLazyload({
    autoDestroy: false,
    placeholder: '../images/loading.png'
    });
    这里的placeholder,,为什么没有生效呢,,mui的案例就生效了 奇怪;
    我是这么写的<img data-lazyload='" + 网络地址 + "' src='../images/translate.png'/>
2015-09-07 12:18 负责人:无 分享
已邀请:
wenju

wenju (作者) - https://www.mescroll.com -- 精致的下拉刷新和上拉加载组件

我把MUI示例lazyload-image.html删除只剩img,,代码如下:
请问:
给图片设置了宽高,placeholder就会失效,而且图片加载时会出现灰色边框?如果删去img宽高样式就生效了,,奇怪

如何设置懒加载时图片截图中间显示,而不是拉伸铺满200x200px的正方形img?
如何设置懒加载失败后,设置另外一张默认图?

!DOCTYPE html>  
<html>  
    <head>  
        <meta charset="utf-8">  
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">  
        <meta name="apple-mobile-web-app-capable" content="yes">  
        <meta name="apple-mobile-web-app-status-bar-style" content="black">  
        <style type="text/css">  
            /*给图片设置了宽高,placeholder就会失效,而且图片加载时会出现灰色边框*/  
            img {  
                width: 200px;  
                height: 200px;  
            }  
        </style>  
    </head>  
    <body>  
        <div class="mui-content">  
            <ul id="list"></ul>  
        </div>  
    </body>  
    <script src="../js/mui.min.js "></script>  
    <script src="../js/mui.lazyload.js"></script>  
    <script src="../js/mui.lazyload.img.js"></script>  
    <script>  
        mui.init();  
        var createFragment = function(count) {  
            var fragment = document.createDocumentFragment();  
            var li;  
            for (var i = 0; i < count; i++) {  
                li = document.createElement('li');  
                li.innerHTML = '<img data-lazyload="http://www.dcloud.io/hellomui/images/' + (i % 5 + 1) + '.jpg?version=' + Math.random() * 1000 + '">';  
                fragment.appendChild(li);  
            }  
            return fragment;  
        };  
        var list = document.getElementById("list");  
        list.appendChild(createFragment(50));  
        /*给图片设置了宽高,placeholder就会失效,而且图片加载时会出现灰色边框*/  
        mui(document).imageLazyload({  
            placeholder: '../images/60x60.gif'  
        });  
    </script>  
</html>
test10086

test10086

图片加载失败解决方案。
document.body.addEventListener('error', function (e) {
var target = e.target;
if (!target || target.tagName !== 'IMG') return;
this.error = null;
imgError.call(target);
}, true);

//图片错误
function imgError() {
this.src = plus.io.convertLocalFileSystemURL("/skins/img/default.jpg");
}

  • wenju (作者)

    这个方法也不错哦 测试了 可行 O(∩_∩)O谢谢哈

    2015-09-07 17:03

DCloud_UNI_FXY

DCloud_UNI_FXY

1.如何显示图片中间区域

<style>  
.wrapper{  
    position: relative;  
    overflow: hidden;  
    width: 200px;  
    height: 200px;  
}  
.wrapper img{  
    position: absolute;  
    top: 50%;  
    left: 50%;  
    transform: translate(-50%,-50%);  
}  
</style>  
<div class="wrapper">  
<img src="http://ask.dcloud.net.cn/uploads/questions/20150907/bc2712e2eb6b985be5874ba6ef440750.jpg"/>  
</div>

2.图片懒加载失败事件,目前暂无提供,你可以自己识别用户是否使用的是上传头像,只有自己上传的才懒加载,其他的直接使用默认头像

  1. lazyLoadApi.refresh(true)
  2. placeholder不生效的问题是当图片设置宽度后,会引发内部的一个bug。你可以先按我上边的居中显示来处理。或者联系我,我给你发一个暂未发布的新版本的mui.lazyload.img.js
  • wenju (作者)

    大神在就是不一样,O(∩_∩)O谢谢哈

    我想问个问题,懒加载成功我想加一个渐变动画,有加载成功后的回调吗?

    2015-09-07 16:53

wenju

wenju (作者) - https://www.mescroll.com -- 精致的下拉刷新和上拉加载组件

懒加载成功后我目前是这么加渐变动画的 额 虽然可以运行,有效果
就是不知道会不会有隐形的问题,或者有没有更好方法

/*透明动画*/  

.anim_opacity {  
    animation: anim_opacity 2s;  
    -webkit-animation: anim_opacity 2s;  
}  
@keyframes anim_opacity {  
    from {  
        opacity: 0;  
    }  
    to {  
        opacity: 1;  
    }  
}  
@-webkit-keyframes anim_opacity {  
    from {  
        opacity: 0;  
    }  
    to {  
        opacity: 1;  
    }  
}

然后加在这里,好笨的方法哇:

  • DCloud_UNI_FXY

    后续版本会考虑支持此类需求

    2015-09-07 17:07

  • wenju (作者)

    回复 DCloud_UNI_FXY:希望可以增加 加载成功和失败的回调 可以在初始化的时候配置参数; 然后我问问 我上面设置的是否正确涅

    2015-09-07 17:14

  • wenju (作者)

    回复 DCloud_UNI_FXY:图片居中显示 是不是都得给img套一个div 没有其他更好的方法了吗 我之前是用背景的background-position: center;

    background-size: contain;

    background-repeat: no-repeat;

    这样就很好控制了

    2015-09-07 17:15

  • DCloud_UNI_FXY

    回复 wenju:目前暂不支持背景图片的lazyload,所以只能先嵌套个div实现

    2015-09-07 17:19

  • DCloud_UNI_FXY

    回复 wenju:当然如果你已经修改了handle方法,你可以自己修改下mui.lazyload.img.js,让他支持background-image的lazyload

    2015-09-07 17:24

  • wenju (作者)

    回复 DCloud_UNI_FXY:好的 已解决问题 O(∩_∩)O谢谢 img.style.backgroundImage="url("+dataSrc+")";

    img.src = "../images/translate.png";

    2015-09-07 19:48

蔡繁荣

蔡繁荣 - 发表是最好的记忆

官方的懒加载有做本地缓存吗?
淡入加载图片这个功能很需要啊,现在的图片直接突然显示,太生硬了

  • wenju (作者)

    没有做缓存 现在缓存都不知道怎么做呢 我这个图片太多了 不敢用downloader 不然会发烫 很烫 大神缓存怎么做呢

    2015-09-07 20:21

  • 蔡繁荣

    回复 wenju: 官方的懒加载没有本地缓存,所以我都是用自己写的。downloader 可以放到队列来控制同时下载的进程数,不过我暂时还没有考虑,全部download

    2015-09-07 22:14

  • DCloud_UNI_FXY

    本地缓存后续会提供demo示例,图片太多,不敢用downloader的问题,主要是需要控制同时download的并发。即,同时仅允许指定数量的download,避免同时太多download导致太好性能,影响体验。

    2015-09-07 22:15

wenju

wenju (作者) - https://www.mescroll.com -- 精致的下拉刷新和上拉加载组件

@DCloud_MUI_FXY: 大神再问2个问题呢:

1.如果网络不佳或者网络断了,,然后监听到网络开启,如何继续让懒加载继续?lazyLoadApi.resume();和lazyLoadApi.refresh(true)无效果;

  1. 我发觉mui.lazyload.img.js的handle方法,其实图片并未下载完,而是开始加载,,所以我在那里写动画和设置背景是不对的..请问是修改哪里?哪个函数是加载成功和失败的
  • DCloud_UNI_FXY

    目前handle方法只是在当前元素出现在viewport的时候调用,所以你可以自己在handle里边先new image,监听onload,onerror,在onload里边给你的元素赋值,onerror里边自己额外处理

    2015-09-08 14:25

  • wenju (作者)

    回复 DCloud_UNI_FXY:好的 那么请问监听到网络开启,如何继续让懒加载继续?

    2015-09-08 14:29

  • wenju (作者)

    回复 DCloud_UNI_FXY:我..我是从Android转来的 js还不大会写,我怕改错了 然后出现些奇怪的问题 额 大神能写个出来吗?~~(>_<)~~

    2015-09-08 14:34

  • DCloud_UNI_FXY

    handle: function(img, key) {

    var dataSrc = img.getAttribute('data-lazyload');

    if (dataSrc && img.src != dataSrc) {

    var temp = new Image();

    temp.onload = function() {

    img.src = dataSrc;

    img.removeAttribute('data-lazyload');

    img.parentNode.parentNode.setAttribute('data-lazyload', 'true');

    };

    temp.onerror = function() {

    //TODO

    }

    temp.src = dataSrc;

    }

    }

    2015-09-08 14:56

wenju

wenju (作者) - https://www.mescroll.com -- 精致的下拉刷新和上拉加载组件

@DCloud_MUI_FXY: 能上传一个最新的懒加载js上来吗?

  • DCloud_UNI_FXY

    自己修改mui.lazyload.img.js addElement方法里的if (img.offsetWidth)改成if (img.offsetWidth&&img.src)即可

    2015-09-08 14:57

  • wenju (作者)

    回复 DCloud_UNI_FXY:这个...这个是监听到网络开启,让懒加载继续的吗?

    2015-09-08 15:02

  • DCloud_UNI_FXY

    回复 wenju:不是,这个是解决图片设置大小后,不显示默认图片的问题。继续下载的问题,需要你自己实现。

    方案:

    用上边我给你的handle方法即可处理,我给你的handle方法只有在onload之后才处理图片,当error后是不处理的,所以当网络恢复后,再次滚动到该图片后,会再次加载

    2015-09-08 15:07

  • wenju (作者)

    回复 DCloud_UNI_FXY:原来如此 ,O(∩_∩)O谢谢大神 耐心指导

    2015-09-08 15:10

wenju

wenju (作者) - https://www.mescroll.com -- 精致的下拉刷新和上拉加载组件

@DCloud_MUI_FXY 我修改的handle方法,,Android有时候出不来图;IOS也是快速滑或者在4G网有些图出不来??额,,您可下载我们的app ''宝贝租车'的'闲置'模块看看 哎呀 实在不好意思献丑 把MUI用成这样

handle: function(img, key) {  
            var dataSrc = img.getAttribute('data-lazyload');  
            if (dataSrc && img.src != dataSrc) {  
                var temp = new Image();  
                temp.onload = function() {  
                    //渐变动画  
                    var classStr = img.className;  
                    if (classStr) {  
                        classStr += " anim_opacity";  
                    } else {  
                        classStr = "anim_opacity";  
                    }  
                    img.className = classStr;  
                    //设置图片为背景  
                    img.src = "../images/translate.png";  
                    img.style.backgroundImage = "url(" + dataSrc + ")";  
                    //标志下载成功  
                    img.removeAttribute('data-lazyload');  
                    img.parentNode.parentNode.setAttribute('data-lazyload', 'true');  
                };  
//              temp.onerror = function() {  
//                    
//              }  
                temp.src = dataSrc;  
            }  
        }

我是这么初始化的:
var lazyLoadApi = mui('#pullrefresh .mui-scroll').imageLazyload({
autoDestroy: false
});

我是这么引用<img data-lazyload='网络地址' src='默认图'/>

然后上拉加载更多和下拉刷新之后调用lazyLoadApi.refresh(true);

wenju

wenju (作者) - https://www.mescroll.com -- 精致的下拉刷新和上拉加载组件

@DCloud_MUI_FXY

运行的效果不正确呢

应该是图片宽或高等比例缩放至200px;宽或高多出200px的居中显示

  • DCloud_UNI_FXY

    -webkit-transform:translate(-50%,-50%)

    transform:translate(-50%,-50%);

    2015-09-10 14:51

该问题目前已经被锁定, 无法添加新回复