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

yizhihongxing

实现瀑布流展现照片是一个常见的前端面试题目,这里提供一种利用纯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日

相关文章

  • jQuery实战之仿淘宝商城左侧导航效果

    欢迎阅读本篇文章,本文将带你详细讲解“jQuery实战之仿淘宝商城左侧导航效果”的完整攻略,教你如何使用jQuery实现仿淘宝商城左侧导航栏效果。 包含的技术点 HTML基础标签的应用 CSS样式定义及样式优化 jQuery基础知识 jQuery的DOM操作方法 jQuery的动画效果 实现步骤 步骤1:HTML结构 仿淘宝商城左侧导航栏的核心部分在于HTM…

    css 2023年6月10日
    00
  • AJAX实现瀑布流布局

    下面我将提供关于“AJAX实现瀑布流布局”的完整攻略,包含以下几个步骤: 步骤1:了解瀑布流布局 瀑布流布局是一种流式布局方式,在页面中按照列来展示数据。该布局的特点是: 每一列宽度相同,高度不同; 每一列数据按照从上到下,从左到右的顺序依次排列; 数据加载时通过 AJAX 异步请求,实现数据的无限滚动加载。 步骤2:布局HTML和CSS 在HTML中,我们…

    css 2023年6月11日
    00
  • css3新特性的应用示例分析

    下面是关于“css3新特性的应用示例分析”的完整攻略。 一、前言 CSS3自从发布之后,其拥有的多种新特性便激发了开发者们的探索热情。其中许多特性,如圆角、阴影、渐变等,都可以使用简单的CSS代码就能实现。而另一些特性,如动画、过渡、伸缩盒模型等,则需要一些更为复杂的代码和技巧。本文将对各类CSS3新特性做出介绍,并结合具体示例进行演示。 二、CSS3特性示…

    css 2023年6月10日
    00
  • HTML 隐藏滚动条和去除滚动条的方法

    下面是详细讲解“HTML隐藏滚动条和去除滚动条的方法”的完整攻略。 隐藏滚动条 HTML默认情况下会显示滚动条,如果我们想要隐藏滚动条,可以使用CSS样式来实现。 方法一:使用overflow属性 可以使用CSS中的overflow属性将滚动条隐藏起来,下面是示例代码: html { overflow: hidden; } 上面实例中,我们将页面HTML元素…

    css 2023年6月10日
    00
  • Vue 过渡实现轮播图效果

    Vue 过渡实现轮播图效果攻略 什么是 Vue 过渡 Vue 过渡是在添加/删除元素,或者显示/隐藏元素时,添加动画效果的机制。Vue 在添加/删除元素时,为元素添加了一些 CSS 类名,你可以在 CSS 中为这些类名设置相应的样式,达到过渡效果的目的。 实现轮播图效果 基于 Vue 过渡的轮播图 在基于 Vue 过渡的轮播图中,我们会使用到 Vue 的内置…

    css 2023年6月11日
    00
  • 10个实用的CSS属性小结

    下面是详细的讲解“10个实用的CSS属性小结”的完整攻略: 10个实用的CSS属性小结 1. box-sizing box-sizing属性用于设置元素的盒子模型,决定元素的内、外边距是否包含在元素的宽度和高度之内,默认值为content-box。合理使用box-sizing属性不仅能简化元素的排版,还能够提高页面的性能。 .example { box-si…

    css 2023年6月9日
    00
  • CSS 模拟float实现center文字左右环绕图片的效果

    CSS模拟float实现文字左右环绕图片效果通常有两种方式实现,分别是使用浮动和使用flex布局,下面我会详细讲解这两种方式的实现方法。 使用浮动实现文字左右环绕图片效果 HTML结构 首先,我们需要先构建一个HTML结构,其中包含一个包含文字的容器div和一个图片img标签,如下所示: <div class="container"…

    css 2023年6月10日
    00
  • CSS3实现曲线阴影和翘边阴影

    CSS3中提供了box-shadow属性用于实现阴影效果,但是默认情况下生成的阴影是直线阴影,如果需要实现曲线阴影或者翘边阴影,可以使用一些特殊的css技巧。 实现曲线阴影 要实现曲线阴影,需要使用radial-gradient()函数来生成一个圆形渐变背景,然后再利用background-clip属性将渐变限定在元素内部。 .curve-shadow { …

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