您可以在CSS中使用if / else条件吗?


119

我想在CSS中使用条件。

我的想法是,我有一个变量,在运行站点以生成正确的样式表时将其替换。

我想要它,以便根据此变量更改样式表!

看起来像:

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

能做到吗?你怎么做到这一点?


您到底需要CSS条件吗?
Sapphire_Brick,

Answers:


137

不是传统意义上的,但如果可以访问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预处理器。您可以在此处使用条件语句,如下所示:

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

但是,在这种情况下,由于缓存这样的样式表将很困难,因此会对性能产生影响。


10
好的答案,我只想补充一点关于缓存的信息:由于浏览器会缓存样式表,并且通常不会为每个页面重新下载样式表,因此很难依靠PHP / [programming-language-of-choice]生成的“动态”样式表。这不是它应该工作的方式。如果您需要更改CSS,则可以将其嵌入到页面中,但是这开始与内容/表示的分离背道而驰。
deceze

3
关于deceze所说的话,并不意味着您不能拥有一个动态变化的网站。样式表可以保持静态,您可以使用带有或不带有jquery或PHP的javascript更改元素类,从而可以更改元素样式。
csga5000

而且,如果要样式化滚动条该怎么办?(您无法在HTML中找到:::-webkit-scrollbar-button)
Jerry's

嗯是吗 那呢 Sass,CSS变量和服务器端处理不依赖于HTML。还是我在这里想念什么?
Boldewyn

15

以下是我的旧答案,该答案仍然有效,但是我今天有一个更自以为是的方法:

CSS之所以这么烂,原因之一就是它没有条件语法。CSS本身在现代Web堆栈中完全不可用。只需使用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-是否单击了元素?
  • :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语句定义变量variable。

当然,这假设您正在使用PHP ...


2
您可以将“ PHP”替换为“您选择的编程语言或模板语言”
Quentin

1
问题是,如果您的CSS为50kb,而您仅更改了一些值,那么静态和缓存会更好吗?
alex

2
是的,但是您可以提取需要动态处理的部分,然后通过进行重新添加@import url('dynamic.css.php')
Boldewyn

这取决于条件。如果它们对每个用户稳定,则可以输出常规的缓存控制标头。
昆汀,2009年

5

您可以使用not代替if

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

3

据我所知,css中没有if / then / else。另外,您可以使用javascript函数更改元素的background-position属性。




3

这是上面Boldewyn答案的一些额外信息。

添加一些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>

现在,您可以使用嵌套选择器将容器类用作div中所有元素的全局变量,而无需将类添加到每个元素中。

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

2

您可以通过以下方式为此目的使用javascript:

  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>

当然,这仅适用于有限的一组商品(例如类别或州),而不是无限的商品(如电子商店商品),否则生成的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如果Variable的值大于,这会将文字颜色更改为绿色0



-1

如果您在代码中编写CSS,则可以使用php

<style>
    section {
        position: fixed;
        top: <?php if ($test == $tset) { echo '10px' }; ?>;
    }
</style
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.