网站搭建-给lightbox增加鼠标滚轮缩放功能
lightbox2 提供了一种轻量化的图片查看方案
本文是笔者在搭建网站时 通过修改lighbox.js的源码 给lightbox增加了鼠标滚轮缩放功能
代码部分
啥废话都不说 咱直接放源码
找到下面这一段:
this.$lightbox.find('.lb-loader, .lb-close').on('click keyup', function (e) {
// If mouse click OR 'enter' or 'space' keypress, close LB
if (
e.type === 'click' || (e.type === 'keyup' && (e.which === 13 || e.which === 32))) {
self.end();
return false;
}
});
然后回车两行
插入以下代码:
// 图片滚轮缩放
this.img = this.$container.find('.lb-image');
this.label = this.$lightbox.find('.lb-dataContainer');
$([this.$overlay[0], this.$lightbox[0]]).bind("mousewheel", function (e) {
// 变量组
var flag = e.originalEvent.wheelDelta < 0; // 获取滚轮方向 TRUE为上 FALSE为下
// 这里的函数为兼容老式浏览器 使用 e.originalEvent.wheelDelta 现在你可以使用 e.deltaY
var imgNH = self.img[0].naturalHeight; // 获取图片原始高度
var imgNW = self.img[0].naturalWidth; // 获取图片原始宽度
var imgH = self.img.height(); // 获取当前图片的高度
var imgW = self.img.width(); // 获取当前图片的宽度
var zoom = 64 // 定义缩放量
var nw = Math.round(zoom * imgW / imgH); // 计算宽度变化量 Math.round 用于取整 确保变化量为整数
var ctH = self.$outerContainer.height(); // 获取外容器的当前高度
var ctW = self.$outerContainer.width(); // 获取外容器的当前宽度
var minH = imgNH / 10; // 设置最小缩放值为图片px值的10分之1
var maxH = imgNH; // 设置最大缩放值为图片px值
var minW = imgNW / 10; // 设置最小缩放值为图片px值的10分之1
var maxW = imgNW; // 设置最大缩放值为图片px值
// 向下滚动
if (flag && imgH > minH && imgW > minW) {
self.$outerContainer.css('height', ctH - zoom); // 减小外容器的高度
self.$outerContainer.css('width', ctW - nw); // 减小外容器的宽度
requestAnimationFrame(function () {
self.img.css('height', ctH - zoom); // 设置图片的高度为外容器的高度
self.img.css('width', ctW - nw); // 设置图片的宽度为外容器的宽度
});
if (ctW - nw > (imgNW / 5) || (ctH - nw > imgNH / 5)) { // 判断外容器的宽度和高度是否大于图片原始宽度和高度的五分之一
self.label.css('width', ctW - zoom); // 设置数据容器的宽度为外容器的宽度减去缩放量
}
// 向上滚动
} else if (!flag && imgH < maxH && imgW < maxW) {
self.$outerContainer.css('height', ctH + zoom); // 增加外容器的高度
self.$outerContainer.css('width', ctW + nw); // 增加外容器的宽度
requestAnimationFrame(function () {
self.img.css('height', ctH + zoom); // 设置图片的高度为外容器的高度
self.img.css('width', ctW + nw); // 设置图片的宽度为外容器的宽度
});
self.label.css('width', ctW + nw); // 保持数据容器的宽度与图片的宽度相适应
}
e.stopPropagation(); // 阻止事件冒泡
return false;
});
var isScaling = false; // 滚轮缩放事件标志
// 图片滚轮缩放
this.img.bind("wheel", function (e) {
isScaling = true; // 设置滚轮缩放事件标志
// 在滚轮缩放事件处理函数的最后添加以下代码
setTimeout(function () {
isScaling = false; // 清除滚轮缩放事件标志
}, 100); // 100ms 后清除标志
});
注意 这里有大量注释 如果你不想要 可以全部删除
总体的原理 看看注释就懂了 你也可以在此基础上添加其他功能 或精简一些代码
我后续会将魔改后的lightbox放在GitHub上开源