构建字符串,这取决于可变数量的参数

Posted

技术标签:

【中文标题】构建字符串,这取决于可变数量的参数【英文标题】:Building of a string, which depends on variable number of parameters 【发布时间】:2015-07-13 12:11:53 【问题描述】:

我的问题是:如何在 Less 中。例如,我想做一个 mixin,它可以帮助我编写 @font-face CSS 规则。所以我需要为我的字体的任意数量的格式(.eot、.ttf、.oft、.woff、.woff2、.svg)构建src:... fonts 属性。这是我处理列表中所有字体格式的 Less 循环:

// @some-types - it is my font formats list, just smth. like 'otf', 'eot',...
// @old-src-value - it is string with src for my font from previous loop
// @counter - it is my loop counter 

.make-font-src(@some-types; @old-src-value; @counter) when (@counter <= length(@some-types)) 

    // Here we get next font format from @some-types
    @font-type: extract(@some-types, @counter);

    // Used for building 'format("opentype")' - like part of src value string
    .get-font-format(@font-type);

    // Building a part of src value string for this iteration
    @src-value: e('@old-src-value, url("@font-path@font-filename.@font-type") format("@font-format")');

    // Recursive call of this mixin for looping
    .make-font-src(@some-types; @src-value; (@counter + 1));

所以我被困在如何获取完整的 src 值字符串上,什么时候所有字体格式都将在循环中处理?另请参考this codepen demo。

【问题讨论】:

抱歉之前的评论有误,这不会导致递归定义错误,因为您使用了不同的变量。 【参考方案1】:

正如我在评论中提到的,这不会导致递归定义错误,因为您已将值分配给不同的变量然后使用它。但是,似乎在循环的第一次迭代完成后,Less 正在处理属性值设置行。您可以通过将第一次迭代本身的 counter 值更改为 2 或更多来验证这一点。

一种解决方案(我认为解决问题的更好方法)是使用property merging with comma 功能并直接设置属性值对,如下面的sn-p:

.make-font-src(@some-types; @counter) when (@counter <= length(@some-types)) 
  @font-path: 'some/test/path/';
  @font-filename: 'Arial';
  @font-type: extract(@some-types, @counter);
  src+: e('url("@font-path@font-filename.@font-type") format("@font-type")');
  .make-font-src(@some-types; (@counter + 1));

div.test 
  .make-font-src('eot', 'woff', 'svg'; 1);

编译后会产生以下输出:

div.test 
  src: url("some/test/path/Arial.eot") format("eot"), 
       url("some/test/path/Arial.woff") format("woff"),
       url("some/test/path/Arial.svg") format("svg");

【讨论】:

这个方案看起来更优雅,不错! @dajnz: 总是乐于帮助队友:) 并且以防万一你不需要&amp; (本地混合变量总是在混合本身中具有最高优先级,因此上一个迭代和下一个迭代都不会干扰)。 糟糕,正在尝试其他方法,但似乎忘记删除了。感谢您指出@seven-phases-max :) 额外的font-format 变量也不是必需的。【参考方案2】:

最后,我找到了自己的解决方案:如果我们在循环的最后一次迭代中触发带有保护的特殊“getter”混合,我们可以从循环混合中获得完整的 src 值。

.getter(@cond; @list) when (@cond = length(@list)) 
    @font-src-full: @src-value;

这是fiddle with demo

【讨论】:

嗯,是的,如果你使用一个变量进行这种连接,循环应该有一个“终端”迭代特化来定义结果变量(经典例子是1,2,3等)。 虽然对于特定的用例,我想知道一个循环是否真的适合真正的字体定义,因为 src 声明 font-face 具有所有向后兼容性和浏览器解决方法 won't follow a strict pattern(即如果需要,我宁愿对每个 src 手动硬编码一个条件(或条件列表)。

以上是关于构建字符串,这取决于可变数量的参数的主要内容,如果未能解决你的问题,请参考以下文章

可变数量的参数函数运行时错误

可变参数宏包装器,扩展为使用与参数数量相对应的字符格式化字符串

使用jQuery AJAX将字符串数组传递给具有可变数量参数的webmethod

创建具有可变数量参数的 CLR UDF

使用 preg_replace_callback 查找并替换具有可变数量参数的函数签名

带有 StaggeredGridLayoutManager 的 RecyclerView:列数可变且可垂直滚动