如何在Bootstrap中使div堆叠而不留间隔并保持顺序在较小的尺寸下?

8

我真的不知道该如何用语言描述这个问题。

如果在一行中有两个 div,每个 div 的高度不同,则下一行会出现不必要的空白。

但在小屏幕上正确堆叠。

 <div class="row">
    <div class="col-lg-6 col-md-6 col-sm-12"> div 1 </div>
    <div class="col-lg-6 col-md-6 col-sm-12"> div 2 </div>
  </div>
  <div class="row">
    <div class="col-lg-6 col-md-6 col-sm-12"> div 3 </div>
    <div class="col-lg-6 col-md-6 col-sm-12"> div 4 </div>
  </div>

在这里输入图片描述

但是当我去掉行并将所有左边的div都放在一个div中,所有右边的div都放在另一个div中时,就没有空间了。

但它们在小屏幕上堆叠的顺序不正确。

  <div class="col-lg-6 col-md-6 col-sm-12">
    <div> div 1 </div>
    <div> div 3 </div>
  </div>
  <div class="col-lg-6 col-md-6 col-sm-12">
    <div> div 2 </div>
    <div> div 4 </div>
  </div>

在这里输入图片描述

请注意,它们不仅仅是4个div,至少有8个。

希望这能清楚地表达出来。非常感谢任何帮助。


1
请展示一下代码。 - Mukul Kant
据我所知,这是Bootstrap 3的一个缺点。您可以查看外部库,例如http://masonry.desandro.com/来满足此需求。或者,Bootstrap 4似乎也解决了这个问题,但那还处于早期测试阶段。 - Hopeful Llama
它更加复杂,因为它们不仅仅是4个div,至少有8个。 - user1118829
1
@AlvaroMenéndez 如果OP正在使用Bootstrap,那么jQuery已经被包含了;-) - Jeroen
1
我的意思是 <div class="col-lg-6 col-md-6 col-sm-12"><div> div (1) </div></div><div class="col-lg-6 col-md-6 col-sm-12"><div> div (2) </div></div><div class="col-lg-6 col-md-6 col-sm-12"><div> div (3) </div></div><div class="col-lg-6 col-md-6 col-sm-12"><div> div (4) </div></div>。这样它将在大尺寸和小尺寸上都按正确顺序排列。 - R Lam
显示剩余7条评论
7个回答

5

如果您不使用Bootstrap样式,想要使用纯CSS解决方案,可以使用display:flex

.flex {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
}
.flex-div {
  border: 1px solid #000000;
  width: 50%;
  box-sizing: border-box;
}
@media (max-width: 767px) {
  .flex {
    flex-direction: column;
  }
  .flex-div {
    width: 100%;
  }
}
<div class="flex">
    <div class="flex-div"> div 1 <br> extra height</div>
    <div class="flex-div"> div 2 </div>
    <div class="flex-div"> div 3 </div>
    <div class="flex-div"> div 4 </div>
</div>

使用上面代码片段中的全屏链接,查看在不同屏幕尺寸下叠放的变化。
更新:
我能找到的最接近您需求的代码是这个:
不幸的是,它从左侧首先将div堆叠成列,并不支持旧版浏览器:

.columns {
  -webkit-column-count: 2;
  -moz-column-count: 2;
  column-count: 2;
  -webkit-column-gap: 30px;
  -moz-column-gap: 30px;
  column-gap: 30px;
  padding: 1px;
}
.columns-div {
  border: 1px solid #000000;
}


@media (max-width: 767px) {
  .columns {
  -webkit-column-count: auto;
  -moz-column-count: auto;
  column-count: auto
  -webkit-column-gap: 0;
  -moz-column-gap: 0;
  column-gap: 0;
}
}
<div class="columns">
  <div class="columns-div">div 1
    <br>extra height</div>
  <div class="columns-div">div 2</div>
  <div class="columns-div">div 3</div>
  <div class="columns-div">div 4</div>
</div>

关于栏目的更多信息

栏目支持情况


这个方法确实很好,但是它让两个调整的div高度相同,这不是我需要的。 - user1118829
@user1118829 抱歉,什么是调整 div? - Pete
@user1118829,我已经更新了我的答案,但不幸的是堆叠顺序错误,但这只是给您提供了一个额外的选项。 - Pete

