【问题标题】:Multiple :not pseudos not working as intended多个 :not 伪无法按预期工作
【发布时间】:2020-05-08 04:04:59
【问题描述】:

一个普通的网站菜单,带有大小合适的按钮,由带有background-color 的块内的居中列出的文本组成。 我需要按钮在悬停时、按下时以及用户在相应页面上时更改其background-color

菜单的HTML:

<div class="box box-menu">
            <ul class="nav">
                <a href="index.html"><li class="button button-activated">Home</li></a>
                <a href="menu/gallery.html"><li class="button">Gallery</li></a>
                <a href="menu/commission.html"><li class="button">Commission Us</li></a>
                <a href="menu/staff.html"><li class="button">Official Staff</li></a>
                <a href="menu/faqtos.html"><li class="button">FAQ / TOS</li></a>
                <a href="menu/contacts.html"><li class="button button-last">Contacts</li></a>
            </ul>

及其样式表:

.box-menu{
  position: relative;
  float: left;
  width: 200px;
}

.nav{
text-align: center;
}

.button{
  height: 70px;
  list-style-type: none;
  background-color: #141414;
  color: #e8a53c;
  font-size: 20px;
  line-height: 60px;
  vertical-align: middle;
  text-shadow: 2px 2px black;
  margin-bottom: 10px;}

.button-last{
  margin-bottom: 0;
}

.button:hover:not(.button-activated):not(.button:active) {
  background-color: #141414;
  color: #901313;}

.button:active{
  background-color: #761111;
}

.button-activated{
  background-color: #901313;
  color: #e8a53c;
}

:active 用于单击按钮。 button-activated 是当前所选页面的类。

有点不必要的混乱,但无论如何。

  1. 我希望“已激活”按钮在悬停时不改变颜色。
  2. 我希望其余按钮在悬停时改变颜色。
  3. 当用户按下按钮时,我想要它的 :active(被点击)background-color - 而不是它的 :hover background-color(因为用户有当他按下按钮时,他的鼠标在按钮顶部)。

我想解决它的一种方法是使用 :not 伪,但是每当我在一行中编写多个它们时,整个事情就会完全停止工作......它应该像这样工作:

“按钮应该在悬停时改变背景颜色 - 除非它被点击,并且除非它被指定为你所在的页面。”

我做错了吗?我需要单独编写它们,一次一个 :not 吗?

【问题讨论】:

    标签: html css button css-selectors


    【解决方案1】:

    问题不是你有多个:not(),而是你的第二个无效。

    在当前的CSS Selectors Level 3 规范1 中,not() 只接受simple selectors,而.button:active 是一个复杂选择器,因此您的not(.button:active) 无效并且整个规则被丢弃。

    但在你的情况下,你真的不需要那个复杂的选择器,简单的:active 就可以了,它会给你.button:hover:not(.button-activated):not(:active)

    这是一个更简单的例子,仍然暴露了这个问题:

    .foo:not(.bar):not(.foo:hover) { /* does not work */
      color: red;
    }
    .foo:not(.bar):not(:hover) { /* does work */
      background-color: green;
    }
    &lt;div class="foo"&gt;hover me to remove stylings&lt;/div&gt;

    1 - 虽然下一个版本 'CSS Selectors Level 4' 现在将 not() 的参数设置为 selector-list,所以如果我做对了,我们应该很快就能在这里传递复杂的选择器。

    【讨论】:

    • :active 部分似乎没有覆盖 :hover 对我来说,这意味着 :active 总是看起来像 :hover,因为在按下时光标悬停在按钮上,所以我求助于这些:不是伪类。不过我会再试一次。另外,请注意简单的选择器规则!
    【解决方案2】:

    With multiple css classes it's better to list with comma separation,而不是像您在此处使用伪类所做的那样将它们链接起来。

    .button:hover:not(.button-activated), 
    .button:hover:not(.button:active) {
      background-color: #141414;
      color: #901313;
    }
    

    但是,一般来说,对于更复杂的类和代码,描述性通常比效率更有用。在将其插入 CodePen 之后,将它们分开可能是可行的方法并且仍然可以使用:

    .button:hover:not(.button-activated) { 
      background-color: #141414;
      color: #901313;
    }
    
    .button:hover:not(.button:active) {
      background-color: #141414;
      color: #901313;}
    

    【讨论】:

    • 呵呵,我从来没有这样用过逗号。我会进一步研究它,谢谢!
    • 没问题!如果此解决方案对您有用,请检查复选标记!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2020-06-26
    • 2015-02-20
    • 2015-09-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多