【问题标题】:Do CSS functions exist?CSS函数存在吗?
【发布时间】:2021-09-18 21:28:06
【问题描述】:

我不知道该怎么称呼它,但基本上可以说我有一种我经常使用的风格,

.somepattern{
    font-size:16px;
    font-weight:bold;
    border:2px solid red;
}

但有时我想更改font-sizeborder 的颜色。是否可以将此代码视为一个库,我可以在其中将样式设置为 div

<div class="somepattern">Text</div>

但仍然像我们使用函数一样控制16pxred

【问题讨论】:

  • CSS 有功能,但不是你要找的那种。
  • 有趣的没有人提出表达式声明
  • rgb() 和 url() 是最常用的 css 函数。

标签: css


【解决方案1】:

我知道我迟到了,但选择的答案不是正确的答案,因为它将它推迟到 CSS 预处理器。

回答具体问题“CSS 函数存在吗?”,答案是:是的。

但是,CSS 函数的工作方式与 OP 最初的概念完全不同。

翠西平的答案似乎是最正确的答案。

CSS 函数示例如下:

  • url()
  • attr()
  • calc()
  • rotate()
  • scale()
  • linear-gradient()
  • sepia()
  • grayscale()
  • translate()

可以在此处找到详细、全面的列表:

CSS functions on MDN 更新链接 18/9/20

【讨论】:

  • 我们可以在 CSS 中创建自己的函数吗?
  • 目前没有。也许将来会以某种形式或形式出现。但是,如果发生这种情况,CSS 将不再是 CSS,而是一种编程语言。
【解决方案2】:

您无法通过标记以编程方式控制 CSS,但您可以使用众多 CSS 扩展中的一种来使 CSS 更像一种编译语言。

http://lesscss.org/

http://sass-lang.com/

如果我们用 LESS 编写您的示例,我们会得到如下内容:

.somepattern(@color: red, @size: 16px) {
    font-size:@size;
    font-weight:bold;
    border:2px solid @color;
}

然后你可以像这样在你的LESS文件中使用它:

.myclass {
    .somepattern(green, 20px);
}

【讨论】:

  • +1 使用其中之一。到目前为止,我只在一个项目中使用了 LESS,但我再也不想做纯 CSS 了。当然,如果可能的话,你应该在服务器端使用它们。
  • @Al Kepp:浏览器不能直接理解。需要在服务器端预先格式化或在客户端由 Javascript 解释。更好的方法当然是服务器端,因为样式并没有真正改变很多。如果您支持的是 Asp.net,您可以随时使用 T4 模板自动转换所有 *.less 文件...
  • @Al Kepp:如果您不知道 T4 是什么,请再次查看我的答案,我将 Phil Haack 的 T4 模板链接到 LESS。红色那篇博文,你会明白很多。请注意,T4 也可以用于其他用途,例如 enum generation
  • @ddagradi 只需在 Node.js 中使用 LESS ;)
  • 罗伯特,非常感谢您特别提到 T4。我认为这是一个很棒的工具,它可以为我做很多事情。我以前从未听说过。 +2
【解决方案3】:

不。没有您需要的 CSS 功能。至少不是直接的。

但至少有两种相当通用的方法供您使用来完成您需要的事情:

类组合

您当然可以在任何元素中组合任意数量的类,例如:

<div class="heading run-in">
    Some heading
</div>
Lorem ipsum dolor sit amet...

你的 CSS 定义为:

.heading {
    color: #999;
    font-size: 16pt;
    font-weight: bold;
    border-bottom: 2px solid red;
    display: block;
    margin: 1.5em 0 .5em;
}
.run-in {
    display: inline;
    margin: 0;
    font-size: 1em;
}

少 CSS

当然还有LESS CSS project 可以让您定义变量(并且还有其他糖)并在其他类中使用它们。

LESS 使用 变量mixins操作函数等动态行为扩展了 CSS。 LESS 使用 Node.js 在客户端(IE 6+、Webkit、Firefox)和服务器端运行。

如果您的服务器平台是 .net,那么有一个项目 DotLessCSS 也有一个 .net 中的库。还有 Phil Haack 的 T4 template

请注意,还有许多 CSS 预处理器/增强器,例如 LESS CSS:

也许还有一些我没有提到的。有些支持嵌套 CSS3 选择器,有些则不支持。有些针对特定的服务器端技术,有些则不针对。所以要明智地选择。

【讨论】:

  • 请不要在您的示例中定义 .red.size16 类。 CSS 类必须是语义的,即按其语义目的命名,而不是按实现命名。虽然我确定我只是用它作为示例,但这个非常危险,因为许多初学者会在他们的 css 代码中直接使用它。
  • @Al Kepp:感谢您指出这一点。我编辑了我的答案以反映这一点。
【解决方案4】:

您可以通过将样式标签添加到 HTML 来重新定义样式:

<div class="somepattern" style="font-size:5px">Text</div>

或通过应用多个类,如 class="somepattern small"。

