jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)

下面是关于利用 jQuery 实现瀑布流布局中延迟 AJAX 加载图片的攻略。

前言

瀑布流布局是一种非常流行的网页排版方式,它能够适应不同尺寸的图片,并且极大地提高了页面浏览的舒适度。本文主要介绍如何在瀑布流布局中,通过 AJAX 延迟加载图片。

实现方式

实现方式主要分为两步:

  1. 在 HTML 代码中创建图片容器
  2. 通过 AJAX 技术加载图片,并使用绝对定位进行排版

创建图片容器

首先,在 HTML 代码中创建包含每张图片的容器。为了实现瀑布流布局,首先需要设置每列容器的宽度,并将它们设置为 float: left

<div class="column">
  <div class="item"><img src=""></div>
  <div class="item"><img src=""></div>
  <div class="item"><img src=""></div>
</div>
<div class="column">
  <div class="item"><img src=""></div>
  <div class="item"><img src=""></div>
</div>
<div class="column">
  <div class="item"><img src=""></div>
  <div class="item"><img src=""></div>
</div>

接下来是 CSS 样式,主要是对容器的设置:

.column {
  width: 33%;
  float: left;
}
.item {
  position: relative;
}
.item img {
  display: block;
}

延迟加载图片

接下来是通过 AJAX 技术来加载图片。首先,在页面加载完成后,获取页面的高度和列数,然后开始加载图片。

示例代码1:

$(function() {
  var page = 1;
  var isLoading = false;
  var columns = $('.column');
  var columnCount = columns.length;
  var scrollTop = 0;

  function loadImages() {
    if (isLoading) {
      return;
    }
    isLoading = true;
    $.ajax({
      url: '/data?p=' + page,
      dataType: 'json',
      success: function(data) {
        appendImages(data);
        isLoading = false;
        page++;
      },
      error: function() {
        isLoading = false;
      }
    });
  }

  function appendImages(data) {
    var images = data.images;
    var html = '';
    for (var i = 0, len = images.length; i < len; i++) {
      var html = '<div class="item">';
      html += '<img src="' + images[i] + '">';
      html += '</div>';
      var column = getShortestColumn();
      column.append(html);
    }
    PositionImages();
  }

  function getShortestColumn() {
    var minColumn = columns.eq(0);
    columns.each(function() {
      var height = $(this).height();
      if (height < minColumn.height()) {
        minColumn = $(this);
      }
    });
    return minColumn;
  }

  function PositionImages() {
    $('.item').each(function() {
      var item = $(this);
      item.css({
        left: item.position().left,
        top: getShortestColumn().height(),
        opacity: 1
      });
    });
  }

  $(window).scroll(function() {
    var currentScrollTop = $(this).scrollTop();
    if (currentScrollTop > scrollTop) {
      var maxHeight = getTallestColumn().height() + $(this).height();
      if ($(document).scrollTop() >= maxHeight) {
        loadImages();
      }
    }
    scrollTop = currentScrollTop;
  });

  function getTallestColumn() {
    var maxColumn = columns.eq(0);
    columns.each(function() {
      var height = $(this).height();
      if (height > maxColumn.height()) {
        maxColumn = $(this);
      }
    });
    return maxColumn;
  }

  loadImages(); // 页面刚加载完时,需要立即加载第一次数据
});

如上所示,在页面滚动到底部时,会触发加载图片的函数。在此之前,需要进行一些判断,以避免重复加载。

图片如何布局

在 AJAX 加载完成后,需要排列图片。由于图片的加载顺序是不定的,所以需要判断每列容器的高度,将新加载的图片添加到高度最短的列中。

示例代码2:

function appendImages(data) {
  var images = data.images;
  var html = '';
  for (var i = 0, len = images.length; i < len; i++) {
    var html = '<div class="item">';
    html += '<img src="' + images[i] + '">';
    html += '</div>';
    var column = getShortestColumn();
    column.append(html);
  }
  PositionImages();
}

function getShortestColumn() {
  var minColumn = columns.eq(0);
  columns.each(function() {
    var height = $(this).height();
    if (height < minColumn.height()) {
      minColumn = $(this);
    }
  });
  return minColumn;
}

function PositionImages() {
  $('.item').each(function() {
    var item = $(this);
    item.css({
      left: item.position().left,
      top: getShortestColumn().height(),
      opacity: 1
    });
  });
}

然后,使用绝对定位对图片进行定位。这里需要注意,由于图片是延迟加载的,如果遇到图片未加载完成就进行布局,会导致元素的位置出现偏差。因此需要特别关注图片的加载状态。

使用 opacity 属性为 0,等到图片加载成功后再将其设置蒋 1。

