JS图片瀑布流制作

这里为大家带来了两种通过js制作图片瀑布流的方法。

一、绝对定位法

计算每个元素的绝对位置进行设置。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>瀑布流</title>
    <style>
        .image-item {
            width: 300px;
            position: absolute;
            transition: all .5s;

        }
        .image-item .image {
            width: 100%;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="image-item"><img src="./images/zj1.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj2.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj3.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj4.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj5.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj6.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj7.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj8.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj9.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj10.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj11.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj12.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj13.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj14.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj15.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj16.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj17.jpg" alt="" class="image"></div>
        <div class="image-item"><img src="./images/zj18.jpg" alt="" class="image"></div>
    </div>
</body>
<script>
const config = {
    mode: 0,
    marginHeight: 20,
}

window.onload = function() {
    init();
}

function init() {
    let {mode} = config;
    config.imagesArray = document.querySelectorAll(".image-item");

    const windowWidth = document.querySelector(".wrap").getBoundingClientRect().width; // 容器宽度
    const imageWidth =  config.imagesArray[0].getBoundingClientRect().width; // 单张图片宽度
    config.imageWidth = imageWidth;
    config.cols = parseInt(windowWidth/imageWidth); // 计算列数
    //计算图片之间的间距(可选择space-between/space-around)
    let spanNum = mode ? config.cols -1 : config.cols +1;
    config.margin = (windowWidth - imageWidth * config.cols) / spanNum;

    config.heightArray = (new Array(config.cols)).fill(0,0); //得到初始高度的数组

    setImagePos();
}

function setImagePos() {
    let { imageWidth, imagesArray, margin, heightArray, mode } = config;
    imagesArray.forEach(item => {
        //取高度数组中的最小值
        let minHeight = Math.min.apply(Math.min, heightArray);
        let currentIndex = heightArray.indexOf(minHeight);
        // 设置图片位置
        item.style.top = minHeight + "px";
        if(mode) {
            item.style.left = currentIndex * (imageWidth + margin) + "px";
        } else {
            item.style.left = currentIndex * (imageWidth + margin) + margin + "px";
        }

        //更新高度数组
        let newHeight = item.getBoundingClientRect().height + config.marginHeight;
        heightArray[currentIndex] += newHeight;
    });
}

let timer;
window.onresize = function() {
    clearTimeout(timer);
    timer = setTimeout(init, 50);
}
</script>
</html>

二、按列插入法

首先计算出可以放几列图片,再插入列容器,在循环图片,往高度最小的列容器中插入图片。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>瀑布流2</title>
    <style>
        #wrap {
            display: flex;
            justify-content: space-around;
        }
        #wrap .col img {
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="wrap"></div>
</body>
<script>

// 创建图片数组(由于图片名有规律,这里就不一个一个写)
const images = [];
for(var i = 1; i <= 18; i ++) {
    var src = "./images/zj" + i + ".jpg";
    images.push(src);
}

var wrap = document.getElementById("wrap");
var colWidth = 300; //每列宽度
var colsArray = []; // 列DOM数组
var heightArray = []; // 高度数组
var currentImage = 0; //图片索引
var oldCols = null; //用作记录,节约性能
var timer;

init();
window.onresize = function() {
    clearTimeout(timer);
    timer = setTimeout(function() {
        init();
    }, 50);
}

function init() {
    // 得到对应的列数,并创建每列的容器
    var windwoWidth = window.innerWidth;
    var cols = parseInt(windwoWidth / colWidth);
    if(cols !== oldCols) {
        oldCols = cols;
        //清空数据
        colsArray = [];
        heightArray = [];
        currentImage = 0;
        wrap.innerHTML = "";
        // 创建列容器
        for(var i = 0; i < cols; i++) {
            var col = createElement("div",{"class":"col"});
            colsArray.push(col);
            wrap.appendChild(col);
            heightArray.push(0);
        }

        //循环图片数据
        pushImage();
    }
}

function createElement(tagName,dataset) {
    var tag = document.createElement(tagName);
    for(key in dataset) {
        tag.setAttribute(key,dataset[key]);
    }
    return tag;
}

