CSS 색상 변수에 불투명도를 어떻게 적용합니까?


144

전자 앱을 디자인하고 있으므로 CSS 변수에 액세스 할 수 있습니다. 색 변수를 vars.css다음과 같이 정의했습니다 .

:root {
  --color: #f0f0f0;
}

이 색상을에 사용하고 싶지만 main.css일부 불투명도가 적용되었습니다.

#element {
  background: (somehow use var(--color) at some opacity);
}

어떻게하면 되나요? 전처리기를 사용하지 않고 CSS 만 사용하고 있습니다. 모든 CSS 답변을 선호하지만 JavaScript / jQuery를 수락합니다.

opacity투명하지 않아야하는 배경 이미지를 사용하고 있기 때문에 사용할 수 없습니다 .


따라서 하나 이상의 요소를 사용해야하는 것처럼 들립니다 ....
epascarello

나는 선호하지 않지만, 내가해야 할 것 같다 ... :(
JoshyRobot

4
아 아아아 !!!!! 너무 짜증나! 지금은 거의 2020 년입니다. 색상 선택기는 #hex 색상을 얻습니다. alpha / rgba는 Sass / Stylus에서 작동하지 않습니다. rgb 값이 아니기 때문입니다. 모든 단색에 대해 CMS에 4 개의 슬라이더를 배치해야합니까?
보안관

답변:


240

기존 색상 값을 가져 와서 알파 채널을 적용 할 수 없습니다. 즉,와 같은 기존 16 진수 값을 가져 와서 #f0f0f0알파 구성 요소로 지정하고 결과 값을 다른 속성과 함께 사용할 수 없습니다 .

그러나 사용자 정의 속성을 사용하면 16 진수 값을 RGB 트리플렛으로 변환하여 사용할 수 있으며 rgba()해당 값을 쉼표를 포함하여 사용자 정의 속성에 저장하고 원하는 알파 값을 가진 함수 var()로 해당 값을 대체 rgba()할 수 있습니다. 그냥 일이야:

:root {
  /* #f0f0f0 in decimal RGB */
  --color: 240, 240, 240;
}

body {
  color: #000;
  background-color: #000;
}

#element {
  background-color: rgba(var(--color), 0.8);
}
<p id="element">If you can see this, your browser supports custom properties.</p>

이것은 거의 사실이 아닌 것 같습니다. 1 어떻게 작동합니까?

커스텀 속성의 값으로 치환된다는 사실에 놓여 마법 으로는 교체 할 때 var(), 특성 값에 대한 참조를 하기 전에 그 속성의 값이 계산된다. 지금까지 사용자 지정 속성에 관한 한대로의 가치 있음이 수단 --color귀하의 예제에서 모두에서 컬러 값이 아닙니다 까지var(--color) 표현은 색상 값 (및 해당 맥락에서) 기대 어딘가에 나타납니다. 에서 2.1 CSS의-변수 사양의 :

사용자 정의 속성에 허용되는 구문은 매우 허용됩니다. 시퀀스에 <bad-string-token>, <bad-url-token>, 일치하지 않는 <)-token>, <]-가 포함되지 않는 한 <declaration-value> 생성은 하나 이상의 토큰 시퀀스와 일치합니다. token> 또는 <}-token> 또는 "<" "값을 가진 최상위 <semicolon-token> 토큰 또는 <delim-token> 토큰.

예를 들어, 다음은 유효한 사용자 정의 특성입니다.

--foo: if(x > 5) this.width = 10;

이 값은 변수로는 쓸모가 없지만 일반적인 속성에서는 유효하지 않으므로 JavaScript에서 읽고 작동 할 수 있습니다.

그리고 3 절 :

속성에 하나 이상의 var () 함수가 포함되어 있고 해당 함수가 구문 상 유효한 경우 구문 분석시 전체 속성 문법이 유효한 것으로 가정해야합니다. var () 함수가 대체 된 후 계산 된 값 시간에 구문 검사 만됩니다.

이것은 240, 240, 240위에서 본 값이 선언이 계산 되기 전에rgba() 함수 로 직접 대체 됨을 의미합니다 . 그래서 이거:

#element {
  background-color: rgba(var(--color), 0.8);
}

rgba()쉼표로 구분 된 숫자 값이 4 개 이상이어야 하므로 처음 에는 유효한 CSS가 아닌 것 같습니다.

#element {
  background-color: rgba(240, 240, 240, 0.8);
}

물론 이것은 완벽하게 유효한 CSS입니다.

한 단계 더 나아가면 알파 구성 요소를 자체 사용자 정의 속성에 저장할 수 있습니다.

:root {
  --color: 240, 240, 240;
  --alpha: 0.8;
}

동일한 결과로 대체하십시오.

#element {
  background-color: rgba(var(--color), var(--alpha));
}

