纯js实现瀑布流展现照片(自动适应窗口大小)

实现瀑布流展现照片是一个常见的前端面试题目,这里提供一种利用纯JS实现瀑布流展现照片并自适应窗口大小的方法。实现该方法需要完成以下步骤:

1.根据窗口大小计算瀑布流展示区的宽度、每个卡片的宽度、每行可容纳的卡片个数和卡片间的间隔大小等几个参数,并将它们存储在一个变量对象中。同时,动态创建卡片,并根据图片大小将图片缩放至卡片容器大小。示例代码如下:

let containerWidth = document.querySelector('.container').clientWidth; // 获取容器宽度
let cardWidth = 240; // 卡片宽度
let gutter = 10; // 卡片间隔
let cardCount = Math.floor(containerWidth / (cardWidth + gutter)); // 每行容纳卡片的个数

// 创建卡片元素,并填充图片
function createCard(src) {
  let card = document.createElement('div');
  card.className = 'card';
  let img = new Image();
  img.onload = function() {
    let scale = cardWidth / img.width;
    let height = img.height * scale;
    card.style.height = height + 'px';
  }
  img.src = src;
  card.appendChild(img);
  return card;
}

// 初始化卡片布局
function initLayout(items) {
  let cards = [];

  for (let i = 0; i < items.length; i++) {
    let card = createCard(items[i]);
    cards.push(card);
    let index = i % cardCount;
    let left = index * (cardWidth + gutter);
    if (i < cardCount) {
      card.style.top = 0;
      card.style.left = left + 'px';
    } else {
      let minIndex = 0;
      let minHeight = cards[minIndex].offsetHeight;
      for (let j = 1; j < cardCount; j++) {
        let height = cards[j].offsetHeight;
        if (minHeight > height) {
          minHeight = height;
          minIndex = j;
        }
      }
      card.style.top = minHeight + gutter + 'px';
      card.style.left = minIndex * (cardWidth + gutter) + 'px';
    }
    document.querySelector('.container').appendChild(card);
  }
}

// 根据窗口大小重新计算参数并更新布局
function updateLayout() {
  let containerWidth = document.querySelector('.container').clientWidth;
  let newCardCount = Math.floor(containerWidth / (cardWidth + gutter));
  if (newCardCount != cardCount) {
    cardCount = newCardCount;
    let cards = Array.from(document.querySelectorAll('.card'));
    let heights = Array.from(cards, card => card.offsetHeight);
    for (let i = 0; i < cards.length; i++) {
      let index = i % cardCount;
      if (i < cardCount) {
        cards[i].style.top = 0;
        cards[i].style.left = index * (cardWidth + gutter) + 'px';
      } else {
        let minIndex = 0;
        let minHeight = heights[minIndex];
        for (let j = 1; j < cardCount; j++) {
          let height = heights[(i - cardCount) + j];
          if (minHeight > height) {
            minHeight = height;
            minIndex = j;
          }
        }
        cards[i].style.top = minHeight + gutter + 'px';
        cards[i].style.left = minIndex * (cardWidth + gutter) + 'px';
        heights[minIndex] += cards[i].offsetHeight + gutter;
      }
    }
  }
}

// 初始化和更新布局
let items = ['https://via.placeholder.com/300x400', 'https://via.placeholder.com/240x240', ...];
initLayout(items);
window.addEventListener('resize', updateLayout);
  1. 使用无限滚动实现翻页效果,即在滚动到页面底部时,自动加载下一页的数据并添加到页面底部。示例代码如下:
let page = 2; // 初始页码
let isLoading = false; // 是否正在加载数据
let items = ['https://via.placeholder.com/300x400', 'https://via.placeholder.com/240x240', ...];

// 加载并添加数据
function loadAndAppendData() {
  isLoading = true;
  fetch(`https://example.com/api/data?page=${page}`)
    .then(res => res.json())
    .then(data => {
      items = items.concat(data); // 将新数据与旧数据合并
      let cards = data.map(createCard);
      cards.forEach(card => document.querySelector('.container').appendChild(card));
      isLoading = false;
      page++;
    })
    .catch(error => console.error(error))
}

// 监听滚动事件,如果滚动到页面底部则加载新数据
window.addEventListener('scroll', () => {
  if (isLoading) return; // 如果正在加载数据,则不执行后面的代码
  let containerHeight = document.querySelector('.container').offsetHeight;
  let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
  let windowHeight = window.innerHeight;
  if (scrollTop + windowHeight >= containerHeight) {
    loadAndAppendData();
  }
});

