如何在SCSS中使用Mixin覆盖引用父选择器

时间:2018-07-31 22:03:59

标签: css sass css-selectors scss-mixins

我有一个常用的组件,它的scss是这样的:

.component {
    margin-right: 12px;

    &.specified-use-case {
        margin-right: 30px;

        &:nth-child(odd) {
            margin-right: 70px
        }
    }
}

现在,我希望所有内容在移动视图中都具有相同的样式

.component {
    margin-right: 12px;

    // some predefined mixin
    @include viewport(mobile) {
        margin-right: 0px;
        margin-bottom: 14px;
    }

    &.specified-use-case {
        margin-right: 30px;

        &:nth-child(odd) {
            margin-right: 70px
        }
    }
}

但这无法更改移动视图中“指定用例”的样式。为了做到这一点,我必须

.component {
    margin-right: 12px;

    // some predefined mixin
    @include viewport(mobile) {
        margin-right: 0px;
        margin-bottom: 14px;
    }

    &.specified-use-case {
        margin-right: 30px;

        @include viewport(mobile) {
            margin-right: 0px;
            margin-bottom: 14px;
        }

        &:nth-child(odd) {
            margin-right: 70px

            @include viewport(mobile) {
                margin-right: 0px;
                margin-bottom: 14px;
            }
        }
    }
}

这对我来说似乎不合适。有没有更好的方法来一次定义移动视图CSS?

3 个答案:

答案 0 :(得分:2)

很遗憾,根据CSS' specificity rules(尝试this calculator),您需要重复一遍。您的SCSS解释器所做的只是将您编写的内容编译为标准CSS,这看起来类似于:

.component {
 margin-right:12px
}
@media (max-width:768px) {
 .component {
  margin-right:0px;
  margin-bottom:14px
 }
}
.component.specified-use-case {
 margin-right:30px
}
@media (max-width:768px) {
 .component.specified-use-case {
  margin-right:0px;
  margin-bottom:14px
 }
}
.component.specified-use-case:nth-child(odd) {
 margin-right:70px
}
@media (max-width:768px) {
 .component.specified-use-case:nth-child(odd) {
  margin-right:0px;
  margin-bottom:14px
 }
}

如您所见,在声明之后,您将使用@media规则集覆盖每个类。而且由于我是一个强烈建议不要使用!important(因为您将打开潘多拉魔盒)的人,所以缩短SCSS的唯一方法是:

.component {
    margin-right: 12px;

    // some predefined mixin
    @include viewport(mobile) {
        margin-right: 0px;
        margin-bottom: 14px;  // only need to define margin-bottom once, here.
    }

    &.specified-use-case {
        margin-right: 30px;

        @include viewport(mobile) {
            margin-right: 0px;
            //margin-bottom: 14px;, remove this
        }

        &:nth-child(odd) {
            margin-right: 70px

            @include viewport(mobile) {
                margin-right: 0px;
                //margin-bottom: 14px;, remove this
            }
        }
    }
}

希望这会有所帮助!

答案 1 :(得分:1)

您可以将规则放在媒体查询中:

@include viewport(mobile) {
    margin-right: 0px;
    margin-bottom: 14px;

    &.specified-use-case {
        margin-right: 0px;
        margin-bottom: 14px;
    }
}

答案 2 :(得分:1)

似乎像sass是错误的,因为您在断点上方指定了边距,请尝试以下操作:

.component {
    margin-right: 12px;

&.specified-use-case {
    margin-right: 30px;

    &:nth-child(odd) {
        margin-right: 70px
    }
  }
 // some predefined mixin
@include viewport(mobile) {
    margin-right: 0px;
    margin-bottom: 14px;
}
}