美文网首页我爱编程
Angular与isotopejs与imagesLoaded 无

Angular与isotopejs与imagesLoaded 无

作者: Scoor | 来源:发表于2018-04-24 12:44 被阅读0次

[TOC]

Angular.js

Angular.js是一款优秀的前端框架,在web与wap中可以通过简单的代码实现复杂的无刷新加载、切换、删除与其他js效果

Isotope.js

这是一款功能非常强大的前端布局js插件,通吃瀑布流、栅格、懒加载、排序等!前端有了它,女神抱回家!!!

imagesLoaded

专业的图片加载插件,可以分块或全局检测图片是否加载完成,是angular与isotope的耦合器

代码

代码分为html代码,angular代码,接口没啥好说的,核心代码在Angular指令那一块的耦合器imagesLoaded,它保证angular的图片加载完成后再进行布局排版,否则图片未加载完成导致布局错乱无法得到解决。

html代码

<script src="/js/jquery.min.js" type="text/javascript"></script>
<script src="/js/imagesloaded.pkgd.min.js" type="text/javascript"></script>
<script src="/js/isotop.js" type="text/javascript"></script>
<script src="/js/angular.min.js" type="text/javascript"></script>
<script src="/js/app.js" type="text/javascript"></script>
//以上是用的所有的js代码
<div class="row" id="masonry" data-iso-repeat="galleries">
</div>

一个指令,就只么多吧!

注:指令的galleries才是你要循环的,下面的items只是形参可以随便写!!

Angular代码

无限加载功能是用的js原生观察器IntersectionObserver监控底部的标签,当标签出现在用户视线,调用加载更多方法。

观察器看阮一峰教程吧IntersectionObserver API 使用教程

Angular初始化

 $scope.index_init=function({//初始化gallery,工厂和接口略过
        obverse();//调用观察器,实现无线加载
        $scope.p=0//页数
        indexFactory.ajaxgetindex($scope.p).then(function (d) {
            $scope.galleries=d;
        })
    }

Angular加载更多

 $scope.more_gal=function () {
        $scope.p++
        if($scope.loadnull) return;
        indexFactory.ajaxgetindex($scope.p).then(function (d) {
            $scope.galleries=$scope.galleries.concat(d);//这里会被$watch监控到,会重新调用isotope布局方法
            if(d==false||d==null||d==[]||d==undefined){
                $scope.loadnull=true;//没有更多了
            }
        })
    }

Angular指令

[你的app].directive('isoRepeat', function ($timeout) {
    return {
        scope: {
            items: '=isoRepeat'
        },
        template:'<gall ng-repeat="item in items" class="col-lg-3 col-md-4 col-sm-6 col-xs-12">' +
                        '<div class=" grid-portfolio">' +
                            '<img ng-src="{{item.main_pic}}" alt=""/>'+
                        '</div>'+
                '</gall>',
        link: function (scope, element, attrs) {
           console.log(element)
            var options = {
                animationEngine : 'jquery',
                itemSelector: 'gall',//repeat对应的标签
                layoutMode: 'masonry',//瀑布流布局
                columnWidth:0,
            };

            //console.log(element.isotope(options))
            var $grid =  element.isotope(options);//初始化isotope
            $("html").imagesLoaded(function(){//!!!这段代码就是整个项目的核心!!!
                $grid.isotope('layout');//所有图片加载完成后,调用排版布局方法
                scope.$digest();
            })
            scope.$watch('items', function(newVal, oldVal){//监听items,发生改变(加载或删除)时,重新布局
                $timeout(function(){
                    $("html").imagesLoaded(function(){//!!!这段代码就是整个项目的核心!!!
                        element.isotope( 'reloadItems' ).isotope({
                            masonry: {
                                columnWidth:0
                            }
                        });
                        scope.$digest();
                    })

                });
            },true);
        }
    };
});

来看看成品吧!
福利!!!该项目demo:月风美女写真!!!
由于IntersectionObserver观察器对手机支持不太友好,项目中已经弃用了,监听scroll虽然很low但是还是稳!

相关文章

网友评论

    本文标题:Angular与isotopejs与imagesLoaded 无

    本文链接:https://www.haomeiwen.com/subject/tfndlftx.html