由于想开发一个瀑布流主题,我历经3周时间,在国内外各大论坛及度娘等网站查找资料,一遍遍的测试、实践,终于功夫不负有心人,用代码实现了瀑布流布局+无限触底加载的功能,可谓是呕心沥血,怎一个累字了得!下面分享记录瀑布流开发的代码及心得!

wp主题开发

一、首先说一下必备js插件

1.masonry瀑布流布局插件
布局插件:http://www.jq22.com/jquery-info362
2.infinite-scroll无限加载插件
插件官方:https://infinite-scroll.com/#masonry-isotope-packery
3.imagesloaded图片加载插件
插件官方:https://imagesloaded.desandro.com/

二、wp主循环+masonry实现布局

1.主循环html代码:

<?php if(have_posts()) : ?>
<div class="container">  
<div id="masonry" class="container-fluid">  
	<?php while (have_posts()) : the_post(); ?>	
		<div class="box masonry-item">
			<a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
				<img src="<?php echo get_the_post_thumbnail_url(); ?>">
			</a>  
		</div>
	<?php endwhile; ?>
	</div>	
</div>
<?php else : ?>
<!-- 没有列表 -->
<div class="block">
当前列表为空,尚未发布!
</div>

<?php endif; ?>
<!-- 分页 -->
<?php pageNavLink();?>  

2.在footer底部引入masonry插件及js代码

<script src="<?php echo get_template_directory_uri(); ?>/static/js/water.js" type="text/javascript"></script>
<script>
$(function() {
    var $container = $('#masonry');
    $container.imagesLoaded(function() {
        $container.masonry({
                itemSelector: '.box',
                gutter: 20,
                isAnimated: true,
            });
     });
});
</script> 

完成这一步,你会发现你的页面已经实现瀑布流布局了!,效果如下:

三、实现瀑布流无限加载功能

底部引入imagesloaded和infinite-scroll两个插件,并修改我们的js代码:

<script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
<script src="<?php echo get_template_directory_uri(); ?>/static/js/infinite-scroll.js" type="text/javascript"></script>
<script>
jQuery(document).ready(function($) { 
	var $grid = $('#masonry').masonry({
	navSelector: '#pages',
	nextSelector: '#pages .pages_next', //下一页选择器
	itemSelector: ".box", //下一页中需要被加载进当前页的块
	gutter: 20,
	itemSelector: '.masonry-item',
	});
	var msnry = $grid.data('masonry'); 
	$grid.infiniteScroll({
	path: '#pages .pages_next',
	history: false,
	append: '.masonry-item',
	outlayer: msnry,
	});
});
</script> 

刷新页面,发现还是不可以,最开始我在wp后台设置的分页是3和5,发现不能触底,也就是页面高度没有到浏览器的底部,不会触发加载图片的js,因此我调整到10,果然,可以动态加载数据了!

还有一点,上面是我多次试验成功的代码,特别是最后的js,需要你根据自己的元素id和class修改,否则不生效,除非你的html代码和我的一样,那没问题,绝对可以用!

对了,上面还有一段分页代码,无限加载需要配置“下一页”的class,wp自带的下一页没有class,就在functions里面动态加入了class了,代码如下:

//给下一页添加类
add_filter('next_posts_link_attributes', 'posts_link_attributes');
// add_filter('previous_posts_link_attributes', 'posts_link_attributes');
function posts_link_attributes() {
  return 'class="pages_next"';
}
//分页代码
function  pageNavLink( $range = 4 ) {
    global $paged,$wp_query;
    if ( !$max_page ) {
        $max_page = $wp_query->max_num_pages;
    }
    if( $max_page >1 ) {
        echo "<div id='pages'>"; 
        if( !$paged ){
            $paged = 1;
        }
        if( $paged != 1 ) {
            echo "<a href='".get_pagenum_link(1) ."' class='extend' title='跳转到首页'>首页</a>";
        }
        previous_posts_link('上一页');
        if ( $max_page >$range ) {
            if( $paged <$range ) {
                for( $i = 1; $i <= ($range +1); $i++ ) {
                    echo "<a href='".get_pagenum_link($i) ."'";
                if($i==$paged) echo " class='current'";echo ">$i</a>";
                }
            }elseif($paged >= ($max_page -ceil(($range/2)))){
                for($i = $max_page -$range;$i <= $max_page;$i++){
                    echo "<a href='".get_pagenum_link($i) ."'";
                    if($i==$paged)echo " class='current'";echo ">$i</a>";
                    }
                }elseif($paged >= $range &&$paged <($max_page -ceil(($range/2)))){
                    for($i = ($paged -ceil($range/2));$i <= ($paged +ceil(($range/2)));$i++){
                        echo "<a href='".get_pagenum_link($i) ."'";if($i==$paged) echo " class='current'";echo ">$i</a>";
                    }
                }
            }else{
                for($i = 1;$i <= $max_page;$i++){
                    echo "<a href='".get_pagenum_link($i) ."'";
                    if($i==$paged)echo " class='current'";echo ">$i</a>";
                }
            }
        next_posts_link('下一页'); 
        if($paged != $max_page){
            echo "<a href='".get_pagenum_link($max_page) ."' class='extend' title='跳转到最后一页'>尾页</a>";
        }
        echo '<span>共'.$max_page.'页</span>';
        echo "</div>\n";  
    }
}

到此结束,历经三周的难题终于突破了,心里美滋滋!