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插件 Form表单插件使用方法

    快速学习jQuery插件 Form表单插件使用方法 什么是jQuery插件Form表单插件 Form表单插件是一款基于jQuery框架封装的表单模块,它可以帮助我们快速便捷地开发各种表单验证和提交功能,包括但不限于表单验证规则、异步提交等功能。 Form表单插件的安装 安装jQuery插件Form表单插件的方法很简单,你可以通过官方网站 https://jq…

    jquery 2023年5月28日
    00
  • jquery通过load获取文件的内容并跳到锚点的方法

    当使用jQuery的load函数时,可以使用锚点进行定位。下面是使用jQuery的load函数获取文件内容并跳转到锚点的完整攻略: 步骤一:编写包含锚点的HTML页面 首先,需要编写一个包含锚点的HTML页面。假设该页面名为example.html,包含两个锚点,一个为#section1,另一个为#section2。 <!DOCTYPE html&gt…

    jquery 2023年5月27日
    00
  • 编写高效jQuery代码的4个原则和5个技巧

    让我来详细讲解“编写高效jQuery代码的4个原则和5个技巧”的完整攻略。 原则 1. 简化选择器 在使用jQuery选择器时,尽可能简化选择器,避免选择大量节点,这会降低程序的性能。 示例: // 不好的选择器 $(‘.container ul li a’).click(function () { // do something }); // 好的选择器 …

    jquery 2023年5月28日
    00
  • jQWidgets jqxGrid showcolumn()方法

    jQWidgets jqxGrid showcolumn()方法详解 jQWidgets jqxGrid 是一种表格控件,用于在 Web 应用程序中创建表格。showcolumn() 方法是 jqxGrid 控件一个,用于显示指定的列。本文将详细讲解 showcolumn() 方法的使用方法,并提供两个示例说明。 方法 column() 方法用于显示指定的列…

    jquery 2023年5月10日
    00
  • jQWidgets jqxDateTimeInput dropDownHorizontalAlignment属性

    以下是关于“jQWidgets jqxDateTimeInput dropDownHorizontalAlignment属性”的完整攻略,包含两个示例说明: 简介 jqxDateTimeInput 控件的 dropDownHorizontalAlignment 属性用于设置日期时间选择器下拉框的水平对齐方式。 完整攻略 以下是 jqxDateTimeInpu…

    jquery 2023年5月11日
    00
  • 如何在时间改变时改变下拉菜单

    如何在时间改变时改变下拉菜单? 在 HTML、CSS 和 JavaScript 中,我们可以使用 JavaScript 代码判断当前时间,然后改变下拉菜单的选项。下面我将详细讲解实现该功能的完整攻略,包括两条示例说明。 HTML & CSS 首先,我们需要一个下拉菜单,它应该包含我们想要显示的不同选项。这里我们可以使用 HTML 的“select”标…

    jquery 2023年5月12日
    00
  • jQWidgets jqxEditor宽度属性

    jQWidgets jqxEditor宽度属性 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI组件和工具包括表格、下拉等。jqEditor是jQWidgets的组件之一,用于创建富文本编辑器。width属性是jqxEditor的一个属性,用于设置富文本编辑器的宽度。 width的基本语法 width属性用于设置富文本编辑器的宽度,其基…

    jquery 2023年5月9日
    00
  • js和jquery对dom节点的操作(创建/追加)

    下面就是关于js和jquery对dom节点的操作的完整攻略,包括节点的创建和追加: 创建节点 使用js创建节点 在js中创建节点通常需要分为三个步骤:创建节点、设置节点属性和将节点添加到文档中。 创建节点 使用document.createElement()可以创建一个新的元素节点。例如,如下代码可以创建一个新的 div 元素节点: var newDiv =…

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