js实现瀑布流布局

2023-11-13

实现思路是:

  1. 收集列表元素数组
  2. 每列定宽不定高,列表元素全部相对于容器元素绝对定位
  3. 根据容器可视宽度计算每行的元素盛放个数
  4. 根据盛放个数先处理第一行,依次排列在第一行
  5. 处理后续元素,维护一个每列当前高度的数组,对于后续行的元素,依次往当前最低的那一列上放置直到最后一个元素
  6. 最后由于列表元素全部绝对定位导致容器元素无法高度自适应,在放置完最后一个列表元素而后将容器元素的高度设定为数组的最大值即可
    代码如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body {
      margin: 0;
      padding: 0;
    }
  </style>
</head>
<body>
  <div id="app">

  </div>

  <script>
  //面向瀑布流对象编程
    class WaterFull {
      constructor (boxes, app) {
        this.clientWidth = document.documentElement.clientWidth
        this.boxes = boxes
        this.app = app
        this.boxWidth = this.boxes[0].offsetWidth
        this.maxColumn = parseInt(this.clientWidth / this.boxWidth)
        this.heightArr = []
      }

      init () {
        // 设置容器宽度
        this.app.style.width = (this.maxColumn * this.boxes[0].offsetWidth) + 'px'
        // 处理第一行
        this.processFirstLine()
        // 处理其他行
        this.processOtherLine()
      }

      processFirstLine () {
        for (let i = 0; i < this.maxColumn; i++) {
          let box = this.boxes[i]
          box.style.position = 'absolute'
          box.style.left = (i * this.boxWidth) + 'px'
          box.style.top = '0px'
          this.heightArr.push(box.offsetHeight)
        }
      }
      processOtherLine () {
        for (let i = this.maxColumn; i < this.boxes.length; i++) {
          let box = this.boxes[i]
          let minHeight = Math.min(...this.heightArr)
          let minIndex = this.heightArr.indexOf(minHeight)
          box.style.position = 'absolute'
          box.style.left = (minIndex * this.boxWidth) + 'px'
          box.style.top = minHeight + 'px'
          this.heightArr[minIndex] += box.offsetHeight
          if (i + 1 === this.boxes.length) {
            this.app.style.height = Math.max(...this.heightArr) + 'px'
          }
        }
      }
    }

    function initRender () {
      const app = document.querySelector('#app')
      const boxes = []
      for (let i = 0; i < 100; i++) {
        let box = document.createElement('div')
        box.style.boxSizing = 'border-box'
        box.style.borderRadius = '10px'
        box.style.height = getRandomHeight() + 'px'
        box.style.width = '300px'
        box.style.backgroundColor = getRandomColor()
        box.classList.add('box')
        app.appendChild(box)
        boxes.push(box)
      }
      let wf = new WaterFull(boxes, app)
      wf.init()
    }
    initRender()

    function getRandomHeight() {
      return parseInt(Math.random() * 300 + 100)
    }
    function getRandomColor() {
      function random () {
        return parseInt(Math.random() * 255 + 1)
      }
      return `rgba(${random()}, ${random()}, ${random()}, 1)`
    }
  </script>
</body>
</html>

