国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 如何用JS實現網頁瀑布流布局

如何用JS實現網頁瀑布流布局

2022-03-09 16:19范佐 js教程

這篇文章主要介紹了如何用JS實現網頁瀑布流布局,幫助大家更好的利用JavaScript制作網頁,感興趣的朋友可以了解下

前言:

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

什么是瀑布流布局:

先看效果:

如何用JS實現網頁瀑布流布局

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

不完整html代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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>
     ......<!-- 省略了圖片,多少張圖片自行決定-->

完整的css代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*{
        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. 獲取圖片

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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. 設置圖片寬帶

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

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

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

4. 比較圖片高度

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

?
1
2
3
4
5
6
7
8
9
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. 得到上一行中最小高度圖片的位置

?
1
2
3
4
5
6
7
8
//定義一個getMinHeightLocation函數,給它傳入BoxHeightArr上一行全部圖片,和minHeight上一行圖片的最小高度
  function getMinHeightLocation(BoxHeightArr, minHeight) {
    for (var i in BoxHeightArr) {
      if (BoxHeightArr[i] === minHeight) {//當圖片高度等于最小高度時,該圖片的位置為最小高度圖片的位置
        return i
      }
    }
  }

6. 插圖

?
1
2
3
4
5
6
7
8
9
10
11
12
  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//插入圖片后,得將這位置的高度設為兩張圖片的高度和
  }
}

完整代碼如下:

優化代碼,提高性能

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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實現網頁瀑布流布局的詳細內容,更多關于JS實現網頁瀑布流布局的資料請關注服務器之家其它相關文章!

原文鏈接:https://juejin.cn/post/6952404632610013215

延伸 · 閱讀

精彩推薦
  • js教程原生JS運動實現輪播圖

    原生JS運動實現輪播圖

    這篇文章主要為大家詳細介紹了原生JS運動實現輪播圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Bean_s9442021-12-24
  • js教程js實現隨機點名

    js實現隨機點名

    這篇文章主要為大家詳細介紹了js實現隨機點名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    搬磚大法10172022-01-04
  • js教程微信小程序頁面間傳值的實現方法示例

    微信小程序頁面間傳值的實現方法示例

    這篇文章主要給大家介紹了關于微信小程序頁面間傳值的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    little_little10272022-02-27
  • js教程Deno :它比 Node.js 更好嗎?

    Deno :它比 Node.js 更好嗎?

    在本文中,我們將討論 Deno 的創建原因以及它與 Node.js 相比的優缺點。還將對 Deno 的怪癖(quirks)和功能做一個實用概述,以便您決定它是否適合于您的下...

    編程界譯6752022-03-07
  • js教程微信小程序自定義支持圖片的彈窗

    微信小程序自定義支持圖片的彈窗

    這篇文章主要為大家詳細介紹了微信小程序自定義支持圖片的彈窗,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    歲末Zzz8442021-12-15
  • js教程js面向對象方式實現拖拽效果

    js面向對象方式實現拖拽效果

    這篇文章主要為大家詳細介紹了js面向對象方式實現拖拽效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    web前端的清流7342022-01-25
  • js教程小程序實現滑動塊效果

    小程序實現滑動塊效果

    這篇文章主要為大家詳細介紹了小程序實現滑動塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Daniel·M·water11232022-03-07
  • js教程js實現貪吃蛇游戲含注釋

    js實現貪吃蛇游戲含注釋

    這篇文章主要為大家詳細介紹了js實現貪吃蛇游戲含注釋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    越學越害怕5852022-02-16
主站蜘蛛池模板: 久久亚洲一区二区三区明星换脸 | 欧洲亚洲精品久久久久 | 日本免费在线 | 日韩电影免费在线观看 | 六月成人网 | 欧美不卡| 一道本一区| 国产精品久久久久久久久久久久 | 日韩欧美成人一区二区三区 | 免费色网站| 日韩电影一区二区三区 | 一级爱 | 美女在线一区 | 久久久久久久av | 日韩精品www | 国产在线看片 | 欧美精品久久久久 | 91精品久久| 热99久久 | 久久久精品免费观看 | 伊人婷婷| 中文字幕国产一区 | 中文字幕在线视频观看 | 国产在线精品视频 | 狠狠av| 在线免费观看毛片 | 日韩欧美中文在线 | 国产高清一级片 | 久久大陆 | 久久国产精品亚洲 | 久久最新 | 日本一区二区三区视频免费看 | 国产精品国产精品国产专区不卡 | 久久久久国产一区二区三区四区 | 免费看a| 亚洲精品久久久 | 免费激情| 午夜精品在线 | 免费观看h片 | 国产欧美视频在线 | 日韩激情 |