CSS에서 if / else 조건을 사용할 수 있습니까?


120

CSS에서 조건을 사용하고 싶습니다.

아이디어는 올바른 스타일 시트를 생성하기 위해 사이트가 실행될 때 대체 할 변수가 있다는 것입니다.

이 변수에 따라 스타일 시트가 변경되도록하고 싶습니다!

다음과 같이 보입니다.

[if {var} eq 2 ]
    background-position : 150px 8px;
[else]
    background-position : 4px 8px; 

할 수 있습니까? 어떻게하나요?


CSS 조건이 필요한 도대체 무엇을하려고하십니까?
Sapphire_Brick

답변:


138

전통적인 의미는 아니지만 HTML에 액세스 할 수있는 경우이를 위해 클래스를 사용할 수 있습니다. 이걸 고려하세요:

<p class="normal">Text</p>

<p class="active">Text</p>

CSS 파일에서 :

p.normal {
  background-position : 150px 8px;
}
p.active {
  background-position : 4px 8px;
}

이것이 CSS 방식입니다.


그런 다음 Sass 와 같은 CSS 전처리 기가 있습니다. 당신이 사용할 수있는 조건문 이이 같은 which'd 살펴 :

$type: monster;
p {
  @if $type == ocean {
    color: blue;
  } @else if $type == matador {
    color: red;
  } @else if $type == monster {
    color: green;
  } @else {
    color: black;
  }
}

단점은 스타일 시트를 사전 처리해야한다는 점과 조건이 런타임이 아닌 컴파일 시간에 평가된다는 것입니다.


적절한 CSS의 새로운 기능은 사용자 정의 속성 (일명 CSS 변수)입니다. 런타임에 평가됩니다 (지원하는 브라우저에서).

그들과 함께 당신은 라인을 따라 뭔가를 할 수 있습니다.

:root {
  --main-bg-color: brown;
}

.one {
  background-color: var(--main-bg-color);
}

.two {
  background-color: black;
}

마지막으로 선호하는 서버 측 언어로 스타일 시트를 사전 처리 할 수 ​​있습니다. PHP를 사용하는 style.css.php경우 다음과 같은 파일을 제공합니다 .

p {
  background-position: <?php echo (@$_GET['foo'] == 'bar')? "150" : "4"; ?>px 8px;
}

이 경우 이러한 스타일 시트를 캐싱하기가 어렵 기 때문에 성능에 영향을 미칩니다.


11
좋은 대답입니다. 캐싱과 관련하여 한 가지 요점을 추가하고 싶습니다. 브라우저는 스타일 시트를 캐시하고 일반적으로 모든 페이지에 대해 다시 다운로드하지 않기 때문에 PHP / [programming-language-of-choice]에 의해 생성 된 "동적"스타일 시트에 의존하기가 어렵습니다. . 작동해야하는 방식이 아닙니다. CSS를 변경해야한다면 당연히 페이지에 삽입 할 수 있지만 콘텐츠 / 프레젠테이션 분리에 어긋나 기 시작합니다.
deceze

3
deceze가 말한 것과 관련하여 동적으로 변경되는 웹 사이트를 가질 수 없다는 의미는 아닙니다. 스타일 시트는 정적으로 유지 될 수 있으며, 요소 스타일이 변경 될 수있는 방식으로 jquery 또는 PHP를 사용하거나 사용하지 않고 javascript를 사용하여 요소 클래스를 변경할 수 있습니다.
csga5000

그리고 스크롤바를 스타일 화하려면 어떨까요? (html에서 ::-webkit-scrollbar-button을 찾을 수 없습니다)
Jerry

음, 그래요? 어때요? Sass, CSS 변수 및 서버 측 처리는 HTML에 의존하지 않습니다. 아니면 여기에 뭔가 빠졌나요?
Boldewyn

15

아래는 여전히 유효한 내 오래된 답변이지만 오늘은 더 의견이 많은 접근 방식이 있습니다.

CSS가 너무 짜증나는 이유 중 하나는 조건부 구문이 없기 때문입니다. CSS는 그 자체로 현대 웹 스택에서 완전히 사용할 수 없습니다. 잠시 동안 SASS를 사용하면 내가 왜 그렇게 말하는지 알게 될 것입니다. SASS에는 조건부 구문이 있으며 기본 CSS에 비해 많은 다른 이점도 있습니다.


이전 답변 (아직 유효 함) :

일반적으로 CSS에서는 할 수 없습니다!

다음과 같은 브라우저 조건이 있습니다.

/*[if IE]*/ 
body {height:100%;} 
/*[endif]*/

