【问题标题】:How to remove the gaps within flex items?如何消除弹性项目中的间隙?
【发布时间】:2017-11-26 00:12:04
【问题描述】:

div中出现了巨大的差距,文字随着display:flex的增加而增加

添加额外的div wrap 可能不是可能影响移动版本的解决方案。 移动端视图应该是这样的???

p {
  margin: 10px;
}

body {
  display: flex;
  flex-wrap: wrap;
  // flex-direction: column;
}

.my-wrap {
  width: 90%;
  margin: 50px auto;
  display: flex;
  flex-direction: column;
  flex-wrap: wrap;
  border: 1px solid #eee;
  color: #fff;
}

.wrap-one,
.wrap-two {
  width: 75%;
}

.wrap-one {
  background-color: tomato;
  flex: 1;
}

.wrap-two {
  background-color: deepskyblue;
}

.wrap-three {
  background-color: greenyellow;
  flex-basis: 100%;
  width: 25%;
}
<div class="my-wrap">
  <div class="wrap-one">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum voluptates ipsa tempora qui voluptas, dicta corrupti dolorum, iure esse earum ut pariatur, ad possimus facilis consequatur impedit accusantium autem! Nesciunt?</p>
  </div>
  <div class="wrap-two">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat commodi aspernatur et! Voluptates officiis nemo corporis delectus pariatur. Cupiditate perspiciatis illum minima, porro voluptas velit nobis ad eveniet modi explicabo.</p>
  </div>
  <div class="wrap-three">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Perspiciatis reprehenderit, necessitatibus vel praesentium dolorum vitae sequi in magni voluptate alias fugit saepe eos sint dolore quae sapiente sunt itaque, cupiditate.</p>
  </div>
</div>

【问题讨论】:

  • 这应该是什么样子?您可能需要在此处调整 HTML。如果您从.wrap-one 中删除flex:1,它可以解决第一个问题。坦率地说,您可能需要将 onetwo 放入它们自己的容器中。
  • 由于您使用 flex 方向列来实现该输出,因此唯一的方法是在容器上设置一个高度。要正确解决这个问题,您需要包装一个和两个
  • 是的,像这样 - codepen.io/Paulie-D/pen/rwwodM
  • @Paulie_D 删除 flex:1 与 div codepen.io/anon/pen/pwwqLv 产生差距实际上所有颜色都应该适合 .my-wrap div
  • 那么你需要更清楚这应该是什么样子。

标签: html css flexbox css-grid


【解决方案1】:

首先,您遇到了异常行为,因为您在绿色项目 (.wrap-three) 上指定了 flex-basis: 100%,而没有在父项上指定高度。

在 CSS 中,要使百分比高度在浏览器中正常工作,您应该始终指定父级的高度。

将此添加到您的代码中:

html, body, .my-wrap { height: 100%; }

html,
body,
.my-wrap {
  height: 100%;
}

p {
  margin: 10px;
}

body {
  display: flex;
  flex-wrap: wrap;
}

.my-wrap {
  width: 90%;
  margin: 50px auto;
  display: flex;
  flex-direction: column;
  flex-wrap: wrap;
  border: 1px solid #eee;
  color: #fff;
}

.wrap-one,
.wrap-two {
  width: 75%;
}

.wrap-one {
  background-color: tomato;
  flex: 1;
}

.wrap-two {
  background-color: deepskyblue;
}

.wrap-three {
  background-color: greenyellow;
  flex-basis: 100%;
  width: 25%;
}
<div class="my-wrap">
  <div class="wrap-one">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum voluptates ipsa tempora qui voluptas, dicta corrupti dolorum, iure esse earum ut pariatur, ad possimus facilis consequatur impedit accusantium autem! Nesciunt?</p>
  </div>
  <div class="wrap-two">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat commodi aspernatur et! Voluptates officiis nemo corporis delectus pariatur. Cupiditate perspiciatis illum minima, porro voluptas velit nobis ad eveniet modi explicabo.</p>
  </div>
  <div class="wrap-three">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Perspiciatis reprehenderit, necessitatibus vel praesentium dolorum vitae sequi in magni voluptate alias fugit saepe eos sint dolore quae sapiente sunt itaque, cupiditate.</p>
  </div>
</div>

其次,由于您没有在 flex 容器上指定高度,浏览器可以自行决定解释高度。

为了更稳定的布局,试试这个(例如):.my-wrap { height: 300px }

p {
  margin: 10px;
}

body {
  display: flex;
  flex-wrap: wrap;
}

.my-wrap {
  height: 300px;
  width: 90%;
  margin: 50px auto;
  display: flex;
  flex-direction: column;
  flex-wrap: wrap;
  border: 1px solid #eee;
  color: #fff;
}

.wrap-one,
.wrap-two {
  width: 75%;
}

.wrap-one {
  background-color: tomato;
  flex: 1;
}

.wrap-two {
  background-color: deepskyblue;
}

