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까지 hsl로 hex또는 색상 이름을. 의사 와 요소에 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.