我try 创建一个具有可配置项的网格系统来设置位置和大小. 问题是,高度/宽度设置对网格项目没有影响.它们保持与1x1相同的大小,第一项不占用2x1:

const items = [{
    x: 0,
    y: 0,
    w: 2,
    h: 1
}, {
    x: 2,
    y: 2,
    w: 1,
    h: 1
}, {
    x: 3,
    y: 3,
    w: 1,
    h: 1
}];



document.addEventListener("DOMContentLoaded", () => {

    let numCols = 3;
    let numRows = 3;

    let gridContainer = document.getElementById("grid-container");


    gridContainer.style.gridTemplateColumns = `repeat(${numCols}, 1fr)`;
    gridContainer.style.gridTemplateRows = `repeat(${numRows}, 1fr)`;


    items.forEach((obj, i) => {

        let elem = document.createElement("div");

        elem.classList.add("grid-item");
        elem.textContent = `#${i} - ${obj.x}, ${obj.y}`;

        // Set the position dynamically
        elem.style.gridRow = `${obj.x} / span ${obj.w}`;
        elem.style.gridColumn = `${obj.y} / span ${obj.h}`;

        gridContainer.appendChild(elem);

    });

});
body, html {
  height: 100%;
  margin: 0;
  overflow: hidden;
}

#grid-container {
  display: grid;
  height: 100vh;
  /*gap: 1px; /* Optional: Add gap between grid items */
}

.grid-item {
  border: 1px solid #ccc;
  display: flex;
  align-items: center;
  justify-content: center;
}
<!DOCTYPE html>
<html lang="en">
<head>

  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="style.css">
  <title>Full-Height Grid System</title>
  
</head>
<body>

  <div id="grid-container"></div>
  <script src="script.js"></script>

</body>
</html>

为什么忽略第一个元素的宽度设置?

Actual result: enter image description here

Wanted result: enter image description here

推荐答案

You made two mistakes.

第一个错误:

首先,您不能设置grid-row-start: 0;(与Column相同),这就是内联样式甚至没有应用到您的第一个div的原因.数字必须是非零整数.

因此,对于您的第一件物品,而不是

{ x: 0, y: 0; w: 2, h: 1 }

它必须是

{ x: 1, y: 1; w: 2, h: 1 }

第二个错误:

您为行和列使用了错误的参数,您需要交换这些参数:

elem.style.gridRow = `${obj.x} / span ${obj.w}`;
elem.style.gridColumn = `${obj.y} / span ${obj.h}`;

应该是

elem.style.gridRow = `${obj.x} / span ${obj.h}`;
elem.style.gridColumn = `${obj.y} / span ${obj.w}`;

const items = [{
    x: 1,
    y: 1,
    w: 2,
    h: 1
}, {
    x: 2,
    y: 2,
    w: 1,
    h: 1
}, {
    x: 3,
    y: 3,
    w: 1,
    h: 1
}];



document.addEventListener("DOMContentLoaded", () => {

    let numCols = 3;
    let numRows = 3;

    let gridContainer = document.getElementById("grid-container");


    gridContainer.style.gridTemplateColumns = `repeat(${numCols}, 1fr)`;
    gridContainer.style.gridTemplateRows = `repeat(${numRows}, 1fr)`;


    items.forEach(({x,y,w,h}, i) => {

        let elem = document.createElement("div");

        elem.classList.add("grid-item");
        elem.textContent = `#${i} - x:${x}, y:${y}, w:${w}, h:${h}`;

        // Set the position dynamically
        elem.style.gridRow = `${x} / span ${h}`;
        elem.style.gridColumn = `${y} / span ${w}`;

        gridContainer.appendChild(elem);

    });

});
body, html {
  height: 100%;
  margin: 0;
  overflow: hidden;
}

#grid-container {
  display: grid;
  height: 100vh;
  /*gap: 1px; /* Optional: Add gap between grid items */
}

.grid-item {
  border: 1px solid #ccc;
  display: flex;
  align-items: center;
  justify-content: center;
}
<div id="grid-container"></div>

Javascript相关问答推荐

ReactJS中的material UI自动完成类别

具有相同参数的JS类

Vue:ref不会创建react 性属性

按钮未放置在html dis位置

通过在页面上滚动来移动滚动条

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

MongoDB中的引用

扫描qr code后出错whatter—web.js

google docs boldText直到按行执行应用脚本错误

使用LocaleCompare()进行排序时,首先使用大写字母

使用GraphQL查询Uniswap的ETH价格

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

提交链接到AJAX数据结果的表单

使用VUE和SCSS的数字滚动动画(&;内容生成)

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

在SuperBase JS客户端中寻址JSON数据

JWT Cookie安全性

有没有办法通过使用不同数组中的值进行排序

Firebase函数中的FireStore WHERE子句无法执行

在不使用AJAX的情况下将JavaScript数组值传递给Laravel控制器?