最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何用JS實(shí)現(xiàn)網(wǎng)頁(yè)瀑布流布局

 更新時(shí)間:2021年04月24日 11:56:26   作者:范佐  
這篇文章主要介紹了如何用JS實(shí)現(xiàn)網(wǎng)頁(yè)瀑布流布局,幫助大家更好的利用JavaScript制作網(wǎng)頁(yè),感興趣的朋友可以了解下

前言:

瀑布流 又稱(chēng)瀑布流式布局,是比較流行的一種網(wǎng)站頁(yè)面布局方式。即多行等寬元素排列,后面的元素依次添加到其后,等寬不等高,根據(jù)圖片原比例縮放直至寬度達(dá)到我們的要求,依次按照規(guī)則放入指定位置。

什么是瀑布流布局:

先看效果:

  • 圖片多行等寬元素排列,后面的元素依次添加到其后,等寬不等高,根據(jù)圖片原比例縮放直至寬度達(dá)到我們的要求,依次按照規(guī)則放入指定位置。
  • 為了方便理解,在此先給上html、css代碼

不完整html代碼:

<div id="container">
        <div class="box">
            <div class="box-img">
                <img src="./img/1.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="./img/2.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="./img/3.jpg" alt="">
            </div>
        </div>
     </div>
     ......<!-- 省略了圖片,多少?gòu)垐D片自行決定-->

完整的css代碼

*{
        padding: 0;
        margin: 0;
    }
    #container{
        position: relative;
    }
    .box{
        float: left;
        padding: 15px;
    }
    .box-img {
        width: 150px;
        padding: 5px;
        border: 1px solid #ccc ;
        box-shadow: 0 0 5px #ccc;
        border-radius: 5px;
    }
    .box-img img{
        width: 100%;
        height: auto;
    }

如何實(shí)現(xiàn):

簡(jiǎn)單地來(lái)說(shuō),如果要實(shí)現(xiàn)瀑布流布局,得完成這幾件事✍

1. 獲取圖片

function getChildElemnt() {
    const contentArr = []//定義數(shù)組準(zhǔn)備裝圖
    const parent = document.getElementById(container)//得到整個(gè)頁(yè)面
    const allContent = parent.getElementsByTagName('*')//得到整個(gè)標(biāo)簽
    console.log(allContent);
    for (var i = 0; i < allContent.length; i++) {
      if (allContent[i].className == 'box') {
        contentArr.push(allContent[i])//將class='box'的標(biāo)簽裝入數(shù)組
      }
    }
    console.log(contentArr);
    return contentArr//返回?cái)?shù)組
 }

2. 設(shè)置圖片寬帶

 var ccontent = getChildElemnt()
  var imgWidth = ccontent[0].offsetWidth//令所有圖片寬度等于第一張圖片

3. 計(jì)算瀏覽器頁(yè)面一行最多能存放圖片的數(shù)量

var dWidth=document.documentElement.clientWidth//頁(yè)面寬度
var num = Math.floor(dWidth/ imgWidth)
//Math.floor()向下取整

4. 比較圖片高度

因?yàn)樵谄俨剂鞑季种?,?dāng)?shù)谝恍袌D片已經(jīng)擺滿(mǎn)后,第二行的第一張圖片要放在第一行中高度最小的圖片的下面

var BoxHeightArr = []//定義一個(gè)數(shù)組,把每張圖片的高度依次放進(jìn)去
    for (var i = 0; i < ccontent.length; i++) {
      if (i < num) {
        BoxHeightArr[i] = ccontent[i].offsetHeight//將圖片的高度存入數(shù)組
      } else {//當(dāng)?shù)谝恍幸呀?jīng)存放不了圖片后
        var minHeight = Math.min.apply(null, BoxHeightArr)//比較出上一行最小的高度
        
      }
    }

5. 得到上一行中最小高度圖片的位置

