three way of waterfall flow

本文介绍两种实现瀑布流布局的方法:一种使用CSS3的column-width属性简化布局;另一种使用JavaScript动态创建元素并进行精确布局,同时支持滚动加载更多内容。

First the simple way , use css3 colum-width:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>


    <style>

        ul{
            column-width: 250px;
        }

        ul>li{
            display: inline-block;
            box-shadow: 10px 10px 10px 10px gray;
            background: red;
            width: 100%;
            height: 300px;
            text-decoration: none;
            margin: 10px 0;
        }

        ul>li:nth-of-type(1){
            height: 100px;
        }

        ul>li:nth-of-type(2){
            height: 50px;
        }

        ul>li:nth-of-type(3){
            height: 80px;
        }


        ul>li:nth-of-type(4){
            height: 120px;
        }


        ul>li:nth-of-type(5){
            height: 180px;
        }

        ul>li:nth-of-type(6){
            height: 200px;
        }

        ul>li:nth-of-type(7){
            height: 111px;
        }


    </style>
</head>
<body>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
</body>
</html>

这里写图片描述

note : you need add display:inline-block otherwise some block will to next colum.

the second way ,by javascript

step:

    .1 dynatic create box and img 
    .2 cycle get the minimum height and then put the next to the below of the most minimum  use position absolute method
    .3 when scroll to half height of screen load other more 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流首页</title>

    <style>

        *{
            /*去除边距*/
            margin:0;
            padding: 0;
            /*html性能优化:虚拟dom,如果一个html标签没有设置css样式,就是虚拟的,
             所以无论设置多少层div都对性能没有影响*/
        }
        #main{
            height: 2000px;
            /*定位*/
            position: relative;
        }
        .box{
            /*内边距*/
            padding:15px 0 0 15px ;
            float: left;
        }
        .pic{
            /*边框*/
            border:1px solid #dddddd;
        }
        .pic img{
            width: 105px;
        }

    </style>
</head>
<body>
<!--父盒子-->
<div id="main">
    <!--单个盒子-->
    <div class="box">
        <!--图片盒子-->
        <div class="pic">
            ![](images/1.jpg)
        </div>
    </div>
    <!--单个盒子标签复制20次...图片名字改改...-->
</div>
<!--jQuery方式需要引入jQuery库,JS方式与CSS方式都要注释掉-->
<!--引入JS,CSS方式注释掉-->

