javascript - 光标位置到 CSS 网格位置

标签 javascript css css-grid

我有一个 CSS 网格布局,并且想要获取光标下方的单元格位置。 想象一下下面的例子:

enter image description here

如果我的光标位于图像中星星所在的位置,我正在寻找一个返回 {grid-row-start: 2, grid-row-end: 3, grid-column-start :5,网格列结束:6}

你们中有人知道执行此操作的 native 函数吗?或者我必须自己计算这些值? 谢谢:)

我的示例的代码如下所示:

<html>
    <head>
        <style>
            .container {
                display: grid;
                grid-gap: 10px;
                background-color: blue;
                grid-template-columns: repeat(6, 1fr);
                height: 400px;
            }
            .container div {
                background-color: green;
            }
            .grid-stack-item {
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="2" data-gs-height="1">
                <div class="grid-stack-item-content">1</div>
            </div>
            <div class="grid-stack-item" data-gs-x="2" data-gs-y="0" data-gs-width="2" data-gs-height="2">
                <div class="grid-stack-item-content">2</div>
            </div>
            <div class="grid-stack-item" data-gs-x="4" data-gs-y="0" data-gs-width="1" data-gs-height="1">
                <div class="grid-stack-item-content" style="overflow: hidden">3</div>
            </div>
            <div class="grid-stack-item" data-gs-x="5" data-gs-y="0" data-gs-width="1" data-gs-height="1">
                <div class="grid-stack-item-content"> 4</div>
            </div>
            <div class="grid-stack-item" data-gs-x="0" data-gs-y="1" data-gs-width="1" data-gs-height="1">
                <div class="grid-stack-item-content">5</div>
            </div>
            <div class="grid-stack-item" data-gs-x="1" data-gs-y="1" data-gs-width="1" data-gs-height="2">
                <div class="grid-stack-item-content">6</div>
            </div>

            <div class="grid-stack-item" data-gs-x="0" data-gs-y="2" data-gs-width="1" data-gs-height="1">
                <div class="grid-stack-item-content">8</div>
            </div>
            <div class="grid-stack-item" data-gs-x="2" data-gs-y="2" data-gs-width="2" data-gs-height="1">
                <div class="grid-stack-item-content">9</div>
            </div>
            <div class="grid-stack-item" data-gs-x="4" data-gs-y="2" data-gs-width="1" data-gs-height="1">
                <div class="grid-stack-item-content">10</div>
            </div>
            <div class="grid-stack-item" data-gs-x="5" data-gs-y="2" data-gs-width="1" data-gs-height="1">
                <div class="grid-stack-item-content">11</div>
            </div>
        </div>
    <script>
        for(let elm of document.getElementsByClassName('grid-stack-item')){
            elm.style['grid-column-start'] = parseInt(elm.getAttribute('data-gs-x')) + 1;
            elm.style['grid-column-end'] = parseInt(elm.getAttribute('data-gs-x')) + parseInt(elm.getAttribute('data-gs-width')) + 1;
            elm.style['grid-row-start'] = parseInt(elm.getAttribute('data-gs-y')) +1 ;
            elm.style['grid-row-end'] = parseInt(elm.getAttribute('data-gs-y')) + parseInt(elm.getAttribute('data-gs-height')) +1;
        }
    </script>
    </body>

</html>

最佳答案

您想要做的是找出鼠标悬停在哪个元素上,然后从该元素获取 window.getCompulatedStyle(element).gridColumnStart (以及其他)。

最简单的方法是向每个 grid-stack-item 元素添加一个 mouseenter 事件。

这是一个粗略的示例:

let currentCellPosition = {
  "grid-row-start": null,
  "grid-row-end": null,
  "grid-column-start": null,
  "grid-column-end": null
}

Array.from(document.getElementsByClassName("grid-stack-item")).forEach(element => {
  element.addEventListener("mouseenter", () => {
    const style = window.getComputedStyle(element);
    currentCellPosition = {
      "grid-row-start": style.gridRowStart,
      "grid-row-end": style.gridRowEnd,
      "grid-column-start": style.gridColumnStart,
      "grid-column-end": style.gridColumnEnd
    }
  })
})

在此示例中,currentCellPosition 将始终具有最新的单元格位置。

document.addEventListener("DOMContentLoaded", () => {
  const output = document.getElementById("output");

  Array.from(document.getElementsByClassName("cell")).forEach(element => {
    element.addEventListener("mouseenter", () => {
    const style = window.getComputedStyle(element)
      output.innerHTML = `
      row start: ${style.gridRowStart}
      row end: ${style.gridRowEnd}
      column start: ${style.gridColumnStart}
      column end: ${style.gridColumnEnd}
      `;
    })
  })
});
.container {
  border: 2px solid green;
  display: grid;
  grid-template-columns: auto auto;
  grid-template-rows: auto auto;
  height: 200px;
  width: 100%;
}

.a {
  grid-row-start: 1;
  grid-row-end: 2;
  grid-column-start: 1;
  grid-column-end: 2;
  background-color: lightblue;
}
.b {
  grid-row-start: 2;
  grid-row-end: 3;
  grid-column-start: 1;
  grid-column-end: 3;
  background-color: orange;
}
.c {
  grid-row-start: 1;
  grid-row-end: 2;
  grid-column-start: 2;
  grid-column-end: 3;
  background-color: lightgreen;
}
<div class="container">
  <div class="a cell"></div>
  <div class="b cell"></div>
  <div class="c cell"></div>
</div>

<p id="output">

</p>

关于javascript - 光标位置到 CSS 网格位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59825813/

相关文章:

html - 对齐 CSS 网格布局卡上的元素

css - 如何在 <blockquote> 中剪辑 <img>

javascript - 仅当标题悬停时,如何设置我的菜单才能滑出?

javascript - 为什么 "@grant randominvalidsetting"会激活沙箱?

javascript - 如何使用 i18next 和 Angular 插件进行翻译?

javascript - 我怎样才能 .slidetoggle 一个 div 另一个 div 中字符串的 .length

html - 仅CSS的砌体布局

html - 如果我使用 CSS Grid,是否应该为每个 HTML 页面创建一个新的 CSS 文件?

javascript - 使用指向不同质量版本的源更改视频质量

javascript - VideoJs/Javascript |字幕不起作用