이를 통해 즉시 교환 할 수있는 다른 알파 값을 가질 수 있습니다.


1 사용자 정의 속성을 지원하지 않는 브라우저에서 코드 스 니펫을 실행하는 경우입니다.


12
이것은 아름답다
roberrrt-s

1
@Roberrrt : 사실 답변을 이전에 게시 한 것을 보았을 때 실제로 깨달아야 할 것 입니다.
BoltClock

2
이 변수를 사용한다면 다음과 같은 것을 사용하지 마십시오 .element2 { background-color: rgba(var(--red), var(--low-opacity); }. 이렇게하면 변수 사용법을 완전히 활용할 수 있습니다 :).
roberrrt-s 2014

7
불행하게도, "240, 240, 240"색상 선택기로 값을 편집 할 수 없습니다. GUI에 적합한 색상을 찾아야 할 때 큰 실수입니다.
GetFree

1
@ s3c 구문 var(--hex-color)99#333333 99분명히 원하는 것이 아닌 두 개의 토큰 ( 토큰 을 분리 할 공간에 주목 )으로 변환됩니다 . 사용자 정의 속성은 원래 문자열이 아닌 토큰을 복사하도록 정의되었으며 이것이 최종 결과입니다. 지금이 문제를 해결하기에는 너무 늦었습니다.
Mikko Rantalainen

19

