中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用JS實現網頁瀑布流布局

發布時間:2021-04-25 13:54:26 來源:億速云 閱讀:155 作者:小新 欄目:開發技術

這篇文章主要介紹怎么用JS實現網頁瀑布流布局,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

JS是什么

JS是JavaScript的簡稱,它是一種直譯式的腳本語言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發,可以給網站添加各種各樣的動態效果,讓網頁更加美觀。

什么是瀑布流布局:

先看效果:

怎么用JS實現網頁瀑布流布局

  • 圖片多行等寬元素排列,后面的元素依次添加到其后,等寬不等高,根據圖片原比例縮放直至寬度達到我們的要求,依次按照規則放入指定位置。

  • 為了方便理解,在此先給上html、css代碼

不完整html代碼:

<div id="container">
        <div class="box">
            <div class="box-img">
                <img src="./img/1.jpg" >
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="./img/2.jpg" >
            </div>
        </div>
        <div class="box">
            <div class="box-img">
                <img src="./img/3.jpg" >
            </div>
        </div>
     </div>
     ......<!-- 省略了圖片,多少張圖片自行決定-->

完整的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;
    }

如何實現:

簡單地來說,如果要實現瀑布流布局,得完成這幾件事?

1. 獲取圖片

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

2. 設置圖片寬帶

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

3. 計算瀏覽器頁面一行最多能存放圖片的數量

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

4. 比較圖片高度

因為在瀑布流布局中,當第一行圖片已經擺滿后,第二行的第一張圖片要放在第一行中高度最小的圖片的下面

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)//比較出上一行最小的高度
        
      }
    }

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

//定義一個getMinHeightLocation函數,給它傳入BoxHeightArr上一行全部圖片,和minHeight上一行圖片的最小高度
  function getMinHeightLocation(BoxHeightArr, minHeight) {
    for (var i in BoxHeightArr) {
      if (BoxHeightArr[i] === minHeight) {//當圖片高度等于最小高度時,該圖片的位置為最小高度圖片的位置
        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'//將要插入的圖片絕對定位,即元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進行規定
      ccontent[i].style.top = minHeight + 'px'//令插入的圖片到頂端的距離剛好等于要插其下面圖片的高度
      ccontent[i].style.left = ccontent[minIndex].offsetLeft + 'px'//令插入的圖片到最左邊的距離剛好等于要插其下面圖片到最左邊的距離
      BoxHeightArr[minIndex] = BoxHeightArr[minIndex] + ccontent[i].offsetHeight//插入圖片后,得將這位置的高度設為兩張圖片的高度和
    }
  }

完整代碼如下:

優化代碼,提高性能

window.onload = function() {
  imgLocation('container', 'box')//構造函數imgLocation
}
//用window.onload = function() {}函數就不用等著body頁面中調用就可以執行了

// 獲取到當前有多少張圖片要擺放
function imgLocation(parent, content) {//令parent='container',content='box'
  // 將parent下所有的內容全部取出
  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實現網頁瀑布流布局”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

如东县| 岐山县| 鄢陵县| 遂溪县| 莱州市| 大厂| 信阳市| 嫩江县| 桓仁| 无为县| 旬邑县| 寿阳县| 磐安县| 普宁市| 八宿县| 平乡县| 鄂托克旗| 凌源市| 安阳市| 新田县| 饶平县| 耒阳市| 防城港市| 榆中县| 东港市| 浦江县| 西藏| 吉首市| 沭阳县| 大化| 云南省| 濮阳县| 崇礼县| 攀枝花市| 全南县| 稷山县| 临湘市| 甘孜| 宝应县| 长寿区| 博乐市|