【问题标题】:Using CSS selectors, is it possible to differentiate between these 2 code snippets?使用 CSS 选择器,是否可以区分这两个代码片段?
【发布时间】:2021-02-14 18:49:14
【问题描述】:

使用 CSS 选择器,是否可以以任何方式区分以下两个代码 sn-ps?通过区分,我的意思是选择任何一个 sn-p 的任何部分(或整体),而不是另一个。

<span role="presentation">
   <span class="test" role="presentation" test-text="foo">bar</span>
</span>

<span role="presentation">
   <span class="test" role="presentation" test-text="foo">bar</span>
   baz
</span>

所使用的网络浏览器只有 Firefox,因此也可以接受仅限 Mozilla 的功能。

编辑 1:

可能对回答者有所帮助的其他详细信息:

上述两个 HTML sn-ps 的更复杂版本都存在于代码中。我已将其隔离以简化此问题,因为其他所有内容都是相关的。唯一的区别是外部span 中的字符串(baz)。

我正在寻找一个选择器,它可以匹配一个 sn-p 中的任何内容,而不匹配另一个 sn-p 中的任何内容。 (我不确定这是否可行,所以我试图最大限度地灵活回答。)我无法更改上游 HTML,但我可以更改 CSS。

编辑 2:

我被要求添加更多细节和细节,因为这可能会影响答案。

我认为这真的有助于澄清:我的目标是隐藏字符串 bar 当且仅当 baz 存在于上游HTML(如第二个代码sn-p所示)。

我很擅长隐藏整个 span.test 元素或仅隐藏其中的 bar 文本字符串...任何一种方式都可以。

关于隐藏 bar,我对隐藏它的所有可能性持开放态度,因此它不占用空间。我在考虑 display: nonewidth: 0,但是当 baz 存在时任何导致它不占用任何空间的东西都是好的。

编辑 3:

只是一个快速更新:我深入浏览了上游代码,看起来 bar 将始终是空白。我不确定这是否会打开任何大门,但如果确实如此,我认为值得一提。

【问题讨论】:

  • 定义区分
  • @TemaniAfif 选择任一 sn-p 的任何部分(或整体)的任何方法,但不选择另一个。
  • 选择和做什么?
  • 类似这样的东西:jsfiddle.net/m8b9taLp/1?只有 baz 是红色的?
  • @TemaniAfif 嗯......有趣......这几乎满足了所写的问题......现在我需要考虑一下,看看我是否可以用你的想法做我想做的事。这与我的想法完全相反,这可能会很好,因为我可以添加一个:not() psuedo-class 或者使用您慷慨提供的方向来更多地考虑它。我需要花一点时间来考虑一下,因为你的做法与我的想法完全相反(这可能是件好事,因为我还没有成功)。

标签: html css firefox css-selectors pattern-matching


【解决方案1】:

谨慎使用(或根本不使用......)的一个非常老套的想法。仅当baz 长于bar 时才有效

[role=presentation] {
  text-indent: -13px; /* based on "bar" text */
  display: inline-block;
  position:relative;
}
[role=presentation]::before {
   content:"";
   position:absolute;
   top:0;
   bottom:0;
   right:0;
   left:0;
   background:#fff;
    z-index: -1;
}

[role=presentation] [role=presentation] {
  text-indent: 0;
  z-index:-2;
  transform: translateX(calc(100% + 7px)); /* the 7px is the whitespace*/
  margin-right:0;
}
[role=presentation] [role=presentation]::before {
  content:none;
}


/* irrelevant, simply to separate both elements */
.extra {
  margin: 10px;
  font-size:30px;
}
<div class="extra">
  <span role="presentation">
   <span class="test" role="presentation" test-text="foo">bar</span>
  </span>
</div>
<div class="extra">
  <span role="presentation">
   <span class="test" role="presentation" test-text="foo">bar</span> baz
  </span>
</div>

<div class="extra">
  <span role="presentation">
   <span class="test" role="presentation" test-text="foo">bar</span> another baz
  </span>
</div>

【讨论】:

  • 谢谢特曼尼!这很聪明。我在看你现在做了什么。您有什么理由选择使用px 单位而不是em
  • @RockPaperLz-MaskitorCasket 没有特别的原因,在所有情况下它都不是一个通用值,所以单位不会有很大的不同
  • 谢谢。在第二行中,不是以特定字体硬编码为 bar 长度的像素数吗?
  • @RockPaperLz-MaskitorCasket 是的,这是您必须根据 bar(字体、字体大小、字母间距等)更新的“非”通用值跨度>
  • 知道了。这不应该造成问题,因为我可以使用 CSS 控制所有这些。将使用em 单位使其自动反映字体/字体大小/等。正在使用?
【解决方案2】:

这2个代码块的唯一区别是后者有文本节点baz

但是,无法选择文本节点。

即使baz 被 HTML 元素包裹,它也无助于选择前一个兄弟元素或父元素。这是不可能的。

我能想到的唯一选择它们的方法是通过 span[role="presentation"] 在父元素中的位置。

例如,如果span[role="presentation"] 是同一父级的子级,您可以使用诸如:first-child:last-child:nth-child() 等伪类来选择它们...

div > span[role="presentation"]:first-child {
  background: red;
}

div > span[role="presentation"]:last-child {
  background: green;
}
<div>
  <span role="presentation">
     <span class="test" role="presentation" test-text="foo">bar</span>
  </span>

  <span role="presentation">
     <span class="test" role="presentation" test-text="foo">bar</span> baz
  </span>
</div>

我不知道有任何 Mozilla 独有的功能会允许以不同的方式进行操作。

【讨论】:

  • 感谢您的回答法布里齐奥。我不知道为什么其他人马上就对它投了反对票,因为它写得很好。我根据答案质量投票,即使我还不知道它是否完全准确。你的结论和我的一样,但我希望我错了,因为它真的能帮助我做到这一点。关于使用外部span 的顺序,这是一个好主意,但不幸的是,我不能使用它。上游为我提供了数千个外部 span's,其中任何一个都可以有一个 baz 内部。
  • 可能是因为我给出的示例与我在发布之前没有看到的 EDIT 2 不太相关。无论如何,我仍然认为第一部分回答了这个问题,但是是的,我很高兴被证明是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多