当前位置: 首页 > 知识库问答 >
问题:

sass - SCSS中特定子选择器不生效的问题?

贝财
2024-08-06

scss 第二个子选择器失效问题

有如下代码,它无法按照预期运行:
html:

<div class="top-info">
  <div></div>
  <span>无床位</span>
  <div></div>
  <span>有床位</span>
</div>

scss:

.top-info{
  color: $fontColor;
  >div{
    width: .75rem;
    height: .75rem;
  }
  >div:first-child{
    background-color: $withoutBed;
  }
  >div:nth-child(2){
    background-color: $hasBed;
  }
 }

image.png
但若改成:

scss:
.top-info{
  color: $fontColor;
  >div{
    width: .75rem;
    height: .75rem;
  }
  >div:first-child{
    background-color: $withoutBed;
  }
  >div:nth-child(n+2){
    background-color: $hasBed;
  }
 }

image.png
它便生效了!(顺带一提,使用last-child也没有生效,!important也试过,应该不是优先级问题),有大佬知道是什么原因吗?

共有2个答案

司寇灵均
2024-08-06

nth-child用错了,nth-child(2)是匹配父元素的第二个元素,如果前面有元素名,再匹配对应的元素名对不对,所以,他是双重匹配,而不是先过滤再匹配。类似的选择器,可以换用nth-of-type。

这种需求,最好的做法是给div加上class,使用class设置样式,不然dom结构变化,css就失效了

翟丰茂
2024-08-06

在 SCSS(或 CSS)中,当你使用子选择器(>)时,它只会选择直接子元素。在你的 HTML 结构中,div 元素是 .top-info 的直接子元素,但 span 元素也是 .top-info 的直接子元素,它们会中断 div 元素在 :nth-child 选择器中的计数。

问题分析

在你的第一个 SCSS 示例中:

.top-info{
  // ...
  >div:nth-child(2){
    background-color: $hasBed;
  }
}

这里 :nth-child(2) 实际上尝试选择 .top-info 的第二个直接子元素,但根据 HTML 结构,第二个直接子元素是一个 span,而不是 div。因此,这个选择器不会匹配任何 div 元素。

解决方案

你的第二个 SCSS 示例之所以能够工作,是因为你使用了 :nth-child(n+2),这个选择器匹配从第二个元素开始的所有子元素(在这个上下文中,就是第二个和第三个直接子元素,它们都是 div)。但这并不是最精确的选择方法,因为它也包含了后续可能存在的其他类型的子元素。

为了更精确地选择 .top-info 下的第二个和之后的 div 子元素,你可以使用 :nth-of-type() 选择器,它只考虑特定类型的元素:

.top-info{
  color: $fontColor;
  >div{
    width: .75rem;
    height: .75rem;
  }
  >div:first-child{
    background-color: $withoutBed;
  }
  >div:nth-of-type(n+2){
    background-color: $hasBed;
  }
}

这里 :nth-of-type(n+2) 正确地选择了 .top-info 中的第二个及之后的所有 div 子元素,不受其他类型子元素(如 span)的影响。

总结

  • 使用 :nth-child() 时,要考虑到它计算的是所有类型的子元素。
  • 使用 :nth-of-type() 可以更精确地基于元素类型来选择子元素。
  • 在你的情况下,:nth-of-type(n+2) 是更合适的选择器。
 类似资料:
  • 本文向大家介绍sass SCSS,包括了sass SCSS的使用技巧和注意事项,需要的朋友参考一下 示例 就像在Sass中一样,SCSS变量用于存储一个值,该值将在整个SCSS文档中多次使用。 变量通常用于存储常用的属性值(例如字体和颜色),但可以用于任何属性的任何值。 SCSS使用该$符号声明变量。 !default如果要仅在尚未分配新值的情况下为该变量分配新值,则可以在声明变量时使用:    

  • 我最近在写CSS的时候用了SASS。我在WordPress上建网站。我开发了一种CSS编写方法,我认为这是一种通过特定的Wordpress“页面”组织CSS的聪明方法。我的方法是: 1)通过一些php魔法,我给每个新的Wordpress“page”一个独特的类,一直在body标签上。所以如果我的站点有4个页面,每个页面上的body标签都有一个独特的类,如:,等。 我想这会给我一个很好的“捷径”来设

  • 我有这个: 我想选择类为col-md-4,6,8,12的排班的孩子。有没有什么好办法一次全选? 可以有多个行DIV,我将使用wrapAll将每个行DIV的子级包装到其他DIV中。所以如果我使用wrapAll,它只是将其他行div的所有内容转移到第一个行div。如果我将选择器查询放在循环内部,它只是继续包装子项乘以行divs的数量。我不想让这种事发生。 你们听懂了吗?

  • 我是一个新生的QA,我在这里尝试编写一个Protractor脚本,从下拉列表中选择一个选项。我的下拉列表中有两个选项,我正在尝试从数字中选择它。 这是我正在使用的代码。 默认情况下,选项 2 在页面加载时处于选中状态。我需要的是从下拉列表中选择选项1。但是,我的代码不会这样做。 下面是选择选项的代码片段。 提前感谢:)

  • 正如您在代码中所看到的,我希望“&”指的是“.app”,因为它在其他地方以及node_sass中都起作用。 这是样式化组件中的一个bug还是我遗漏了什么?下面是复制问题的codesandbox链接:- https://codesandbox.io/s/jolly-visvesvaraya-ibjd8?file=/src/app.js

  • There are 2 CSS preprocessors to choose from: Less https://lesscss.org/ Sass https://sass-lang.com/ They both have been around for several years. We’re going to use Sass. Sass vs SCSS Sass has 2 synta

  • 问题内容: 我正在研究一个jQuery主题,其中包括对尽可能多的表单元素进行样式化。最初,它是为Webkit(Chrome)开发的。现在,我也想使其与Firefox一起使用。 问题是;Firefox在某些特定于Webkit的语法上存在问题。 例如: 问题是位。删除它,Firefox运行正常。它也做到这一点对于其他类似语法,并使用所有其他的事情标签。它可以识别出自己的标签,虽然很好。 Webkit似

  • 问题内容: 我有一个带有id列和成千上万行的表。我获得了1000个ID的列表,用于对照其他表格数据进行检查。 ID没有按顺序存储。 ID列表也不按顺序排列。 当我使用这些ID选择表格数据时,仅返回990个结果,这意味着自该列表产生以来,其中10个结果已更改/被删除。如何从该数据范围中找到10个缺失值?这是我目前正在做的事情: 返回990个结果。我可以做类似的事情吗? 编辑:抱歉造成混乱。我应该提到