.item {
  position: absolute;
  opacity: 0;
  transition: opacity .5s ease-in-out;
}

.item.loaded {
  opacity: 1;
}

同时在 JS 代码中,将图片加载成功的状态写入图片容器中:

function appendImages(data) {
  var images = data.images;
  var html = '';
  for (var i = 0, len = images.length; i < len; i++) {
    var html = '<div class="item">';
    html += '<img src="' + images[i] + '">';
    html += '</div>';
    var column = getShortestColumn();
    column.append(html);
  }
  PositionImages();
}

function PositionImages() {
  $('.item').each(function() {
    var item = $(this);
    item.css({
      left: item.position().left,
      top: getShortestColumn().height(),
    });
    item.one('load', function() {
      item.addClass('loaded');
    });
  });
}

至此,就完成了基于 jQuery 瀑布流绝对定位布局的延迟 AJAX 加载图片攻略的讲解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片) - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 基于jquery实现日历效果

    要实现基于jQuery的日历效果,我们可以分为以下几个步骤。 设计HTML结构 首先,在HTML中设计好日历的基本框架。可以使用一个div元素,将每个日期都放在一个单独的span元素中。类名可以分别为“day”和“number”。其中,“day”用于标识周几(如“Mon”、“Tue”等),“number”用于标识日期。 示例代码: <div class…

    jquery 2023年5月28日
    00
  • 简单的jQuery入门指引

    简单的jQuery入门指引 什么是jQuery jQuery是一个快速,小巧并且功能丰富的JavaScript库。它可以简化HTML文档遍历、事件处理、动画和AJAX等操作。 使用jQuery,可以将许多常见的JavaScript任务简化为只需要一行代码即可完成。例如: $(‘#myButton’).click(function() { // do some…

    jquery 2023年5月27日
    00
  • jQuery无刷新上传之uploadify3.1简单使用

    为了详细讲解“jQuery无刷新上传之uploadify3.1简单使用”的完整攻略,我们需要按照一定的顺序进行介绍和操作。下面是教程的步骤: 1. 引入uploadify插件和jquery插件 为了使用uploadify插件,我们首先需要引入jQuery插件和uploadify插件的js文件和css文件。通常情况下,我们可以在html文档中直接引入这些文件。…

    jquery 2023年5月27日
    00
  • jQWidgets jqxGrid commandcolumnrenderer属性

    以下是关于“jQWidgets jqxGrid commandcolumnrenderer属性”的完整攻略,包含两个示例说明: 简介 jqx 控件的 commandcolumnrenderer 属性用于自定义命令列的渲染方式。 完整攻略 以下是 jqxGrid 控件 commandcolumnrenderer 属性的完整攻略: 定义commandcolumn…

    jquery 2023年5月11日
    00
  • jquery Validation表单验证使用详解

    jQuery Validation表单验证使用详解 jQuery Validation是一种用于客户端表单验证的插件,使用它可以轻松地对表单数据进行预处理,从而加强表单数据的有效性。下面将对jQuery Validation的使用进行详细讲解。 引入jQuery Validation插件 首先,需要在页面中引入jQuery和jQuery Validation…

    jquery 2023年5月27日
    00
  • JQuery中使用Ajax赋值给全局变量异常的解决方法

    首先需要了解 Ajax 请求是异步执行的,也就是说当发起 Ajax 请求时,程序并不会等待请求返回结果,而是直接执行后面的代码,当 Ajax 请求返回结果时,会触发回调函数,将结果返回给回调函数处理。所以如果我们在全局变量的位置直接赋值,可能会得到 undefined 或者 null。 要在 jQuery 中使用 Ajax 赋值给全局变量,需要将赋值操作放到…

    jquery 2023年5月28日
    00
  • jQWidgets jqxPanel getVScrollPosition()方法

    以下是关于 jQWidgets jqxPanel 组件中 getVScrollPosition() 方法的详细攻略。 jQWidgets jqxPanel getVScrollPosition() 方法 jQWidgets jqxPanel 组件的 getVScrollPosition() 方法用于获取垂直滚动条的位置。 语法 var vScrollPosi…

    jquery 2023年5月12日
    00
  • jQWidgets jqxInput selectAll()方法

    jqxInput 是 jQWidgets 提供的一种输入框控件,用于在 Web 应用程序中创建输入框。selectAll() 方法是 jqxInput 控件的一个方法,用于选择输入框中的所有文本。以下是 jqxInput 的 selectAll() 方法的详细说明: 方法 selectAll() 方法用于选择输入框中的所有文本。 // 选择 jqxInput…

    jquery 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部