当前位置: 首页 > 面试题库 >

没有媒体查询的CSS网格最大列

郤浩慨
2023-03-14
问题内容

是否可以定义一个最大列数的网格,但是当屏幕宽度改变时允许元素包装到新行上?

我有隐式类,允许行包装到新行上,但是没有最大列数。

这是使用弹性盒的一种方法的代码笔

CSS:

.flex-container {
  display: flex;
  flex-wrap: wrap;
}

另一种方法是使用网格

.grid {
  display: grid;
  counter-reset: grid-items;
  position: relative;
}


.grid--auto-fit {
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

我想要一个相当通用的解决方案,没有Java脚本或媒体查询,我想实现的目标是否可能?


问题答案:

使用flexbox,您可以简单地将a设置max-width为容器,因为您的元素具有固定的宽度:

.flex-container {

  display: flex;

  flex-wrap: wrap;

  max-width:calc(5*(200px + 20px));

}



.flex-item {

  background: tomato;

  padding: 5px;

  width: 200px;

  height: 100px;

  margin: 10px;



  line-height: 100px;

  color: white;

  font-weight: bold;

  font-size: 2em;

  text-align: center;

  box-sizing:border-box;

}


<div class="flex-container wrap">

  <div class="flex-item">1</div>

  <div class="flex-item">2</div>

  <div class="flex-item">3</div>

  <div class="flex-item">4</div>

  <div class="flex-item">5</div>

  <div class="flex-item">6</div>

  <div class="flex-item">7</div>

  <div class="flex-item">8</div>

</div>

唯一的缺点是您需要知道元素的宽度及其边距才能正确设置max-width

如果您希望元素扩展并覆盖所有宽度,可以使用以下技巧min-width

.flex-container {

  display: flex;

  flex-wrap: wrap;

}



.flex-item {

  background: tomato;

  padding: 5px;

  min-width: 200px;

  width:calc(100%/5 - 20px); /*5 columns*/

  height: 100px;

  margin: 10px;



  line-height: 100px;

  color: white;

  font-weight: bold;

  font-size: 2em;

  text-align: center;

  box-sizing:border-box;

}


<div class="flex-container wrap">

  <div class="flex-item">1</div>

  <div class="flex-item">2</div>

  <div class="flex-item">3</div>

  <div class="flex-item">4</div>

  <div class="flex-item">5</div>

  <div class="flex-item">6</div>

  <div class="flex-item">7</div>

  <div class="flex-item">8</div>

</div>

在这里,您还需要考虑边距,您可以使用CSS变量轻松地使它更加灵活:

.flex-container {

  display: flex;

  flex-wrap: wrap;

}



.flex-item {

  --m:10px;

  background: tomato;

  padding: 5px;

  min-width: 200px;

  width:calc(100%/5 - 2*var(--m)); /*5 columns*/

  height: 100px;

  margin: var(--m);



  line-height: 100px;

  color: white;

  font-weight: bold;

  font-size: 2em;

  text-align: center;

  box-sizing:border-box;

}


<div class="flex-container wrap">

  <div class="flex-item">1</div>

  <div class="flex-item">2</div>

  <div class="flex-item">3</div>

  <div class="flex-item">4</div>

  <div class="flex-item">5</div>

  <div class="flex-item">6</div>

  <div class="flex-item">7</div>

  <div class="flex-item">8</div>

</div>

您还可以考虑flex-grow是否希望元素始终扩展(即使有换行),但是您可能会遇到需要修复一些问题的最后一行的问题:

.flex-container {

  display: flex;

  flex-wrap: wrap;

  --m:10px;

}



.flex-item {

  background: tomato;

  padding: 5px;

  min-width: 200px;

  flex-grow:1;

  width:calc(100%/5 - 2*var(--m)); /*5 columns*/

  height: 100px;

  margin: var(--m);



  line-height: 100px;

  color: white;

  font-weight: bold;

  font-size: 2em;

  text-align: center;

  box-sizing:border-box;

}



.flex-container span {

  min-width: 200px;

  flex-grow:1;

  width:calc(100%/5 - 2*var(--m)); /*5 columns*/

  margin:0 var(--m);

}


<div class="flex-container wrap">

  <div class="flex-item">1</div>

  <div class="flex-item">2</div>

  <div class="flex-item">3</div>

  <div class="flex-item">4</div>

  <div class="flex-item">5</div>

  <div class="flex-item">6</div>

  <div class="flex-item">7</div>

  <div class="flex-item">8</div>



  <!-- 4 empty elements to fix the issue (we can also use pseudo element) -->

  <span></span>

  <span></span>

  <span></span>

  <span></span>

</div>

在下面的示例中,我们将列数设置为5,因此,如果在最后一行中有1-4个元素,则至少需要4个空元素才能解决此问题。当然,这是一个缺点,但是由于您知道列数,因此可以轻松设置这些空元素,并且不需要任何JS。

为了使其更加灵活,这是一个带有CSS变量的想法:

.flex-container {

  display: flex;

  flex-wrap: wrap;

  border:1px solid;

  --m:10px;

  --n:5;

  --width:150px;

}



.flex-item {

  background: tomato;

  min-width: var(--width);

  flex-grow:1;

  width:calc(100%/var(--n) - 2*var(--m));

  height: 50px;

  margin: var(--m);



  box-sizing:border-box;

}



.flex-container span {

  display:contents; /* each span will give us 2 elements*/

}

.flex-container span:before,

.flex-container span:after,

.flex-container:before,

.flex-container:after{

  content:"";

  min-width: var(--width);

  flex-grow:1;

  width:calc(100%/var(--n) - 2*var(--m));

  margin:0 var(--m);

  order:1; /*we make sure they are at the end*/

}


<div class="flex-container wrap">

  <div class="flex-item">1</div>

  <div class="flex-item">2</div>

  <div class="flex-item">3</div>

  <div class="flex-item">4</div>

  <div class="flex-item">5</div>

  <div class="flex-item">6</div>

  <div class="flex-item">7</div>

  <div class="flex-item">8</div>



  <!-- a lot of elements !! -->

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

</div>



<div class="flex-container wrap" style="--n:10">

  <div class="flex-item">1</div>

  <div class="flex-item">2</div>

  <div class="flex-item">3</div>

  <div class="flex-item">4</div>

  <div class="flex-item">5</div>

  <div class="flex-item">6</div>

  <div class="flex-item">7</div>

  <div class="flex-item">8</div>



  <!-- a lot of elements !! -->

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

</div>



<div class="flex-container wrap" style="--n:3">

  <div class="flex-item">1</div>

  <div class="flex-item">2</div>

  <div class="flex-item">3</div>

  <div class="flex-item">4</div>

  <div class="flex-item">5</div>

  <div class="flex-item">6</div>

  <div class="flex-item">7</div>

  <div class="flex-item">8</div>



  <!-- a lot of elements !! -->

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

  <span></span>

</div>

我曾经display:contents能够设置N个空元素,以后将其视为2 * N,这可以减少代码。

如果您将有7列,我们将只需要6个额外的元素。我们可以使用两个伪元素,然后仅使用2个空元素来覆盖其余的4个。



 类似资料:
  • 我目前正在努力获得一个CSS网格来处理一些较小屏幕尺寸的媒体查询。我基本上有一个两行三列的网格,在较小的屏幕尺寸下,它可以向下延伸到三行两列。我想让它进入一个网格,在一个电话大小的屏幕上有6行和一个主列。以下是我目前的代码: } 这在很大程度上是可行的。然而,出于某种奇怪的原因,尽管我在上面做了一些粗制滥造的努力,但这些框并没有集中在较小的屏幕上。下面是完整的代码笔来说明我的问题:https://

  • 问题内容: 编写CSS媒体查询时,有什么方法可以使用“或”逻辑指定多个条件? 我正在尝试做这样的事情: 问题答案: 使用逗号指定两个(或多个)不同的规则: 从https://developer.mozilla.org/en/CSS/Media_queries/ …此外,您可以在逗号分隔的列表中组合多个媒体查询;如果列表中的任何媒体查询为true,则将应用关联的样式表。这等效于逻辑“或”运算。

  • 主要内容:1. 媒体类型,2. 媒体特性,3. 逻辑操作符,4. 定义媒体查询随着移动设备的快速普及,用户不再只是通过传统的电脑系来浏览 Web 内容,越来越多的用户开始使用各种尺寸的智能手机、平板电脑或者其它设备来浏览 Web 内容,为了确保使用不同设备的用户都能拥有不错的体验就需要用到媒体查询。 媒体查询是 CSS 样式表最重要的功能之一,所谓媒体查询指的就是根据不同的媒体类型(设备类型)和条件来区分各种设备(例如:电脑、手机、平板电脑、盲文设备等),并为它们分别定义不

  • 问题内容: iPhone 5的屏幕更长,无法捕捉到我网站的移动视图。iPhone 5新增了哪些响应式设计查询,可以与现有iPhone查询结合使用吗? 我当前的媒体查询是这样的: 问题答案: 另一个有用的媒体功能是。 请注意, iPhone 5没有16:9的宽高比 。实际上是40:71。 iPhone <5: iphone 5: iPhone 6: iPhone 6 Plus: iPad:

  • 我已经尝试了几个小时来解决这个问题,我正在努力,不管我做什么,它拒绝在我添加max-width或min-width的瞬间调用媒体标记中的CSS。为了测试,我让media标记使主体变红,并将min-width降低到可笑的低。什么都没发生。如果我留下屏幕标记而不留下任何其他东西,它就会调用它 CSS: HTML: 请原谅代码的绝对混乱,但我还没来得及清理这个问题,就在我对这个问题失去理智之前。

  • 我正在做一个装在盒子里的计数器。我试图使这个计数器对不同的屏幕大小做出响应,但由于某些原因,我试图使用的媒体查询将无法工作。 我曾尝试将设备宽度更改为768px以下,但查询对计数器没有影响,我不确定原因。我已经包括了计数器的HTML/PHP代码以及CSS。有人知道为什么它不起作用吗 我已确保此标签包含在文档的标题中。 超文本标记语言: CSS: