没有媒体查询如何实现3列桌面到1列移动布局
在这里研究了一些问题,但他们并没有完全解决我想要的东西。
说我有一个网站,我想要。在桌面上我想要:
这很容易。 网格 - 板块 - 列:重复(3,33%)
(基本上)
在移动设备上,但是,我想要此
我遇到的事情发生在它翻转之前发生到一个列:
我正在尝试clamp()
,minmax()
,以及各种各样的东西想。是的,我可以完全使用媒体查询,但是我希望使用夹具,网格,Minmax等现代CS创建真正的流体网格/Flex布局,因此不需要对基本布局更改进行媒体查询。
我知道这不起作用,但是作为要求的起点,这是我100次尝试之一的简单版本:)在此版本中,我试图使用夹具从重复(3)切换到重复(1)。
.wrapper {
display: grid;
gap: 15px;
grid-template-columns: repeat(clamp(1, calc(100% - 500px), 3), 33%);
}
.one {
background: red;
}
.two {
background: green;
}
.three {
background: blue;
}
<div class="wrapper">
<div class="item one"><h3>Example A</h3></div>
<div class="item two"><h3>Example Two</h3></div>
<div class="item three"><h3>Third Example</h3></div>
</div>
Looked into a few questions here but they don't quite solve what I'm looking for.
Say I have a website and I want. On desktop I want this:
This is easy. grid-template-columns: repeat(3, 33%)
(basically)
On mobile, however, I want this
What I'm running into is happens before it flips to a single column:
I'm trying clamp()
, minmax()
, and all sorts of things but nothing ever works as I want. Yes, I can totally use a media query but I was hoping to create a truly fluid grid/flex layout using modern CSS like clamp, grid, minmax, etc so there wouldn't be a need for media queries for basic layout changes.
I know this doesn't work but as a starting point as requested here's a simple version of one of my 100 attempts :) In this version I was trying to use clamp to switch from a repeat(3) to repeat(1).
.wrapper {
display: grid;
gap: 15px;
grid-template-columns: repeat(clamp(1, calc(100% - 500px), 3), 33%);
}
.one {
background: red;
}
.two {
background: green;
}
.three {
background: blue;
}
<div class="wrapper">
<div class="item one"><h3>Example A</h3></div>
<div class="item two"><h3>Example Two</h3></div>
<div class="item three"><h3>Third Example</h3></div>
</div>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我写了一篇详细的文章,其中包含更多通用规则: https:https://// css-tricks.com/responsive-layouts-fewer-media-ceries/
以下是一个想法,使用
max(0px,(400px-100vw)*1000 -基础。如果
100VW
(屏幕大小)大于400px
或相反的情况,则此公式将给出0px
(屏幕大小)(屏幕大小)大于400px
Bigflex-basis
并创建一个包装。只需调整400px
扮演@Media(最大宽度:400px)
的角色使用CSS网格可以如下:
我正在控制没有媒体查询的最大列数的类似问题: CSS GRID-无媒体查询的最大列数
我们可以扩展上述解决方案以考虑更复杂的情况。
从6到3到1列的示例:
要了解值考虑以下范围:
要获取6列,我们需要在范围
>>] 14.3%16.7%]
(我考虑15%
)中。要获取3列,我们需要在范围内的值
] 25%33.3%]
(我考虑了30%
),我们只是避免使用边缘,以确保我们计算空白。
一个使用CSS变量的更通用的解决方案,我将添加
0.1%
,以确保该值足够大以获得所需的列数,并且可以保持差距。我们还添加一些动态的颜色(相关:如何根据其高度或宽度更改&lt; div; div; div; div; >)
使用Flexbox,我们可以具有不同的(可能想要的)行为,其中一行的最后一项将占据所有自由空间:
I wrote a detailed article with more generic rules: https://css-tricks.com/responsive-layouts-fewer-media-queries/
Here is an idea using
max(0px, (400px - 100vw)*1000)
inside flex-basis. This formula will eiter give0px
if100vw
(screen size) is bigger than400px
or a very big value in the opposite case giving each element a bigflex-basis
and create a wrapping. Simply adjust the400px
which play the role of@media (max-width:400px)
Using CSS grid it can be like below:
A similar question where I am controling the maximum number of columns without media query: CSS grid - maximum number of columns without media queries
We can scale the above solution to consider more complex cases.
Example of moving from 6 to 3 to 1 column:
To understand the values consider the following ranges:
To get 6 columns we need a value in the range
]14.3% 16.7%]
(I considered15%
)To get 3 columns we need a value in the range
]25% 33.3%]
(I considered30%
)We simply avoid the edges to make sure we account for the gaps.
A more generic solution using CSS variables where I will add
0.1%
to make sure the value is big enough to get the needed number of column and it can hold the gap.Let's also add some dynamic coloration (related: How to change the color of <div> Element depending on its height or width?)
Using flexbox where we can have a different (probably wanted) behavior where the last item of a row will take all the free space:
您可以通过这样的网格来实现这一点:
You can achive this by using grid like this:
@Temani的答案是傻瓜,但很棒:)。我需要为4列布局实施类似的东西(分解2个Cols然后是1个Col),但发现替换25和50的15个和30个百分比值不起作用。这似乎与以下事实有关,即需要考虑网格差距的百分比,因此 @temani的答案仅是因为“错误”而真正起作用。因此,基于4个Col网格的更强大的(甚至更多的刺激性)解决方案是:
@Temani's answer is bonkers but great :). I needed to implement a similar thing for a 4 column layout (breaking to 2 cols then 1 col) but found that replacing the 15 and 30 percentage values for 25 and 50 didn't work. This seems to be related to the fact that the percentages need to take account of the grid gap, so @Temani's answer only really works because of the rounding 'error'. So a more robust (if even more bonkers) solution, based on a 4 col grid is: