如何突出显示和检测css网格行上的鼠标点击?

wlzqhblo  于 2023-02-26  发布在  其他
关注(0)|答案(4)|浏览(174)

我正在尝试创建一个菜单,我用CSS网格布局。我遇到的问题是,当鼠标悬停在每个菜单项上时,如何使菜单交互。
我希望当鼠标停留在一行中的任何菜单项上时能够高亮显示整行,我可以通过添加一个:hover css规则来高亮显示每个单独的网格单元格,但是我不知道如何高亮显示整行网格。
第二部分是检测行何时被点击。同样,我可以为每个单元格添加一个onClick事件处理程序,但这似乎并不理想,因为用户可能会不小心点击网格单元格之间的间隙。我在想,如果我能弄清楚如何高亮显示整行,那么我可以为该行高亮显示器添加单击处理程序,这样就可以解决间隙点击问题。
我创建了一个codepen示例,演示了当前菜单的构造方式:https://codepen.io/marekKnows_com/pen/RqMgGw
超文本:

<div class="myGrid">
  <div class="anchor" id="item1">
    <i class="image material-icons">folder_open</i>
  </div>
  <span class="text">Open...</span>
  <span class="shortcut">Ctrl+O</span>

  <div class="anchor" id="item2">
    <i class="image material-icons">save</i>
  </div>
  <span class="text">Save...</span>
  <span class="shortcut">Ctrl+S</span>

  <div class="anchor" id="item3"></div>
  <span class="text">Action</span>

  <div class="separator"></div>

  <div class="anchor" id="item4"></div>
  <span class="text">Exit</span>
  <span class="shortcut">Ctrl+X</span>
</div>

CSS:

.myGrid {
  border: 1px solid black;
  display: grid;
  grid-template-columns: 20px auto auto;
  grid-gap: 2px 6px;
  align-items: center;
  justify-items: start;
  padding: 10px;
  box-sizing: border-box;
}
.image { 
  width: 24px;
}
.text {
  height: 28px;
  line-height: 28px
}
.shortcut {
  justify-self: end;
  padding: 0 5px;
  height: 28px;
  line-height: 28px
}
.separator {
  grid-column: 1 / span 3;
  width: 100%;
  height: 3px;
  border-bottom: 1px solid lightgray;
}
bvk5enib

bvk5enib1#

一种选择是用div Package row元素,在 Package 器div中包含样式display: contents;,将click处理程序添加到 Package 器div中。
CSS网格在布局内容时会将 Package 器内的元素视为没有 Package 器,因此它们会根据您的需要对齐。请参阅MDN display-box了解更多信息。该链接还指出了浏览器在display: contents;方面存在辅助功能错误。
display: contents;不允许样式。要突出显示整个网格行,您需要使用其他CSS技术。这个 Package 器div可以用在CSS选择器中。
到目前为止,我只使用Firefox进行了测试。

<div class="myGrid">

  <div class="row" onclick="console.log('click');">
    <div class="anchor" id="item1">
      <i class="image material-icons">folder_open</i>
    </div>
    <span class="text">Open...</span>
    <span class="shortcut">Ctrl+O</span>
  </div>

  <div class="row" onclick="console.log('click');">
    <div class="anchor" id="item2">
      <i class="image material-icons">save</i>
    </div>
    <span class="text">Save...</span>
    <span class="shortcut">Ctrl+S</span>
  </div>

  <div class="row" onclick="console.log('click');">
    <div class="anchor" id="item3"></div>
    <span class="text">Action</span>
  </div>

  <div class="separator"></div>

  <div class="row" onclick="console.log('click');">
    <div class="anchor" id="item4"></div>
    <span class="text">Exit</span>
    <span class="shortcut">Ctrl+X</span>
  </div>

</div>
.myGrid {
  border: 1px solid black;
  display: grid;
  grid-template-columns: 20px auto auto;
  grid-gap: 2px 6px;
  align-items: center;
  justify-items: start;
  padding: 10px;
  box-sizing: border-box;
}
.row {
  display: contents;
}
.image { 
  width: 24px;
}
.text {
  height: 28px;
  line-height: 28px
}
.shortcut {
  justify-self: end;
  padding: 0 5px;
  height: 28px;
  line-height: 28px
}
.separator {
  grid-column: 1 / span 3;
  width: 100%;
  height: 3px;
  border-bottom: 1px solid lightgray;
}
zysjyyx4

zysjyyx42#

我终于让它工作了。我最终做的是使锚元素具有相对位置。然后我在锚元素下添加了一个具有绝对位置的新div。在JavaScript中,我可以将新元素的大小调整为网格的全宽,并使用z-index相应地定位它相对于行中其他元素的位置。

djp7away

djp7away3#

首先,您可能需要更改html,以便.anchor元素 Package 每个条目。

<div class="myGrid">
    <div class="anchor" id="item1">
        <i class="image material-icons">folder_open</i>
        <span class="text">Open...</span>
        <span class="shortcut">Ctrl+O</span>
    </div>
    <div class="anchor" id="item2">
        <i class="image material-icons">save</i>
        <span class="text">Save...</span>
        <span class="shortcut">Ctrl+S</span>
    </div>
    <div class="anchor" id="item3">
        <span class="text">Action</span>
    </div>
    <div class="separator"></div>
    <div class="anchor" id="item4">
        <span class="text">Exit</span>
        <span class="shortcut">Ctrl+X</span>
    </div>
</div>

然后使用flex对齐每个项目的内容

.myGrid {
  border: 1px solid black;
  padding: 10px;
  box-sizing: border-box;
}

.anchor {
  display: flex;
  justify-content: flex-start;
}

/* Hover for each anchor */
.anchor:hover {
    background: red;
}

.image { 
    width: 24px;
}

.text {
    height: 28px;
    line-height: 28px
}

.shortcut {
    margin-left: auto; /* push the shortcut to the right */
    padding: 0 5px;
    height: 28px;
    line-height: 28px
}

.separator {
    grid-column: 1 / span 3;
    width: 100%;
    height: 3px;
    border-bottom: 1px solid lightgray;
}

https://codepen.io/anon/pen/xQWLaE

ljsrvy3e

ljsrvy3e4#

.anchor:hover > 
       .mygrid
       { background:red }

检查这个如果它工作在悬停item1它将改变边界颜色(从黑色到红色作为突出显示)

相关问题