【问题标题】:Chrome/webkit not rendering css display change on input:checked + element + elementChrome/webkit 未在输入时呈现 css 显示更改:已检查 + 元素 + 元素
【发布时间】:2012-12-21 12:30:47
【问题描述】:

场景

我有一个 CSS 选择器,它应该在单击标签时显示子内容。选择器沿着input:checked + element + element 的行,为最终元素提供块显示(默认为无)。问题是它适用于除 webkit 之外的所有主要浏览器。 Chrome、Safari 和 android 的移动浏览器(v2.2 抱歉,我落后于时代)都无法显示该元素。当我在 Chrome 中检查元素时,它显示它应该是 display: block 但它没有呈现它。我可以在开发人员工具中取消选中并检查该属性,它会显示,但不是之前。

我认为这是 webkit 中的一个错误。

问题

这是一个多部分的问题:这是 webkit 中的一个已知错误吗?我的选择器有什么问题吗?以及如何解决 webkit 浏览器的问题(任何创意建议)?

代码

HTML

  <input id="c1" type="checkbox">
  <label for="c1">Ein</label>
  <section>Content</section>

  <input id="c2" type="checkbox">
  <label for="c2">Zwei</label>
  <section>Content</section>

  <input id="c3" type="checkbox">
  <label for="c3">Drei</label>
  <section>Content</section>

CSS

input {
  float:left;
  clear:left;
  visibility: hidden;
  position:absolute;
}

label {
  color:green;
  display:block;
  cursor:pointer;
}

section {
  display:none;
}

label:after {
  content:" +";
}

input:checked + label:after {
  content:" -";
}

input:checked + label + section {
  display:block;
}

演示

演示:http://jsbin.com/epibin/2
来源:http://jsbin.com/epibin/2/edit

【问题讨论】:

  • 看起来像一个重新绘制的“错误”,在检查切换时不会重新绘制兄弟姐妹。如果在检查器中打开/关闭显示,它会正确绘制。 Safari (PC) 中的结果相同
  • 感谢您的回复,@mdmullinax。这是有道理的,但它确实呈现了从+ 到- 的变化。我也尝试了一些其他属性来测试它。看这个演示:jsbin.com/epibin/6/edit
  • this answer 中的 CSS 解决方案可能更适合您的需求,因为它不需要任何额外的 HTML 标记,并且可以在错误最终修复时删除
  • @MyHeadHurts:我实际上找到并发布了我认为比您链接的解决方案更好的解决方案。
  • @ScottS 这绝对是一个更整洁的 hack,我将把它添加到我的收藏中:) 谢谢!可惜 Chrome 在链式选择器上遇到了这么多麻烦!

标签: google-chrome css safari webkit


【解决方案1】:

听起来很像Bug 45168 – CSS multiple adjacent sibling selector sequence is ignored if prefixed with a pseudo-class selector

如果您在标记中交换 &lt;label&gt; 和 &lt;input&gt; 结构(并相应地调整 CSS),它就可以工作。

http://jsbin.com/epibin/10/edit

(但现在+ - 不切换)

编辑:

将 &lt;label&gt; 和 &lt;section&gt; 放入 div 容器中有效:http://jsbin.com/epibin/12/edit

【讨论】:

  • 知道如何同时允许切换 +/- 吗?
  • 将&lt;label&gt; 和&lt;section&gt; 放在一个div 容器中似乎可以工作jsbin.com/epibin/12/edit
【解决方案2】:

正如mdmullinax 所说,这是 chrome 中的一个突出错误。

这个 hack 从接受的答案中的链接对我有用:

 body { -webkit-animation: bugfix infinite 1s; }
 @-webkit-keyframes bugfix { from { padding: 0; } to { padding: 0; } }

【讨论】:

  • 只是发布这个,以便我下次可以更轻松地找到答案;)
  • 刚刚发布了我发现的更好的解决方案。
【解决方案3】:

链一个伪类

This demonstrates 表示此代码修复了错误(请注意,nth-child(n) 匹配任何元素,但将其添加到链中会使其正常工作):

input:checked + label:nth-child(n) + section {
  display:block;
}

【讨论】:

  • 太棒了!这完美地解决了这个问题!如果我可以问,您是如何想到这个解决方案的?
  • 对与同一问题相关的this more recent question 进行试验的试验和错误。
  • 完美。优于 webkit-animate 的首选解决方案,因为这会导致 Android 设备上的滚动延迟。
  • 这对我有用,但因为它是 input:checked + input[type=hidden] label 我需要将 nth-child(n) 应用于标签,而不是隐藏字段。
  • 太棒了!这对我也有用。 USB 调试也有很大帮助。但是一旦被诊断出来,这个线程就更有意义了。谢谢。
【解决方案4】:

@ScottS 提供了一个可靠的解决方案。另一种可能的方法对我有用,并且从局外人“他们为什么这样做”的角度来看更有意义:

input:checked ~ section {
  display:block;
}

它选择后面的每个“节”,并且是“输入:已检查”的兄弟。

有两种情况我可以想到@ScottS 的版本更优越,因为在我的解决方案中也选择了“标签”位置的元素: (1) 'input's 兄弟#1 & #2 是相同的元素(而不是'label' & 'section') (2) 您试图通过使用“*”选择器来概括。

【讨论】:

  • 我认为它并不逊色。事实上,它非常直观。感谢您发布此答案。这是tweaked demo of my code with your solution。我必须改变的一件事是使输入、标签和部分的所有兄弟都在同一个容器元素下,以防止不加选择的先前兄弟选择器显示不属于它的其他部分。我还为它们制作了单选按钮,只是为了好玩。尽管接受的答案正确地修复了 chrome 错误问题,但这是一种可能的替代方法。你至少应该得到赏金。
  • ' ~ ' 固定对我有用。 “第n个孩子”没有。输入 ~ 标签输入是一个复选框。
  • 这救了我的命:D
猜你喜欢
  • 2019-02-13
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2021-07-11
  • 1970-01-01
  • 2011-06-19
  • 2011-06-26
相关资源
最近更新 更多