• 使用js实现响应式瀑布流布局(附带动画效果)


    效果图

     

    思路

    1.获取图片容器的宽度,根据宽度的大小去控制列数的生成;

    2.定义间距变量,图片数组和计算出每列宽度;

    3.遍历图片元素数组,为每一项加上宽度;

    4.进行判断如果i小于列数则将第一列的图片高度添加进数组然后设置style的top,left值控制其位置

    5.如果i大于列数就说明是第二行,则找到上一行数组中高度最小的元素,根据其设置top,left值;

    6.最后根据根据索引将每一项添加到数组

    代码

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    7. <title>Documenttitle>
    8. <style>
    9. body {
    10. margin: 0;
    11. }
    12. .wrap {
    13. position: relative;
    14. margin: 10px;
    15. max-width: 1200px;
    16. margin: 0 auto;
    17. }
    18. .box {
    19. position: absolute;
    20. /* 图像灰度 */
    21. filter: grayscale(0.5);
    22. transition: left 0.5s, top 0.5s;
    23. }
    24. .box img {
    25. display: block;
    26. width: 100%;
    27. }
    28. style>
    29. head>
    30. <body>
    31. <div class="wrap">
    32. <div class="box">
    33. <img src="http://wlog.cn/demo/waterfall/images/001.jpg" alt="" />
    34. div>
    35. <div class="box">
    36. <img src="http://wlog.cn/demo/waterfall/images/002.jpg" alt="" />
    37. div>
    38. <div class="box">
    39. <img src="http://wlog.cn/demo/waterfall/images/003.jpg" alt="" />
    40. div>
    41. <div class="box">
    42. <img src="http://wlog.cn/demo/waterfall/images/004.jpg" alt="" />
    43. div>
    44. <div class="box">
    45. <img src="http://wlog.cn/demo/waterfall/images/005.jpg" alt="" />
    46. div>
    47. <div class="box">
    48. <img src="http://wlog.cn/demo/waterfall/images/006.jpg" alt="" />
    49. div>
    50. <div class="box">
    51. <img src="http://wlog.cn/demo/waterfall/images/007.jpg" alt="" />
    52. div>
    53. <div class="box">
    54. <img src="http://wlog.cn/demo/waterfall/images/008.jpg" alt="" />
    55. div>
    56. <div class="box">
    57. <img src="http://wlog.cn/demo/waterfall/images/009.jpg" alt="" />
    58. div>
    59. <div class="box">
    60. <img src="http://wlog.cn/demo/waterfall/images/010.jpg" alt="" />
    61. div>
    62. <div class="box">
    63. <img src="http://wlog.cn/demo/waterfall/images/011.jpg" alt="" />
    64. div>
    65. <div class="box">
    66. <img src="http://wlog.cn/demo/waterfall/images/012.jpg" alt="" />
    67. div>
    68. <div class="box">
    69. <img src="http://wlog.cn/demo/waterfall/images/013.jpg" alt="" />
    70. div>
    71. <div class="box">
    72. <img src="http://wlog.cn/demo/waterfall/images/014.jpg" alt="" />
    73. div>
    74. <div class="box">
    75. <img src="http://wlog.cn/demo/waterfall/images/015.jpg" alt="" />
    76. div>
    77. <div class="box">
    78. <img src="http://wlog.cn/demo/waterfall/images/016.jpg" alt="" />
    79. div>
    80. <div class="box">
    81. <img src="http://wlog.cn/demo/waterfall/images/017.jpg" alt="" />
    82. div>
    83. <div class="box">
    84. <img src="http://wlog.cn/demo/waterfall/images/018.jpg" alt="" />
    85. div>
    86. <div class="box">
    87. <img src="http://wlog.cn/demo/waterfall/images/019.jpg" alt="" />
    88. div>
    89. <div class="box">
    90. <img src="http://wlog.cn/demo/waterfall/images/020.jpg" alt="" />
    91. div>
    92. div>
    93. <script>
    94. // 根据元素宽度生成列数从而实现响应式
    95. function createColumns(ele) {
    96. let width = ele.offsetWidth;
    97. if (width >= 1200) {
    98. _column = 5;
    99. }
    100. if (width < 1200 && width >= 992) {
    101. _column = 4;
    102. }
    103. if (width < 992 && width >= 768) {
    104. _column = 3;
    105. }
    106. if (width < 768) {
    107. _column = 2;
    108. }
    109. if (width < 360) {
    110. _column = 1;
    111. }
    112. return _column;
    113. }
    114. function render() {
    115. let _wrap = document.querySelector(".wrap"); //父容器
    116. let _column = createColumns(_wrap); //列数
    117. let _spacing = 10; //间距
    118. let _colWidth =
    119. (_wrap.offsetWidth - (_column - 1) * _spacing) / _column; //列宽
    120. let _boxList = document.querySelectorAll(".box");
    121. let _arr = []; //高度数组
    122. for (let i = 0; i < _boxList.length; i++) {
    123. _boxList[i].style.width = _colWidth + "px";
    124. if (i < _column) {
    125. _arr.push(_boxList[i].offsetHeight); //将每一列的高度存放到_arr数组中
    126. _boxList[i].style.top = 0;
    127. _boxList[i].style.left = (_colWidth + _spacing) * i + "px";
    128. } else {
    129. let min = Math.min(..._arr); //最小高度
    130. let index = _arr.indexOf(min); //最小高度的索引
    131. _boxList[i].style.top = min + _spacing + "px"; //第二列居上距离
    132. _boxList[i].style.left = (_spacing + _colWidth) * index + "px"; //第二列居左距离
    133. _arr[index] += _boxList[i].offsetHeight + _spacing;
    134. }
    135. }
    136. }
    137. // 在网页上的资源全部加载完成后再运行代码
    138. window.addEventListener("load", render);
    139. // 窗口宽度改变
    140. window.addEventListener("resize", render);
    141. script>
    142. body>
    143. html>

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

    csdn文章推荐受影响解决办法10个字10行

  • 相关阅读:
    Bert不完全手册3. Bert训练策略优化!RoBERTa & SpanBERT
    ELF文件格式解析
    嵌入式实操----基于RT1170 移植mbw做SDRAM带宽测试(三十一)
    推荐《全职猎人》
    考研数据结构大题整合_组三(LZH组)
    后端跨域问题的处理
    【JavaScript】如何获取指定范围内的随机数
    李宏毅机器学习作业6-使用GAN生成动漫人物脸
    二次开发入门须知
    ELK日志分析系统
  • 原文地址:https://blog.csdn.net/qq_45547094/article/details/126606260