Sass-背景の不透明度のために16進数をRGBaに変換


213

次のSassミックスインがあります。これは、RGBaの例を半分完全に変更したものです

@mixin background-opacity($color, $opacity: .3) {
    background: rgb(200, 54, 54); /* The Fallback */
    background: rgba(200, 54, 54, $opacity);
} 

私は$opacity大丈夫ですが、今は$color部品に行き詰まっています。ミックスインに送信する色はRGBではなくHEXになります。

私の使用例は:

element {
    @include background-opacity(#333, .5);
}

このミックスイン内でHEX値を使用するにはどうすればよいですか?

回答:


414

RGBA()関数が十分進RGB値のような単一の六角色を受け入れることができます。たとえば、これは問題なく動作します。

@mixin background-opacity($color, $opacity: 0.3) {
    background: $color; /* The Fallback */
    background: rgba($color, $opacity);
}

element {
     @include background-opacity(#333, 0.5);
}

ただし、16進数の色をRGBコンポーネントに分解する必要がある場合は、red()green()、およびblue()関数を使用して分割できます。

$red: red($color);
$green: green($color);
$blue: blue($color);

background: rgb($red, $green, $blue); /* same as using "background: $color" */

私はこれと、r、b、g関数を試してみましたが、機能しませんでした。Drupalバックエンドのダイナミックカラーを使用していましたが、何かが壊れている可能性があります。それでも、最後に並べ替えました。さらに調査した結果、答えが見つかりました+1
Rick Donohoe

1
しかし、#($ color + $ opacity)に相当する16進数は何ですか?-これは便利かもしれません。できる?
somedirection

2
私の知る限り、RGBAは不透明度を追加します。つまり、その背後にある要素を見ることができます。標準ではhex、これを行うことはできません。
Richard Peck

ありがとう。RGB Aで 16進数を試そうとは思わなかったでしょう。
RayViljoen

2
結果は同じで、ホイールを再発明する必要がないので、のrgba($color, $alpha)ように使用する方が良いrgba(#000000, 0.6)です。;)
lbartolic 2017

118

組み込みのミックスインがあります: transparentize($color, $amount);

background-color: transparentize(#F05353, .3);

量は0から1の間でなければなりません。

Sassの公式ドキュメント(モジュール:Sass :: Script :: Functions)


1
私はこれが好き!最新のブラウザー実装に最適です。
マイクコルメンディ2015年

16
サイドノートとして:$量は、それはあなたが設定する値ではなく、差し引きますどのくらいです
MMachinegun

3
量が逆になるように見える90%が、結果を得るために透明にしたいという意味を除いて、.1
うまく機能した

奇妙な。ドキュメントを読んだことがない人は、「透明化」機能があると疑うことはないでしょう。とても参考になりますが、ありがとうございます!
tobybot

すばらしい答えです。これは受け入れられる答えになるはずです。ありがとう。$colorTheme: hsl(289, 65%, 47%); $crossOutColor: transparentize($colorTheme, 0.5);私のために働いた。
ライアン

34

SASSには、値を評価するための組み込みrgba()関数があります。

rgba($color, $alpha)

例えば

rgba(#00aaff, 0.5) => rgba(0, 170, 255, 0.5)

独自の変数を使用した例:

$my-color: #00aaff;
$my-opacity: 0.5;

.my-element {
  color: rgba($my-color, $my-opacity);
}

出力:

.my-element {
  color: rgba(0, 170, 255, 0.5);
}

6

あなたはこの解決策を試すことができ、最高です... url(github

// Transparent Background
// From: http://stackoverflow.com/questions/6902944/sass-mixin-for-background-transparency-back-to-ie8

// Extend this class to save bytes
.transparent-background {
  background-color: transparent;
  zoom: 1;
}

// The mixin
@mixin transparent($color, $alpha) {
  $rgba: rgba($color, $alpha);
  $ie-hex-str: ie-hex-str($rgba);
  @extend .transparent-background;
  background-color: $rgba;
  filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#{$ie-hex-str},endColorstr=#{$ie-hex-str});
}

// Loop through opacities from 90 to 10 on an alpha scale
@mixin transparent-shades($name, $color) {
  @each $alpha in 90, 80, 70, 60, 50, 40, 30, 20, 10 {
    .#{$name}-#{$alpha} {
      @include transparent($color, $alpha / 100);
    }
  }
}

// Generate semi-transparent backgrounds for the colors we want
@include transparent-shades('dark', #000000);
@include transparent-shades('light', #ffffff);

5
あなたの答えは良いですが、不必要に複雑に見えます。透明な色合いは私の質問には関係ないと思いますが、透明な背景クラスについては説明できますか?透明なシェードのミックスインを使用していない場合、私は必要ないと思いますか?
リックDonohoe

@RickDonohoe、私が覚えている限り、z-index:1、および透明な背景はIE <9のフォールバックです。m.Eloutafiは、他のニーズでさらに使用するために、それを別のクラスに入れたと思います。「From:」で始まる回答の行を見る...
Roman M. Kos '30 / 09/30

2

変数からの色とアルファ透明度を混合する必要がある場合、rgba()関数を含むソリューションを使用すると、次のようなエラーが発生します。

      background-color: rgba(#{$color}, 0.3);
                       ^
      $color: #002366 is not a color.
   
          background-color: rgba(#{$color}, 0.3);
                            ^^^^^^^^^^^^^^^^^^^^

このようなものが役に立つかもしれません。

$meeting-room-colors: (
  Neumann: '#002366',
  Turing: '#FF0000',
  Lovelace: '#00BFFF',
  Shared: '#00FF00',
  Chilling: '#FF1493',
);
$color-alpha: EE;

@each $name, $color in $meeting-room-colors {

  .#{$name} {

     background-color: #{$color}#{$color-alpha};

  }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.