【问题标题】:Pass a value from HTML to CSS将值从 HTML 传递到 CSS
【发布时间】:2018-10-06 19:45:48
【问题描述】:

我很感兴趣是否可以将值从 html 传递给 css 类? 像这样 示例:

<div class="mt(5)"> Some text </div>
style {
 .mt(@mpx) {
   margin-top: @mpx px;
 }
}

我听说在 Less 中可以采用这种方式

【问题讨论】:

  • 既然你提到了less,你有研究过吗?
  • 这个question可以考虑你的关注
  • ... 为什么不直接使用&lt;div style="margin-top:5px"&gt;?如果您打算使用一个类来应用单个样式,然后将其作为 HTML 传入的变量,那么您不妨只使用内联样式。或者你可以正确地做事。
  • 首先我想把代码最小化并且写的很好。我根本不能使用内联样式,因为它不是一个好的解决方案。对于边距和填充,我想要不同的样式: ml-1 > margin-left:5; mb-2 > 边距底部:10;等等。所以我不想把所有的case都用硬编码写出来。
  • 我听说这种方式在 Less 中是可能的 - 不,它不是(CSS、Less 和任何其他 CSS 预处理器都不是)。您需要一些脚本来实现目标。

标签: html css variables styles less


【解决方案1】:

也许这就是您要找的东西? CSS: Attr()

您可以将值绑定到一个属性,然后在 css 中获取该属性,如下所示:

CSS

<p data-foo="hello">world</p>

CSS

[data-foo]::before {
    content: attr(data-foo) " ";
}

结果

你好世界

【讨论】:

    【解决方案2】:

    这是一种使用LESS的方法。

    1. 使用 CSS 变量:
      变量可以在 HTML 元素的style 属性中声明。
      然后,CSS 将从 HTML 中获取值并应用正确的样式。

    2. 添加一些 JavaScript:
      现在可以动态修改变量的值。

    ⋅ ⋅ ⋅

    使用示例:

    • 背景颜色在 HTML 中设置,(固定)
    • 如果单击,div1 的填充将增大。 (动态)

    // When clicking on the div1, padding is gonna grow up.
    document.getElementById("div1").onclick = function(){
      var pad = this.style.getPropertyValue("--pad");
      this.style.setProperty("--pad", parseInt(pad) + 1);
    }
    .divs {
      background: var(--bg);
      padding: calc(var(--pad)*5px);
    }
    <div id="div1" class="divs" style="--bg: #ff6; --pad: 1;">div1</div>
    <div id="div2" class="divs" style="--bg: #f66; --pad: 2;">div2</div>

    ⋅ ⋅ ⋅

    关于 CSS 变量: 变量名必须以-- 开头并且区分大小写。
    这些变量值应用于元素及其子元素。
    要全局使用,可以在 body 标签上声明。

    这里是一些示例的链接:https://www.w3schools.com/css/css3_variables.asp

    【讨论】:

    • 是的,我找到了定义变量主题,但这不是我需要的。这很有趣。我想动态传递变量。
    • @KoboldMines “动态”是什么意思? (CSS变量可以用javascript/jQuery访问)
    • 我的意思是从 HTML 传递值并在 css 中捕获它们。我使用 Angular 项目,不能使用 jQuery。
    • @KoboldMines 我添加了一个修改 CSS 变量的 JavaScript(没有 jQuery)示例。
    【解决方案3】:

    不,您想要的方式在 CSS 或其任何超集(如 Less 和其他)中都是不可能的。总是 HTML 使用来自 CSS 的值,而不是相反。因此,您需要一些脚本来满足您的需求。

    可以通过 Custom Properties 使用内联样式将值从 HTML 传递到 CSS:

    .c {color:  var(--c)}
    .m {margin: var(--m)}
    <div class="c" style="--c: blue" >Foo</div>
    <div class="m" style="--m: 0 2em">Bar</div>
    <div class="c" style="--c: green">Baz</div>

    甚至像这样:

    * {
        color:  var(--c);
        margin: var(--m);
        /* etc. */
    }
    <div style="--c: blue" >Foo</div>
    <div style="--m: 0 2em">Bar</div>
    <div style="--c: green">Baz</div>

    但该方法没有办法与普通香草方法的样式不同,即:

    <div style="color: blue"> 
    ... etc. 
    

    它本质上同样丑陋且不可维护。


    许多人试图通过生成数百个预定义类来实现目标,例如.mt-1.mt-2、....mt-99 等(因为这在 CSS 预处理器中非常容易做到)。但它是更丑陋的解决方案(我不会详细说明为什么会这样。您将在其他地方阅读或在几个项目后了解自己)。

    【讨论】:

    • 很确定这就是 OP 想要的。是给我的!谢谢!今天学到了新东西!
    • 只是想把这个扔出去。这种方法不支持 IE,没什么大不了的,但想提醒窥视者。
    • @IamBatman 什么是 IE?好吧,严肃地说,我把我的回答当作 “从不这样做” 的一个例子,而不是一个建议的解决方案(你是否错过了“它本质上同样丑陋且不可维护。”最后?) 在 Q 中尝试使用 CSS 的想法表明了对整个 CSS 设计的误解。
    • IE = Internet Explorer(除非您讽刺 IE 是一个古老的浏览器)。是的,我看到了,但是我有 3 个元素除了颜色之外具有相同的样式,而不是使用 3 个不同的类,我想使用某种变量。这解决了我的问题。现在从技术上讲,我想我可以用单独的元素样式覆盖 CSS,这样与 IE 兼容会更有意义。
    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2020-05-03
    • 2014-07-02
    • 2012-05-22
    • 2021-10-26
    • 2019-10-13
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多