Чи можете ви використовувати умови CSS у програмі CSS?


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 спосіб зробити це.


Потім є препроцесори CSS типу Sass . Ви можете використовувати там умовні умови , які виглядатимуть приблизно так:

$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 / [мова вибору мови програмування] . Це не так, як це має працювати. Якщо вам потрібна зміна CSS, ви можете вставити її на сторінку, звичайно, але це почне суперечити вмісту / поділу презентації.
деге

3
Що стосується того, що сказав deceze, це не означає, що ви не можете мати веб-сайт, що динамічно змінюється. Аркуші стилів можуть залишатися статичними, і ви можете змінювати класи елементів, використовуючи javascript з або без jquery або PHP, щоб змінити стилізацію елементів.
csga5000

а що робити, якщо ви хочете стилізувати смуги прокрутки? (ви не можете знайти :: - webkit-scrollbar-button у html)
Джеррі

Гм, так? Що з цим? Змінні 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. З цим ви можете зробити досить просунуті речі без жодного рядка JavaScript.

Деякі псевдокласи:

  • : active - елемент натискається?
  • : Позначено - чи встановлено прапорець / радіо / опція? (Це дозволяє зробити умовний стиль через використання прапорця!)
  • : empty - Чи елемент порожній?
  • : повноекранний - Чи документ у повноекранному режимі?
  • : focus - Чи має елемент фокусування на клавіатурі?
  • : focus-within - Чи має елемент чи хтось із його дітей фокус на клавіатурі?
  • : має ([селектор]) - чи містить елемент дочірня відповідність [селектор]? (На жаль, не підтримується жодним із основних браузерів.)
  • : hover - чи клацніть миша на цьому елементі?
  • : в діапазоні /: поза межами діапазону - Чи вхідне значення між / за межами мінімуму та максимальними межами?
  • : invalid /: valid - Чи містить елемент форми недійсний / допустимий вміст?
  • : посилання - Це небачене посилання?
  • : not () - Переверніть селектор.
  • : target - Цей елемент є цільовим фрагментом URL-адреси?
  • : відвідував - Користувач раніше відвідував це посилання?

Приклад:

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" на "Ваша мова програмування чи шаблонів за вибором"
Квентін

1
Проблема полягає в тому, що якщо ваш CSS становить 50 кбіт, а ви змінюєте лише декілька значень, чи не було б краще статичним і кешованим?
alex

2
Так, але ви можете витягти частини, щоб мати потребу в динаміці, і повторно включити їх через @import url('dynamic.css.php').
Boldewyn

Це залежить від того, які умови. Якщо вони стабільні на основі кожного користувача, ви можете вивести звичайні заголовки кеш-керування.
Квентін

5

Ви можете використовувати не замість того, якщо хочете

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

3

Наскільки я знаю, у css немає if / then / else. Крім того, ви можете використовувати функцію javascript, щоб змінити властивість фонового положення елемента.


3

Ще один варіант (заснований на тому, чи хочете ви, щоб оператор динамічно оцінювався чи ні) - використовувати препроцесор C, описаний тут .


3

(Так, стара нитка. Але вона з’явилася вгорі пошуку в Google, щоб і інші могли бути зацікавлені)

Я здогадуюсь, якщо if / else-логіка може бути виконана за допомогою JavaScript, який, в свою чергу, може динамічно завантажувати / вивантажувати таблиці стилів. Я не перевіряв це в браузерах тощо, але це має працювати. З цього ви почнете:

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


3

Це трохи додаткової інформації до відповіді Болдевіна вище.

Додайте код PHP, щоб зробити if / else

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>

Тепер ви можете використовувати контейнерний клас як глобальну змінну для всіх елементів у діві за допомогою вкладеного селектора, не додаючи клас до кожного елемента.

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

2

Для цього ви можете використовувати javascript таким чином:

  1. спочатку ви встановлюєте CSS для класу "нормальний" та для "активного" класу
  2. тоді ви надаєте своєму елементу ідентифікатор "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, але більш універсальне.

Ще одна така хитрість - розподілити ідентифікатор деякого активного елемента по всьому документу, наприклад, знову під час виділення меню: (використовується синтаксис 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>

Звичайно, це практично лише з обмеженим набором предметів, наприклад категорій або штатів, а не необмеженими наборами, такими як товари електронного магазину, інакше створений 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, ви можете встановити умовні оператори, використовуючи javascript у межах html:

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

Це змінить колір тексту .classна зелений, якщо значення змінної перевищує значення 0.


-1

просто зробіть це в html, використовуючи потрійний оператор, якщо не інше

class = "{{умова? 'class1': 'class2'}}"

або

[ngClass] = "умова? 'class1': 'class2'"


-2

Ви можете використовувати php, якщо пишете css у тег

<style>
    section {
        position: fixed;
        top: <?php if ($test == $tset) { echo '10px' }; ?>;
    }
</style
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.