그러나 아무도 Javascript를 사용하여 DOM을 변경하거나 클래스를 동적으로 할당하거나 각 프로그래밍 언어로 스타일을 연결하는 것을 막을 수 없습니다.

나는 때때로 CSS 클래스를 뷰에 문자열로 보내고 그 (php)와 같은 코드에 에코합니다.

<div id="myid" class="<?php echo $this->cssClass; ?>">content</div>

14
놀랍게도 아무도 CSS에 조건부 구문이 존재하지 않는다고 지적하지 않았습니다. 조건부 주석은 HTML에만 존재합니다.
BoltClock

12

calc()와 함께 사용 var()하여 일종의 모방 조건부를 사용할 수 있습니다 .

:root {
--var-eq-two: 0;
}

.var-eq-two {
    --var-eq-two: 1;
}

.block {
    background-position: calc(
        150px * var(--var-eq-two) +
        4px * (1 - var(--var-eq-two))
    ) 8px;
}

개념


8

두 개의 개별 스타일 시트를 만들고 비교 결과에 따라 그중 하나를 포함 할 수 있습니다.

하나에 둘 수 있습니다

background-position : 150px 8px;

다른 하나

background-position : 4px 8px;

CSS에서 수행 할 수있는 유일한 검사는 브라우저 인식이라고 생각합니다.

조건부 CSS


8

CSS에서 일종의 조건부이기도 한 CSS 의사 클래스를 아무도 언급하지 않았다는 사실에 놀랐습니다. 이것으로 자바 스크립트 한 줄없이 꽤 진보 된 일을 할 수 있습니다.

일부 의사 클래스 :

  • : active-요소가 클릭되고 있습니까?
  • : checked-라디오 / 체크 박스 / 옵션이 선택되어 있습니까? (이렇게하면 체크 박스를 사용하여 조건부 스타일을 지정할 수 있습니다!)
  • : empty-요소가 비어 있습니까?
  • : fullscreen-문서가 전체 화면 모드입니까?
  • : focus-요소에 키보드 포커스가 있습니까?
  • : focus-within-요소 또는 하위 요소에 키보드 포커스가 있습니까?
  • : has ([selector])-요소에 [selector]와 일치하는 자식이 포함되어 있습니까? (슬프게도 주요 브라우저에서는 지원되지 않습니다.)
  • : hover-마우스가이 요소를 가리 킵니까?
  • : in-range / : out-of-range-입력 값이 최소 및 최대 한계 사이 / 밖입니까?
  • : invalid / : valid-양식 요소에 유효하지 않은 / 유효한 내용이 있습니까?
  • : link-방문하지 않은 링크입니까?
  • : not ()-선택기를 반전합니다.
  • : target-이 요소가 URL 조각의 대상입니까?
  • : visited-사용자가 이전에이 링크를 방문한 적이 있습니까?

예:

div { color: white; background: red }
input:checked + div { background: green }
<input type=checkbox>Click me!
<div>Red or green?</div>


6

css 파일을 PHP로 구문 분석하도록 서버를 설정 한 다음 간단한 PHP 문으로 변수 변수를 정의합니다.

물론 이것은 당신이 PHP를 사용하고 있다고 가정합니다 ...


2
"PHP"를 "선택한 프로그래밍 또는 템플릿 언어"로 바꿀 수 있습니다.
Quentin

1
문제는 CSS가 50kb이고 몇 가지 값만 변경하는 경우 정적이고 캐시되는 것이 더 낫지 않을까요?
alex

2
네,하지만 역학을 필요로하는 부분을 추출하고을 통해 다시 포함 할 수 있습니다 @import url('dynamic.css.php').
Boldewyn

조건이 무엇인지에 따라 다릅니다. 사용자별로 안정적인 경우 일반적인 캐시 제어 헤더를 출력 할 수 있습니다.
Quentin

5

대신에 사용할 수 없습니다.

.Container *:not(a)
{
    color: #fff;
}

3

내가 아는 한 CSS에는 if / then / else가 없습니다. 또는 javascript 함수를 사용하여 요소의 background-position 속성을 변경할 수 있습니다.


3

또 다른 옵션 (if 문을 동적으로 평가할지 여부에 따라)은 여기에 설명 된대로 C 전처리기를 사용하는 입니다.


3

(예, 오래된 스레드입니다.하지만 다른 사람들도 관심을 가질 수 있도록 Google 검색 상단에 표시되었습니다.)

if / else-logic은 자바 스크립트로 수행 될 수 있으며, 이는 차례로 스타일 시트를 동적으로로드 / 언로드 할 수 있습니다. 나는 이것을 브라우저 등에서 테스트하지 않았지만 작동해야합니다. 이렇게하면 시작할 수 있습니다.

