jquery - 当 slideDown 具有多列和多行时,向下推底部 div

标签 jquery css flexbox masonry

我将多个元素组织成多个列和行

 <div class="items">
    <div class="item-1">
    <div class="item-2">
    <div class="item-3">
    <div class="item-4">
    <div class="item-5">
    ...
 </div>

我正在使用 jQuery slidedown 在点击时显示每个元素的隐藏内容。我想正确地推送底部内容,即扩展对象所属的同一列。

带有基本 float:left 和 width:33% 的示例

http://jsfiddle.net/kurtko/4w8n1frr/

我试过几种方法:

1) 使用带有 float:left 的列,然后使用 PHP 插入更改顺序的元素。从:1,2,3,4,5,6,7,8,9 到 1,4,7,2,5,8,3,6,9。

http://jsfiddle.net/kurtko/adLL8gmn/

<div class="items">    
 <div class="column>
   <div class="item-1">
   <div class="item-4">
   <div class="item-7">
 </div>
 <div class="column>
   <div class="item-2">
   <div class="item-5">
   <div class="item-8">
 </div>
</div>

这是一个很好的方法,但是当我使用带有一列的响应式版本时,顺序不正确。

2) masonry 。 Masonry - Isotope 有一个名为“masonryColumnShift”的自定义布局模式,但在当前版本 2 中被禁用。

http://isotope.metafizzy.co/v1/custom-layout-modes/masonry-column-shift.html

3) flex 盒子。使用:

http://jsfiddle.net/kurtko/7cu5jvrr/

.items {    
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    align-items: flex-start;
}

.item {
   width: 33.3%;
}

结果不错,但并不完美。当元素更改其高度时,会在行下方创建一个空白区域。

有什么想法吗?

谢谢。

最佳答案

更新(2015 年 4 月 21 日)

这是对我之前的一个非常重要的更新。我正在使用 jQuery 查找所有 div,并将它们分类到 .new div 中。当屏幕变得小于 600px 时,我将它们放回原来的配置,并将它们堆叠起来以便在移动设备上更好地查看。

直播可以看到here .

$(document).ready(function() {
  var divsAccross = 3;       // DIV's accross
  var elmParent = '.items';  // Container Class
  var elmChild = '.item';    // Elements to be sorted
  var createdDiv = 'new';    // New DIV created to hold the new sort
  var sortBy = 'id';         // Sort Elements by...

  // Shouldn't have to edit anything below.
  var windowSize = $(window).width();
  var totalDivs = [];
  var scrnSize = "large";
  var newWidths = Math.floor(100 / divsAccross);
  var newMargin = (100 % divsAccross) / (divsAccross - 1);

  $(elmChild).each(function() {
    totalDivs.push($(this).attr(sortBy));
  });

  var matrix = listToMatrix(totalDivs, divsAccross);

  if (windowSize > 600) {
    reOrder(matrix);
    scrnSize = "large";
  } else {
    scrnSize = "small";
  }

  $(elmChild).click(function() {
    $(this).find('.hidden').slideToggle(500);
  });

  $(window).resize(function() {
    windowSize = $(window).width();

    if (windowSize <= 600) {
      if (scrnSize == "large") {
        var $mylist = $(elmParent);

        $mylist.find(elmChild).sort(function(a, b) {
          return +a.getAttribute(sortBy) - +b.getAttribute(sortBy);
        }).appendTo($mylist);
        $("." + createdDiv).remove();
        scrnSize = "small";
      }
    } else {
      if (scrnSize == "small") {
        reOrder(matrix);
        scrnSize = "large";
      }
    }
  });

  function reOrder(list) {
    for (var d = 0; d < list.length; d++) {
      for (var n = 0; n < list[d].length; n++) {
        $('#' + list[d][n]).addClass(' ' + d);
      }
      $('.' + d).wrapAll("<div class=" + createdDiv + "></div>");
      $('.' + createdDiv).css({
        'width': newWidths + '%',
        'margin': '0 ' + newMargin + '% 0 0'
      })
    }
  }

  function listToMatrix(list, elementsPerSubArray) {
    var matrix = [],
      i, k;
    var newMatrix = [],
      x, y;

    for (i = 0, k = -1; i < list.length; i++) {
      if (i % elementsPerSubArray === 0) {
        k++;
        matrix[k] = [];
      }
      matrix[k].push(list[i]);
    }

    for (x = 0; x < elementsPerSubArray; x++) {
      newMatrix[x] = [];
      for (y = 0; y < matrix.length; y++) {
        if (matrix[y][x] != null) {
          newMatrix[x].push(matrix[y][x]);
        }
      }
    }
    return newMatrix;
  }
});
* {
  margin: 0;
  padding: 0;
}
.items {
  margin: 0.5%;
  height: 100%;
}
.item {
  padding: 20px 0;
  margin: 0 5px 5px 0;
  background: darkgreen;
  text-align: center;
  width: 100%;
  border: 1px solid red;
  cursor: pointer;
  float: left;
}
.new {
  float: left;
}
.new:last-child {
  margin: 0 !important;
}
.hidden {
  display: none;
  margin-top: 20px;
  width: 100%;
  padding: 150px 0;
  border-top: 1px solid red;
  border-bottom: 1px solid red;
  background-color: orange;
}
@media all and (max-width: 600px) {
  .items {
    display: flex;
    flex-flow: row wrap;
    height: 100%;
  }
  .items > * {
    flex: 1 100%;
    width: 100%;
    float: none;
  }
  .two {
    order: 2;
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="items">
  <div class="item" id="1">1
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="2">2
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="3">3
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="4">4
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="5">5
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="6">6
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="7">7
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="8">8
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="9">9
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="10">10
    <div class="hidden">Hide</div>
  </div>
  <div class="item" id="11">11
    <div class="hidden">Hide</div>
  </div>
</div>

更新 (4/22/15)

如果您计划拥有九个以上的 div 并将所有内容的所有控件放在顶部,则更新函数。您不需要编辑前五个变量以外的任何内容。您唯一可以做的就是将它变成它自己的插件。

关于jquery - 当 slideDown 具有多列和多行时,向下推底部 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29747058/

相关文章:

javascript - 如何在另一个 div/span 上延续一个 div 的背景?

jquery - 如何延迟加载背景图像

Javascript/jquery,获取 (x,y) 处的所有 div 位置。转发触摸?

css - 位置:固定在 CSS 媒体打印上似乎重复打印内容?

html - 子 div 重叠,不尊重父 div 宽度

html - 如何使用 Flexbox 将表单拉伸(stretch)成水平 div?

html - IE9支持css3 flex的替代方式

javascript - 使用带有变量的 jquery 计算直接子元素

CSS 问题 - 包装

html - 当父元素被另一个子元素填充得更高时,强制元素达到 100% 高度