Bạn có thể sử dụng điều kiện if / else trong CSS không?


120

Tôi muốn sử dụng các điều kiện trong CSS của mình.

Ý tưởng là tôi có một biến mà tôi thay thế khi trang web được chạy để tạo ra style-sheet phù hợp.

Tôi muốn nó để theo biến này, bảng kiểu thay đổi!

Nó có vẻ như:

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

Điều này có thể được thực hiện? Làm thế nào để bạn làm điều này?


Bạn đang cố gắng làm cái quái gì mà yêu cầu điều kiện CSS?
Sapphire_Brick

Câu trả lời:


138

Không phải theo nghĩa truyền thống, nhưng bạn có thể sử dụng các lớp cho việc này, nếu bạn có quyền truy cập vào HTML. Xem xét điều này:

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

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

và trong tệp CSS của bạn:

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

Đó là cách CSS để làm điều đó.


Sau đó là các bộ tiền xử lý CSS như Sass . Bạn có thể sử dụng các điều kiện ở đó, trông giống như sau:

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

Nhược điểm là bạn bị ràng buộc phải xử lý trước các bảng định kiểu của mình và điều kiện được đánh giá tại thời điểm biên dịch, không phải thời gian chạy.


Một tính năng mới hơn của CSS phù hợp là các thuộc tính tùy chỉnh (hay còn gọi là biến CSS). Chúng được đánh giá tại thời gian chạy (trong các trình duyệt hỗ trợ chúng).

Với họ, bạn có thể làm điều gì đó dọc theo dòng:

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

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

.two {
  background-color: black;
}

Cuối cùng, bạn có thể xử lý trước biểu định kiểu của mình bằng ngôn ngữ phía máy chủ yêu thích của bạn. Nếu bạn đang sử dụng PHP, hãy cung cấp một style.css.phptệp có dạng như sau:

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

Trong trường hợp này, tuy nhiên, bạn sẽ có tác động đến hiệu suất, vì việc lưu vào bộ nhớ đệm một biểu định kiểu như vậy sẽ rất khó khăn.


11
Câu trả lời hay, tôi chỉ muốn bổ sung một điểm liên quan đến bộ nhớ đệm: Vì các bảng định kiểu trong bộ đệm của trình duyệt và thường không tải xuống lại chúng cho mọi trang nên khó có thể dựa vào các bảng định kiểu "động" được tạo bởi PHP / [program-language-of-choice] . Nó không phải là cách nó phải hoạt động. Nếu bạn cần thay đổi CSS, tất nhiên bạn có thể nhúng nó vào trang, nhưng điều đó bắt đầu đi ngược lại với việc phân tách nội dung / bản trình bày.
dối trá

3
Liên quan đến những gì dối trá đã nói, điều đó không có nghĩa là bạn không thể có một trang web thay đổi động. Các trang định kiểu có thể giữ nguyên trạng thái tĩnh và bạn có thể thay đổi các lớp phần tử bằng cách sử dụng javascript có hoặc không có jquery hoặc PHP theo cách mà kiểu dáng phần tử có thể thay đổi.
csga5000

và nếu bạn muốn cách điệu thanh cuộn thì sao? (bạn không thể tìm thấy :: - webkit-scrollbar-button trong html)
Jerry

Ừm, vâng? Còn nó thì sao? Các biến Sass, CSS và xử lý phía máy chủ không phụ thuộc vào HTML. Hay tôi đang thiếu một cái gì đó ở đây?
Boldewyn

15

Dưới đây là câu trả lời cũ của tôi vẫn còn hiệu lực nhưng ngày nay tôi có một cách tiếp cận kiên định hơn:

Một trong những lý do khiến CSS hấp dẫn đến vậy là chính xác là nó không có cú pháp điều kiện. CSS hoàn toàn không sử dụng được trong ngăn xếp web hiện đại. Sử dụng SASS chỉ trong một thời gian ngắn và bạn sẽ biết tại sao tôi nói như vậy. SASS có cú pháp có điều kiện ... và rất nhiều lợi thế khác so với CSS nguyên thủy.


