首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动裁剪多线柔性箱

自动裁剪多线柔性箱
EN

Stack Overflow用户
提问于 2021-12-21 13:13:00
回答 3查看 52关注 0票数 0

我需要在一个漂亮的表中显示8-9张卡片,每行有2-4行和2-4个元素。所有行都有相同数量的元素。

例如,根据容器元素的宽度,用户应该看到醚8或9卡:

代码语言:javascript
运行
复制
C1 C2 C3 C4
C5 C6 C7 C8

代码语言:javascript
运行
复制
C1 C2 C3
C4 C5 C6
C7 C8 C9

代码语言:javascript
运行
复制
C1 C2
C3 C4
C5 C6
C7 C8

如果没有媒体查询,我如何做到这一点?

最自然的方法似乎是使用flex-wrap: wrap的flexbox,但是如何解释flexbox,如果它只包含一个元素,我需要隐藏一行?是否只有css解决方案?我能用javascript检测包装柔性盒有多少行吗?

EN

回答 3

Stack Overflow用户

发布于 2021-12-21 13:49:18

Flexbox与flex-wrap: wrap和媒体查询相结合可以是一个很好的解决方案。

您可以设置多个断点,并为不同屏幕大小创建不同的行为。也可以(除了设置flex-basis之外)用display: none隐藏最后一个元素

例如,使用移动第一方法,您可以这样做:

代码语言:javascript
运行
复制
.wrapper {
  display: flex;
  flex-wrap: wrap;
}
.wrapper div {
  flex-basis: 50%;
}
.wrapper div:last-child {
  display: none;
}
@media (min-width: 600px) {
  .wrapper div {
    flex-basis: 33.33%;
  }
  .wrapper div:last-child {
    display: block;
  }
}
@media (min-width: 992px) {
  .wrapper div {
    flex-basis: 25%;
  }
  .wrapper div:last-child {
    display: none;
  }
}
代码语言:javascript
运行
复制
<div class="wrapper">
  <div>C1</div>
  <div>C2</div>
  <div>C3</div>
  <div>C4</div>
  <div>C5</div>
  <div>C6</div>
  <div>C7</div>
  <div>C8</div>
  <div>C9</div>
</div>

票数 0
EN

Stack Overflow用户

发布于 2021-12-22 12:14:21

最好是使用容器查询,但不幸的是,在2021年,它们没有得到广泛的支持。除此之外,我不知道在没有媒体查询的情况下,只有CSS才能解决这个问题。

我仍然认为媒体查询是一个很好的解决方案(在这种情况下,您可以找到viewport宽度与容器宽度之间的关系),但是由于您坚持不使用它们,您唯一的方法就是使用一些javascript (虽然使用JS布局可能不是一个好主意)。

其中一种方法是使用一个已经创建的库(例如EQCSS),但是如果您想拥有自己的解决方案,可以像下面这样模拟容器查询。

代码语言:javascript
运行
复制
$(function() {
  updateWrapper(); // call on page load
  $(window).on('resize', function(){
    updateWrapper(); // update on window resize
  });
});

function updateWrapper() {
  var innerWrapper = $('.wrapper > div'); // get inner wrapper
  innerWrapper.removeClass(); // remove previously set class

  var elWidth = $('.wrapper').width(); // get container width
  if(elWidth < 600) { // set class according to container width
    innerWrapper.addClass('mobile');
  } else if (elWidth >= 600 && elWidth < 992) {
    innerWrapper.addClass('tablet');
  } else {
    innerWrapper.addClass('desktop');
  }
}
代码语言:javascript
运行
复制
.wrapper {
  /* width: 400px; // use any value here */
  background: lightgray;
}
.wrapper > div {
  display: flex;
  flex-wrap: wrap;
}

.mobile div {
  flex-basis: 50%;
}
.mobile div:last-child {
  display: none;
}

.tablet div {
  flex-basis: 33.33%;
}
.tablet div:last-child {
  display: block;
}

.desktop div {
  flex-basis: 25%;
}
.desktop div:last-child {
  display: none;
}
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrapper">
  <div>
    <div>C1</div>
    <div>C2</div>
    <div>C3</div>
    <div>C4</div>
    <div>C5</div>
    <div>C6</div>
    <div>C7</div>
    <div>C8</div>
    <div>C9</div>
  </div>
</div>

票数 0
EN

Stack Overflow用户

发布于 2021-12-21 13:54:11

由于您决定在JavaScrpt中观察行数,所以使用javascript很容易完成布局(不管怎么说,您最终将使用JavaScript,因此我认为这不值得大惊小怪)。如果没有,请使用媒体查询来控制元素的显示,并以这种方式使用网格而不是柔性盒:

文件结构:

代码语言:javascript
运行
复制
.container
  #card1.card
  #card2.card
  ...
  #card8.card
  #card9.card
代码语言:javascript
运行
复制
.container{
  display: grid;
  grid-template: 1fr 1fr 1fr / 1fr 1fr 1fr;
}
@media all and (min-width: 600px){
  .container{
    grid-template: 1fr 1fr 1fr 1fr / 1fr 1fr;
  }
  .card:last-child{
    display: none;
  }
}

其他人也是如此。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70436051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档