【问题标题】:Change a SCSS Variable based on CSS class [duplicate]根据 CSS 类更改 SCSS 变量 [重复]
【发布时间】:2015-09-03 19:39:37
【问题描述】:

我有一系列 a 标记组成一个网格(每个 a 是一个带有 .portfolio-grid-item 类的块)。

每个.portfolio-grid-item 包含多个divheading 元素,并通过变量($grid-color: $blue;) 使用默认颜色。

我正在尝试创建一个 SCSS 规则来执行以下操作:

  • 检查是否为a 标记分配了其他类。
  • 如果有其他类,请将默认颜​​色变量替换为新的。
  • 如果不是,则回退到默认值。

例如

分类为.portfolio-grid-item .orange 的元素应该将$grid-color: $blue 替换为$grid-color: $orange;

我尝试过使用mixinif 语句,但我以前从未这样做过,我不确定该方法是否正确或受支持。

我的笔在这里:http://codepen.io/anon/pen/EjwarE

任何建议将不胜感激!

更新:

简单地说(我知道这不是真正的代码,这只是我的目标逻辑,希望这会有所帮助!):

// Default
$grid-color: $blue


// Statement
if HTML element has class = `.orange`

// Change the following variable
$grid-color: $orange

这个想法是,这将一次性覆盖 所有 $grid-color 实例

【问题讨论】:

    标签: html if-statement sass mixins


    【解决方案1】:

    这更符合您的需要。我确信它可以改进,但我使用了一个颜色值图,我循环通过它来产生你的颜色变体。

    我没有使用 if 语句纯粹是因为默认情况下我修改了您的主要元素 CSS 以包含蓝色背景作为标准。通过这种方式,我们的循环只需要生成映射的其他颜色,并且样式会通过您添加到该元素的额外类来覆盖。

    SCSS:

    //set your base colours
    $colors: (
      green: green,
      blue: blue,
      orange: orange
    );
    
    //loop through your map and apply colours to the mapped values. This overrides the default where the additional class is applied. 
    @each $colors, $specific in $colors {
      .portfolio-grid-item.#{$colors} {
        background: $specific;
      }
    }
    

    您的投资组合项目:

    // Gird Sizings
    .portfolio-grid-item {
      height: $grid-item-height;   
      position: relative;
      text-decoration: none;
      float: left;
      width: 33.33%;
      //set default
      background: $grid-color;
    }
    

    工作示例 - Codepen

    使用此方法,您可以通过调整地图以包含更多值来将颜色应用于字体等。例如,您可以在地图中同时映射背景和字体颜色。如:

    //set your base colours
    $colors: 
      (green, white, green),
      (orange, white, orange);
    
    //loop through your map and apply colours to the mapped values. This overrides the default where the additional class is applied. 
    @each $color, $text, $bg in $colors {
      .portfolio-grid-item.#{$color} {
        background: $bg;
        color: $text;
      }
    }
    

    然后,您可以将悬停添加到循环中,并根据需要使映射到 $bg 的背景变暗。据我了解,这应该达到预期的结果。

    【讨论】:

    • 谢谢你 - 让我看看我能不能理解它(这对我来说是全新的)!
    • 如果有任何问题请告诉我。map的基本原理是第一个值是map键(即所有值关联的名称),下一个值是文本颜色,然后是背景颜色。任何其他内容都可以附加并添加到地图中以包含更多或更少的信息。然后在您运行循环时将其分配给 var。如果您要粘贴我的任何示例并调整值,您应该开始了解它是如何工作的。
    • 搞砸了,这一切都说得通!谢谢!
    【解决方案2】:

    好吧,你可以这样做:

    @mixin gridbg($bg) {
       @if $bg == blue {
       background: $blue;
     } @else if $bg == green {
       background: $green;
     } @else if $bg == orange {
       background: $orange;
     }
    }
    
    .orange {
      @include gridbg(orange);
    }
    
    .green {
      @include gridbg(green);
    }
    
    .blue {
      @include gridbg(blue);
    }
    

    更新

    上面只是一个简单的例子,但是你可以用 mixins 做更多的事情: 这是一个预览:

    .orange {
        @include gridbg(orange);
        h3 {
          color: $grid-color
        }
        h5 {
          color: white;
          background: $orange;
        }
        &:hover {
            @include gridbghover(orange);
            h3 {
              color: $grid-color
            }
            h5 {
              color: white;
              background: darken($orange, 20%);
            }
        }
    }
    

    还有一个demo

    【讨论】:

    • 谢谢,我得到了这个方法——但它并没有解决问题——它只替换了背景属性,我试图替换变量,以便它影响使用颜色的所有东西——我将您的代码添加到我的笔并在此处分叉...如果您将鼠标悬停在一个框上,您会看到悬停颜色(源自同一变量)不会改变...这是我的问题。
    • 你的更新很好 - 到目前为止,这是我能看到的唯一实现效果的选项......但它仍然非常复杂......我有 15 种颜色可以应用,所以写 15该代码的大块是我确信可以改进的东西......简单来说,我想说:(如果 class= .orange)=(使用 #ffa500 覆盖所有 $grid-color)
    • 这种方法的缺点是它都是手动的。您不妨只使用普通的 CSS。您获得的唯一进步是包含颜色的变量使事情变得更容易,但总的来说,这只是非常费力。 OP 需要可维护的代码!
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2022-01-11
    • 1970-01-01
    • 2015-10-14
    • 2020-08-22
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多