【问题标题】:Pseudo element visibility behavior伪元素可见性行为
【发布时间】:2015-07-13 20:54:15
【问题描述】:

我google了一下,但也许这里有人可以向我解释为什么伪元素,即:before和:after会这样。

我有一个内容 div,里面有一些元素 - 段落、锚点、图标等。假设我在一个锚元素上添加了一个 :after 伪元素并填充了一个内容,该内容将显示图标

a:after{
    content:"\f001";
    font-family: "Awesome icon font";
    display: inline-block;
}

我可以通过单击按钮来切换该元素的可见性。

问题是当该元素被隐藏时,DOM 中不会显示任何伪元素。一旦我切换它的可见性(从display:none; 到,比如说display: inline-block;),就会显示伪元素。

在一个更具体的示例中,我有一个导航菜单,如果我单击“汉堡”菜单,可以隐藏或显示该菜单。一个导航项目是一个购物车图标。我通过单击菜单图标来切换上滑动画。所有的文本菜单都会很好地向上滑动,但只有当动画完成时,商店图标才会“弹出”。这看起来有点草率。

为什么会这样?为什么在嵌套伪元素的容器上的显示值控制伪元素的显示(即使它们本身的显示值与none 不同)?不仅影响它们的显示值,当你检查 DOM 时,如果容器有display: none; 值,就不会有任何伪元素存在。

编辑:

小提琴示例:http://jsfiddle.net/at4u56fy/

【问题讨论】:

  • 伪元素被插入到元素中,即它们被添加到满足选择器的元素中。它们不是独立于元素的单独兄弟节点,因此将与所述元素一起消失。尝试将伪元素视为直接后代,添加到元素的开头或结尾。
  • 所以基本上如果我想保持他们的可见性,我必须切换visibility 规则而不是display。这很奇怪,因为当您在 div 容器上有 display: none; 规则并且里面有一些元素时,当您检查 DOM 时,它们仍然存在(html 代码在那里,它们里面是什么),但是伪元素会完全消失。这让我有点困惑。
  • 这最后一部分更像是 Inspect/Firebug 工具的问题。无需显示不会生成的内容,因为该元素具有display: none。 :hover 和 :focus 可能会或不会:在这种情况下不会发生
  • 你试过'visibility:hidden'吗?
  • 我想我必须使用visibility 属性来避免这个问题。

标签: html css


【解决方案1】:

让我们看看文档是怎么说的......

关于display: none;

该值导致元素不会出现在formatting structure (即,在视觉媒体中,元素不生成框,也没有 对布局的影响)。后代元素不生成任何框 任何一个;元素及其内容从格式中移除 结构完全。此行为不能通过设置 后代的“显示”属性。

请注意,显示“无”不会创建不可见的框; 它根本没有创建任何盒子。 CSS 包括使 元素以在格式化结构中生成影响 格式化,但本身不可见。请查阅本栏目 在visibility了解详情。

进一步到formatting structure 它说:

从带注释的文档树中,生成格式结构。 通常,格式化结构与文档树非常相似, 但它也可能有很大不同,特别是当作者使用 伪元素和生成的内容。一、格式化结构 根本不需要“树形”——结构的性质 取决于实施。二、格式化结构可以 包含比文档树更多或更少的信息。例如, 如果文档树中的元素的值为“无” 'display' 属性,该元素不会在 格式化结构。另一方面,列表元素可能会生成 格式结构中的更多信息:列表元素的 内容和列表样式信息(例如,项目符号图像)。

请注意,CSS 用户代理不会更改文档树 这个阶段。特别是,由于样式表而生成的内容是 不反馈给文档语言处理器(例如,用于重新解析)。

因此,如果元素设置为display: none;,用户代理似乎会忽略 CSS 生成的内容。因此,您可能想看看 visibility: hidden; 应该适合您。

【讨论】:

  • 感谢您的解释。我想我必须找到一种方法来利用 jquery 上下切换与可见性切换而不是显示切换。
  • @dingo_d 切换类
  • 我在设置菜单时遇到了一些问题,因为单击时我正在显示菜单,当菜单未显示时,您可以看到页面的面包屑,我已经终于用 jquery 让这一切工作得很好,很顺利。当我尝试使用 css 创建相同的效果时遇到了一些复杂情况(不能将外部容器放入 overflow: hidden;,因为我有下拉菜单),这排除了 transform: translateY(); css 规则。
猜你喜欢
  • 2013-07-06
  • 2021-11-13
  • 1970-01-01
  • 2016-11-28
  • 2012-12-24
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多