<script>


    /**
     * Created by Mac on 2017/1/7.
     */
    function $(id) {
        //判断id的类型
        return typeof id === 'string'?document.getElementById(id):id;
    }

    //当网页加载完毕
    window.onload = function () {
        //瀑布流布局 保证传的参数能够找到父盒子
        waterFall('main','box');

        //滚动加载盒子
        window.onscroll = function (){
            //判断是否加载
            if (checkWillLoad())
            {
                //创造假数据
                var data = {'dataImg':[{'img':'22.jpg'},{'img':'22.jpg'},{'img':'22.jpg'},{'img':'22.jpg'},{'img':'22.jpg'},{'img':'22.jpg'}]};
                //加载数据
                for(var i=0; i<data.dataImg.length; i++)
                {
                    //创建最外面的盒子
                    var newBox = document.createElement('div');
                    newBox.className = 'box';
                    $('main').appendChild(newBox);
                    //创建单个盒子
                    var newPic = document.createElement('div');
                    newPic.className = 'pic';
                    newBox.appendChild(newPic);
                    //创建img
                    var newImg = document.createElement('img');
                    newImg.src = 'images/' + data.dataImg[i].img;
                    newPic.appendChild(newImg);
                }
                //把刚创建的盒子瀑布流布局
                waterFall('main','box');
            }
        }
    }

    //实现瀑布流布局
    //规则:从第二行开始的图片,总是拼接在上一行高度最矮的图片后面
    function  waterFall(parent,box) {
        //父盒子居中
        //通过父盒子拿到所有的子盒子
        var allBox = $(parent).getElementsByClassName(box);
        //求出盒子的宽度
        var boxWidth = allBox[0].offsetWidth;
        //求出浏览器的宽度(包括边框的宽高)
        var screenWidtn = document.body.offsetWidth;
        //求出列数 //取整函数取整
        var cols = Math.floor( screenWidtn/boxWidth);
        //父标签居中
        //先求出父标签宽度
        $(parent).style.width = boxWidth * cols + 'px';
        //居中
        $(parent).style.margin = '0 auto';

        //子盒子定位
        //创建一个高度数组,存所有的高度
        var heightArr = [];
        //遍历
        for(var i = 0; i < allBox.length ;i++)
        {
            //求出每个盒子的高度
            var boxHeight = allBox[i].offsetHeight;
            //第一行的盒子不需要重新定位//每一行的盒子数与列数相同
            if(i<cols)
            {
                //添加第一行所有盒子高度
                heightArr.push(boxHeight);
            }
            else//剩下的盒子都需要瀑布流布局
            {
                //求出最矮的盒子高度
                var minBoxHeight = Math.min.apply(this,heightArr);
                //求出最矮盒子对应的索引
                var minBoxIndex = getMinBoxIndex(minBoxHeight,heightArr);
                //盒子瀑布流定位  顶部间距就是最矮盒子的高度
                allBox[i].style.position = 'absolute';
                allBox[i].style.top = minBoxHeight + 'px';
                allBox[i].style.left = minBoxIndex * boxWidth +'px';
                //关键:更新数组最矮高度,使下一个图片在高度数组中总是找最矮高度的图片下面拼接
                heightArr[minBoxIndex] += boxHeight;
            }
        }
    }

    //求出最矮盒子对应的索引函数
    function getMinBoxIndex(val,arr) {
        for(var i in arr)
        {
            if(val == arr[i])
            {
                return i;
            }
        }
    }

    //加载更多规则:当浏览器最下方到达图片的高度一半时让其刷新出来
    //判断是否符合加载条件
    function checkWillLoad() {
        //取出所有盒子
        var allBox = $('main').getElementsByClassName('box');
        //取出最后一个盒子
        var lastBox = allBox[allBox.length - 1];
        //求出最后一个盒子高度的一半 + 内容与浏览器头部的偏离位置
        var lastBoxDis = lastBox.offsetHeight * 0.5 + lastBox.offsetTop;
        //求出浏览器的高度
        // 注意:JS代码存在浏览器兼容问题 一般分标准模式(按屏幕算document.body.offsetHeight)和混杂模式(按所有内容算)
        var screenHeight =  document.documentElement.clientHeight;
        //页面偏离屏幕的高度
        var scrollTopHeight = document.body.scrollTop;
        //判断
        return lastBoxDis <= screenHeight + scrollTopHeight;
    }
</script>

</body>
</html>

这里写图片描述

.3 Third way is same to second but use jq to write

// document.write("<script src='jquery-3.1.1.min.js'></script>");
//当页面加载完毕
$(window).on('load',function () {
    //1.实现瀑布流布局
    waterFall();

    //2.滚动加载
    $(window).on('scroll',function () {
        //判断是否加载
        if (checkWillLoad())
        {
            ////创造假数据
            var data = {'dataImg':[{'img':'23.jpg'},{'img':'24.jpg'},{'img':'25.jpg'},{'img':'26.jpg'},{'img':'27.jpg'},{'img':'28.jpg'}]};
            //遍历创建盒子
            $.each(data.dataImg,function (index,value)
                   {
                       //创建一个div标签 设置它的类为'box' 添加到'main'里面去
                       var newBox = $('<div>').addClass('box').appendTo($('#main'));
                       var newPic = $('<div>').addClass('pic').appendTo($(newBox));
                       //创建img  取出遍历的对象value的img属性对应的值
                       $('<img>').attr('src','images/'+$(value).attr('img')).appendTo($(newPic));
                   })
            //1.实现瀑布流布局
            waterFall();
        }
    });
});

