当前位置: 首页 > 面试题库 >

为什么通用同级组合器允许切换伪元素的内容,而不允许相邻同级的内容?

宗政金鹏
2023-03-14
问题内容

在这个问题中,“像jQuery的.click()一样工作的CSS3选择器?”我使用的状态发布了一个答案],以切换元素的显示。:checked``input``type="checkbox"

这是我在该答案中发布的演示的HTML:

<input type="checkbox" id="switch" />
<nav>
    <h2>This would be the 'navigation' element.</h2>
</nav>
<label for="switch">Toggle navigation</label>

和CSS(为简洁起见,省略了过渡):

#switch {
    display: none;
}
#switch + nav {
    height: 0;
    overflow: hidden;
    /* transitions followed */
}
#switch:checked + nav {
    height: 4em;
    color: #000;
    background-color: #ffa;
    /* transitions followed */
}

label {
    cursor: pointer;
}

有一次,我张贴发生,我认为我们可以在答案 拨动的文本label用于触发复选框的状态变化,使用下面的选择(已修订label的文本‘导航’):

label {
    display: inline-block;
    cursor: pointer;
}

#switch + nav + label::before {
    content: 'Show ';
}

#switch:checked + nav + label::before {
    content: 'Hide ';
}

这不起作用,因为当处于input未检查状态(和label显示的Show navigation)时选择器匹配时,选择器在更改状态时 _无法_匹配input。请注意,过渡仍然对nav元素起作用,并且原始匹配选择器指示下一个同级组合器原始匹配。上面的链接显示了不起作用的选择器的简化演示(在Chrome27 / Windows XP中)。

然后我想到尝试使用通用同级组合器,以减少选择器链。这导致了以下CSS(为简洁起见,再次删除了转换):

#switch:checked + nav {
    background-color: #ffa;
}

label {
    display: inline-block;
    cursor: pointer;
}

#switch ~ label::before {
    content: 'Show ';
}

#switch:checked ~ label::before {
    content: 'Hide ';
}

有点出乎我的意料,这个工作(在content该的label响应的改变的状态改变input)。

所以,问题是:为什么通用同级组合器不允许更新后一个同级链,而链接的下一个同级组合器(匹配DOM的元素和结构)却不允许呢?

此外,这似乎在Firefox(Windows XP上为21)上 确实 有效;所以我想这个问题会稍作更改,包括:这是Chrome /
Webkit中的错误还是预期的行为?

而且,甚至 更进一步 ,虽然这是Chrome中的错误(感谢@Boltclock),但还是有些荒唐的“不做任何事情”动画修复了无法正常工作的演示(尽管存在其他更好的替代方法,如Scott的答案显示):

body {
    -webkit-animation: bugfix infinite 1s;
}
@-webkit-keyframes bugfix {
    from {
        padding: 0;
    }
    to {
        padding: 0;
    }
}
#switch {
}
#switch + nav {
    -moz-transition: all 1s linear;
    -ms-transition: all 1s linear;
    -o-transition: all 1s linear;
    -webkit-transition: all 1s linear;
    transition: all 1s linear;
}
#switch:checked + nav {
    background-color: #ffa;
    -moz-transition: all 1s linear;
    -ms-transition: all 1s linear;
    -o-transition: all 1s linear;
    -webkit-transition: all 1s linear;
    transition: all 1s linear;
}
label {
    display: inline-block;
    cursor: pointer;
}
#switch + nav + label::before {
    content:'Show ';
}
#switch:checked + nav + label::before {
    content:'Hide ';
}

注意: 之所以用此“修复”更新问题,而不是将其发布为答案,是因为问题 不是 “我该如何解决?” 但是(基本上)“为什么不起作用?”


问题答案:

这是WebKit浏览器中的一个长期错误,与将某些动态伪类与下一个同级组合器一起使用有关。无论您是将样式应用于兄弟元素本身还是该兄弟元素的伪元素,都会发生这种情况。

所以要么是固定的,要么是其他触发/触发了它。



 类似资料:
  • 问题内容: 举个例子 是在HTML5有效吗? 问题答案: 是的,您编写的内容在HTML5中有效,但并非所有内联元素,我认为这只是适用于.. 参考:HTML5中的“块级”链接 提示:如果使用此设置,则to 或可能会有意外的视觉样式结果 更新: 对于“默认样式可能会导致混淆”的其他“内联代码块”组合,则“不允许”使用-说明在这里 ### 默认样式可能导致混淆的情况 某些元素具有默认样式或行为,这些默认

  • 下面的泛型代码无法编译,我可以理解原因:这是为了阻止可能不兼容的类型添加到集合中: 然而,我可以对数组做同样的事情,并且不会得到编译器错误。当我运行它时,我会得到一个 为什么编译器不阻止我上传数组,因为它会麻烦地阻止我上传泛型?

  • 问题内容: 我有一个基于Java的Web服务客户端,该客户端连接到Java Web服务(在Axis1框架上实现)。 我的日志文件中出现以下异常: 问题答案: 这通常是由XML声明前的空白引起的,但是它可以是任何文本,例如破折号或任何字符。我说这通常是由空白引起的,因为人们认为空白始终是可忽略的,但事实并非如此。 经常发生的另一件事是UTF-8 BOM(字节顺序标记),如果将文档作为字符流传递给XM

  • 为什么会这样?最后,还有其他类似的功能我应该知道是不允许的。

  • 我一直在使用Android Studio和Ubuntu13.10没有问题。我决定更新到14.04,现在我无法让Android工作室工作。Gradle无法构建并不断地说错误:Prolog中不允许内容。我所做的只是从头开始创建一个新项目。 > Ubuntu 14.04是从刚擦除的分区安装的 使用Android Studio V5.7,但我也尝试了V4.6 我安装了Oracle JDK,并相应地设置了$

  • 问题内容: 我运行Intellij,当我尝试运行android应用程序时,总是出现内部错误:序言中不允许内容。我认为我已经尽力修复了所有问题,但没有任何效果。之前,我在AndroidManifest中没有做任何特别的事情,所以我不知道为什么它不起作用。 问题答案: 关闭Intellij想法 去你的工作区 删除.idea文件夹 打开您的项目并导入。