http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml


3

이것은 위의 Boldewyn 답변에 대한 약간의 추가 정보입니다.

if / else를 수행하기 위해 PHP 코드 추가

if($x==1){
  print "<p class=\"normal\">Text</p>\n";
} else {
  print "<p class=\"active\">Text</p>\n";
}

3

모든 조건 범위에 대해 컨테이너 div를 추가 할 수 있습니다.

컨테이너 div에 조건 값을 클래스로 추가합니다. (서버 측 프로그래밍-php / asp ...)

<!--container div-->
<div class="true-value">
   <!-- your content -->
   <p>my content</p>
   <p>my content</p>
   <p>my content</p>
</div>

이제 각 요소에 클래스를 추가하지 않고도 중첩 된 선택기를 사용하여 div의 모든 요소에 대한 전역 변수로 컨테이너 클래스를 사용할 수 있습니다.

.true-value p{
   background-color:green;
}
.false-value p{
   background-color:red;
}

2

이러한 목적으로 자바 스크립트를 다음과 같이 사용할 수 있습니다.

  1. 먼저 '일반'클래스와 '활성'클래스에 대해 CSS를 설정합니다.
  2. 그런 다음 요소에 ID 'MyElement'를 제공합니다.
  3. 이제 JavaScript에서 조건을 만듭니다. 아래 예제와 같이 ... (실행하고 myVar 값을 5로 변경하면 어떻게 작동하는지 볼 수 있습니다)

var myVar = 4;

if(myVar == 5){
  document.getElementById("MyElement").className = "active";
}
else{
  document.getElementById("MyElement").className = "normal";
}
.active{
  background-position : 150px 8px;
  background-color: black;
}
.normal{
  background-position : 4px 8px; 
  background-color: green;
}
div{
  width: 100px;
  height: 100px;
  }
<div id="MyElement">
  
  </div>


2

CSS는 멋지게 설계된 패러다임이며 많은 기능이 많이 사용되지 않습니다.

조건 및 변수가 전체 문서 또는 일부 요소의 범위에 일부 값의 변경을 배포하는 메커니즘을 의미하는 경우 다음 방법을 사용합니다.

var myVar = 4;
document.body.className = (myVar == 5 ? "active" : "normal");
body.active .menuItem {
  background-position : 150px 8px;
  background-color: black;
}
body.normal .menuItem {
  background-position : 4px 8px; 
  background-color: green;
}
<body>
<div class="menuItem"></div>
</body>

이렇게하면 CSS 스타일 전체에 변수의 영향을 분산시킬 수 있습니다. 이것은 @amichai 및 @SeReGa가 제안하는 것과 유사하지만 더 다양합니다.

이러한 또 다른 트릭은 문서 전체에 일부 활성 항목의 ID를 배포하는 것입니다 (예 : 메뉴를 강조 표시 할 때 다시) : (Freemarker 구문 사용)

var chosenCategory = 15;
document.body.className = "category" + chosenCategory;
<#list categories as cat >
    body.category${cat.id} .menuItem { font-weight: bold; }
</#list>
<body>
<div class="menuItem"></div>
</body>

물론 이것은 카테고리 나 주와 같은 제한된 항목 세트에서만 실용적이며 e-shop 상품과 같은 무제한 세트가 아닙니다. 그렇지 않으면 생성 된 CSS가 너무 큽니다. 그러나 정적 오프라인 문서를 생성 할 때 특히 편리합니다.

생성 플랫폼과 함께 CSS로 "조건"을 수행하는 또 다른 트릭은 다음과 같습니다.

.myList {
   /* Default list formatting */
}
.myList.count0 {
   /* Hide the list when there is no item. */
   display: none;
}
.myList.count1 {
   /* Special treatment if there is just 1 item */
   color: gray;
}
<ul class="myList count${items.size()}">
<!-- Iterate list's items here -->
<li>Something...</div>
</ul>


1

jquery 사용에 개방적이라면 html 내에서 javascript를 사용하여 조건문을 설정할 수 있습니다.

$('.class').css("color",((Variable > 0) ? "#009933":"#000"));

.class변수 값이보다 크면 의 텍스트 색상이 녹색으로 변경됩니다 0.


-1

다른 경우가 아닌 삼항 연산자를 사용하여 html로 수행하십시오.

class = "{{조건? 'class1': 'class2'}}"

또는

[ngClass] = "조건? 'class1': 'class2'"


-2

태그에 CSS를 작성하면 PHP를 사용할 수 있습니다.

<style>
    section {
        position: fixed;
        top: <?php if ($test == $tset) { echo '10px' }; ?>;
    }
</style
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.