您可以在 css 文档中使用 handlebars.js 变量吗?

Posted

技术标签:

【中文标题】您可以在 css 文档中使用 handlebars.js 变量吗?【英文标题】:Can you use handlebars.js variables in a css document? 【发布时间】:2014-05-27 18:29:03 【问题描述】:

我有兴趣做一些条件格式,并认为最好的方法是:

内部 CSS 文档

#if something 
    /* some css */

else
    /* some other css */

/if

但我搜索了一下,只找到了 Django 相关的东西。这在车把或任何其他 js 库中是否可行?

注意:我使用Meteor

【问题讨论】:

【参考方案1】:

不是原生的 CSS,不是。但是看看 SASS:http://sass-lang.com/ 或 LESS:http://lesscss.org,这两个 CSS 预处理器可以满足您的要求

【讨论】:

【参考方案2】:

以下是在流星中执行此操作的几种方法:

使用类助手

<template name="hello">
  <p class=excitedClass>hello world</p>
</template>
Template.hello.excitedClass = function () 
  return Session.equals('excited', true) && 'excited';
;

模板助手根据会话变量的值确定类。您也可以将其用于样式等其他属性。

在模板中使用条件

<template name="hello">
  #if excited
    <p class="excited">hello world</p>
  else
    <p>hello world</p>
  /if
</template>
Template.hello.excited = function () 
  return Session.get('excited');
;

模板根据会话变量的值选择要呈现的元素版本。

【讨论】:

对此的改进是将感兴趣元素的类属性设为变量,并在 CSS 中静态定义这些类。但如果可能的话,我希望所有与样式相关的逻辑都在 CSS 上。 我编辑了示例以使用类而不是样式。想法是一样的。【参考方案3】:

有可能实现你想要的,因为毕竟模板引擎生成文本,上下文决定它是否应该被解释为 html、SVG 或 CSS。

我使用的技术有点违反直觉,因为它使用样式标签,而且我们被教导不要将 CSS 嵌入 HTML 页面,但此建议的目的是分离 HTML 和 CSS ,在我即将解释的示例中仍然是这种情况。

假设您有一个包含 4 个属性的项目集合,这些属性与您希望如何在屏幕上呈现它们有关。

文本:内容字符串。 color1 和 color2 :表示 HTML 颜色的字符串。 梯度:布尔值;如果为真,则使用带有 color1 和 color2 的背景渐变,然后在悬停时反转渐变;如果为 false,则使用 color1 作为背景色,然后在悬停时使用 color2。

让我们使用这个模式来填充一个集合。

Items=new Collection("items");
for(var i=0;i<10;i++)
    Items.insert(
        text:"Item "+i,
        color1:"#"+Random.hexString(6),
        color2:"#"+Random.hexString(6),
        gradient:Random.choice([false,true])
    );

现在我们定义一个模板来迭代我们的集合。

<template name="itemsList">
    <ul class="items-list">
        #each items
            > item
        /each
    </ul>
</template>

最有趣的部分来了:我们使用一个样式标签来定义我们的内联 CSS,它是由一个专用的子模板生成的。

itemClass 模板被传递给被迭代的项目的当前上下文。

<template name="item">
    <li class="item item-_id">
        <style scoped>
            > itemClass
        </style>
        text
    </li>
</template>

我们的模板根据当前项目的属性生成 CSS:条件格式终于! 由于我们使用的是 Meteor,因此您的格式也会是反应式的,这有多酷?

<template name="itemClass">
  height:64px;
  .item-_id
    #if gradient
  background:linear-gradient(to bottom, color1 5%, color2 100%);
    else
  background-color:color1;
    /if
  
  .item-_id:hover,.item-_id:focus
    #if gradient
  background:linear-gradient(to bottom, color2 5%, color1 100%);
    else
  background-color:color2;
    /if
  
</template>

注意:我使用的是 style 标签的 scoped 属性,它告诉浏览器本节中定义的格式对于父元素(本例中的 li.item)是本地的,这完全有意义。

http://www.w3schools.com/tags/att_style_scoped.asp

然而,目前只有 Firefox 支持,所以在其他浏览器中,样式标签会生成普通的旧全局 CSS,我们需要一个备用:这就是为什么我用项目的 _id 装饰类名。

如果所有浏览器都支持 scoped 属性,我们可以删除 item-_id 类并直接设置 item 类的样式,它会按预期工作!

【讨论】:

很好的回应!太糟糕了 Scope 属性的支持很弱。但是你的方法很有趣。让我想到了一些可能性,尽管我仍然希望能够直接在 CSS 中插入一些 或类似的东西。【参考方案4】:

阅读后我自己的答案是创建 CSS 静态类并使用把手更改 HTML 元素的类。这里有两个例子:

第一个很简单。主要用途是改变整体部分的风格。

<template name="mainPage" class=somePageClass>
    Main page content
</template>

在 Meteor 上你会做类似的事情

Template.mainPage.somePageClass = function()
    //some logic
   return someClass;
;

下一种情况更有趣,要求列表的每个元素都有属性类(例如 some_element.class = "classX" )。

<template name="subTemplate">
    #each someList
        <div class=class>
            Element content
        </div>
    /each
</template>

这样,您可以根据特定元素诱导样式。例如,根据社交页面中的帖子类型等更改背景颜色。

【讨论】:

【参考方案5】:

您可以直接以 css 样式作为参数。我用handelbarjs试过这个,它工作得很好。

<style>
.invoice-box 
    max-width: 800px;
    padding: 30px;
    font-size: 16px;
    line-height: 24px;
    font-family: 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif;
    color: #555;
    max-height: 560px;    
    zoom:  zoom ;    

【讨论】:

以上是关于您可以在 css 文档中使用 handlebars.js 变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Handlebars 中使用带有按钮的 Javascript 函数

Handlebars的使用方法文档整理(Handlebars.js)

如何在 Ember Handlebars 中使用 if 语句实现 not?

是否可以通过 Ajax 加载 Handlebars 模板?

Meteor 模板事件处理程序中“this”的上下文(使用 Handlebars 进行模板)

删除 来自Handlebars Template