效果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js实现瀑布流布局 的相关文章

  • 如何在javascript中计算日出和日落?

    我正在使用appcelerator titan开发一个IOS应用程序 我想让我的应用程序在日出和日落时向用户发送本地通知 解决这个问题的一个好工具是使用 YQL 的雅虎天气 但是 雅虎天气仅供非商业用途 我正在尝试找到一个javascrip
  • Highstock highcharts 不规则数据的 x 尺度错误

    我有不规则的数据 我使用时图表绘制得很好高图表 function var chart new Highcharts Chart chart renderTo chart xAxis type datetime series name Vol
  • 如何从 JavaScript 中计算 HTML 表格的渲染高度?

    调整窗口大小时 我需要知道表格有多大 以便我可以动态地很好地适应中间的所有其他内容 表格高度仅取决于动态加载的内容 如何在 JavaScript 中计算表格的渲染高度 您可以使用element offsetHeight https deve
  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • javascript 使用 onclick 创建按钮

    我正在尝试使用 javascript 创建一个具有 onclick 事件的按钮 该事件调用 head 中定义的函数 该函数接收相对于按钮的 dom 对象作为参数 我该怎么做呢 ex
  • JavaScript 对象引用缓存

    我们的代码库中有很多对象 它们的名称空间是为了避免冲突 Example App local view MyView 在我在代码库中看到的大多数地方 我们使用完整路径来获取对对象的引用 并且这在同一函数中重复多次 Example functi
  • 如何获取 RxJSSubject 或 Observable 的当前值?

    我有 Angular 2 服务 import Storage from storage import Injectable from angular2 core import Subject from rxjs Subject Inject
  • 如何从表中选择所有偶数 id?

    我想从 MySQL 数据库的表中选择所有甚至帖子 ID 然后显示它们 我还想获取所有带有奇怪 id 的帖子并将它们显示在其他地方 我想使用 PHP 来完成此操作 因为这是我使用的服务器端语言 或者 我是否必须选择所有帖子 然后使用 Java
  • 零作为 IIFE 中的第一个参数[重复]

    这个问题在这里已经有答案了 In babeljs v6 5 1 class Foo 编译为 use strict var classCallCheck2 require babel runtime helpers classCallChec
  • JavaScript 变量赋值与 OR 对比 if 检查[重复]

    这个问题在这里已经有答案了 在 JavaScript 中 我最近意识到你可以使用 OR 赋值的逻辑运算符 我想知道这是否被认为是不好的做法 特别是 我有一些具有可选数组输入的函数 如果输入是null or undefined我应该将它设置为
  • Chrome SuppressDifferentOriginSubframeJSDialogs 使用 JS 设置覆盖?

    Chrome 开发团队显然刚刚推出了一项名为 SuppressDifferentOriginSubframeJSDialogs 的新 功能 这使得默认情况下不会显示来自与父级不同域上的 iFrame 的警报 确认框 https www ch
  • ngModel.$parsers 忽略 ng-model 值末尾的空格

    我有这样的指令 directive noWhitespace parse function parse return restrict A require ngModel link function scope element attrs
  • 是否可以覆盖 javaScript 原始数据类型?

    问题是不言自明的 我知道可以扩展原始数据类型 例如string但有可能覆盖它吗 这是在采访中被问到的一个问题 不 你不能覆盖任何东西 Ecma脚本定义原始类型 http es5 github com x4 3 2 Undefined Nul
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • ReactJS:从没有 onChange 事件的 props 中选择默认值?

    所以 我只是想知道我是否绝对需要在 React 中的选择组件上有一个 onChange 事件处理程序 我有一个道具传递我想要选择的选项的默认值 如果我有的话 它就没有问题
  • 使用 onBlur 事件上的值更新 React 输入文本字段

    我有以下输入字段 在模糊时 该函数调用服务来更新服务器的输入值 完成后 它会更新输入字段 我怎样才能让它发挥作用 我可以理解为什么它不允许我更改字段 但我能做些什么才能使其工作 我无法使用defaultValue因为我会将这些字段更改为其他
  • Postman - 如何计算 JSON 响应中特定对象的出现次数

    我是 JSON 和 Postman 的新手 我相信我正在尝试做一些非常简单的事情 我创建了一个 GET 请求 它将获得如下所示的 JSON 响应 在下面的例子中我想得到count响应中所有 IsArchived 属性 这些属性的数量因响应而
  • 有没有办法防止输入 type=“number” 获得多个点值?

    我只想得到十进制值 如 1 5 0 56 等 但它允许多个点 有什么办法可以预防吗 您可以使用pattern属性
  • 在 Google Apps 脚本中的文本前插入换行符

    我需要在 Google 文档中的某些文本之前插入一些换行符 尝试过这种方法但出现错误 var body DocumentApp getActiveDocument getBody var pattern WORD 1 var found b
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐

  • libevent(6)windows上使用iocp网络模型

    windows操作系统上不能使用epoll模型 只能使用iocp网络模型 这里我把怎么在windows上使用iocp的代码直接贴上 include
  • LSM树由来、设计思想以及应用到HBase的索引

    讲LSM树之前 需要提下三种基本的存储引擎 这样才能清楚LSM树的由来 哈希存储引擎 是哈希表的持久化实现 支持增 删 改以及随机读取操作 但不支持顺序扫描 对应的存储系统为key value存储系统 对于key value的插入以及查询
  • Java连接远程服务器debug

    日常我们debug是经常用的 但是本地还好说 远程debug就有点难度 而且有时候必须要在预演 测试环境的服务器去debug 举个例子 需要https 公网 域名之类的 测试服务器这些有些是配置的 但是你自己本地开发肯定不会有这些 就需要你
  • XMLHTTP的常用方法和属性

    以下内容 摘录于网上 对原作者的用心整理和无私分享表示感谢 Open方法 包含了5个参数 前三个是必要的 后两个是可选的 在服务器需要进行身份验证时提供 参数的含义如下所示 http method HTTP的通信方式 比如GET或是 POS
  • spark 解决办法 check your cluster UI to ensure that workers are registered and have sufficient memory

    报错 WARN scheduler TaskSchedulerImpl Initial job has not accepted any resources check your cluster UI to ensure that work
  • 第35步 机器学习实战DLC:不平衡数据处理(下)

    失踪人口回归的第二期 继续说一说用PSM处理不平衡数据 一 啥叫PSM PSM全称为Propensity Score Matching 翻译过来就是倾向匹配得分 为了省流 让小Chart介绍一下 放到我们的数据就是 根据某个特征 从对类别0
  • python均值插补法填补缺失值_python数据分析:缺失值处理

    我们拿到的原始数据通常都是一团糟的 缺失值尤其常见 自己在做论文的时候也常常被缺失数据困扰 所以打算写一些如何用python进行缺失值的处理 首先需要大家注意的是 数据的清理很枯燥 但是很重要 根据IBM的研究 数据科学家80 的时间都在做
  • vue+element锚点跳转+自动感应导航栏

    最近来个需求 要做一个页面 每个模块都是百分百全屏且右侧有个导航栏能自动感应在哪个模块 点击也能直接跳转到该锚点 其实难点也就那几个 慢慢捋一下就好 话不多说上代码 1 锚点跳转且点击哪个会模块右侧导航栏就会高亮 我这个导航栏是因为未来增加
  • 警惕免杀版Gh0st木马!

    https github com SecurityNo1 Gh0st2023 经过调查发现 这款开源的高度免杀版Gh0st木马目前正在大范围传播 据称可免杀多种主流杀软 开发者不仅制作了新颖的下载页面 还设法增加了搜索引擎的收录权重 吸引了
  • 【机器学习】14、sklearn

    文章目录 一 机器学习概览 二 分类 2 1 二分类器 2 多分类器 2 3 误差分析 三 训练模型 3 1 线性回归和逻辑回归 3 2 逻辑回归 3 3 softmax回归 练习题4 四 SVM 练习题5 五 决策树 练习题6 六 集成学
  • 微信小程序嵌套的H5使用小程序分享(分享微信好友或朋友圈)

    需求说明 嵌套在微信小程序中的H5想要使用小程序自带分享功能 分享H5的页面给微信好友或朋友圈 实现原理 H5中可使用wx miniProgram postMessage向小程序的webview发送消息 会触发组件的message事件 在小
  • kvm-ovirt-vdsm安装记录

    小技巧 1 fedaro 19自动查找最快yum源 yum install yum fastestmirror 2 libvirt启动sasl添加用户 saslpasswd2 c a libvirt admin 3 查看kvm模块 lsmo
  • 第十三届蓝桥杯A组Python组心得分享

    第一次写心得类的文章 趁着假期有时间 记录一下在准备这个比赛间的一些心得和一些问题的思路 前面是碎碎念 直接看问题解决思路的可以跳到后面 先说情况 省一 小题对了第一个 大题写出来了五个 不确定是否全部AC 认真准备这个比赛的时间不超过一周
  • 【今日CV 计算机视觉论文速览】Wed, 13 Mar 2019

    今日CS CV计算机视觉论文速览 Wed 13 Mar 2019 Totally 25 papers Interesting 自动医学图像分析 主要就x光乳腺癌检测 胸片CT肺结合检测 脑部颈部病变检测等方面展开研究 并阐述了如何生成数据
  • iOS左对齐自动换行collection样式

    前言 想必大家工作中或多或少会遇到下图样式的UI需求吧 像这种cell长度不固定 以此向右对齐排列的样式UI可以说是很常见的 实现方式 一般的实现可能主要是分一下两种 1 一种是用button依次排列实现 动态计算text宽度 记录之前一个
  • Ruby on Rails emoji表情通过json返回

    原因 大概意思是 emoji表情是5位字符 而to json as json最多支持4个字符 导致返回的emoji不完整 客户端就不会识别 导致乱码 解决方法 在config initializers文件夹下新建patches rb 文件
  • 【项目复盘React】react封装动态组件+组件懒加载(hook版)

    使用到的hook useContext 使用到的api lazy React 1 在utils文件夹下新建文件夹testContext 2 新建文件PersonContext js 导出一个Context对象实例 import React
  • 射频原理图设计checklist

    射频原理图设计checklist 持续更新 文章目录 射频原理图设计checklist 1 WiFi GPS测试兼容 2 SAR SENSER 的GPIO控制和电源供电需常开 3 射频收发器与基带芯片之间的IQ连接线需参考平台推荐 4 主集
  • WEB靶场系类搭建

    环境 windwos centos ubuntu DVWA 1 进 phpmyadmin创建dvwa数据库 2 修改配置文件 3 输入127 0 0 1 dvwa 安装 pikachu 1 直接修改配置文件 2 127 0 0 1 pika
  • js实现瀑布流布局

    实现思路是 收集列表元素数组 每列定宽不定高 列表元素全部相对于容器元素绝对定位 根据容器可视宽度计算每行的元素盛放个数 根据盛放个数先处理第一行 依次排列在第一行 处理后续元素 维护一个每列当前高度的数组 对于后续行的元素 依次往当前最低