4
如果您能添加jQuery,可能会有所帮助。您可以添加类似以下内容的代码:
$(document).ready(function () {
            var height = Math.max($(".left").outerHeight(), $(".right").outerHeight());
            $(".left").height(height);
            $(".right").height(height);
        });  

将类right添加到位于右侧的div,将类left添加到位于左侧的div。这将使两个div具有相同的高度。
唯一的问题可能是当同一列中所有
都具有相同的高度时,您可能不希望它们具有相同的height。不知道是否可以使jquery代码仅在窗口大小>某些像素(可能)时工作,但您可以通过在正确的media queries中使用!important来强制设置heightauto。这只是我的见解。
编辑:我在此处找到了一个可以根据最大宽度窗口大小使此脚本工作的方法。
function checkPosition() {
    if (window.matchMedia('(max-width: 767px)').matches) {
        //...
    } else {
        //...
    }
}

一个问题:当浏览器被调整大小时会发生什么?(你知道,图形艺术家和设计师喜欢调整浏览器来测试你的响应式布局...)。哦,而在.resize()上执行该脚本是一个坏主意,因为它会给客户端带来一些真正的负载。我更喜欢CSS方法,它更加简洁。 - cari
1
说实话,你自己说了那种“喜欢”调整浏览器大小的人。然而,响应式网页的唯一原因是为了适应未来真正用户所使用的任何平台,而那些“调整大小”只是为了好玩(或学习)的人是非常少数的...而且这些人会理解jquery函数的使用。这只是我的观点。 - Alvaro Menéndez
^同意。以前的客户和我有过同样的争论,我回答了类似于这样的话。 - AndrewL64

3

修订答案

在这个回答https://stackoverflow.com/a/32565224/3956566的帮助下,我整理了一些代码。

为了方便您的自定义,我使用了一个较小的宽度。同时,将任何css更改放在site.css文件中,而不是bootstrap,并在bootstrap之后调用site.css,以覆盖更改。

Css:

div {outline:solid 1px red; }

  .left {
 } 
  .right {
 }  

HTML:

<div style="display:none">
<div id="1"  class="left" style="height:100px;background-color:yellow;">DIV 1</div>
<div id="2" class="right" style="height:20px;">DIV 2</div>
<div id="3" class="left" style="height:50px;background-color:yellow;">DIV 3</div>
<div id="4" class="right" style="height:170px;">DIV 4</div>
<div id="5" class="left" style="height:120px;background-color:yellow;">DIV 5</div>
<div id="6" class="right" style="height:30px;">DIV 6</div>
<div id="7" class="left" style="height:50px;background-color:yellow;">DIV 7</div>
<div id="8" class="right" style="height:90px;">DIV 8</div>
</div>
<div id="div1" style="width: 50%;float:left;background-color:grey"></div>
<div id="div2" style="width: 50%;float:right;background-color:blue"></div>
<div id="div3" style="width: 100%;float:left;background-color:white"></div>

jQuery:
if ($(window).width() > 400) {
    $('#div1').append($('.left'));
    $('#div2').append($('.right'));
}
if ($(window).width() < 400) {
    $('#div3').append($('#1'));
    $('#div3').append($('#2'));
    $('#div3').append($('#3'));
    $('#div3').append($('#4'));
    $('#div3').append($('#5'));
    $('#div3').append($('#6'));
    $('#div3').append($('#7'));
    $('#div3').append($('#8'));
}


$('#div1').append($('.left'));
$('#div2').append($('.right'));

$( window ).resize(function() {
    if($(window).width()>400){
        $('#div1').append($('.left'));
        $('#div2').append($('.right'));  
    }
    if($(window).width()<400)
    {
        // These need to be added in order, as appending them to the
        // first two divs reorders them.
        $('#div3').append($('#1'));
        $('#div3').append($('#2'));
        $('#div3').append($('#3'));
        $('#div3').append($('#4'));
        $('#div3').append($('#5'));
        $('#div3').append($('#6'));
        $('#div3').append($('#7'));
        $('#div3').append($('#8'));
    }
});

查看示例:

https://jsfiddle.net/kermit77/vo439fte/4/

enter image description here

enter image description here


第一个答案

除了在计算每个div的高度并相应调整边距(仅适用于更大的布局)之外,还要采取进一步措施;
例如:

div 1 height = a, div 2 height = b

div diff = (a-b)

if diff >0

div 4 top margin = -diff

else

div 3 top-margin = -diff;

但您需要对奇数编号的div高度和偶数编号的div高度进行累加并作出相应调整。

