【问题标题】:HBS template with grunt-dr-svg-sprites带有 grunt-dr-svg-sprites 的 HBS 模板
【发布时间】:2015-02-12 16:27:48
【问题描述】:

我正在使用 grunt 从分离的 SVG 文件和生成图标的 (s)css 文件生成精灵 SVG 图像(带有 PNG 后备)。对于这个过程,我使用grunt-dr-svg-sprites,模板使用 Handlebars 语法。

我想要实现的结构思路是这样的:

@mixin prefix-filename {
  width: X;
  height: X;
  background-position: X X;
  @include background();
}
.
.
.
@mixin prefix-filename {
  width: X;
  height: X;
  background-position: X X;
  @include background();
}

@mixin background() {
  background-size: X X;
  background-repeat: no-repeat;
  background-image: url("sprite-with-its-path.png");

  .svg & {
    background-image: url("sprite-with-its-path.svg");
  }
}

但是因为我对 Handlebars 模板语法不是很熟悉,所以我创建的模板已经损坏并且无法正常工作。它看起来像这样:

{{~#sizes~}}
{{~#items~}}

@mixin {{className}} {
  width: {{unit width ../../../config/cssUnit ../../../config/cssBaseFontSize}};
  height: {{unit height ../../../config/cssUnit ../../../config/cssBaseFontSize}};
  background-position: {{unit x ../../config/cssUnit ../../config/cssBaseFontSize -1}} {{unit y ../../config/cssUnit ../../config/cssBaseFontSize -1}};
  @include background();
}

{{/items~}}

@mixin background() {{prefix items ""}} {
  background-size: {{unit width ../../config/cssUnit ../../config/cssBaseFontSize}} {{unit height ../../config/cssUnit ../../config/cssBaseFontSize}};
  background-repeat: no-repeat;
  background-image: url("{{url pngPath ../../cssPath}}");

{{~/sizes~}}

  .svg & {
    background-image: url("{{url ../svgPath ../cssPath}}");
  }
}

当我尝试构建精灵时,我收到以下错误消息:

Building SVG sprites...
Fatal error: Arguments to path.resolve must be strings

但是无论如何,如果 mixin 名称中的 {{className}} 包含“.”,那么它也是错误的。 (点)开头,background() mixin 也不应该包含任何项目名称。

在选项中我定义了以下属性:spriteElementPathspritePathcssPathprefixlayoutcssUnittemplate

如果我使用官方模板文件,精灵生成正常,所以 Grunt 配置没问题。

您能帮我看看我的代码有什么问题吗?如何才能实现我最初的目标?

提前谢谢你!

更新: 我刚刚包含了 Grunt 配置的相关部分。

'svg-sprites': {
  'icons': {
    options: {
      spriteElementPath: svgProject + 'svg',
      spritePath: svgProject + 'output/icon-sprite.svg',
      cssPath: 'modules/_icon-sprite.scss',
      prefix: 'icon',
      layout: 'alt-diagonal',
      cssUnit: 'rem',
      template: svgProject + 'templates/custom_template.hbs'
    }
  }
},

更新 2: 感谢@hereandnow78 和@rasmusfl0e 的帮助!他们指出了一些重要的事情,最后我可以解决这个问题。主要问题是背景定义中的相对路径。这是模板的最终版本和工作版本:

{{~#sizes~}}
{{~#items~}}
@mixin {{selector}} {
    width: {{unit width ../../config/cssUnit ../../config/cssBaseFontSize}};
    height: {{unit height ../../config/cssUnit ../../config/cssBaseFontSize}};
    background-position: {{unit x ../../config/cssUnit ../../config/cssBaseFontSize -1}} {{unit y ../../config/cssUnit ../../config/cssBaseFontSize -1}};
    @include background();
}
{{~/items~}}

@mixin background() {
    background-size: {{unit width ../config/cssUnit ../config/cssBaseFontSize}} {{unit height ../config/cssUnit ../config/cssBaseFontSize}};
    background-repeat: no-repeat;
    background-image: url("{{url pngPath ../cssPath}}");

    .svg & {
        background-image: url("{{url ../svgPath ../cssPath}}");
    }
}
{{~/sizes~}}

【问题讨论】:

  • 您的 grunt 配置可能是错误的,只是因为您遇到的错误可能意味着某些路径配置错误(我怀疑您将目标配置为数组而不是字符串)。
  • 但是在这种情况下,为什么它与官方的 hbs 模板完美配合?
  • 你是对的,但也许你只是发布你的配置部分,只是为了确保,应该有助于澄清你的问题
  • 我刚刚做了。 ;)

标签: javascript templates gruntjs handlebars.js


【解决方案1】:

避免使用“。”在类名上,您需要像这样覆盖默认的options.selector(在您的配置中):

    selector: function (filename) {
        return "icon-" + filename;
    },

在您的模板中有几处需要更改:

@mixin background() {{prefix items ""}} {

应该只是:

@mixin background() {

还有这一点:

  .svg & {
    background-image: url("{{url ../svgPath ../cssPath}}");
  }
}

可能需要在sizes 括号内(就在{{~/sizes~}} 上方)。

我不知道还有什么问题 - 但请尝试一下,看看会怎样:D

【讨论】:

  • selector 覆盖建议是完美的,谢谢!就 mixin 标题定义而言,我只是使用了该前缀部分,因为在我以前的测试版本中,由于缺少它而导致错误。最后你建议的最后一部分也是正确的,我进入了sizes 部分。但是不幸的是,所有这些仍然没有解决原始路径问题。解决方案是修复相对路径。 :) 我将使用最终的可行解决方案更新我原来的问题。
  • 是的 - 我应该记得更改模板代码的范围也会影响路径的嵌套深度 - 就像在 sizes 中移动东西时一样。很高兴你把事情解决了! :)
【解决方案2】:

我在您的 hbs 模板中发现 2 个可能的问题

  1. 关闭items 时缺少波浪号~(我怀疑您自定义了~ 的用法)

    错误:{{/items~}} 可能正确:{{~/items~}}

  2. 在你的最后一个块中,你有一个缺少开口的大括号:

    .svg & { 背景图像: url("{{url ../svgPath ../cssPath}}"); } }

【讨论】:

  • 你是对的,波浪号不见了,但它没有引起任何问题,我试过了。就第二点而言,这也不是问题,但整个最后一部分应该像@rasmusfl0e 建议的那样在sizes 部分内。另外真正的问题是路径定义最初是错误的cssPath
猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多