zoukankan      html  css  js  c++  java
  • 图片加载淡入淡出效果

    HTML代码

    首先是图片标记的写法:

    <img data-src="/path/to/image.jpg" alt="">
    

    需要将图片的地址放到 data-src 属性里,而src值填写默认的一张图片。

    CSS代码

    所有具有data-src属性的图片,我们将其初始显示状态为不可见,通过透明度来调节:

    img {
    	opacity: 1;
    	transition: opacity 0.3s;
    }
    
    img[data-src] {
    	opacity: 0;
    }
    

    这样写的作用是什么?等当图片加载时,你就能看的效果了。

    JavaScript代码

    我们最终会将 data-src 属性去掉,换成src属性,但这是图片加载成功后的动作:

    [].forEach.call(document.querySelectorAll('img[data-src]'), function(img) {
    	img.setAttribute('src', img.getAttribute('data-src'));
    	img.onload = function() {
    		img.removeAttribute('data-src');
    	};
    });
    

    观看演示
    相比起其它各种的图片延迟加载技术,这种方法非常的简单,它几乎不要求其它任何条件,可以用在任何地方,使用起来非常灵活。

    当然,简单有简单的好坏,也会因为简单而不足。它不具有图片图片滚动到可视窗口内再加载的功能。最终使用哪种技术,还是要看场景而定。

    下面是lazyload.js

    
    var lazyLoad = {
        init: function() {
            var that = this;
            that.onerrorImgUrl = "data-error"; //图片加载失败用什么图片替换
            that.srcStore = "data-src"; //图片真实地址存放的自定义属性
            that.class = "lazy-img"; //惰性加载的图片需要添加的class
            that.sensitivity = 50; //该值越小,惰性越强(加载越少)
            minScroll = 5,
            slowScrollTime = 200;
    
            document.addEventListener("scroll", function() {
                that.changeimg();
            });
    
            setTimeout(function() {
                that.trigger();
            }, 100);
    
        },
        scanImage: function() {
            var that = this;
            var imgList = [];
            var allimg = [].slice.call(document.querySelectorAll('img.' + that.class + ''));
            allimg.forEach(function(ele) {
                if (!that.isLoadedImageCompleted(ele)) {
                    imgList.push(ele);
                }
            });
    
            that.imglistArr = imgList;
        },
        isLoadedImageCompleted: function(ele) {
            return (ele.getAttribute('data-loaded') == '1')
        },
        trigger: function() {
            var that = this;
            eventType = that.isPhone && "touchend" || "scroll";
            that.fireEvent(document, eventType);
            //$(window).trigger(eventType);
        },
        fireEvent: function(element, event) {
            // 其他标准浏览器使用dispatchEvent方法
            var evt = document.createEvent('HTMLEvents');
            // initEvent接受3个参数:
            // 事件类型,是否冒泡,是否阻止浏览器的默认行为
            evt.initEvent(event, true, true);
            return !element.dispatchEvent(evt);
        },
        changeimg: function() {
            function loadYesOrno(img) {
                var windowPageYOffset = window.pageYOffset,
                    windowPageYOffsetAddHeight = windowPageYOffset + window.innerHeight,
                    imgOffsetTop = img.getBoundingClientRect().top + window.pageYOffset;
                return imgOffsetTop >= windowPageYOffset && imgOffsetTop - that.sensitivity <= windowPageYOffsetAddHeight;
            }
    
            function loadImg(img, index) {
    
                var imgUrl = img.getAttribute(that.srcStore);
    
                img.setAttribute("src", imgUrl);
    
                img.onload || (img.onload = function() {
                        img.classList.remove(that.class);
                        img.setAttribute('data-loaded', 1)
                        img.removeAttribute('data-src');
                        //$(this).removeClass(that.class).getAttribute('data-loaded',1),
                        that.imglistArr[index] = null;
                        img.onerror = img.onload = null;
                    },
                    img.onerror = function() {
                        img.src = img.getAttribute(that.onerrorImgUrl);
                        img.classList.remove(that.class);
                        img.classList.add("lazy-err");
                        img.setAttribute('data-loaded', 0);
                        //$(this).removeClass(that.class).getAttribute('data-loaded',0),
                        that.imglistArr[index] = null,
                            img.onerror = img.onload = null
                    });
    
                var newImgStack = [];
                that.imglistArr.forEach(function(ele) {
    
                    //img标签可见并且加载未完成
                    if (!that.isLoadedImageCompleted(ele)) {
                        newImgStack.push(ele);
                    }
                });
                that.imglistArr = newImgStack;
            }
    
            var that = this;
            that.scanImage();
            that.imglistArr.forEach(function(val, index) {
    
                if (!val) return;
                var img = val;
                if (!loadYesOrno(img) || that.isLoadedImageCompleted(img)) return;
    
                if (!img.getAttribute(that.srcStore)) return;
    
                loadImg(img, index);
            })
    
        }
    };
    
  • 相关阅读:
    【转载】mysql 日志开启
    无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。
    MVC4 本地IIS测试
    新浪网易IP地区信息查询API接口调用方法(转载)
    解决方案看起来是受源代码管理,但无法找到它的绑定信息。保存解决方案的源代码管理设置的 MSSCCPRJ.SCC 文件或其他项可能已被删除。由于无法自动恢复这些缺少的信息,缺少绑定的项目将被视为不受源代码管理。
    SQL语句中order_by_、group_by_、having的用法区别
    项目总结之关于JQuery一些常用的函数
    Log4Net使用指南之用log4net记录日志到数据库(含有自定义属性)------附Demo例子源代码
    HighCharts点击柱形或饼块等加URL或Click事件
    .Net用字符串拼接实现表格数据相同时合并单元格
  • 原文地址:https://www.cnblogs.com/sakura-sakura/p/6678198.html
Copyright © 2011-2022 走看看