OP가 전처리기를 사용하지 않는다는 것을 알고 있지만 다음 정보가 여기에 대한 답변의 일부인 경우 도움이 될 것입니다 (아직 댓글을 달 수 없습니다. 그렇지 않으면 @BoltClock 답변에 댓글을 달았습니다.

예를 들어 scss를 사용하는 경우 scss는 4 개의 매개 변수가 필요한 scss 관련 rgba () / hsla () 함수를 사용하여 스타일을 컴파일하려고 시도하기 때문에 위의 대답이 실패합니다. 그러나 rgba () / hsla ()도 기본 CSS 함수이므로 문자열 보간을 사용하여 scss 함수를 무시할 수 있습니다.

예 (sass 3.5.0+에서 유효) :

:root {
    --color_rgb: 250, 250, 250;
    --color_hsl: 250, 50%, 50%;
}

div {
    /* This is valid CSS, but will fail in a scss compilation */
    background-color: rgba(var(--color_rgb), 0.5);
    
    /* This is valid scss, and will generate the CSS above */
    background-color: #{'rgba(var(--color_rgb), 0.5)'};
}
<div></div>

lighten()결과 코드가 기능적인 CSS가 아니기 때문에과 같은 CSS가 아닌 scss 함수에는 문자열 보간이 작동 하지 않습니다. 그래도 여전히 유효한 scss이므로 컴파일시 오류가 발생하지 않습니다.


4
당신이 당신의 말대꾸 .scss 파일에 기본 CSS 색상 기능을 사용하려는 경우, 당신은 처리 '말대꾸를 무시하고 그들을 통과하기 위해 파일의 상단에 다음과 같은 함수 정의를 포함 할 수 있습니다 : @function rgb($args...) { @return #{'rgb(#{$args})'}; } @function rgba($args...) { @return #{'rgba(#{$args})'}; } @function hsl($args...) { @return #{'hsl(#{$args})'}; } @function hsla($args...) { @return #{'hsla(#{$args})'}; }````
lunelson

rgbargb지금은 꽤 오랫동안 동의어입니다 . 따라서 "a"를 삭제할 수 있습니다.
s3c

1
scss 파일에 대한 또 다른 해결 방법은 대문자 ( RGB) 를 사용 하는 것입니다. 그러면 sass에서 무시됩니다. 예 : color: RGB(var(--color_rgb), 0.5);. 에서 GitHub의
Jono 작업

9

나는 비슷한 상황에 있었다, 그러나 변수에서 아무것도 할 수 있기 때문에 불행하게도 주어진 솔루션은 나를 위해 작동하지 않았다 rgb까지 hslhex또는 색상 이름을. 의사 와 요소에 and
를 적용 하여이 문제를 해결했습니다 .background-coloropacity:after:before

.container {
    position: relative;
}

.container:before {
    content: "";
    width: 100%;
    height: 100%;
    position: absolute;
    left: 0;
    background-color: var(--color);
    opacity: 0.3;
}

배경을 적용 할 요소에 따라 스타일을 약간 변경해야 할 수도 있습니다.
또한 모든 상황에서 작동하지는 않지만 다른 솔루션을 사용할 수없는 경우에 도움이되기를 바랍니다.

편집 : 방금이 솔루션은 대상 요소 앞에 요소를 만들고 투명한 배경색을 적용하기 때문에 텍스트 색상에도 영향을 미친다는 것을 알았습니다.
경우에 따라 문제가 될 수 있습니다.


이는보다 유연한 색상 지정 (예 : 이름 또는 rgb또는 HSL)을 허용 할뿐만 아니라 기본 CSS 색상 함수와 Sass의 색상 함수 사이의 충돌을 피할 수 있다는 장점이 있습니다. 아래의 SimplyPhy의 답변을 참조하십시오 .
Jim Ratliff

1
나는 그것을 사용 :before하지 않고 올바른 적재 순서를 얻을 수 있도록 사용하는 것이 낫다고 생각합니다 z-index.
Mikko Rantalainen

5

이것은 실제로 CSS로 가능합니다 . 조금 더러워 그라디언트를 사용해야합니다. 예를 들어 작은 스 니펫을 코딩했습니다. 어두운 배경의 경우 밝은 흰색의 경우와 같이 검은 색 불투명도를 사용해야합니다.

:root {
  --red: rgba(255, 0, 0, 1);
  --white-low-opacity: rgba(255, 255, 255, .3);
  --white-high-opacity: rgba(255, 255, 255, .7);
  --black-low-opacity: rgba(0, 0, 0, .3);
  --black-high-opacity: rgba(0, 0, 0, .7);
}

div {
	width: 100px;
	height: 100px;
	margin: 10px;
}
    
    
.element1 {
	background: 
        linear-gradient(var(--white-low-opacity), var(--white-low-opacity)) no-repeat,
	linear-gradient(var(--red), var(--red)) no-repeat;
}

.element2 {
	background: 
        linear-gradient(var(--white-high-opacity), var(--white-high-opacity)) no-repeat,
	linear-gradient(var(--red), var(--red)) no-repeat;
}
    
.element3 {
	background: 
        linear-gradient(var(--black-low-opacity), var(--black-low-opacity)) no-repeat,
	linear-gradient(var(--red), var(--red)) no-repeat;
}

.element4 {
	background: 
        linear-gradient(var(--black-high-opacity), var(--black-high-opacity)) no-repeat,
	linear-gradient(var(--red), var(--red)) no-repeat;
}
<div class="element1">hello world</div>
<div class="element2">hello world</div>
<div class="element3">hello world</div>
<div class="element4">hello world</div>


배경 크기를 지정할 필요가 없습니다. 그라디언트에는 고유 크기가 없으며 결과적으로 자동으로 늘어납니다.
BoltClock

@BoltClock 예, 말 그대로 게시했을 때 코드 펜에서 약간의 장난이 있었다고 생각했습니다. 고마워요!
roberrrt-s

이것은 영리합니다 . 작년에 비슷한 질문에 대답했을 때 단색 그라데이션을 서로 겹쳐서 생각하지 않았습니다 . 이 질문은 어쨌든 그것이 작성된 방식보다 더 일반적 일 것입니다. 제가 대답 한 것은 매우 구체적인 사용 사례에 대한 것이 었습니다.
BoltClock

배경이 다르면 실제로 작동하지 않습니다. 이제 '불투명도'를 적용 할 때 흰색 배경 (255,255,255)으로 가정합니다. OP의 기본 배경색으로 기본 설정 될 수 있습니다. 그러나 다시, 흰색 배경은 아마도 사람들이 이것을 알지 못할 정도로 가장 밝은 색상의 필요성에 맞을 것입니다.
roberrrt-s

1
방금 다른 놀라운 것을 발견했습니다. 나는 이제 답을 올렸다.
BoltClock

1
:root{
--color: 255, 0, 0;
}

#element{
    background-color: rgba(var(--color), opacity);
}

여기서 불투명도를 0에서 1 사이의 값으로 바꾸십시오.


이것이 질문에 대답하려는 시도입니까? 그렇다면 코드가 실제로 의미가 없기 때문입니다. 특히 rgba(var(--color), opacity)비트. 특히 사용자 정의 속성 값은 전체 rgb () 표기법이므로. 또한 "불투명도"키워드 때문입니다.
BoltClock

rgb 부품은 var에 있어서는 안된다
피자

1

SCSS / SASS

장점 : 모든 채널 (0-255)에 8 비트를 사용하는 대신 16 진수 색상 값만 사용할 수 있습니다.

이것이 내가 https://codyhouse.co/blog/post/how-to-combine-sass-color-functions-and-css-variables 의 초기 아이디어로 내가 한 방법입니다.

편집 :#{$color-name}-rgb 생성 된 * -r, * -g, * -b CSS 변수를 사용 하고 생략 하도록 alpha 함수를 수정할 수도 있습니다 .


결과

body {
  --main-color: rgb(170, 68, 204);
  --main-color-rgb: 170,68,204;
  --main-color-r: 170;
  --main-color-g: 68;
  --main-color-b: 204;
}

.button-test {
  // Generated from the alpha function
  color: rgba(var(--main-color-r), var(--main-color-g), var(--main-color-b), 0.5);
  // OR (you wrote this yourself, see usage)
  color: rgba(var(--main-color-rgb), 0.5);
}

용법:

body {
    @include defineColorRGB(--main-color, #aa44cc);
}

.button-test {
  // With alpha function:
  color: alpha(var(--main-color), 0.5);
  // OR just using the generated variable directly
  color: rgba(var(--main-color-rgb), 0.5);
}

믹스 인 및 기능

@mixin defineColorRGB($color-name, $value) {
    $red: red($value);
    $green: green($value);
    $blue: blue($value);
    #{$color-name}: unquote("rgb(#{$red}, #{$green}, #{$blue})");
    #{$color-name}-rgb: $red,$green,$blue;
    #{$color-name}-r: $red;
    #{$color-name}-g: $green;
    #{$color-name}-b: $blue;
}

// replace substring with another string
// credits: https://css-tricks.com/snippets/sass/str-replace-function/
@function str-replace($string, $search, $replace: '') {
    $index: str-index($string, $search);
    @if $index {
        @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
    }
    @return $string;
}

@function alpha($color, $opacity) {
    $color: str-replace($color, 'var(');
    $color: str-replace($color, ')');
    $color-r: var(#{$color+'-r'});
    $color-g: var(#{$color+'-g'});
    $color-b: var(#{$color+'-b'});
    @return rgba($color-r, $color-g, $color-b, $opacity);
}

희망적으로 이것은 누군가를 구할 수 있기를 바랍니다.


1
나는이 접근법을 좋아한다. 감사합니다
tonygatta

0

각 색상에 고유 한 변수 / 값을 설정할 수 있습니다 (원본과 불투명 색상).

:root {
  --color: #F00;
  --color-opacity: rgba(255, 0, 0, 0.5);
}
#a1 {
  background: var(--color);
} 
#a2 {
  background: var(--color-opacity);
}
<div id="a1">asdf</div>
<div id="a2">asdf</div>

이것을 사용할 수없고 자바 스크립트 솔루션에 문제가 없다면 다음 중 하나를 사용할 수 있습니다.

$(function() {
  $('button').click(function() {
    bgcolor = $('#a2').css('backgroundColor');
    rgb_value = bgcolor.match(/\d+,\s?\d+,\s?\d+/)[0]
    $('#a2').css('backgroundColor', 'rgba(' + rgb_value + ', 0.5)');
  });
});
:root {
  --color: #F00;
}
#a1 {
  background: var(--color);
} 
#a2 {
  background: var(--color);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="a1">asdf</div>
<div id="a2">asdf</div>
<button>Click to change opacity</button>


1
불투명도 값이 변경되므로 모든 불투명도에 대한 변수를 작성하는 것은 성 가실 것입니다.
JoshyRobot

-1

일반 CSS 변수와 함께 rgba ()를 사용하려면 다음을 시도하십시오.

  1. : root 안에 색을 선언하지만 다른 답변과 같이 rgb ()를 사용하지 마십시오. 그냥 값을 쓰십시오

:root{
  --color : 255,0,0;
  }

  1. var ()을 다른 답변으로 사용하여 --color 변수를 사용하십시오.

#some-element {
  color : rgba(var(--color),0.5);
}


-3

CSS에서는 rgba 값을 사용할 수 있어야합니다.

#element {
  background: rgba(240, 240, 240, 0.5);
}

