首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sass如何在: not ()伪类中使用“a”来表示没有父类?

Sass如何在: not ()伪类中使用“a”来表示没有父类?
EN

Stack Overflow用户
提问于 2020-06-25 06:59:16
回答 3查看 532关注 0票数 1

我需要添加一个条件“非父类”到代码,但它不工作。

下面是我尝试过的:

代码语言:javascript
复制
.display-download-icon {
  &:not(.media-2 &){ // if it does not has a parent with .media-2 class
    &:hover {
      .image-overlay {
        display: block;
        opacity: 1;
        z-index: 2;
      }
    }
  }
}

但它会转换为下面的CSS:

代码语言:javascript
复制
.display-download-icon:not(.media-2 .display-download-icon):hover .image-overlay {
  display: block;
  opacity: 1;
  z-index: 2;
}

HTML结构为:

代码语言:javascript
复制
<div class="media-2">
  <div class="display-download-icon">
    <div class="image-overlay"></div>
  </div>
</div>

你能帮上忙吗?谢谢

EN

回答 3

Stack Overflow用户

发布于 2020-06-25 16:36:47

首先,我们必须弄清楚一些事情。您可能误解了this article,因为它的标题有点不恰当。尽管CSS有一个子选择器,但它缺乏选择父选择器的能力。因为SASS只是编写CSS的一种更方便的方式,所以SASS也不能有这样的东西。这就是说,让我们继续讨论你的问题。

如果我理解正确的话,您希望仅当image-overlay元素不包含在具有media-2类的元素中时,它才具有悬停效果。如果是这样的话,你将不得不改变你的方法。

首先,定义正常行为,即除了具有.media-2类的元素之外的所有元素的正常行为。然后为.media-2类的子类定义一个新规则。

萨斯

代码语言:javascript
复制
.display-download-icon {
  display: block; /* Just for the demo */
  height: 100px; /* Just for the demo */
  width: 100%; /* Just for the demo */
  border: 1px solid black; /* Just for the demo */
  margin-bottom: 10px; /* Just for the demo */

  > .image-overlay {
    display: block;
    opacity: 1;
    z-index: 2;
  
    height: 100%; /* Just for the demo */
    width: 100%; /* Just for the demo */

    &:hover {
      background: red; /* Just for the demo */
    }
  }
}

.media-2 .display-download-icon > .image-overlay:hover {
  background: none; /* Just for the demo */
}

代码段

检查此代码段的功能

代码语言:javascript
复制
.display-download-icon {
  display: block;
  height: 100px;
  width: 100%;
  border: 1px solid black;
  margin-bottom: 10px;
}

.display-download-icon > .image-overlay {
  display: block;
  opacity: 1;
  z-index: 2;
  
  height: 100%;
  width: 100%;
}

.display-download-icon > .image-overlay:hover {
  background: red;
}

.media-2 .display-download-icon > .image-overlay:hover {
  background: none;
}
代码语言:javascript
复制
<div class="media-1">
  <div class="display-download-icon">
    <div class="image-overlay"></div>
  </div>
</div>

<div class="media-2">
  <div class="display-download-icon">
    <div class="image-overlay"></div>
  </div>
</div>

<div class="media-3">
  <div class="display-download-icon">
    <div class="image-overlay"></div>
  </div>
</div>

我希望你能明白这一点。

票数 1
EN

Stack Overflow用户

发布于 2020-06-25 07:07:01

"&"所做的就是充当前面父选择器的别名,这就是为什么您会得到编译后的输出(因为.media-2类名后面有"&“)。你只需要去掉最后一个"&“,它就能正常编译。

代码语言:javascript
复制
.display-download-icon {
  &:not(.media-2){ // removed the "&"
    &:hover {
      .image-overlay {
        display: block;
        opacity: 1;
        z-index: 2;
      }
    }
  }
}

上面编译为.display-download-icon:not(.media-2):hover .image-overlay { display: block;opacity: 1;z-index: 2;}

但您也可以删除其中的一些嵌套以使其更具可读性

代码语言:javascript
复制
.display-download-icon:not(.media-2):hover {
  .image-overlay {
     display: block;
     opacity: 1;
     z-index: 2;
   }
}

它将编译成相同的输出。

票数 0
EN

Stack Overflow用户

发布于 2020-06-25 08:24:08

可悲的是,CSS中没有父选择器这样的东西,所以这并不是一个真正的Sass &a问题,而是CSS的核心行为。

您需要编写一个专门的规则,如下所示:

代码语言:javascript
复制
/* base icon styling */
.display-download-icon {
  ...
}

/* separate rule for parent case */
div:not(.media-2) {
  .display-download-icon {
    &:hover {
      .image-overlay {
        display: block;
        opacity: 1;
        z-index: 2;
      }
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62565334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档