Câu trả lời cũ (vẫn còn hiệu lực):

Nó không thể được thực hiện trong CSS nói chung!

Bạn có các điều kiện trình duyệt như:

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

Nhưng không ai ngăn cản bạn sử dụng Javascript để thay đổi DOM hoặc gán động các lớp hoặc thậm chí nối các kiểu trong ngôn ngữ lập trình tương ứng của bạn.

Đôi khi tôi gửi các lớp css dưới dạng chuỗi đến chế độ xem và lặp lại chúng thành mã như vậy (php):

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

14
Ngạc nhiên là không ai chỉ ra rằng cú pháp có điều kiện không tồn tại trong CSS. Nhận xét có điều kiện chỉ tồn tại trong HTML.
BoltClock

12

Bạn có thể sử dụng calc()kết hợp với var()để sắp xếp các điều kiện bắt chước:

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

Ý tưởng


8

Bạn có thể tạo hai bảng định kiểu riêng biệt và bao gồm một trong số chúng dựa trên kết quả so sánh

Trong một trong những cái bạn có thể đặt

background-position : 150px 8px;

Trong một cái khác

background-position : 4px 8px;

Tôi nghĩ rằng kiểm tra duy nhất bạn có thể thực hiện trong CSS là nhận dạng trình duyệt:

CSS có điều kiện


8

Tôi ngạc nhiên là không ai đề cập đến các lớp giả CSS, cũng là một loại điều kiện trong CSS. Bạn có thể làm một số điều khá nâng cao với điều này mà không cần một dòng JavaScript nào.

Một số lớp giả:

  • : active - Phần tử đang được nhấp?
  • : đã chọn - Radio / hộp kiểm / tùy chọn có được chọn không? (Điều này cho phép tạo kiểu có điều kiện thông qua việc sử dụng hộp kiểm!)
  • : rỗng - Phần tử có trống không?
  • : fullscreen - Tài liệu có ở chế độ toàn màn hình không?
  • : focus - Phần tử có tiêu điểm bàn phím không?
  • : focus-inside - Phần tử hoặc bất kỳ phần tử nào trong số đó có tiêu điểm bàn phím không?
  • : has ([selector]) - Phần tử có chứa con khớp với [selector] không? (Đáng tiếc là không được hỗ trợ bởi bất kỳ trình duyệt chính nào.)
  • : hover - Con chuột có di chuột qua phần tử này không?
  • : in-range /: out-of-range - Giá trị đầu vào có nằm trong / ngoài giới hạn tối thiểu và tối đa không?
  • : invalid /: valid - Phần tử biểu mẫu có nội dung không hợp lệ / hợp lệ không?
  • : link - Đây có phải là một liên kết không được kiểm soát không?
  • : not () - Đảo ngược bộ chọn.
  • : target - Phần tử này có phải là mục tiêu của phân đoạn URL không?
  • : đã thăm - Người dùng đã truy cập liên kết này trước đây chưa?

Thí dụ:

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


6

Thiết lập máy chủ để phân tích cú pháp tệp css dưới dạng PHP và sau đó xác định biến biến bằng một câu lệnh PHP đơn giản.

Tất nhiên điều này giả sử bạn đang sử dụng PHP ...


2
Bạn có thể thay thế "PHP" với "lập trình hay templating ngôn ngữ của sự lựa chọn của bạn"
Quentin

1
Vấn đề là, nếu CSS của bạn là 50kb và bạn chỉ thay đổi một vài giá trị, thì liệu nó có tốt hơn là tĩnh và được lưu vào bộ nhớ đệm không?
alex

2
vâng, nhưng bạn có thể trích xuất các phần cần động lực học và bao gồm lại chúng thông qua @import url('dynamic.css.php').
Boldewyn

Nó phụ thuộc vào những gì các điều kiện là. Nếu chúng ổn định trên cơ sở mỗi người dùng, bạn có thể xuất các tiêu đề điều khiển bộ nhớ cache thông thường.
Quentin

5

Bạn có thể sử dụng not thay vì nếu thích

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

3