HTML

<div class="somepattern small"> Text </div>

CSS

.small {
font-size:5px;
}

small 类将在somepattern 类之后应用,因此将覆盖some pattern 类中设置的任何属性。

【讨论】:

  • +1 但是 HTML+CSS 的一个例子会让这个答案更清楚。
  • 内联样式就像在不使用样式的情况下在 MS Word 中创建目录...更改 CSS 会导致样式的不可预知行为...
【解决方案5】:

您所描述的实际上是使用style 属性完成的。

<div class="somepattern" style="font-size:10px;">Text</div>

我认为这正是您想要的。并且不推荐,因为它打破了通常的(好的)吐出内容的模式及其视觉风格。 (虽然,老实说,我确实经常使用它。;-))

【讨论】:

  • 我建议你尽量不要使用内联。我从不使用它们。生活幸福多了。 :)
  • @Robert:尽管您在理论上是正确的,但现实世界有时会带来“情况”......此外,如果您按照答案中的建议定义 .size16 之类的类,那么这些不是语义类,所以他们没有比直接使用 style 属性更好的方式。
  • 哦,是的。因为更改 CSS 文件中的单个类定义意味着可预测的结果。具有内联样式会使样式更改更加复杂。尤其是在多开发人员团队中工作时。我的示例为每个类定义了一个 CSS 设置,这当然是一个非常简化的示例。每个类定义都可以(通常是)更复杂。
【解决方案6】:

它是一个 CSS 类。如果您要问的是,它不能像函数一样使用。没有代码库,因为它不是编译的。 CSS 只是用标记语言编写的文档的表示语义(格式)。您可以在 .css 文件中包含所有 css 类,并在任何您想要的地方使用它。

【讨论】:

    【解决方案7】:

    我通过其他人的 cmets 认识到这种解决方案使手头的问题过于复杂。此解决方案有效,但有更简单更好的替代方案,不依赖于服务器端脚本。

    如果您将样式表设为 php 文件 stylesheet.php?fontsize=16,您实际上可以控制您的样式表,然后您可以在样式表中检索变量

      <?php
         header("Content-type: text/css");
         $fontsize=16;
      ?>
    
     .somepattern{
       font-size: $fontsize;
       font-weight:bold;
       border:2px solid red;
       }
    

    【讨论】:

    • -1 这是一个怪异、怪异的解决方案,它 a) 依赖于服务器端库 b) 与 Web 标准大相径庭。我会非常警惕做这样的事情。
    • @ddagradi 我已经在许多网站上看到过这种做法。您能否详细说明这种方法的危险性 - 提前谢谢。
    • @Flying Swissman:可能是复杂性? CSS 文件往往非常复杂,因此您要么最终拥有大量简单的 CSS 文件,要么拥有一个非常复杂的文件,并且在引用它时必须定义大量变量。
    • 鉴于社区提出了许多独立于服务器端语言的解决方案,因此没有必要使用 PHP-as-CSS,而且使用 get 参数来管理您的样式似乎超级笨拙。如果你真的不能不动态地处理你的样式,使用 Javascript 来为你的元素添加额外的 CSS 类/内联样式。
    • @Fyling Swissman:实际上再想一想我应该指出,使用这种 CSS 文件引用很像内联样式。确实,它不是基于每个元素设置的,而是基于每个文件设置的。仍然需要多次更改才能一致地更改所有目标页面的外观。有很多具有不同值的变量会使这个过程更加错误。
    【解决方案8】:

    晚会!

    您现在可以使用css custom variables 执行此操作。

    在我们的css中使用var()函数:

    .some-pattern {
        font-size: var(--font-size);
        font-weight: bold;
        border: var(--border);
      }
    

    然后在我们的 html 中内联定义自定义变量:

    <div
      class="some-pattern"
      style="--border: 3px double red; --font-size: 16px;"
    >
      test
    </div>
    

    【讨论】:

    • 您还可以在单​​独的 CSS 类中定义自定义变量。例如class="some-pattern red".red { --border: 3px double red }
    【解决方案9】:

    是的,这是可能的。但是你必须在 Recatjs 的帮助下自己完成它(你不必更深入,基本就足够了)。其实这样想 如果bootstrap可以做这样的事情,我们只需要定义类名,它会自动设计HTML文件,那为什么我们做不到呢。

    这是我的代码图片(https://i.stack.imgur.com/hyePO.png)

    这就是我在 jsx 代码中使用它的方式 (https://i.stack.imgur.com/yK6VD.jpg)

    【讨论】:

    • 你好。我已编辑您的答案以删除个人信息,请不要发布此类内容或要求发送消息。问题和答案必须发生在网站本身。此外,您应该将代码发布为 格式化文本 而不是图像。谢谢你。 :)
    【解决方案10】:

    你的意思是内联样式吗? &lt;div class="somepattern" style="border-color:green"&gt;Text&lt;/div&gt;

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2016-11-07
      • 1970-01-01
      相关资源
      最近更新 更多