【问题标题】:Unable to set different hover background colors in a table in dark mode/light mode无法在暗模式/亮模式下的表格中设置不同的悬停背景颜色
【发布时间】:2023-03-02 23:22:02
【问题描述】:

我正在我的应用程序中尝试暗模式,其中有一个包含数据的表格。出于某种原因,我必须使用 Javascript 设置表格行背景悬停颜色。现在暗模式和亮模式都只有一种背景悬停颜色。例如,如果我的背景悬停效果使用 Javascript 设置为红色,用于浅色模式,那么它对于深色模式也是红色的,这看起来很糟糕。如果我将mouseoutmouseover 事件放在if statements 中的switchTheme 函数中,它不起作用。

我想要的是根据我所处的模式将背景悬停颜色设置为不同。如果我处于浅色模式,我会说红色/白色悬停背景颜色,当我处于深色模式时,它会自动更改为蓝色/绿色。

这是sn-p:

const toggleSwitch = document.querySelector('#dark-mode-button input[type="checkbox"]');

function switchTheme(e) {
    if (e.target.checked) {
        document.documentElement.setAttribute('data-theme', 'dark');
        
    }else {        
        document.documentElement.setAttribute('data-theme', 'light');
        
    }    
}

toggleSwitch.addEventListener('change', switchTheme, false);


$("body").on("mouseover", "table tr", function() {
    $(this).css("background", "red");
});

$("body").on("mouseout", "table tr", function() {
    $(this).css("background", "#fff");
});
:root {
  --primary-color: #495057;
  --bg-color-primary: #F5F5F5;
}

body{
  background-color: var(--bg-color-primary); 
}

[data-theme="dark"] {
  --primary-color: #8899A6;
  --bg-color-primary: #15202B;
}

table {
  font-family: arial, sans-serif;
  border-collapse: collapse;
  width: 100%;
  background-color: #fff;
}

td, th {
  border: 1px solid #dddddd;
  text-align: left;
  padding: 8px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="dark-mode-button">
    <input id="chck" type="checkbox">Dark Mode
    <label for="chck" class="check-trail">
      <span class="check-handler"></span>
    </label>
</div>

<table class="table">
    <thead>
      <tr>
          <th>Header 1</th>
          <th>Header 2</th>
          <th>Header 3</th>
      </tr>
    </thead>  
    <tbody>
      <tr>
        <td>Alfreds Futterkiste</td>
        <td>Maria Anders</td>
        <td>Germany</td>
      </tr>
      <tr>
        <td>Centro comercial Moctezuma</td>
        <td>Francisco Chang</td>
        <td>Mexico</td>
      </tr>
      <tr>
        <td>Island Trading</td>
        <td>Helen Bennett</td>
        <td>UK</td>
      </tr>
      <tr>
        <td>Laughing Bacchus Winecellars</td>
        <td>Yoshi Tannamuri</td>
        <td>Canada</td>
      </tr>
      <tr>
        <td>Magazzini Alimentari Riuniti</td>
        <td>Giovanni Rovelli</td>
        <td>Italy</td>
      </tr>
    </tbody>                     
</table>

【问题讨论】:

  • 我可以建议使用css:hover 吗?另请注意,您的 mouseovermouseout 选择器不相同。
  • 修复了选择器。抱歉,由于某种原因我想通过 Javascript 设置悬停效果,所以我不能使用它。我有一个动态表,有一个rowspan 的问题。因此,当我使用 css hover 时,有些部分会悬停,而有些则不会。所以这就是为什么我必须通过 JS 设置悬停效果
  • 你对为什么据称不能使用 CSS 的解释听起来很假。您通过 JS 所做的一切,就是对整个表格行的悬停做出反应,然后为这些行设置背景。您对为什么仅使用tr:hover { background: red; } 不可能做到这一点的解释到目前为止没有什么意义,使用您显示的代码。你提到了行跨度,但我在你的 HTML 中没有看到,我也没有看到你的 JS 代码以任何方式考虑到它。
  • 这不是我一直在处理的实际表格。你不能在不了解问题的情况下就说这是假的。我不能使用css,因为我有一个理由。这不是我要找的。听说过“桌面悬停斑马效应”吗?我有我的动态数据。我必须发布 500 行代码来解释这一点。相反,我想用 JS 来做。所以如果你不能用 JS 解决这个问题,那么请继续。
  • 有一个斑马效果的例子,它仍然不需要javascript:stackoverflow.com/questions/15464831/… 但你是对的:如果你想用javascript,你可以这样做。

标签: javascript jquery


【解决方案1】:

保持当前代码最快/最简单的方法是检查您使用switchTheme() 设置的data-theme 属性并相应地设置颜色。

$("body").on("mouseover", "table tr", function(){
    let tColor = (document.documentElement.getAttribute('data-theme') === 'dark') ? 'blue' : 'red';
    $(this).css("background", tColor)
});

$("body").on("mouseout", "table tr", function(){
    let tColor = (document.documentElement.getAttribute('data-theme') === 'dark') ? 'green' : 'white';
    $(this).css("background", tColor)
});

我认为最好只删除 mouseout 上的 background 以默认回到样式表定义的背景:

$("body").on("mouseout", "table tr", function(){
    $(this).css("background", "")
});

然而,像这样,样式表中并没有真正定义颜色。或者,您可以根据主题在样式表中设置两个隐藏元素(悬停/正常)的background,并获取计算样式。

【讨论】:

  • 它有效。但是有一个问题。它以白色背景开始。然后它会根据悬停颜色发生变化。我想我可以用 css 设置背景颜色。
  • @Zak:在mouseout 上,您应该将其设置为空白,默认返回样式表定义。另请注意,background 不仅仅包括 background-color
  • 哇。严重地?你能告诉我更多吗?
  • background 也会覆盖 background-image 例如。有一个列表here
  • 那得具体一点
【解决方案2】:

使用下面的代码

var color = ""; 
function switchTheme(e) {
if (e.target.checked) {
    document.documentElement.setAttribute('data-theme', 'dark');
    color = "red"; 
}
else { 
document.documentElement.setAttribute('data-theme', 'light');
color = "gray";
} 

$("body").on("mouseover", "table tr", function() {
    $(this).css("background", color);
});

$("body").on("mouseout", "table tr", function() {
    $(this).css("background", color);
});

当我们点击复选框时,我们将颜色存储在一个变量中, 当悬停在桌子上时,我们正在设置值

【讨论】:

  • 对不起,它不起作用。我应用了你的代码。但是没有悬停效果。
【解决方案3】:

您可以将元素的:hover 设置为您的变量值,例如

var(--bg-color-primary)

对于浅色和深色主题的网站,您实际上不需要任何 JavaScript。 希望对您有所帮助!

【讨论】:

  • 对不起,我不能使用它,因为我想通过 Javascript 设置悬停效果,因为某种原因。我有一个动态表,并且存在行跨度问题。因此,当我使用 css hover 时,有些部分会悬停,而有些则不会。所以这就是为什么我必须通过 JS 设置悬停效果
猜你喜欢
  • 2021-09-13
  • 2021-12-28
  • 2021-12-04
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2021-10-06
  • 2015-11-09
  • 2021-10-19
相关资源
最近更新 更多