//定義一個(gè)getMinHeightLocation函數(shù),給它傳入BoxHeightArr上一行全部圖片,和minHeight上一行圖片的最小高度
  function getMinHeightLocation(BoxHeightArr, minHeight) {
    for (var i in BoxHeightArr) {
      if (BoxHeightArr[i] === minHeight) {//當(dāng)圖片高度等于最小高度時(shí),該圖片的位置為最小高度圖片的位置
        return i
      }
    }
  }

6. 插圖

    for (var i = 0; i < ccontent.length; i++) {
    if (i < num) {
      BoxHeightArr[i] = ccontent[i].offsetHeight
    } else {
      var minHeight = Math.min.apply(null, BoxHeightArr)
      var minIndex = getMinHeightLocation(BoxHeightArr, minHeight)
      ccontent[i].style.position = 'absolute'//將要插入的圖片絕對(duì)定位,即元素的位置通過(guò) "left", "top", "right" 以及 "bottom" 屬性進(jìn)行規(guī)定
      ccontent[i].style.top = minHeight + 'px'//令插入的圖片到頂端的距離剛好等于要插其下面圖片的高度
      ccontent[i].style.left = ccontent[minIndex].offsetLeft + 'px'//令插入的圖片到最左邊的距離剛好等于要插其下面圖片到最左邊的距離
      BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight//插入圖片后,得將這位置的高度設(shè)為兩張圖片的高度和
    }
  }

完整代碼如下:

優(yōu)化代碼,提高性能

window.onload = function() {
  imgLocation('container', 'box')//構(gòu)造函數(shù)imgLocation
}
//用window.onload = function() {}函數(shù)就不用等著body頁(yè)面中調(diào)用就可以執(zhí)行了

// 獲取到當(dāng)前有多少?gòu)垐D片要擺放
function imgLocation(parent, content) {//令parent='container',content='box'
  // 將parent下所有的內(nèi)容全部取出
  var cparent = document.getElementById(parent)
  var ccontent = getChildElemnt(cparent, content)
  var imgWidth = ccontent[0].offsetWidth
  var num = Math.floor(document.documentElement.clientWidth / imgWidth)
  cparent.style.cssText = `width: ${imgWidth * num} px`

  var BoxHeightArr = []
  for (var i = 0; i < ccontent.length; i++) {
    if (i < num) {
      BoxHeightArr[i] = ccontent[i].offsetHeight
    } else {
      var minHeight = Math.min.apply(null, BoxHeightArr)
      var minIndex = getMinHeightLocation(BoxHeightArr, minHeight)
      ccontent[i].style.position = 'absolute'
      ccontent[i].style.top = minHeight + 'px'
      ccontent[i].style.left = ccontent[minIndex].offsetLeft + 'px'
      BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight
    }
  }
  // console.log(BoxHeightArr);
}


function getChildElemnt(parent, content) {parent='container',content='box'
  const contentArr = []
  const allContent = parent.getElementsByTagName('*')
  console.log(allContent);
  for (var i = 0; i < allContent.length; i++) {
    if (allContent[i].className == content) {
      contentArr.push(allContent[i])
    }
  }
  console.log(contentArr);
  return contentArr
}

function getMinHeightLocation(BoxHeightArr, minHeight) {
  for (var i in BoxHeightArr) {
    if (BoxHeightArr[i] === minHeight) {
      return i
    }
  }
}