//实现瀑布流布局
function waterFall () {
    //拿到所有的盒子
    var allBox = $('#main > .box');
    //取出其中一个盒子的宽度
    var boxWidth = $(allBox).eq(0).outerWidth();
    //取出屏幕的高度
    var screenWidth = $(window).width();
    //求出列数 //取整函数取整
    var cols = Math.floor( screenWidth/boxWidth);
    //父标签居中
    $('#main').css({
        'width':cols * boxWidth + 'px',
        'margin':'0 auto'
    });
    //对子盒子定位
    var heightArr = [];
    //遍历
    $.each(allBox,function (index,value) {
        //取出单独盒子的高度
        var boxHeight = $(value).outerHeight();
        //判断是否第一行
        if(index < cols)
        {
            heightArr[index] = boxHeight;
        }
        else  //剩余的盒子要瀑布流布局
        {
            //求出最矮的盒子高度
            var minBoxHeight = Math.min.apply(null,heightArr);
            //取出最矮高度对应的索引  封装了js的这个方法
            var minBoxIndex = $.inArray(minBoxHeight,heightArr);
            //定位
            $(value).css({
                'position':'absolute',
                'top':minBoxHeight + 'px',
                'left':minBoxIndex * boxWidth + 'px'
            });
            //更新数组中最矮的高度
            heightArr[minBoxIndex] += boxHeight;
        }
    })

}

//判断是否符合加载条件
function checkWillLoad() {
    //直接取出最后一个盒子
    var lastBox = $('#main > div').last();
    //取出最后一个盒子高度的一半 + 头部偏离的位置
    var lastBoxDis = $(lastBox).outerHeight() + $(lastBox).offset().top;
    //求出浏览器的高度
    var clientHeight = $(window).height();
    //求出页面偏离浏览器高度
    var scrollTopHeight = $(window).scrollTop();
    //比较返回
    return lastBoxDis <= clientHeight + scrollTopHeight;

}
The effect is same to above.

refer:http://www.jianshu.com/p/0a9b27e7da36

        thanks for reading
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
内容概要:本文系统介绍了基于最小势能原理(即能量法)的物理信息神经网络(PINNs)在求解固体力学二维问题中的理论框架与应用实践,并提供了完整的PyTorch代码实现案例。该方法通过将物理系统的总势能泛函嵌入神经网络的损失函数中,利用深度学习框架直接求解满足控制方程和边界条件的位移场近似解,避免了传统数值方法对网格划分的依赖。文章重点剖析了基于变分原理的能量形式如何替代强形式偏微分方程构建损失项,提升了求解的稳定性与泛化能力。同时,研究对比了不同PINNs架构与训练策略在处理复杂几何形状、非均匀材料属性及非线性力学行为时的精度、收敛性与计算效率,验证了其在处理经典弹性力学问题(如平面应力/应变问题)中的有效性与潜力。配套代码便于读者复现结果并拓展至更广泛的工程应用场景。; 适合人群:具备一定深度学习基础和固体力学知识的研究生、科研人员及工程技术从业者,特别适用于从事计算力学、智能仿真、物理驱动建模、结构分析等方向的研究者。; 使用场景及目标:①掌握基于能量法的PINNs建模范式,理解其相较于传统有限元法的优势与局限;②研究物理信息神经网络在无网格求解复杂边界与非线性问题中的能力;③对比不同神经网络结构对求解精度与收敛速度的影响,推动PINNs在工程实际中的落地应用。; 阅读建议:建议读者结合所提供的PyTorch代码逐模块分析网络构建、能量泛函定义、边界条件施加及训练程设计,深入理解物理约束与机器学习模型的融合机制,并鼓励在自定义问题中调整网络参数、采样策略与损失权重以优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值