html加载原理,html+js实现图片预加载,lightbox底层原理。

在前端设计时,为了让某县页面的图片即使缓存到浏览器中,一般使用预加载技术,但更为确切的应该称为异步加载,因为对线程不会造成阻塞。

图片是网站开发部分中的静态资源,当浏览器网络请求到图片时会首先缓存,然后根据url hash值载入到中

核心代码

function loadImage(id,src,callback)

{

var imgloader= new window.Image();

//当图片成功加载到浏览器缓存

imgloader.onload =function(evt)

{

if(typeof(imgloader.readyState)=='undefined')

{

imgloader.readyState = 'undefined';

}

//在IE8以及以下版本中需要判断readyState而不是complete

if ((imgloader.readyState=='complete'||imgloader.readyState=="loaded")||imgloader.complete)

{

callback({'msg':'ok','src':src,'id':id});

}else{

imgloader.onreadystatechange(evt);

}

};

//当加载出错或者图片不存在

imgloader.onerror = function(evt)

{

callback({'msg':'error','id':id});

}

//当加载状态改变

imgloader.onreadystatechange = function(e)

{

//此方法只有IE8以及一下版本会调用

}

imgloader.src=src;

}

深情的测试一下吧。

html>

异步(预加载)加载图片

 

function loadImage(id,src,callback)

{

var imgloader= new window.Image();

//当图片成功加载到浏览器缓存

imgloader.onload =function(evt)

{

if(typeof(imgloader.readyState)=='undefined')

{

imgloader.readyState = 'undefined';

}

//在IE8以及以下版本中需要判断readyState而不是complete

if ((imgloader.readyState=='complete'||imgloader.readyState=="loaded")||imgloader.complete)

{

//console.log('width='+imgloader.width+',height='+imageloader.height);//读取原始图片大小

callback({'msg':'ok','src':src,'id':id});

}else{

imgloader.onreadystatechange(evt);

}

};

imgloader.onerror = function(evt)

{

callback({'msg':'error','id':id});

};

imgloader.onreadystatechange = function(e)

{

//此方法只有IE8以及一下版本会调用

};

imgloader.src=src;

}

var loadResult = function(data)

{

data =   data ||{} ;

if(typeof(data.msg)!='undefined')

{

if(data.msg=='ok')

{

//这里使用了id获取元素,有点死板,建议读者自行扩展为css 选择符

document.getElementById(''+data.id).src=data.src;

}else{

//这里图片加载失败,我们可以显示其他图片,防止大红叉

document.getElementById(''+data.id).src='unload.png';

}

}

}

var surl = 'http://web.2008php.com/2014_Website_appreciate/2014-10-31/20141031133134.jpg';

loadImage('display_images',surl,loadResult);

注意:这种用法过于简单,没有发挥出性能,请读者自行改造后,预加载20张1024*780图片,然后自动播放。如果是预加载的,播放时看不见卡顿或显示不完全的现象。

--------------------------------------------------------------------------------

目前,很多主流的图片展示库如 lightbox.js,facybox.js等底层就是依据这种原理实现的,有兴趣的读者可以使用一下这些第三方框架。

try doing it.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用HTML和JavaScript实现单击图片切换的示例代码: ```html <!DOCTYPE html> <html> <head> <title>Image Gallery</title> <style> /* 灯箱样式 */ .lightbox { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.6); display: none; justify-content: center; align-items: center; } .lightbox img { max-width: 80%; max-height: 80%; } .lightbox .prev, .lightbox .next { position: absolute; top: 50%; transform: translateY(-50%); font-size: 3em; color: #fff; cursor: pointer; } .lightbox .prev { left: 20px; } .lightbox .next { right: 20px; } </style> </head> <body> <!-- 图片列表 --> <div class="gallery"> <img src="image1.jpg" alt="Image 1" onclick="openLightbox(this)"> <img src="image2.jpg" alt="Image 2" onclick="openLightbox(this)"> <img src="image3.jpg" alt="Image 3" onclick="openLightbox(this)"> <img src="image4.jpg" alt="Image 4" onclick="openLightbox(this)"> </div> <!-- 灯箱 --> <div class="lightbox"> <img src="" alt="Lightbox Image"> <div class="prev" onclick="prevImage()"><</div> <div class="next" onclick="nextImage()">></div> </div> <script> // 获取图片列表和灯箱元素 var gallery = document.querySelector('.gallery'); var lightbox = document.querySelector('.lightbox'); var lightboxImage = lightbox.querySelector('img'); var prevButton = lightbox.querySelector('.prev'); var nextButton = lightbox.querySelector('.next'); // 获取所有图片元素 var images = gallery.querySelectorAll('img'); // 当前显示的图片索引 var currentIndex = 0; // 打开灯箱 function openLightbox(image) { // 设置灯箱图片 lightboxImage.src = image.src; // 显示灯箱 lightbox.style.display = 'flex'; // 获取当前图片索引 currentIndex = Array.prototype.indexOf.call(images, image); } // 关闭灯箱 function closeLightbox() { // 隐藏灯箱 lightbox.style.display = 'none'; } // 切换到上一张图片 function prevImage() { currentIndex--; if (currentIndex < 0) { currentIndex = images.length - 1; } lightboxImage.src = images[currentIndex].src; } // 切换到下一张图片 function nextImage() { currentIndex++; if (currentIndex >= images.length) { currentIndex = 0; } lightboxImage.src = images[currentIndex].src; } // 点击灯箱以外的区域关闭灯箱 lightbox.addEventListener('click', function(event) { if (event.target === this) { closeLightbox(); } }); // 监听键盘事件 document.addEventListener('keydown', function(event) { if (event.key === 'Escape') { closeLightbox(); } else if (event.key === 'ArrowLeft') { prevImage(); } else if (event.key === 'ArrowRight') { nextImage(); } }); </script> </body> </html> ``` 该示例代码中,我们使用了HTML和CSS来创建灯箱的样式,使用JavaScript来实现图片的切换。当用户单击图片时,我们会打开灯箱并显示当前图片。在灯箱中,我们还添加了上下切换按钮和键盘事件监听器,以便用户可以通过多种方式切换图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值