CSS Grid Layout是一种允许创建网格的W3C技术。它不需要使用浮动,表格,绝对定位甚至flexbox(另一种CSS3技术)来构建各种网格,从简单到复杂。一般情况下,请勿将此标记用于CSS网格系统。
我正在布局一个 3x2 网格,每个单元格中包含图像、标题和文本。如果文本比同一行中的其他文本短,则会在顶部创建一个空白,并且内容向下移动。 我
我想要一个响应式网格布局,其中列数根据屏幕尺寸动态变化。如果项目少于列,则它们应该使用可用空间或至少居中......
我在容器内有一个导航下拉菜单。提供的 HTML 和 CSS 代码旨在显示语言下拉菜单。但是,我遇到了容器宽度不符合的问题
我在将 border-radius 应用于 CSS 中的容器元素时遇到问题。尽管设置了 border-radius 属性,但它似乎没有生效。 这是我的代码: * { 填充:0;
在Css-grid上设置grid-gap以自动填充可用的水平空间
我正在尝试计算 Css 网格的“grid-gap”属性,以使用 Sass 填充所有可用空间。 这是我的设置。 //不想使用javascript //scss $宽度:250px; .产品网格{...
相同高度项目的网格,在项目外部带有条件“横幅”,无需明确设置高度
我正在尝试实现以下网格: HTML 结构如下: 。容器 { 显示:网格; 间隙:16px; 网格模板列:重复(自动填充,minmax(100px,1fr)); } .容器&...
我想要的最终结果是这样的,我能够得到的结果也是这样的。 基本上,当卡片溢出其父级时,我希望卡片以固定宽度重叠。 当它没有溢出时...
我想要的最终结果是这样的,我能够得到的结果也是这样的。 基本上,当卡片溢出其父级时,我希望卡片以固定宽度重叠。 当它没有溢出时...
在具有两列的网格布局中,我有几行具有相似的内容,而最后一行在其第一个单元格中具有较长的文本。 我使用 display: inline-grid 和 grid-template-columns: auto aut...
我有以下代码,运行良好。 *, *::前, *::后 { 框大小:边框框; } 图像{ 宽度:100%; } 身体 { 字体系列:等宽字体; 背景颜色:aliceblue; } .con...
CSS 网格 - 使下一行采用 100% 宽度并均匀地间隔项目
我有一个连续的项目列表。我希望每个项目占据最小宽度。当用户调整屏幕大小时,我希望项目溢出到下一行。 。容器 { 显示:网格; 网格-
我目前正在为客户编写一个网站。这是一个展示他们摄影作品的作品集网站,我的布局遇到了问题。我有一个 div 作为我的父母,属于 ro 类......
是否有一个CSS网格属性可以在网格列之间添加一条规则(垂直线),在网格行之间添加一条规则(水平线),与列规则的工作方式相同或类似?
文档对于所有网格选项不是很清楚。 我在 alpinejs 中有这个网格模板,用 tailwind 对其进行样式设计: 文档对于所有网格选项不是很清楚。 我在 alpinejs 中有这个网格模板,用 tailwind 对其进行样式设计: <div x-show="multiple" class="w-auto grid mt-3" :style="`grid-template-columns: repeat(${images.length < 6 ? images.length : 6}, minmax(0, 1fr))`"> <template x-for="image in images" :key="image.name"> <div x-data="{ imgUrl: null }" x-init="() => { let reader = new FileReader(); reader.onload = e => { imgUrl = e.target.result; }; console.log('image'); console.log(image); reader.readAsDataURL(image); }" > <img :src="imgUrl" alt="image.name" class="h-24 w-auto"> </div> </template> </div> 我面临的问题是网格容器似乎保持其父级的完整宽度,并且网格元素之间存在巨大的间隙: 我想要的是每个图像都在左侧彼此很好地对齐。 这里是片段 <script src="https://cdn.tailwindcss.com"></script> <script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script> <style> [x-cloak] { display: none !important } </style> <div x-data="{ inputId: 'blabla', selectedFileName: '', fileInput: null, multiple: true, images: [], imgCols: 0 }" x-init="() => { fileInput = document.getElementById(inputId); }" class="w-full" x-on:drop="$event => { $event.preventDefault(); const dataTransfer = new DataTransfer(); if (multiple) { Array.from(fileInput.files).forEach(file => { dataTransfer.items.add(file); }); } Array.from($event.dataTransfer.files).forEach(file => { dataTransfer.items.add(file); }); fileInput.files = dataTransfer.files; if (!multiple) { selectedFileName = $event.dataTransfer.files[0].name; } else { images = Array.from(fileInput.files); } fileInput.dispatchEvent(new Event('change', { bubbles: true })); }" x-on:dragover.prevent="() => console.log('drag over prevented')" > <label class="flex justify-center w-full h-32 px-4 transition bg-white border-2 border-gray-300 border-dashed rounded-md appearance-none cursor-pointer hover:border-gray-400 focus:outline-none" > <span class="flex items-center space-x-2"> <x-icon name="upload" /> <span class="font-medium text-gray-600"> drop or <span class="text-blue-600 underline">browse</span> </span> </span> <input id="blabla" type="file" name="file_upload" > </label> <div x-cloak class="w-full text-center" x-show="selectedFileName"> files selected: <span x-text="selectedFileName"></span> </div> <div x-show="multiple" class="w-auto grid mt-3" :style="`grid-template-columns: repeat(${images.length < 6 ? images.length : 6}, minmax(0, 1fr))`"> <template x-for="image in images" :key="image.name"> <div x-data="{ imgUrl: null }" x-init="() => { let reader = new FileReader(); reader.onload = e => { imgUrl = e.target.result; }; reader.readAsDataURL(image); }" > <img :src="imgUrl" alt="image.name" class="h-24 w-auto"> </div> </template> </div> </div> 谢谢。 空白是由于网格轨道列比它们包含的图像宽而引起的。这是由于 minmax(0, 1fr) 内的 repeat() 值造成的。该值意味着网格列轨道的宽度允许增加到 1“份额”的空间。 为了防止这种行为,您可以考虑在 repeat() 中使用不同的值,例如 max-content: <script src="https://cdn.tailwindcss.com"></script> <script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script> <style> [x-cloak] { display: none !important; } </style> <div x-data="{ inputId: 'blabla', selectedFileName: '', fileInput: null, multiple: true, images: [], imgCols: 0 }" x-init="() => { fileInput = document.getElementById(inputId); }" class="w-full" x-on:drop="$event => { $event.preventDefault(); const dataTransfer = new DataTransfer(); if (multiple) { Array.from(fileInput.files).forEach(file => { dataTransfer.items.add(file); }); } Array.from($event.dataTransfer.files).forEach(file => { dataTransfer.items.add(file); }); fileInput.files = dataTransfer.files; if (!multiple) { selectedFileName = $event.dataTransfer.files[0].name; } else { images = Array.from(fileInput.files); } fileInput.dispatchEvent(new Event('change', { bubbles: true })); }" x-on:dragover.prevent="() => console.log('drag over prevented')" > <label class="flex justify-center w-full h-32 px-4 transition bg-white border-2 border-gray-300 border-dashed rounded-md appearance-none cursor-pointer hover:border-gray-400 focus:outline-none" > <span class="flex items-center space-x-2"> <x-icon name="upload" /> <span class="font-medium text-gray-600"> drop or <span class="text-blue-600 underline">browse</span> </span> </span> <input id="blabla" type="file" name="file_upload" /> </label> <div x-cloak class="w-full text-center" x-show="selectedFileName"> files selected: <span x-text="selectedFileName"></span> </div> <div x-show="multiple" class="w-auto grid mt-3" :style="`grid-template-columns: repeat(${images.length < 6 ? images.length : 6}, max-content)`" > <template x-for="image in images" :key="image.name"> <div x-data="{ imgUrl: null }" x-init="() => { let reader = new FileReader(); reader.onload = e => { imgUrl = e.target.result; }; reader.readAsDataURL(image); }" > <img :src="imgUrl" alt="image.name" class="h-24 w-auto" /> </div> </template> </div> </div>
是否有一种聪明而简单的方法将元素从左下角浮动到右上角? 我的 display:grid 解决方案过于静态,并且具有固定的列且不超过 10 个项目。我正在寻找...
我使用 CSS Grid 和 Div 元素创建了一个数据表。以前,我使用 Display Flex,但在使用 Div 元素实现 rowspan 和 colspan 时遇到了困难。 HTML 代码: 我使用 CSS Grid 和 Div 元素创建了一个数据表。以前,我使用 Display Flex,但在使用 Div 元素实现 rowspan 和 colspan 时遇到了麻烦。 HTML 代码: <div class="container"> <div class="grid-responsive"> <div class="grid rounded border"> <div class="grid-header"> <div class="grid-row"> <div class="grid-col grid-col-head">#</div> <div class="grid-col grid-col-head">First Name</div> <div class="grid-col grid-col-head">Last Name</div> <div class="grid-col grid-col-head">Roll</div> </div> </div> <div class="grid-body"> <div class="grid-row"> <div class="grid-col grid-col-tbody">1</div> <div class="grid-col grid-col-tbody">Sandip</div> <div class="grid-col grid-col-tbody">Saha</div> <div class="grid-col grid-col-tbody">10</div> </div> <div class="grid-row"> <div class="grid-col grid-col-tbody">2</div> <div class="grid-col grid-col-tbody">Rahul</div> <div class="grid-col grid-col-tbody">Saha</div> <div class="grid-col grid-col-tbody">20</div> </div> </div> </div> </div> </div> CSS代码: .grid-responsive{ overflow-x: auto; -webkit-overflow-scrolling: touch; } .grid .grid-header{ background-color: #e2e3e5; color: #000; } .grid .grid-row{ display: grid; grid-template-columns: 50px repeat(2, 1fr) 100px; } .grid .grid-row .grid-col{ padding: .5rem .5rem; border-right: 1px solid #cfd0d2; border-bottom: 1px solid #cfd0d2; } .grid .grid-row .grid-col:last-child{ border-right: none; } .grid .grid-row:last-child .grid-col{ border-bottom: none; } 演示 要使用 rowspan,我们使用 'grid-row' CSS 属性 要使用 colspan,我们使用 'grid-column' CSS 属性 尝试在代码中使用它- HTML- <div class="container"> <div class="grid-responsive"> <div class="grid rounded border"> <div class="grid-header"> <div class="grid-row"> <div class="grid-col grid-col-head">#</div> <div class="grid-col grid-col-head">First Name</div> <div class="grid-col grid-col-head">Last Name</div> <div class="grid-col grid-col-head">Roll</div> </div> </div> <div class="grid-body"> <div class="grid-row"> <div class="grid-col grid-col-tbody">1</div> <div class="grid-col grid-col-tbody">Sandip</div> <div class="grid-col grid-col-tbody">Saha</div> <div class="grid-col grid-col-tbody">10</div> </div> <div class="grid-row"> <div class="grid-col grid-col-tbody">2</div> <div class="grid-col grid-col-tbody" style="grid-column: span 2;">Rahul Saha</div> <div class="grid-col grid-col-tbody">20</div> </div> <div class="grid-row"> <div class="grid-col grid-col-tbody" style="grid-row: span 2;">3</div> <div class="grid-col grid-col-tbody">Priya</div> <div class="grid-col grid-col-tbody">Singh</div> <div class="grid-col grid-col-tbody">30</div> </div> </div> </div> </div> </div> CSS- .grid-responsive { overflow-x: auto; -webkit-overflow-scrolling: touch; } .grid .grid-header { background-color: #e2e3e5; color: #000; } .grid .grid-row { display: grid; grid-template-columns: 50px repeat(2, 1fr) 100px; } .grid .grid-row .grid-col { padding: .5rem .5rem; border-right: 1px solid #cfd0d2; border-bottom: 1px solid #cfd0d2; } .grid .grid-row .grid-col:last-child { border-right: none; } .grid .grid-row:last-child .grid-col { border-bottom: none; } .grid-col-head { font-weight: bold; } .grid-col-tbody { background-color: #fff; }
未定义高度时,CSS 网格中的基线垂直对齐在 Firefox 和 Safari 中不起作用
我需要将多个带有图片和标题的项目排列在网格的一行中,如下所示: 图片的长宽比是已知的。 柱的数量是已知的。 网格的宽度继承自...
我有以下 HTML: A B CD AAA 我有以下 HTML: <ul> <li> <p>A</p> <p>B</p> <p>C</p <p>D</p> </li> <li> <p>AAA</p> <p>BBB</p> <p>CCC</p <p>DDD</p> </li> <li> <p>A</p> <p>B</p> <p>C</p <p>D</p> </li> <li> <p>AAAAAA</p> <p>BBBBBB</p> <p>CCCCCC</p <p>DDDDDD</p> </li> </ul> li的实际数量是可变的,但每个li始终有4个p标签。 我想将其布局在 CSS 网格中: +--------+--------+--------+--------+ | A | B | C | D | +--------+--------+--------+--------+ | AAA | BBB | CCC | DDD | +--------+--------+--------+--------+ | A | B | C | D | +--------+--------+--------+--------+ | AAAAAA | BBBBBB | CCCCCC | DDDDDD | +--------+--------+--------+--------+ 因此 ul 有一个包含 4 列的网格,每个 li 都是一个子网格。 但是当屏幕宽度小于650px时,我想将布局切换为两列布局,并重新排序p标签: +--------+--------+ | A | C | +--------+--------+ | B | D | +--------+--------+ | AAA | CCC | +--------+--------+ | BBB | DDD | +--------+--------+ | A | C | +--------+--------+ | B | D | +--------+--------+ | AAAAAA | CCCCCC | +--------+--------+ | BBBBBB | DDDDDD | +--------+--------+ 这是我目前拥有的: ul { list-style: none; display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-areas: "a b c d"; } li { display: grid; grid-template-columns: subgrid; grid-template-rows: subgrid; grid-column: span 4; } li p:nth-of-type(1) { grid-area: a; } li p:nth-of-type(2) { grid-area: b; } li p:nth-of-type(3) { grid-area: c; } li p:nth-of-type(4) { grid-area: d; } @media (max-width: 650px) { ul { grid-template-columns: 1fr 1fr; grid-template-areas: "a c" "b d"; } li { grid-row: span 2; } } 前两行显示正确,但之后“a c”和“b d”行相互重叠。 怎样才能让布局不重叠? ul { list-style: none; display: grid; grid-template-columns: repeat(4, 1fr); /* Define 4 columns */ gap: 10px; /* Optional: adds gap between rows/columns */ } li { display: grid; grid-template-columns: repeat(4, 1fr); /* Each li also has 4 columns */ } li p:nth-of-type(1) { grid-column: 1; /* Position first p in the first column */ } li p:nth-of-type(2) { grid-column: 2; /* Position second p in the second column */ } li p:nth-of-type(3) { grid-column: 3; /* Position third p in the third column */ } li p:nth-of-type(4) { grid-column: 4; /* Position fourth p in the fourth column */ } @media (max-width: 650px) { ul { grid-template-columns: repeat(2, 1fr); /* Only 2 columns in the ul */ } li { grid-template-columns: repeat(2, 1fr); /* Each li has 2 columns */ } li p:nth-of-type(1), /* A and C are in the first column */ li p:nth-of-type(3) { grid-column: 1; } li p:nth-of-type(2), /* B and D are in the second column */ li p:nth-of-type(4) { grid-column: 2; } } 列出项目 在媒体查询中:网格切换为 ul 和 li 的 2 列。 p 元素重新定位,使得 A 和 C 位于第一列,B 和 D 位于第二列。
我想要使用网格布局的粘性卡布局。这就是我设法实现的目标: 1 我想使用网格布局来设计粘性卡的布局。这就是我设法实现的目标: <div class="cards"> <div class="card">1</div> <div class="card">2</div> <div class="card">3</div> <div class="card">4</div> <div class="card">5</div> </div> :root { --card-top-offset: 3rem; --card-h: 36rem; } .cards { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: calc(var(--card-h) / 2); align-items: baseline; } .card { position: sticky; top: 0; height: var(--card-h); transition: all 0.5s; } for (const cards of document.querySelectorAll(".cards")) { let i = 0; for (const card of cards.children) { if (card.classList.contains("card")) { card.style.top = `calc(5vh + ${i} * var(--card-top-offset))`; i += 1; } } cards.style.setProperty( "grid-template-rows", `repeat(${i}, var(--card-h))`, ); } 前 4 张卡效果很好,但第五张卡比我预期的要早脱开。我认为这是因为父元素 cards 正在结束。有没有办法使用 css 网格来实现这种行为?我发现了一些其他方法,但它涉及对某些元素的某些高度进行硬编码,我想避免这种情况。 您遇到的问题是由于粘性定位依赖于父容器的高度。当父容器结束时,粘性元素无法再粘在顶部。为了实现您正在寻找的行为,您可以利用 CSS 网格进行一些调整。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Sticky Cards</title> <style> :root { --card-top-offset: 3rem; --card-h: 36rem; } body { margin: 0; padding: 0; font-family: Arial, sans-serif; } .cards { display: grid; grid-template-columns: repeat(1, minmax(0, 1fr)); gap: calc(var(--card-h) / 2); align-items: baseline; position: relative; padding-top: 5vh; } .card { position: sticky; top: calc(5vh + var(--card-top-offset) * var(--i)); height: var(--card-h); transition: all 0.5s; background: lightblue; } .card:nth-child(1) { --i: 0; } .card:nth-child(2) { --i: 1; } .card:nth-child(3) { --i: 2; } .card:nth-child(4) { --i: 3; } .card:nth-child(5) { --i: 4; } </style> </head> <body> <div class="cards"> <div class="card">1</div> <div class="card">2</div> <div class="card">3</div> <div class="card">4</div> <div class="card">5</div> </div> </body> </html> 这里,每张卡片都有一个 --i 自定义属性,用于确定其相对于顶部的位置。这避免了硬编码高度并允许更动态的设置。位置:粘性仍被使用,但具有计算的顶部偏移量。