总结:

这种方法可以在不使用jQuery等类库和框架的情况下,利用纯JS实现瀑布流展现照片并自适应窗口大小。其核心思想在于动态计算布局参数,实现卡片的瀑布流排列,并通过事件监听实现自适应窗口大小以及无限滚动的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:纯js实现瀑布流展现照片(自动适应窗口大小) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • CSS优先级算法如何计算?有哪些判定规定及计算方式

    CSS优先级算法是用于确定在多个CSS规则应用于同一元素时,哪个规则将具有最高优先级的算法。以下是一个详细的攻略,介绍了CSS优先级算法的计算方式和判定规定,包括两个示例说明: 1. CSS优先级算法的计算方式 CSS优先级算法是基于四个级别的规则计算的,这些级别按照以下顺序排列: 内联样式(在元素的style属性中指定的样式) ID选择器(#id) 类选择…

    css 2023年5月18日
    00
  • 原生JS实现汇率转换功能代码实例

    下面我将详细讲解“原生JS实现汇率转换功能代码实例”的完整攻略。 一、前置知识 在学习原生JS实现汇率转换功能代码实例之前,需要掌握以下前置知识: HTML基础 CSS基础 JavaScript基础(包括DOM操作、事件绑定等) 如果掌握了以上基础知识,那么就可以进入具体的代码实现了。 二、HTML结构 在实现汇率转换功能之前,我们需要先搭建页面结构。页面结…

    css 2023年6月10日
    00
  • php制作动态随机验证码

    制作动态随机验证码是一个常见的网站验证码应用,它可以防止恶意攻击和机器批量注册。下面是实现该功能的完整攻略: 1. 生成随机字符串 首先需要生成一个随机的字符串作为验证码。可以使用PHP内置的md5()函数生成一个32位的随机字符串,也可以通过mt_rand()、rand()等随机数函数生成6~10位的随机字符串。 $code = substr(str_sh…

    css 2023年6月10日
    00
  • 详解CSS中的选择器优先级及样式层叠问题解决

    详解CSS中的选择器优先级及样式层叠问题解决 什么是选择器优先级 在CSS中,通过选择器来选择元素并对其应用样式。但是,当存在多个选择器作用于同一个元素时,就会涉及到选择器的优先级问题。选择器优先级指的是在多个选择器作用于同一元素时,浏览器根据不同选择器的权重来决定哪个样式最后会被应用。 通常,一个规则的选择器包含多个简单选择器,权值的计算方法如下: 按照 …

    css 2023年6月9日
    00
  • 微信小程序实现渐入渐出动画效果

    针对微信小程序实现渐入渐出动画效果,下面我将给出完整的攻略,包含以下内容: 使用wx.createAnimation创建动画实例 在小程序中,我们可以使用wx.createAnimation()方法创建一个Animation实例,它能够通过一系列方法组成一段完整的动画过程。在这个实例对象中,可以指定动画执行的时间、延迟、动画效果等等。 示例代码: var a…

    css 2023年6月10日
    00
  • HTML clearfix清除浮动讲解

    接下来是关于HTML clearfix清除浮动的详细攻略说明: 简介 在HTML页面中,当一个元素被设置为float属性时,会使该元素脱离文档流,导致父元素的高度无法被计算,在布局上造成一定的困扰,此时就需要用到清除浮动(clearfix)。 方法 给父元素设置overflow属性为hidden或auto overflow属性可以清除浮动,因为当一个元素包含…

    css 2023年6月10日
    00
  • div层调整z-index属性无效原因分析及解决方法

    下面是关于“div层调整z-index属性无效原因分析及解决方法”的完整攻略。 标题:div层调整z-index属性无效原因分析及解决方法 问题描述 在网页设计过程中,遇到了div层调整z-index属性无效的问题。即在元素设置了z-index属性后,发现另一个元素(通常是原本处于下方的元素)仍然遮盖在其上方,无法显示在视觉层中。 原因分析 该问题通常是由以…

    css 2023年6月10日
    00
  • CSS中的 position属性sticky详解

    标题:CSS中的position属性sticky详解 简介 CSS的position属性有4个值:static、relative、absolute和fixed。在这些值中,我们通常使用的是静态(static)和相对(relative)定位。但是在某些场景下,我们需要粘性(sticky)布局以实现更好的用户体验和用户界面。 粘性布局概述 粘性布局是指元素在滚动…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部