function pushImage(dataset) {
    var dataset = {
        "src": images[currentImage]
    };
    var image = createElement("img",dataset);
    var min = Math.min.apply(Math.min, heightArray);
    var currentIndex = heightArray.indexOf(min);
    colsArray[currentIndex].appendChild(image);
    image.onload = function() {
        // 当图片达到最大时,不执行
        if(currentImage < images.length -1 ) {
            // 计算加入图片后的容器高度
            var imageHeight = image.getBoundingClientRect().height;
            console.log(image.getBoundingClientRect())
            heightArray[currentIndex] += imageHeight;
            // 图片索引累加
            currentImage ++;
            pushImage();
        } else {
            return false;
        }
    }
}
</script>
</html>

当然肯定还有比这个好的方法,仅作学习交流。

ps:图片存放地址为 当前目录的images目录里面

原文地址:https://www.cnblogs.com/tcxq/p/11652481.html

时间: 2024-10-19 01:27:21

JS图片瀑布流制作的相关文章

js图片瀑布流

一个简单的图片瀑布流 首先准备一个html文件,css用到很少,所以写在html里,还需要一个js文件及几张图片(分辨率随意) html的代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> body { margin: 0px; padding: 0px;

js 图片瀑布流效果实现

/** * Created by wwtliu on 14/9/5. */$(document).ready(function(){ $(window).on("load",function(){ imgLocation(); var dataImg = {"data":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.j

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

一步步教你js原生瀑布流效果实现

一步步教你js原生瀑布流效果实现 什么是瀑布流效果 首先,让我们先看一段动画: 在动画中,我们不难发现,这个动画有以下特点: 1.所有的图片的宽度都是一样的 2.所有的图片的高度是不一样的 3.图片一张挨着一张竖直排列 4.鼠标向下滚动,一直不停的加载图片 5.浏览器的宽度改变,图片的列数会进行相应的更改 那么这种效果类似现实生活中的瀑布,所以我们叫它瀑布流的效果. Js原生瀑布流效果的实现 从上述分析中,我们可以把整个效果分为以下四个部分: html+css界面搭建 瀑布流效果 浏览器向下滚动

原生JS实现瀑布流

浏览网页的时候经常会遇到瀑布流布局的网站.也许有些读者不了解瀑布流.瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.比如下面图片的效果,就是一个典型的瀑布流. 网上有很多JQ的瀑布流插件,而且都写好了兼容,都可以尝试去使用,这里只是跟大家分享一下原生js实现瀑布流的效果,一起学习. 一步一步来: 首先新建一个文件,就叫瀑布流.html吧. <!doctype html> <html

bootstrap+masonry.js写瀑布流

最近在用bootstrap写一个网站,其中有个图文展示的页面要用到瀑布流的效果.因为项目要求,项目要以bootstrap为基准,不准私自添加内联样式.内部样式,所以,自己写瀑布流就不行了,所以,根据要求,百度查找相关资料,看到masonry.js.个人认为这是一个非常好用的瀑布流插件.下面说一下我在引用的过程中遇到的问题,一开始我用bootstrap栅格系统布局,代码如下 <div class="row masonry"> <div class="col-x

ajax抓取网站接口图片瀑布流笔记

用php结合ajax来实现去其它网站抓取图片,在自己本地用! ajax代码部分 <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>图片瀑布流</title> </head> <style>     body{         margin:0;     }    #u

jQuery+HTML5图片瀑布流效果

JavaScript与HTML5实现美女瀑布流布局,本方法是把图片的路径写在了JS的数组里,不过重点好像不是在这里,而是在图片如何自动排列的问题,你可以运行本实例后,点击“加载瀑布流布局”按钮,即可看到图片的瀑布流排列效果,现在很流行这个,希望您从本代码中能找到一些灵感. <!DOCTYPE HTML> <html> <head> <title>jQuery+HTML5图片瀑布流效果丨河北电动叉车|石家庄苗木</title> <style

ios图片瀑布流代码

ios瀑布流,实现简单的瀑布流视图布局,可以显示网络图片,下拉刷新,上拉加载更多. 下载:http://www.huiyi8.com/sc/9087.html ios图片瀑布流代码,布布扣,bubuko.com