阿里经典面试题:瀑布流布局

什么是瀑布流

瀑布流布局,作为一种现代网页设计中的创新布局方式,以其独特的视觉风格和流畅的用户体验在众多网站设计中脱颖而出。这种布局模式被形象地称为"瀑布流",因其形态酷似自然界的瀑布,内容模块按照不规则的垂直顺序排列,每一列高度各异,如同水流般自由流淌。

就好像以下页面一样:

瀑布流布局的核心特征

  1. 多列等宽不等高:瀑布流布局以多列的形式展现内容,每列宽度保持一致,而高度则根据所容纳内容的大小动态调整,形成错落有致的视觉效果。
  2. 动态加载与无限滚动:用户在浏览过程中,随着滚动页面,新的内容块会自动加载,实现了"无尽"的内容流,减少了分页操作,提升了浏览连贯性。
  3. 视觉吸引力:尤其擅长展示图片或视觉元素丰富的媒体内容,为用户提供了沉浸式的浏览体验,增加了页面的观赏性和互动性。

瀑布流布局的优点

  1. 提升用户体验:通过无限滚动的方式,用户无需频繁点击翻页,即可轻松浏览更多内容,增强了浏览的连续性和便捷性。
  2. 简化导航:将大量内容整合在单个页面上,减少了传统导航的复杂性,让用户能更直接地接触到信息。
  3. 增强参与度:鼓励用户通过持续滚动来探索更多内容,延长了用户在网站上的停留时间,增加了互动可能性。
  4. 视觉冲击力:尤其适合视觉驱动型网站,如图片分享平台,能够有效展示大量精美图片,提升页面整体吸引力。

设计瀑布流布局

  1. 先获取屏幕的大小
  2. 获取图片的宽度
  3. 确定第一行能放几张图(n张)
  4. 操作第 n+1 张 摆放它的位置,将其放在高度最小的那一列
  5. 获取每一列的高度
  6. 放入图片后,更新这一列的高度

实操

HTML

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./index.js"></script> 
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    #container{
      position: relative;
    }
    .box{
      float: left;
      padding: 5px;
    }
    .box-img{
      width: 150px;
      padding: 5px;
      border: 1px solid #aaa;
    }
    img{
      width: 100%;
    }
  </style>
</head>
<body>
  <div id="container">
    <div class="box">
      <div class="box-img">
        <img src="./img/1.webp" alt="">
      </div>
    </div>
    ···
    ···
    ···
    <div class="box">
      <div class="box-img">
        <img src="./img/9.webp" alt="">
      </div>
    </div>
    <div class="box">
      <div class="box-img">
        <img src="./img/10.webp" alt="">
      </div>
    </div>
  </div>
</body>
</html>

假设body里面放了好多张,这里未完全显示,不过格式基本都是一样的。别忘了这么多相同的东西不用一个个敲哦,有方便的方法( Emmet

因为css样式比较少我就放在html里面了,要注意这里我将JS的引用放在里html的头部,一般都是在body标签的末尾,所以待会在写JS的时候会添加一些东西,这样就不会影响了。

还要注意,图片的路径别出错了<img src="./img/1.webp" alt="">,下面是没有调整的样子

js

接下来来看看js的代码吧,这才是重中之重!!!

js 复制代码
window.onload = function() {
    imgLocation('container', 'box')  
  
    function imgLocation(parent, child) {
      var cParent = document.getElementById(parent)
      var cChild = cParent.getElementsByClassName(child)
      var screenWidth = window.innerWidth
      var imgWidth = cChild[0].offsetWidth
      var num = Math.floor(screenWidth / imgWidth)
      cParent.style.width = `${imgWidth * num}px`
  
      // 操作第 num+1 张
      var boxHeightArr = []
      for (var i = 0; i < cChild.length; i++) {
        if (i < num) {  // 第一行
          boxHeightArr.push(cChild[i].offsetHeight)
        } 
        else {
          // 找数组最小值
          var minHeight = Math.min(...boxHeightArr)  
          var minIndex = boxHeightArr.indexOf(minHeight) 
  
          // 摆放图片
          cChild[i].style.position = 'absolute'
          cChild[i].style.top = minHeight + 'px'
          cChild[i].style.left = cChild[minIndex].offsetLeft + 'px'
  
          // 更新这一列的高度
          boxHeightArr[minIndex] = boxHeightArr[minIndex] + cChild[i].offsetHeight
        }
      }
    }  
  }
  • window.onload = function() {}js 写在头部,加上这个就不影响了,之后的代码写在里面就可以了;
  • imgLocation('container', 'box') 运用封装的思维
  • .offsetWidth 获取宽度
  • .offsetHeight 获取高度
  • .offsetLeft 获取距离父元素的左侧距离
  • .offsetTop 获取距离父元素的顶部距离
  • ...boxHeightArr ...是解构数组的操作
  • indexof(arr) 会返回数组的下标

OK了,来看看我们的简易版瀑布流

相信你也可以做出来,或许我们可以利用这个来存放照片,也还不错🥰

相关推荐
菜鸟一枚在这1 小时前
深入解析设计模式之单例模式
开发语言·javascript·单例模式
WeiLai11122 小时前
面试基础--微服务架构:如何拆分微服务、数据一致性、服务调用
java·分布式·后端·微服务·中间件·面试·架构
C#Thread3 小时前
C#上位机--流程控制(IF语句)
开发语言·javascript·ecmascript
椰果uu3 小时前
前端八股万文总结——JS+ES6
前端·javascript·es6
~废弃回忆 �༄4 小时前
CSS中伪类选择器
前端·javascript·css·css中伪类选择器
IT、木易4 小时前
跟着AI学vue第五章
前端·javascript·vue.js
大米洗澡4 小时前
数字签名技术基础
python·学习·程序人生·面试·职场和发展
来一碗刘肉面5 小时前
TypeScript - 属性修饰符
前端·javascript·typescript
烂蜻蜓8 小时前
前端已死?什么是前端
开发语言·前端·javascript·vue.js·uni-app
Rowrey9 小时前
react+typescript,初始化与项目配置
javascript·react.js·typescript