또는 불투명도를 설정하십시오.

#element {
  background: #f0f0f0;
  opacity: 0.5;    
}

1
rgba 값을 하드 코딩 할 수 없으며 색상 변수를 사용하고 있습니다. 투명하지 않아야하는 배경 이미지가 있으므로 불투명도를 사용할 수 없다고 언급 했어야합니다.
JoshyRobot

BG가 투명성을 갖기를 원하지만 전체 요소가 불투명성을 갖기를 원한다면 모든 것에 불투명성을 추가하는 것은 도움이되지 않습니다.
Levidps

-4

나처럼 16 진수 색상을 좋아한다면 다른 해결책이 있습니다. 16 진수 값은 6 자리이며 그 이후의 알파 값입니다. 00은 100 % 투명도입니다. 99는 약 75 %입니다. 알파벳 'a1-af'를 사용한 다음 'b1-bf'는 'ff'로 끝나고 100 % 불투명합니다.

:root {
--color: #F00;
}

#element {
background: var(--color)f6;
}

1
불행히도, 나는 이것이 효과가 있다고 생각하지 않습니다. 8 자리 16 진수 코드 지원이 확산되기 시작했지만 허용 된 답변에 사용 된 트릭이 작동하는 것처럼 보이지 않습니다. 예 : jsbin.com/nacuharige/edit?css,output
JoshyRobot

이 방법은 효과적이지 않지만 훌륭한 해결책이 될 수 있습니다.
Braden Rockwell Napier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.