Sass - Chuyển đổi Hex thành RGBa cho độ mờ nền


213

Tôi có mixin Sass sau, đây là một sửa đổi hoàn chỉnh của một ví dụ RGBa :

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

Tôi đã áp dụng $opacityok, nhưng bây giờ tôi là một phần bị mắc kẹt $color. Màu sắc tôi sẽ gửi vào mixin sẽ là HEX chứ không phải RGB.

Ví dụ sử dụng của tôi sẽ là:

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

Làm cách nào tôi có thể sử dụng các giá trị HEX trong mixin này?

Câu trả lời:


414

Hàm rgba () có thể chấp nhận một màu hex cũng như các giá trị RGB thập phân. Ví dụ, điều này sẽ hoạt động tốt:

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

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

Tuy nhiên, nếu bạn cần ngắt màu hex thành các thành phần RGB, bạn có thể sử dụng các hàm red () , green ()blue () để làm như vậy:

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

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

Tôi thề tôi đã thử điều này VÀ các hàm r, b, g và nó không hoạt động. Tôi đã sử dụng màu sắc năng động từ back-end Drupal mặc dù có thể đã phá vỡ thứ gì đó. Tuy nhiên, cuối cùng đã sắp xếp nó và câu trả lời tôi tìm thấy sau khi nghiên cứu thêm +1
Rick Donohoe

1
NHƯNG, hex tương đương với # ($ color + $ opacity) là gì? - điều này có thể hữu ích. có làm được không?
một

2
Theo hiểu biết tốt nhất của tôi, RGBA thêm độ mờ , nghĩa là bạn có thể thấy các yếu tố đằng sau nó. Với tiêu chuẩn hex, bạn không thể làm điều này.
Richard Peck

Cảm ơn. Sẽ không bao giờ nghĩ sẽ thử hex trên rgb a!
RayViljoen

2
Tốt hơn để sử dụng rgba($color, $alpha)như rgba(#000000, 0.6)kết quả là như nhau và không cần phải phát minh lại bánh xe. ;)
lbartolic

118

Có một mixin dựng sẵn: transparentize($color, $amount);

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

Số lượng phải nằm trong khoảng từ 0 đến 1;

Tài liệu Sass chính thức (Mô-đun: Sass :: Script :: Chức năng)


1
Tôi thích điều này! Tuyệt vời cho việc thực hiện trình duyệt hiện đại.
Mike Kormendy

16
như một lưu ý phụ: số tiền $ là số tiền sẽ trừ đi, không phải giá trị bạn muốn đặt
MMachinegun

3
Làm việc tuyệt vời ngoại trừ số tiền dường như là ý nghĩa nghịch đảo mà bạn muốn làm cho nó 90%minh bạch để có được kết quả.1
Patrick Mencias-lewis

kỳ quái. không ai từng đọc tài liệu sẽ nghi ngờ có chức năng "minh bạch hóa". rất hữu ích mặc dù, cảm ơn bạn!
tobybot

Câu trả lời chính xác. Đây phải là câu trả lời được chấp nhận. Cảm ơn. $colorTheme: hsl(289, 65%, 47%); $crossOutColor: transparentize($colorTheme, 0.5);đã làm cho tôi.
Ryan

34

SASS có hàm rgba () tích hợp để đánh giá các giá trị.

rgba($color, $alpha)

Ví dụ

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

Một ví dụ sử dụng các biến của riêng bạn:

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

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

Đầu ra:

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

6

bạn có thể thử giải pháp này, là ... url ( github ) tốt nhất

// 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
Câu trả lời của bạn là tốt nhưng có vẻ phức tạp không cần thiết. Tôi đoán các sắc thái trong suốt không liên quan đến câu hỏi của tôi, mặc dù bạn có thể giải thích lớp nền trong suốt là gì không? Tôi cho rằng tôi không cần nó nếu tôi không sử dụng mixin trong suốt?
Rick Donohoe

@RickDonohoe, theo như tôi nhớ, z-index: 1 và nền trong suốt là một dự phòng cho IE <9. Tôi nghĩ rằng m.Eloutafi đã đưa nó vào lớp riêng biệt, để sử dụng nhiều hơn cho các nhu cầu khác. Xem hàng trong câu trả lời bắt đầu bằng "Từ:" ...
Roman M. Koss

2

Nếu bạn cần trộn màu từ độ trong suốt của biến và alpha và với các giải pháp bao gồm rgba()chức năng, bạn sẽ gặp lỗi như

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

Một cái gì đó như thế này có thể hữu ích.

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

  }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.