Theo như tôi biết, không có if / then / else trong css. Ngoài ra, bạn có thể sử dụng hàm javascript để thay đổi thuộc tính background-position của một phần tử.


3

Tuy nhiên, một tùy chọn khác (dựa trên việc bạn có muốn câu lệnh if được đánh giá động hay không) là sử dụng bộ tiền xử lý C, như được mô tả ở đây .


3

(Đúng, chủ đề cũ. Nhưng nó xuất hiện trên đầu trang tìm kiếm của Google nên những người khác cũng có thể quan tâm)

Tôi đoán logic if / else-logic có thể được thực hiện với javascript, từ đó có thể tải / dỡ các bảng định kiểu động. Tôi chưa thử nghiệm điều này trên các trình duyệt, v.v. nhưng nó sẽ hoạt động. Điều này sẽ giúp bạn bắt đầu:

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


3

Đây là một chút thông tin bổ sung cho câu trả lời của Boldewyn ở trên.

Thêm một số mã php để thực hiện if / else

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

3

Bạn có thể thêm div vùng chứa cho tất cả phạm vi điều kiện của mình.

Thêm giá trị điều kiện dưới dạng một lớp vào div vùng chứa. (bạn có thể đặt nó bằng lập trình phía máy chủ - php / asp ...)

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

Bây giờ bạn có thể sử dụng lớp vùng chứa làm biến toàn cục cho tất cả các phần tử trong div bằng cách sử dụng bộ chọn lồng nhau mà không cần thêm lớp vào từng phần tử.

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

2

Bạn có thể sử dụng javascript cho mục đích này, theo cách này:

  1. trước tiên, bạn đặt CSS cho lớp 'bình thường' và cho lớp 'hoạt động'
  2. sau đó bạn cung cấp cho phần tử của mình id 'MyElement'
  3. và bây giờ bạn thực hiện điều kiện của mình trong JavaScript, giống như ví dụ bên dưới ... (bạn có thể chạy nó, thay đổi giá trị của myVar thành 5 và bạn sẽ thấy nó hoạt động như thế nào)

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 là một mô hình được thiết kế độc đáo và nhiều tính năng của nó không được sử dụng nhiều.

Nếu theo một điều kiện và biến mà bạn muốn nói đến một cơ chế để phân phối thay đổi của một số giá trị cho toàn bộ tài liệu hoặc trong phạm vi của một số phần tử, thì đây là cách thực hiện:

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>

Bằng cách này, bạn phân phối tác động của biến trong suốt các kiểu CSS. Điều này tương tự như những gì @amichai và @SeReGa đề xuất, nhưng linh hoạt hơn.

Một thủ thuật khác như vậy là phân phối ID của một số mục đang hoạt động trong toàn bộ tài liệu, ví dụ: một lần nữa khi đánh dấu menu: (Sử dụng cú pháp của 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>

Chắc chắn, điều này chỉ thực tế với một nhóm mặt hàng giới hạn, như danh mục hoặc trạng thái, chứ không phải nhóm không giới hạn như hàng hóa trong cửa hàng điện tử, nếu không CSS được tạo sẽ quá lớn. Nhưng nó đặc biệt thuận tiện khi tạo các tài liệu ngoại tuyến tĩnh.

Một mẹo nữa để thực hiện "điều kiện" với CSS kết hợp với nền tảng tạo là:

.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

Nếu bạn muốn sử dụng jquery, bạn có thể đặt các câu lệnh có điều kiện bằng cách sử dụng javascript trong html:

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

Điều này sẽ thay đổi màu văn bản thành màu .classxanh lá cây nếu giá trị của Biến lớn hơn 0.


-1

chỉ làm điều này trong html bằng cách sử dụng toán tử bậc ba, không nếu khác

class = "{{condition? 'class1': 'class2'}}"

hoặc là

[ngClass] = "điều kiện? 'class1': 'class2'"


-2

Bạn có thể sử dụng php nếu bạn viết css trong Thẻ

<style>
    section {
        position: fixed;
        top: <?php if ($test == $tset) { echo '10px' }; ?>;
    }
</style
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.