【问题标题】:Push down bottom div when slideDown with multiple columns and rows多列多行滑动时下推底部 div
【发布时间】:2015-06-27 03:06:44
【问题描述】:

我有多个项目组织在多列和多行中

 <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 向下滑动来显示单击时每个项目的隐藏内容。我想正确推送底部内容,即扩展对象所属的同一列。

基本浮动示例:左和宽度: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 - Isotope 有一个名为“masonryColumnShift”的自定义布局模式,但在当前版本 2 中已禁用。

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

3) 弹性盒。使用:

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

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

.item {
   width: 33.3%;
}

效果不错,但并不完美。当一个项目改变其高度时,行下方会创建一个空白。

有什么想法吗?

谢谢。

【问题讨论】:

  • 使用思路1)根据窗口宽度放置div类列

标签: jquery css flexbox masonry


【解决方案1】:

更新(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>

更新(2015 年 4 月 22 日)

更新了功能,以防您计划拥有超过九个div,并将所有控件放在顶部。除了前五个变量之外,您不需要编辑任何内容。你唯一能做的就是把它变成它自己的插件。

【讨论】:

  • 有趣但不完美的解决方案,项目的高度也改变了项目旁边元素的高度,改变了它的高度
  • 我已经对代码进行了完整的修改。看看那是不是你要找的。​​span>
  • 太棒了!这正是我想要的。
  • 你可以去这里,codepen.io/fishgraphics/pen/LVYEjp,使用这些值,看看一切如何根据输入而变化。
【解决方案2】:

基于您的选项 1。

float: left 替换为display: inline-block; 优点是项目不会浮动,并且会与其他项目保持在同一行。展开时,line-height 会做 to,使下一行完全下推。

也可以响应式地工作。

您还需要将垂直对齐设置为顶部。

Updated Fiddle

【讨论】:

  • 但是与 FlexBox 的选项一样,行下方会创建空白。未推送的项目不应从其原始位置移动
  • 啊,好吧,我没有从你的问题中解脱出来。那我的回答是假的。但无论如何我都会留下它,它可能会被其他人使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多