CSS Grid - 突出显示单元格直到悬停的单元格

adl*_*adl 5 javascript css css-grid

在网格中,我想突出显示一组单元格 - 一个矩形形状 - 从左上角的单元格到鼠标位置下方的单元格。

假设我们的网格最初看起来像这样:

.grid {
  display: grid;
  grid-template-columns: repeat(5, 50px);
  grid-template-rows: repeat(5, 50px);
  gap: 5px;
}

.grid-item {
  display: flex;
  justify-content: center;
  align-items: center;
  background: lightgray;
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid">
    <div class="grid-item">1</div>
    <div class="grid-item">2</div>
    <div class="grid-item">3</div>
    <div class="grid-item">4</div>
    <div class="grid-item">5</div>
    <div class="grid-item">6</div>
    <div class="grid-item">7</div>
    <div class="grid-item">8</div>
    <div class="grid-item">9</div>
    <div class="grid-item">10</div>
    <div class="grid-item">11</div>
    <div class="grid-item">12</div>
    <div class="grid-item">13</div>
    <div class="grid-item">14</div>
    <div class="grid-item">15</div>
    <div class="grid-item">16</div>
    <div class="grid-item">17</div>
    <div class="grid-item">18</div>
    <div class="grid-item">19</div>
    <div class="grid-item">20</div>
    <div class="grid-item">21</div>
    <div class="grid-item">22</div>
    <div class="grid-item">23</div>
    <div class="grid-item">24</div>
    <div class="grid-item">25</div>
</div>
Run Code Online (Sandbox Code Playgroud)

现在用户将鼠标悬停在单元格编号 18 上。网格现在应该如下所示:

.grid {
  display: grid;
  grid-template-columns: repeat(5, 50px);
  grid-template-rows: repeat(5, 50px);
  gap: 5px;
}

.grid-item {
  display: flex;
  justify-content: center;
  align-items: center;
  background: lightgray;
}

.grid-item-blue {
  background: lightblue;
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid">
    <div class="grid-item grid-item-blue">1</div>
    <div class="grid-item grid-item-blue">2</div>
    <div class="grid-item grid-item-blue">3</div>
    <div class="grid-item">4</div>
    <div class="grid-item">5</div>
    <div class="grid-item grid-item-blue">6</div>
    <div class="grid-item grid-item-blue">7</div>
    <div class="grid-item grid-item-blue">8</div>
    <div class="grid-item">9</div>
    <div class="grid-item">10</div>
    <div class="grid-item grid-item-blue">11</div>
    <div class="grid-item grid-item-blue">12</div>
    <div class="grid-item grid-item-blue">13</div>
    <div class="grid-item">14</div>
    <div class="grid-item">15</div>
    <div class="grid-item grid-item-blue">16</div>
    <div class="grid-item grid-item-blue">17</div>
    <div class="grid-item grid-item-blue">18</div>
    <div class="grid-item">19</div>
    <div class="grid-item">20</div>
    <div class="grid-item">21</div>
    <div class="grid-item">22</div>
    <div class="grid-item">23</div>
    <div class="grid-item">24</div>
    <div class="grid-item">25</div>
</div>
Run Code Online (Sandbox Code Playgroud)

我更喜欢 css 解决方案。是否可以仅使用 css?如果没有,你会如何在 JS 中做到这一点?

Zoh*_*lak 2

如果您不介意将内容嵌套在更多级别以将其放在假背景上,那么这是一个纯 CSS 想法。

.grid {
    overflow:hidden;
    display: grid;
    grid-template-columns: repeat(5, 50px);
    grid-template-rows: repeat(5, 50px);
    gap: 5px;
}

.grid-item {
    background: lightgray;
    position: relative;
    display: flex;
}

.grid-item>span {
    z-index: 2;
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}

.grid-item:hover:before {
    position: absolute;
    content: '';
    background: linear-gradient(to left,#ff000000 0px 50px,#ffffff 50px 55px) 0 0/55px, linear-gradient(to top,lightblue 0px 50px,#ffffff00 50px 55px) 0 0/1px 55px ;
    z-index: 1;
    width: calc(55px * 9);
    height: calc(55px * 9);
    bottom: 0;
    right: 0;
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid">
  <div class="grid-item"><span>1</span></div>
  <div class="grid-item"><span>2</span></div>
  <div class="grid-item"><span>3</span></div>
  <div class="grid-item"><span>4</span></div>
  <div class="grid-item"><span>5</span></div>
  <div class="grid-item"><span>6</span></div>
  <div class="grid-item"><span>7</span></div>
  <div class="grid-item"><span>8</span></div>
  <div class="grid-item"><span>9</span></div>
  <div class="grid-item"><span>10</span></div>
  <div class="grid-item"><span>11</span></div>
  <div class="grid-item"><span>12</span></div>
  <div class="grid-item"><span>13</span></div>
  <div class="grid-item"><span>14</span></div>
  <div class="grid-item"><span>15</span></div>
  <div class="grid-item"><span>16</span></div>
  <div class="grid-item"><span>17</span></div>
  <div class="grid-item"><span>18</span></div>
  <div class="grid-item"><span>19</span></div>
  <div class="grid-item"><span>20</span></div>
  <div class="grid-item"><span>21</span></div>
  <div class="grid-item"><span>22</span></div>
  <div class="grid-item"><span>23</span></div>
  <div class="grid-item"><span>24</span></div>
  <div class="grid-item"><span>25</span></div>
</div>
Run Code Online (Sandbox Code Playgroud)