css - 如何避免在页面加载时使用 CSS grid-template-columns 进行布局转换?
问题描述
我正在使用以下 CSS 在我的网站上创建一个瓷砖网格。
.columns-grid-maxcolumns { display:grid; grid-auto-flow:row; grid-template-columns:repeat(auto-fit,minmax(20em,1fr)); align-content:start; margin:1em; gap:1em; }
该代码工作正常,但是在加载页面时我得到了“布局转换”。如果我进入开发人员模式并限制带宽并加载页面,我首先会看到一列,然后是两列,然后是三列,依此类推,具体取决于屏幕的宽度。有没有办法避免页面加载时出现这种布局变化?网站是https://portfoliotoolbox.com
解决方案
我使用以下媒体查询自己想出了一个解决方案:
@media (min-width:730px) { .columns-grid-maxcolumns section { max-width:calc((100vw - 1em) / 2 - 1em); } }
@media (min-width:1066px) { .columns-grid-maxcolumns section { max-width:calc((100vw - 1em) / 3 - 1em); } }
@media (min-width:1402px) { .columns-grid-maxcolumns section { max-width:calc((100vw - 1em) / 4 - 1em); } }
@media (min-width:1696px) { .columns-grid-maxcolumns section { max-width:calc((100vw - 1em) / 5 - 1em); } }
在这个解决方案中,我的图块是在<section>
标签中定义的。如果 CSS calc() 函数支持整数下限算法,则可以避免媒体查询。显示的列数 = floor((100vw - 1em) / 22em)。这些数字在上面的媒体查询中表示为常量 2、3、4 和 5。
更新
我不得不根据媒体查询对网格模板列进行硬编码,以完全摆脱布局转换。对于 5 列或更多列,我只是默认为 grid-template-columns 的原始声明,该声明适用于任意数量的列,并且会受到布局偏移的影响。
.columns-grid-maxcolumns { display:grid; grid-auto-flow:row; grid-template-columns:1fr; align-content:start; margin:1em; gap:1em; }
.columns-grid-maxcolumns section { border-radius:1ex; max-width:calc(100vw - 2em); }
@media (min-width:730px) { .columns-grid-maxcolumns { grid-template-columns:1fr 1fr; } .columns-grid-maxcolumns section { max-width:calc((100vw - 1em) / 2 - 1em); } }
@media (min-width:1066px) { .columns-grid-maxcolumns { grid-template-columns:1fr 1fr 1fr; } .columns-grid-maxcolumns section { max-width:calc((100vw - 1em) / 3 - 1em); } }
@media (min-width:1402px) { .columns-grid-maxcolumns { grid-template-columns:1fr 1fr 1fr 1fr; } .columns-grid-maxcolumns section { max-width:calc((100vw - 1em) / 4 - 1em); } }
@media (min-width:1696px) { .columns-grid-maxcolumns { grid-template-columns:repeat(auto-fit,minmax(20em,1fr)); } }
推荐阅读
- sql - 如何解决“没有为'r'的第1列指定列”
- python - 只能使用{}而不是传入python?
- jena - 如何将 Jena 结果集加载到 Jena 模型
- css - 我正在尝试为 href="" 和使用 css的内容自动使用(几乎)相同的文本
- laravel - 用于更新的 Livewire 通行证 ID
- r - 插值以获得 R 中的某个值
- python-3.x - Django Queryset 而不是 view.py 中的 for 循环和 if 语句
- php - 在文件顶部添加带有 php simplexml 的新子节点
- python-3.x - 如何让 Tensorflow 使用更多的 RAM?
- c++ - 监视剪贴板更改 c++ 适用于所有应用程序 (Windows)