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

相关文章

  • Dreamweaver经典问题45条

    首先,我们需要明确,“Dreamweaver经典问题45条”是一个常见的Dreamweaver问题清单,主要包括了常见的问题及其解决方案,对于Dreamweaver初学者或者有一定经验但遇到问题的用户来说,都是非常有参考意义的。 为了更好的使用Dreamweaver,建议用户掌握“Dreamweaver经典问题45条”的完整攻略,下面是实现此目的的详细步骤:…

    css 2023年6月11日
    00
  • JavaScript+CSS相册特效实例代码

    下面我将详细讲解 JavaScript+CSS 相册特效实例代码的完整攻略。该攻略包括以下几个部分: 确定页面布局 加载图片资源 实现相册特效 完成代码实现 1. 确定页面布局 在开始实现相册特效之前,我们需要先确定页面的布局。一般来说,相册页面需要有以下几个元素: 一个包含所有图片的容器 一个用于预览图片的容器 翻页按钮 下面是一个示例代码片段,可以用作基…

    css 2023年6月10日
    00
  • Javascript 两种刷新方法以及区别和适用范围

    我们来详细讲解一下“Javascript 两种刷新方法以及区别和适用范围”。 介绍 在前端开发中,我们经常需要使用 JavaScript 来实现页面的动态效果,同时也需要实现页面的自动刷新。这里介绍两种 JavaScript 刷新方式及其区别和适用范围。 刷新方式 1. location.reload() 方法 location.reload() 方法是 J…

    css 2023年6月10日
    00
  • vue修改打包配置如何实现代码打包后的自定义命名

    要实现vue修改打包配置自定义命名,需要修改webpack的配置文件,具体步骤如下: 打开vue项目根目录下的vue.config.js文件(如果没有则需要创建),该文件用于覆盖webpack默认配置。在该文件中添加如下代码: module.exports = { configureWebpack: { output: { filename: ‘自定义文件名…

    css 2023年6月9日
    00
  • Vue打包上线之后部分CSS不生效问题的解决办法

    下面是详细的讲解: 背景 在使用Vue进行项目开发时,我们经常会使用Vue CLI进行打包,并将打包后的文件上传到服务器上进行部署。但是,在这个过程中,我们有时会遇到一些CSS不生效的问题。 这个问题存在的原因是因为在打包过程中,webpack会对CSS进行一些压缩和编译的操作,有些CSS的属性名称、选择器等可能会被改变,进而导致样式不被正确的应用。 解决办…

    css 2023年6月9日
    00
  • 老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)

    获取CSS样式是JavaScript中常见的操作,但在不同的浏览器中会有些许差异。下文将介绍兼容各浏览器的JavaScript获取CSS样式的方法,其中包括元素内联样式、内部样式和外部样式。 获取元素内联样式 元素内联样式指的是在HTML标签内用style属性设置的样式。获取该样式的方式如下: var element = document.getElemen…

    css 2023年6月10日
    00
  • 使用font-size:0 来去掉inline-block元素之间的空隙方法

    使用 font-size: 0 可以去掉 inline-block 元素之间产生的多余空隙,其原理是把元素内的空格和换行符等字符变成了 0 大小,从而实现消除多余间隙的效果。下面是方法的完整攻略: 1. 在包含元素上添加样式 可以在包含多个 inline-block 元素的容器上添加 font-size: 0 样式。这种方法的缺点是,如果容器中有文字内容,也…

    css 2023年6月9日
    00
  • 详解如何在css中引入自定义字体(font-face)

    以下是“详解如何在CSS中引入自定义字体(font-face)”的完整攻略: 引入自定义字体 如果需要在CSS中引入自定义字体,可以使用@font-face规则来实现。具体步骤如下: 准备字体文件:在本地或网络上准备需要引入的字体文件,例如.ttf、.otf、.woff等格式。 添加@font-face规则:在CSS中添加@font-face规则,指定字体的…

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