我已经缩小了宽度以进行测试。您需要在每个第三个div上清除左侧以防止其放置在右侧。

<div class="row">
    <div class="col-lg-6  col-sm-12" style="height:100px;">DIV 1</div>
    <div  class="col-lg-6  col-sm-12" style="height:80px;">DIV 2</div>
    <div  class="col-lg-6  col-sm-12" style="height:50px;clear:left;">DIV 3</div>
    <div  class="col-lg-6  col-sm-12" style="height:40px;">DIV 4</div>
</div>

每隔三个 div 元素清除左浮动。

CSS:

div {outline:solid 1px red; }
.row {
    margin-right: 2px;
    margin-left: 2px;
}
@media (min-width: 500px) {
.container {
    max-width: 1170px;
}
.col-lg-6 {
    max-width:50%;
    width: 50%;
    float:left;
    clear:right;
}  
}
@media (min-width: 150px) {
.container {
    max-width: 500px;
}
.col-sm-12 {
    width: 100%;
}
}

我不确定我理解你的解决方案,当我添加了4个div时,垂直间距出现了。请注意,我不知道div的高度,它们是动态的。 - user1118829
1
我为了这个赏金已经变穷了,但如果你解决了它,我很乐意把它给你。 - user1118829
1
非常感谢!我会尝试并告诉你 :) - user1118829
非常感谢,我没有时间完全理解它,也不想让赏金过期,但我尝试了一下,似乎运行良好。非常棒的努力 :) - user1118829

2
正如“R Lam”在上面评论的那样,这个方法可行:
<div class="col-lg-6 col-md-6 col-sm-12">
<div>div1</div>
</div>
<div class="col-lg-6 col-md-6 col-sm-12">
<div>div2</div>
</div>
<div class="col-lg-6 col-md-6 col-sm-12">
<div>div3</div>
</div>
<div class="col-lg-6 col-md-6 col-sm-12">
<div>div4</div>
</div>

我在想是否可以让它们相加超过12,但后来我发现了这个问题:问题链接 实际上,这并没有起作用,仍然出现了一些空白。

1

我觉得您想要实现动态的div高度。也就是说,一行内的所有div都应该具有与内容更多的div相同的高度,因此div的高度将取决于可能变化的内容。为了实现这一点,您需要不仅仅是CSS,还需要一些简单的JQuery或JavaScript。 使用JQuery:

<div class="row first-row">
  <div class="col-lg-6 col-md-6 col-sm-12 same-height"> div 1 </div>
  <div class="col-lg-6 col-md-6 col-sm-12 same-height"> div 2 </div>
</div>
<div class="row second-row">
  <div class="col-lg-6 col-md-6 col-sm-12 same-height"> div 3 </div>
  <div class="col-lg-6 col-md-6 col-sm-12 same-height" onload="FixSizeOfRows()"> div 4 </div>
</div>
<script>
  function FixSizeOfRows(){
    $('.first-row > .same-height').height($('.first-row').height());
    $('.second-row > .same-height').height($('.second-row').height());
  }
</script>

这里的想法是在最后一个div完全加载时运行FixSizeOfRows()函数。函数FixSizeOfRows()逐行注入行高到每个子div中(请注意,行高随具有更多内容的子div而增加)。
我更喜欢使用JQuery来操作DOM,而不是纯JavaScript。使用JavaScript也可以做类似的事情,但可能会更加复杂。如果需要更多关于此代码如何工作的说明,请告诉我。

谢谢你的努力,但实际上我不想让一行中的div具有相同的高度,因为其中一些会有太多的空白空间。 - user1118829

1
我们可以通过@media查询实现它。
而且您需要为div添加交替的float left right。
HTML:
    <div class="wid" style="height:80px;background-color:#ccc;float:left;"> div 1 </div>
    <div class="wid" style="height:100px;background-color:red;float:right;"> div 2 </div>
    <div class="wid" style="height:90px;background-color:yellow;float:left;"> div 3 </div>
    <div class="wid" style="height:120px;background-color:green;float:right;"> div 4 </div>
    <div class="wid" style="height:100px;background-color:#ddd;float:left;"> div 5 </div>

CSS:
.wid{
width:50%;
}

@media screen and (max-width:768px){
.wid{
width:100%;
}
}

0

谢谢,但不幸的是我不想让它们有相等的高度。 - user1118829

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接