以上就是如何用JS實(shí)現(xiàn)網(wǎng)頁(yè)瀑布流布局的詳細(xì)內(nèi)容,更多關(guān)于JS實(shí)現(xiàn)網(wǎng)頁(yè)瀑布流布局的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • uni-app禁用返回按鈕/返回鍵的具體實(shí)現(xiàn)

    uni-app禁用返回按鈕/返回鍵的具體實(shí)現(xiàn)

    今天在使用uni-app開(kāi)發(fā)登錄頁(yè)面時(shí)遇到一個(gè)需求,需要禁用返回按鈕,下面這篇文章主要給大家介紹了關(guān)于uni-app禁用返回按鈕/返回鍵的具體實(shí)現(xiàn),需要的朋友可以參考下
    2022-11-11
  • 探討js字符串?dāng)?shù)組拼接的性能問(wèn)題

    探討js字符串?dāng)?shù)組拼接的性能問(wèn)題

    這篇文章主要介紹了有關(guān)js對(duì)字符串?dāng)?shù)組進(jìn)行拼接的性能問(wèn)題,字符串連接一直是js中性能最低的操作之一,應(yīng)該如何解決呢?請(qǐng)參看本文的介紹
    2014-10-10
  • ES6中Promise的使用方法實(shí)例總結(jié)

    ES6中Promise的使用方法實(shí)例總結(jié)

    這篇文章主要介紹了ES6中Promise的使用方法,結(jié)合實(shí)例形式總結(jié)分析了Promise對(duì)象中的各種常用方法及基本使用技巧,需要的朋友可以參考下
    2020-02-02
  • JS中作用域和變量提升(hoisting)的深入理解

    JS中作用域和變量提升(hoisting)的深入理解

    相信大家也都發(fā)現(xiàn)了,在網(wǎng)上關(guān)于JS的變量和作用域的文章有很多,但真正能講清楚,能深入理解的文章很少。在閱讀了很多人的文章以后,我決定綜合起來(lái),結(jié)合實(shí)際代碼,希望能夠以一個(gè)比較清楚完整的方式讓大家真正理解。有需要的朋友們下面來(lái)一起看看吧。
    2016-10-10
  • Javascript基于OOP實(shí)實(shí)現(xiàn)探測(cè)器功能代碼實(shí)例

    Javascript基于OOP實(shí)實(shí)現(xiàn)探測(cè)器功能代碼實(shí)例

    這篇文章主要介紹了Javascript基于OOP實(shí)實(shí)現(xiàn)探測(cè)器功能代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • JS數(shù)組方法push()、pop()用法實(shí)例分析

    JS數(shù)組方法push()、pop()用法實(shí)例分析

    這篇文章主要介紹了JS數(shù)組方法push()、pop()用法,結(jié)合實(shí)例形式分析了JavaScript數(shù)組push()與pop()方法基本功能、原理、使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • JS Replace()的高級(jí)使用方法介紹

    JS Replace()的高級(jí)使用方法介紹

    這篇文章介紹了,js中的Replace()的一些高級(jí)的使用方法,有需要的朋友可以參考一下
    2013-06-06
  • JS簡(jiǎn)單實(shí)現(xiàn)自定義右鍵菜單實(shí)例

    JS簡(jiǎn)單實(shí)現(xiàn)自定義右鍵菜單實(shí)例

    本篇文章主要介紹了JS簡(jiǎn)單實(shí)現(xiàn)自定義右鍵菜單實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 基于javascript的在火狐里面強(qiáng)制換行字符

    基于javascript的在火狐里面強(qiáng)制換行字符

    火狐也不知道為什么,自己功能上,樣式上面,都無(wú)法讓其強(qiáng)制換行,這里用JS來(lái)實(shí)現(xiàn)火狐里面強(qiáng)制換行的方法。
    2010-06-06
  • JavaScript暫停和繼續(xù)定時(shí)器的實(shí)現(xiàn)方法

    JavaScript暫停和繼續(xù)定時(shí)器的實(shí)現(xiàn)方法

    這篇文章主要介紹了JavaScript暫停和繼續(xù)定時(shí)器的方法的相關(guān)資料,非常不錯(cuò),需要的朋友可以參考下
    2016-07-07

最新評(píng)論

昌都县| 灵丘县| 武汉市| 榆树市| 兴安盟| 太仓市| 海伦市| 明光市| 溧水县| 右玉县| 门源| 高清| 琼结县| 镇江市| 社会| 香格里拉县| 弥勒县| 蒙山县| 张家口市| 安丘市| 淮南市| 石景山区| 武穴市| 鄂托克前旗| 阿城市| 定边县| 高安市| 北京市| 兰西县| 萍乡市| 三都| 清流县| 始兴县| 西吉县| 澄城县| 内乡县| 新兴县| 宁强县| 万宁市| 贵德县| 柏乡县|