Sass - Conversion de Hex en RGBa pour l'opacité de l'arrière-plan

213

J'ai le mixin Sass suivant, qui est une modification à moitié complète d'un exemple RGBa :

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

J'ai appliqué $opacityok, mais maintenant je suis coincé avec la $colorpartie. Les couleurs que j'enverrai dans le mixage seront HEX et non RGB.

Mon exemple d'utilisation sera:

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

Comment puis-je utiliser les valeurs HEX dans ce mixin?

Rick Donohoe
la source

Réponses:

415

La fonction rgba () peut accepter une seule couleur hexadécimale ainsi que des valeurs RVB décimales. Par exemple, cela fonctionnerait très bien:

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

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

Si vous avez besoin de diviser la couleur hexadécimale en composants RVB, vous pouvez utiliser les fonctions rouge () , vert () et bleu () pour le faire:

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

background: rgb($red, $green, $blue); /* same as using "background: $color" */
trémie
la source
Je jure que j'ai essayé ceci ET les fonctions r, b, g et cela n'a pas fonctionné. J'utilisais des couleurs dynamiques d'un back-end Drupal, ce qui peut avoir cassé quelque chose. Pourtant, trié à la fin et la réponse que j'ai trouvée après de nouvelles recherches +1
Rick Donohoe
1
MAIS, quel est l'équivalent hexadécimal de # ($ color + $ opacity)? - cela pourrait être utile. faisable?
direction
2
À ma connaissance, RGBA ajoute de l' opacité , ce qui signifie que vous pouvez voir des éléments derrière. Avec la norme hex, vous ne pouvez pas faire cela.
Richard Peck
Merci. N'aurais jamais pensé essayer hex sur rgb a!
RayViljoen
2
Mieux vaut l'utiliser rgba($color, $alpha)comme rgba(#000000, 0.6)le résultat est le même et il n'est pas nécessaire de réinventer la roue. ;)
lbartolic
118

Il existe un mixage intégré: transparentize($color, $amount);

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

Le montant doit être compris entre 0 et 1;

Documentation officielle de Sass (Module: Sass :: Script :: Functions)

user3631047
la source
1
J'aime ça! Idéal pour la mise en œuvre d'un navigateur moderne.
Mike Kormendy
18
en remarque: le montant en $ est la somme qu'il va soustraire, pas la valeur que vous souhaitez définir
MMachinegun
3
A très bien fonctionné, sauf que le montant semble être l'inverse, ce qui signifie que vous voulez le rendre 90%transparent pour obtenir le résultat.1
Patrick Mencias-lewis
bizarre. personne qui n'a pas lu la documentation ne soupçonnera jamais qu'il existe une fonction de "transparence". très utile cependant, merci!
tobybot
Très bonne réponse. Cela devrait être la réponse acceptée. Merci. $colorTheme: hsl(289, 65%, 47%); $crossOutColor: transparentize($colorTheme, 0.5);travaillé pour moi.
Ryan
34

SASS a une fonction rgba () intégrée pour évaluer les valeurs.

rgba($color, $alpha)

Par exemple

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

Un exemple utilisant vos propres variables:

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

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

Les sorties:

.my-element {
  color: rgba(0, 170, 255, 0.5);
}
Reggie Pinkham
la source
6

vous pouvez essayer cette solution, est la meilleure ... 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);
m.Elouafi
la source
5
Votre réponse est bonne mais semble être inutilement compliquée. Je suppose que les nuances transparentes ne sont pas pertinentes pour ma question, bien que pouvez-vous expliquer en quoi consiste la classe d'arrière-plan transparent? Je suppose que je n'en ai pas besoin si je n'utilise pas le mixin transparent-shades?
Rick Donohoe
@RickDonohoe, pour autant que je m'en souvienne, z-index: 1, et le fond transparent est un repli pour IE <9. Je pense que m.Eloutafi a mis cela dans une classe séparée, pour une utilisation ultérieure dans d'autres besoins. Regarder la ligne en réponse où il commence par "From:" ...
Roman M. Koss
2

Si vous devez mélanger la couleur à partir de la transparence variable et alpha, et avec des solutions qui incluent une rgba()fonction, vous obtenez une erreur comme

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

Quelque chose comme ça pourrait être utile.

$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};

  }

}
Vojtech
la source