.wrap-three {
  background-color: greenyellow;
  flex-basis: 100%;
  width: 25%;
}
<div class="my-wrap">
  <div class="wrap-one">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum voluptates ipsa tempora qui voluptas, dicta corrupti dolorum, iure esse earum ut pariatur, ad possimus facilis consequatur impedit accusantium autem! Nesciunt?</p>
  </div>
  <div class="wrap-two">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat commodi aspernatur et! Voluptates officiis nemo corporis delectus pariatur. Cupiditate perspiciatis illum minima, porro voluptas velit nobis ad eveniet modi explicabo.</p>
  </div>
  <div class="wrap-three">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Perspiciatis reprehenderit, necessitatibus vel praesentium dolorum vitae sequi in magni voluptate alias fugit saepe eos sint dolore quae sapiente sunt itaque, cupiditate.</p>
  </div>
</div>

更多信息:

【讨论】:

    【解决方案2】:

    由于您使用的是 flex 方向列,它们不会垂直折叠以减小间隙,这不是 Flexbox 的工作方式。

    对于 flex 方向列,您需要在 my-wrap 容器上设置一个高度,以便 flex 项进行包装,因此,在您的情况下,为了能够拥有动态大小的项,请使用 flex 方向行:

    • 包装onetwo
    • my-wrap更改为行方向并添加flex-wrap: wrap
    • 使wrap-left 成为弹性列容器
    • one/two弹性项目上设置flex-grow

    更新

    为了也启用移动视图,因为这根本无法用 Flexbox 解决,我添加了一个小脚本,根据宽度,只需将 wrap-one 元素移入和移出 wrap-left 元素.

    它还向 body 元素添加了一个类 mobileview,它可用于以与使用媒体查询类似的方式来定位元素。

    脚本的调整大小处理程序在受到限制时对性能影响很小(如果有的话)。

    Fiddle demo

    堆栈sn-p

    (function(d, w, timeout) {
    
      /* custom variables */
      var flexcontainer = '.wrap-left',
        flexitem = '.wrap-one',
        minwidth = 600,             /* if null, then when viewport is portrait */
        classname = 'mobileview';
        
      /* here happens the magic */
      function resizeing() {
        if ((minwidth && (minwidth < w.innerWidth)) ||
            (!minwidth && (w.innerHeight < w.innerWidth))) {
          if (d.body.classList.contains(classname)) {      
            /* move it back inside the main flexcontainer */
            d.body.classList.remove(classname)
            var fca = qSA(flexcontainer);
            for (var i = 0; i < fca.length; i++) {
              fca[i].appendChild(qS(flexitem, fca[i].parentNode))
            }
          }      
        } else {
          if (!(d.body.classList.contains(classname))) {
            /* move it outside the main flexcontainer */
            d.body.classList.add(classname);
            var fca = qSA(flexcontainer);
            for (var i = 0; i < fca.length; i++) {
              fca[i].parentNode.appendChild(qS(flexitem, fca[i]))
            }
          }
        }
      }
      
      /* run at page load init resize */
      w.addEventListener("load", function() {
        resizeing();
      }, false);
      
      /* grab when viewport resize */
      w.addEventListener("resize", function() {
        if (!timeout) {
          timeout = setTimeout(function() {
            timeout = null;
            resizeing();
          }, 66);
        }
      }, false);
      
      /* helper variables */
      var qSA = function(s, el) {
          return (el) ? el.querySelectorAll(s) :
            d.querySelectorAll(s)
        },
        qS = function(s, el) {
          return (el) ? el.querySelector(s) :
            d.querySelector(s)
        };
    }(document, window));
    p {
      margin: 10px;
    }
    body {
      display: flex;
    }
    
    .my-wrap {
      width: 90%;
      margin: 30px auto;
      display: flex;
      flex-wrap: wrap;
      border: 1px solid #eee;
      color: #fff;
    }
    
    .wrap-left {
      flex: 0 0 75%;
      min-width: 0;
      display: flex;
      flex-direction: column;
    }
      .wrap-one {
        flex-grow: 1;
        background-color: tomato;
      }
      .wrap-two {
        flex-grow: 1;
        background-color: deepskyblue;
      }
      
    .wrap-right {
      flex: 0 0 25%;
      min-width: 0;
      background-color: greenyellow;
    }
    
    /*  for mobile layout  */
    .my-wrap > .wrap-one {
      flex: 0 0 100%;
      order: -1;
    }
    .mobileview .wrap-right {
      background-color: green;
    }
    <div class="my-wrap">
      <div class="wrap-left">
        <div class="wrap-one">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum voluptates ipsa tempora qui voluptas, dicta corrupti dolorum, iure esse earum ut pariatur, ad possimus facilis consequatur impedit accusantium autem! Nesciunt?</p>
        </div>
        <div class="wrap-two">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat commodi aspernatur et! Voluptates officiis nemo corporis delectus pariatur. Cupiditate perspiciatis illum minima, porro voluptas velit nobis ad eveniet modi explicabo.</p>
        </div>
      </div>
      <div class="wrap-right">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Perspiciatis reprehenderit, necessitatibus vel praesentium dolorum vitae sequi in magni voluptate alias fugit saepe eos sint dolore quae sapiente sunt itaque, cupiditate.</p>
      </div>
    </div>

    【讨论】:

    • 如果我们添加额外的div,该解决方案可能会影响移动响应版本
    • @MuhammedAthimannil 那么正确的方法当然是展示它的样子,我们也可以提供一个解决方案,因为现在使用的任何一种设备都不能正常工作不会折叠到其内容
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多