纯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日

相关文章

  • 基于Modernizr 让网站进行优雅降级的分析

    基于Modernizr进行网站优雅降级可以让网站在老版本浏览器中正常展示,而在支持HTML5和CSS3的现代浏览器中则展示更加美观的效果。 以下是针对”基于Modernizr 让网站进行优雅降级的分析”步骤的详细攻略: 步骤一:添加Modernizr到项目中 首先,在网站的HTML文件中引入Modernizr。可以从官网下载Modernizr的JS文件,或者…

    css 2023年6月11日
    00
  • JSP分页显示的实例代码

    JSP分页是指将大量数据分为多页进行展示,提高用户体验并减少服务器压力。下面将详细讲解如何实现JSP分页显示,以及两个示例说明。 一、分页的基本思路 在JSP页面中,使用SQL语句查询出所有数据数量; 计算总页数,每页显示数据数量,以及当前页码; 使用SQL语句查询出当前页码的数据; 在JSP页面中循环显示当前页码的数据,并在页面上添加分页控件。 二、实现步…

    css 2023年6月10日
    00
  • CSS通过RGBa将一个元素设置为透明效果

    首先,我们来了解一下RGBa的基本概念。 RGBa是一种CSS的颜色表示方式,可以给一个元素设置透明度。其中,RGB代表红、绿、蓝三种颜色,a代表alpha透明度。a的取值范围是0~1,0表示完全透明,1表示完全不透明。因此,RGBa的语法为:rgba(red, green, blue, alpha),其中red、green、blue三个参数分别表示红、绿、…

    css 2023年6月9日
    00
  • js实现放大镜效果的思路与代码

    下面我将详细讲解如何通过JavaScript实现放大镜效果。 思路分析 实现放大镜效果的思路相对简单,主要包含以下几个步骤: 通过HTML和CSS创建出整体布局,包括放大镜盒子、原图和放大后的图片等元素。 监听原图的鼠标移动事件,并获取鼠标当前的坐标。 根据鼠标坐标计算出放大镜盒子的位置,并将放大后的图片的位置相应更新。 在移动时,保证鼠标不能超出原图的范围…

    css 2023年6月10日
    00
  • css3 column实现卡片瀑布流布局的示例代码

    下面是关于“CSS3 column实现卡片瀑布流布局的示例代码”的完整攻略。 一、CSS3 column介绍 1. 概述 CSS多列布局(CSS3 column)是CSS3中的一种新特性,可以让我们更方便地实现分栏布局,常用在报纸、杂志等排版较为复杂的场合。 2. column-count column-count可以指定分栏数量,例如: .containe…

    css 2023年6月11日
    00
  • 使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享

    我来为您详细讲解使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享的完整攻略。 一、使用CSS实现半透明遮罩效果 CSS中实现半透明黑色遮罩的方法如下: .overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.…

    css 2023年6月10日
    00
  • css3实现文字扫光渐变动画效果的示例

    这里是“css3实现文字扫光渐变动画效果”的完整攻略: 概述 使用CSS3可以实现各种炫酷的动画效果,其中之一就是文字扫光渐变动画效果,可以让你的网页内容更加生动。本篇攻略将详细介绍如何使用CSS3实现这种动画效果。 实现步骤 1. 创建HTML结构 首先,我们需要在HTML中创建一个结构,用于显示要进行动画的文字内容。例如: <div class=&…

    css 2023年6月9日
    00
  • JavaScript事件委托

    JavaScript 事件委托是一种常用的编程技巧,它可以避免为每个元素添加事件监听器。事件委托背后的思想是,将事件监听器添加到其父元素上,而不是为每个子元素添加监听器。当事件触发时,事件将从子元素冒泡到其父元素,由父元素的事件监听器处理。这种技巧可以减少代码量,提高性能。 以下是一个完整的 JavaScript 事件委托攻略: 1. 理解事件冒泡和捕获 事…

    Web开发基础 2023年3月30日
    00
合作推广
合作推广
分享本页
返回顶部