在 Rails 项目中组合 freewall.js 和 fancybox.js 以获得可点击的放大图像
Combining freewall.js and fancybox.js for clickable enlarged images in a Rails project
我正在画廊工作,我想在其中使用 freewall.js 显示图像,唯一的问题是 freewall.js 不包括点击放大图像的功能。
所以我添加了 fancybox.js,因为你需要一个 href 来使 fancybox 工作,所以需要费力才能连接,但是,freewall.js 每次被调用时都会创建一个随机数,所以调用它两次不会工作。这是我开始使用的代码和下面的解决方案。我希望这可以帮助其他编码人员寻找非常时尚、响应迅速且易于实施的画廊。
这是我的开始 html。
<div class="row">
<div class="col-md-12">
<div id="freewall" class="free-wall"></div>
</div>
</div>
这是我的起点Javascript
$(document).ready(function() {
$(".fancybox").fancybox();
});
var temp = "<div class='brick' style='width:{width}px;'><a href='#' class='fancybox'><img src='../assets/carousel/{index}.jpg' width='100%'></a></div>";
var w = 1, h = 1, html = '', limitItem = 20;
for (var i = 0; i < limitItem; ++i) {
w = 1 + 3 * Math.random() << 0;
html += temp.replace(/\{width\}/g, w*160).replace("{index}", i + 1);
}
$("#freewall").html(html);
var wall = new Freewall("#freewall");
wall.reset({
selector: '.brick',
animate: true,
cellW: 150,
cellH: 'auto',
onResize: function() {
wall.fitWidth();
}
});
var images = wall.container.find('.brick');
images.find('img').load(function() {
wall.fitWidth();
});
这是关于如何结合两者的最终 javascript 解决方案。
如您所见,我向每个图像创建的父 div 添加了一个 class .item
(我也可以简单地使用 .brick)。然后我使用 javascript 将 dom 缩小到图像标签并添加一个 href,现在它可以完全正常工作了。
当然它可以使用一些微调,添加悬停效果等等,所以我期待看到其他人可以提出的其他建议和调整。
$(document).on('page:change',function() {
$(".item").find("img").each( function() {
$(this).attr("href",$(this).attr("src"));
});
$(".fancybox").fancybox();
});
var temp = "<div class='brick item' style='width:{width}px;'><img src='../assets/carousel/{index}.jpg' width='100%' class='fancybox'></div>";
var w = 1, h = 1, html = '', limitItem = 30;
for (var i = 0; i < limitItem; ++i) {
w = 1 + 3 * Math.random() << 0;
html += temp.replace(/\{width\}/g, w*160).replace("{index}", i + 1);
}
$("#freewall").html(html);
var wall = new Freewall("#freewall");
wall.reset({
selector: '.brick',
animate: true,
cellW: 150,
cellH: 'auto',
onResize: function() {
wall.fitWidth();
}
});
var images = wall.container.find('.brick');
images.find('img').load(function() {
wall.fitWidth();
});
我正在画廊工作,我想在其中使用 freewall.js 显示图像,唯一的问题是 freewall.js 不包括点击放大图像的功能。
所以我添加了 fancybox.js,因为你需要一个 href 来使 fancybox 工作,所以需要费力才能连接,但是,freewall.js 每次被调用时都会创建一个随机数,所以调用它两次不会工作。这是我开始使用的代码和下面的解决方案。我希望这可以帮助其他编码人员寻找非常时尚、响应迅速且易于实施的画廊。
这是我的开始 html。
<div class="row">
<div class="col-md-12">
<div id="freewall" class="free-wall"></div>
</div>
</div>
这是我的起点Javascript
$(document).ready(function() {
$(".fancybox").fancybox();
});
var temp = "<div class='brick' style='width:{width}px;'><a href='#' class='fancybox'><img src='../assets/carousel/{index}.jpg' width='100%'></a></div>";
var w = 1, h = 1, html = '', limitItem = 20;
for (var i = 0; i < limitItem; ++i) {
w = 1 + 3 * Math.random() << 0;
html += temp.replace(/\{width\}/g, w*160).replace("{index}", i + 1);
}
$("#freewall").html(html);
var wall = new Freewall("#freewall");
wall.reset({
selector: '.brick',
animate: true,
cellW: 150,
cellH: 'auto',
onResize: function() {
wall.fitWidth();
}
});
var images = wall.container.find('.brick');
images.find('img').load(function() {
wall.fitWidth();
});
这是关于如何结合两者的最终 javascript 解决方案。
如您所见,我向每个图像创建的父 div 添加了一个 class .item
(我也可以简单地使用 .brick)。然后我使用 javascript 将 dom 缩小到图像标签并添加一个 href,现在它可以完全正常工作了。
当然它可以使用一些微调,添加悬停效果等等,所以我期待看到其他人可以提出的其他建议和调整。
$(document).on('page:change',function() {
$(".item").find("img").each( function() {
$(this).attr("href",$(this).attr("src"));
});
$(".fancybox").fancybox();
});
var temp = "<div class='brick item' style='width:{width}px;'><img src='../assets/carousel/{index}.jpg' width='100%' class='fancybox'></div>";
var w = 1, h = 1, html = '', limitItem = 30;
for (var i = 0; i < limitItem; ++i) {
w = 1 + 3 * Math.random() << 0;
html += temp.replace(/\{width\}/g, w*160).replace("{index}", i + 1);
}
$("#freewall").html(html);
var wall = new Freewall("#freewall");
wall.reset({
selector: '.brick',
animate: true,
cellW: 150,
cellH: 'auto',
onResize: function() {
wall.fitWidth();
}
});
var images = wall.container.find('.brick');
images.find('img').load(function() {
wall.fitWidth();
});