AMB*_*AMB 12 javascript jquery-masonry infinite-scroll imagesloaded
砌体无限滚动追加html5视频重叠
我目前正在使用imagesLoaded库来检查图像是否已加载然后调用masonry.
但它没有使用html5视频标签,因为这些视频相互重叠.
所以我改变调用masonry从document.ready到window.load并删除呼叫imagesLoaded从此即在初始加载
$(document).ready(function(){
var $container = $('#media');
// layout Masonry again after all images have loaded
$container.imagesLoaded( function() {
$container.masonry({
"columnWidth": "." + "col-sm-2",
itemSelector: '.item',
gutter: 0,
});
$('.item').css('opacity', '1.0');
});
});
Run Code Online (Sandbox Code Playgroud)
对此
$(window).load(function(){
var $container = $('#media');
$container.masonry({
"columnWidth": "." + "col-sm-2",
itemSelector: '.item',
gutter: 0,
});
$('.item').css('opacity', '1.0');
});
Run Code Online (Sandbox Code Playgroud)
现在html5 videos在masonry重叠,并在页面的第一次加载完美渲染initial load,但是,因为我也使用在滚动页面上infinite-scroll添加更多images/videos,所以当新视频被添加到容器时它们正在重叠,这种行为是由早期引起的masonry在加载所有视频元素之前运行,因为imagesloaded无法检查videos loaded.
这是代码.
$(document).ready(function(){
var $container = $('#media');
var no_more_media = "<?= Lang::get('lang.no_more_to_load') ?>";
var loading_more_media = "<?= Lang::get('lang.loading_more_media') ?>";
$container.imagesLoaded(function(){
$container.masonry();
});
$container.infinitescroll({
loading: {
finished: undefined,
finishedMsg: "<p>" + no_more_media + "</p>",
img: "data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==",
msg: null,
msgText: "<div class='loading'><i></i><i></i><i></i></div><p>" + loading_more_media + "</p>",
selector: null,
speed: 'fast',
start: undefined,
},
navSelector : "ul.pagination",
// selector for the paged navigation (it will be hidden)
nextSelector : "ul.pagination a:first",
// selector for the NEXT link (to page 2)
itemSelector : ".container #media .item",
animate: false,
bufferPx: 160,
},
function( newElements ) {
// hide new items while they are loading
//var $newElems =
$.each($(newElements), function(index, value){
item_click_events($(value));
});
$( newElements ).css({ opacity: 0 });
$(newElements).imagesLoaded(function(){
var $newElems = $( newElements );
$newElems.animate({ opacity: 1 });
$container.masonry( 'appended', $newElems, true);
}
);
});
});
Run Code Online (Sandbox Code Playgroud)
我已经尝试过更改document.ready为window.load上面的代码,并imagesloaded完全删除运行,但它无法使用infinitescroll.,
例如修改代码
$(window).load(function(){
var $container = $('#media');
var no_more_media = "<?= Lang::get('lang.no_more_to_load') ?>";
var loading_more_media = "<?= Lang::get('lang.loading_more_media') ?>";
$container.masonry();
$container.infinitescroll({
loading: {
finished: undefined,
finishedMsg: "<p>" + no_more_media + "</p>",
img: "data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==",
msg: null,
msgText: "<div class='loading'><i></i><i></i><i></i></div><p>" + loading_more_media + "</p>",
selector: null,
speed: 'fast',
start: undefined,
},
navSelector : "ul.pagination",
// selector for the paged navigation (it will be hidden)
nextSelector : "ul.pagination a:first",
// selector for the NEXT link (to page 2)
itemSelector : ".container #media .item",
animate: false,
bufferPx: 160,
},
function( newElements ) {
// hide new items while they are loading
//var $newElems =
$.each($(newElements), function(index, value){
item_click_events($(value));
});
$( newElements ).css({ opacity: 0 });
var $newElems = $( newElements );
$newElems.animate({ opacity: 1 });
$container.masonry( 'appended', $newElems, true);
});
});
Run Code Online (Sandbox Code Playgroud)
我可以通过指定视频宽度和高度来解决这个重叠问题的另一种方法,但作为其响应式设计,指定视频宽度和高度会破坏响应性.
所以我的问题是,是否有任何js库simmilar到imagesloaded确保所有视频都加载,然后我可以打电话给砌体?或者我怎么能保证视频不会得到overlapped的infinitescroll?
更新1:
对于infinitescroll,我尝试了很多技巧
$(newElements).load(function(){
var $newElems = $( newElements );
$newElems.animate({ opacity: 1 });
$container.masonry( 'appended', $newElems, true);
});
Run Code Online (Sandbox Code Playgroud)
在pagescroll之后不会加载新内容.
$(window).load(function(){
var $newElems = $( newElements );
$newElems.animate({ opacity: 1 });
$container.masonry( 'appended', $newElems, true);
});
Run Code Online (Sandbox Code Playgroud)
在pagescroll之后不会加载新内容.
var $newElems = $( newElements );
$newElems.animate({ opacity: 1 });
$container.masonry( 'appended', $newElems, true);
Run Code Online (Sandbox Code Playgroud)
重叠视频内容
所以我想出了infinite-scroll提前打电话,放慢了container.masonry3秒,现在效果很好.但仍在等待正确的解决方案.
例如
bufferPx: 700,
setTimeout(function(){
var $newElems = $( newElements );
$newElems.animate({ opacity: 1 });
$container.masonry( 'appended', $newElems, true);
}, 3000);
Run Code Online (Sandbox Code Playgroud)
以上是延迟运行砖石3秒.
我试图寻找类似window.load的div,但没有,所以我的最好的办法是检查是否所有的videos和images被加载,然后调用masonry调用后infinite-scroll
添加工作演示http://plnkr.co/edit/46YzHBJ7eFAXfsPqZB1q 您可以通过单击运行并向下滚动来查看问题.
看起来你可以通过等待视频的loadeddata事件来修复它
这是基本的想法:
function waitForvidLoad(vids, callback) {
/* if no videos i.e. mobile mode only gifs and jpgs then call callback else masonry breaks.*/
if(vids.length === 0){
callback();
}
var vidsLoaded = 0;
vids.on('loadeddata', function() {
vidsLoaded++;
if (vids.length === vidsLoaded) {
callback();
}
});
}
Run Code Online (Sandbox Code Playgroud)
.
var $container = $('#container');
var vids = $('#container').find('video');
waitForvidLoad(vids, function() {
$container.imagesLoaded(function() {
$container.masonry({
itemSelector: '.box',
columnWidth: 100
});
});
Run Code Online (Sandbox Code Playgroud)
在这里工作plunker: http://plnkr.co/edit/jXJ7oFxF3sFWBAJuBqdQ?p=preview
| 归档时间: |
|
| 查看次数: |
816 次 |
| 最近记录: |