jQuery让GIF图片默认为静态图片,鼠标经过时显示动态,不仅仅在WordPress,基本所有网页上GIF图片默认是显示动态的,这样如果多了,就会让网页很卡,也会消耗资源的,所以我研究了一下怎么让GIF像视频一样,显示个缩略图,等鼠标经过或者点击播放的时候播放动态图片。
首先我们来屡一下思路:
1、假设GIF图片像视频一样都是由帧组成的,我们获取其中一帧来做缩略图,嗯,在CSS3时代我们可以用canvas画出来;
2、这个时候就得由两个图片来切换了,一个是缩略图,一个是原始图片,当鼠标经过时自动播放GIF图片;
有了这个思路,我们来编写对应的函数:
一、默认html中架构:
<img src="https://hilau.com/wp-content/uploads/2019/09/canvas.gif" class="gif" />
二、用canvas画出其中一帧来做缩略图:
// 动态图片转静态
function aniToReview(e){
$(e).each(function () {
var canvas = document.createElement('canvas'),
ctx = canvas.getContext("2d"),
base64 = '',
aniUrl = this.src;
//canvas.setAttribute('crossOrigin', 'anonymous');
$(this).one('load', function () {
canvas.width = this.width;
canvas.height = this.height;
ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
base64 = canvas.toDataURL("image/png");
var reviewUrl = URL.createObjectURL(base64)
$(this).attr({
'src': reviewUrl,
'realsrc': aniUrl
});
});
})
}
aniToReview('.gif');
这里如果不能将现在的图片的地址转换成静态地址,显示toDataURL转换不了,在服务器上试试,有时候本地会出现这样的问题;
三、当鼠标经过时动态与静态之间的变化
// 鼠标经过时静态图片转动态
$(document).on('mouseover','.gif',function () {
var reviewImg = $(this).attr('src'),
aniImg = $(this).attr('realsrc');
$(this).attr({'src': aniImg, 'realsrc': reviewImg});
})
$(document).on('mouseout','.gif',function () {
var reviewImg = $(this).attr('realsrc'),
aniImg = $(this).attr('src');
$(this).attr({'src': reviewImg, 'realsrc': aniImg});
})
四、上述代码是针对一张图片处理是可以的
譬如在WordPress,我们每篇文章都有GIF图片,或者我首页缩略图全部是GIF图片,我不可能一个个都加上class=gif,当然不嫌麻烦也是可以的。所以我们判断一下,当有gif图片的时候才会触发上述的效果:
//判断图片是否是GIF图片
function isAssetTypeAnImage(ext) {
return ['gif'].indexOf(ext.toLowerCase()) !== -1;
}
//如果是GIF图片,添加div以及class="gif"
$('img').each(function(){
var gifPath = $(this)[0].src;
var gifIndex = gifPath.lastIndexOf(".");
var gifExt = gifPath.substr(gifIndex+1);
if (isAssetTypeAnImage(gifExt)) {
$(this).wrap("<div class='gifWrap'></div>").parent();
$(this).after('<ins class="play-gif">gif</ins>');
$(this).addClass('gif');
}
});
五、总结一下
当网页有img标签的时候,我们首先判断其是不是GIF图片,如果是,触发我们动态变静态函数,并且鼠标经过会在动态与静态切换。所以这个JQ小插件就出来了(可以保存为gifpreview.js,然后在网页中引入,当然这个必须基于jquery库):
//判断图片是否是GIF图片
function isAssetTypeAnImage(ext) {
return ['gif'].indexOf(ext.toLowerCase()) !== -1;
}
//如果是GIF图片,添加div以及class="gif"
$('img').each(function(){
var gifPath = $(this)[0].src;
var gifIndex = gifPath.lastIndexOf(".");
var gifExt = gifPath.substr(gifIndex+1);
if (isAssetTypeAnImage(gifExt)) {
$(this).wrap("<div class='gifWrap'></div>").parent();
$(this).after('<ins class="play-gif">gif</ins>');
$(this).addClass('gif');
}
});
//dataURLtoBlob("a.gif");
// base64 转 blob
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: mime
});
}
// 动态图片转静态
function aniToReview(e){
$(e).each(function () {
var canvas = document.createElement('canvas'),
ctx = canvas.getContext("2d"),
base64 = '',
aniUrl = this.src;
canvas.setAttribute('crossOrigin', 'anonymous');
$(this).one('load', function () {
canvas.width = this.width;
canvas.height = this.height;
ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
base64 = canvas.toDataURL("image/png");
var reviewUrl = URL.createObjectURL(dataURLtoBlob(base64))
$(this).attr({
'src': reviewUrl,
'realsrc': aniUrl
});
});
})
}
aniToReview('.gif');
// 鼠标经过时静态图片转动态
$(document).on('mouseover','.gif',function () {
var reviewImg = $(this).attr('src'),
aniImg = $(this).attr('realsrc');
$(this).attr({'src': aniImg, 'realsrc': reviewImg});
$('.play-gif').fadeOut(100);
})
$(document).on('mouseout','.gif',function () {
var reviewImg = $(this).attr('realsrc'),
aniImg = $(this).attr('src');
$(this).attr({'src': reviewImg, 'realsrc': aniImg});
$('.play-gif').fadeIn(100);
})
最后,补充下对应css样式:
ins.play-gif{
box-sizing:border-box;
position:absolute;
top:50%;
margin-top:-20px;
left:50%;
margin-left:-20px;
min-height:40px;
min-width:40px;
text-align:center;
background:#222;
line-height:34px;
font-size:14px;
text-transform:uppercase;
color:#fff;
border-radius:50%;
opacity:.9;
border:3px solid #fff;
cursor:pointer;
text-decoration:none;
}
ins.play-gif:hover{
opacity:.5;
}
.gifWrap{
position:relative;
display:inline-block;
}
大功告成!如果需要的可以自己试试,然后演示可以见本站效果!
声明:本文采用 BY-NC-SA 协议进行授权,如无注明均为原创,转载请注明转自 你好!刘
本文地址:jQuery给GIF动画添加缩略图,不止用在WordPress
本文地址:jQuery给GIF动画添加缩略图,不止用在WordPress
发表评论