【问题标题】:Combine calc() with attr() in CSS [duplicate]在CSS中将calc()与attr()结合起来[重复]
【发布时间】:2013-12-27 17:56:38
【问题描述】:

我想知道我是否可以将 calc() 函数与 attr() 函数结合起来实现以下功能:

<div class="content" data-x="1">
    This box should have a width of 100px
</div>

<div class="content" data-x="2">
    This box should have a width of 200px
</div>

<div class="content" data-x="3">
    This box should have a width of 300px
</div>

CSS

.content{
    //Fallback. If no calc is supported, just leave it at 100px
    width: 100px;
}


.content[data-x]{
    // Multiply the width of the element by the factor of data-x
    width: calc(100px * attr(data-x));
}

draft 说它应该可以工作,但在我的情况下(Chrome 31.0.1650.63 m 和 Firefox 25.0.1)它没有。那么有两种情况:

  1. 我做错了
  2. 尚不支持

怎么了?

Example Fiddle

【问题讨论】:

    标签: css css-calc


    【解决方案1】:

    目前,默认情况下,任何主流浏览器都不支持 attr() 用于除“内容”之外的任何属性。在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/CSS/attr

    【讨论】:

    • 这是一个带有“内容”的示例:jsfiddle.net/cQ8F4/2
    • 是的,不支持。您可以使用这样的 css 进行非动态处理:jsfiddle.net/cQ8F4/3 对于动态解决方案,我将使用 javascript 或 jQuery:jsfiddle.net/cQ8F4/4
    • 截至 2018 年 5 月 19 日,这个答案大部分仍然是正确的,但链接的文档仅指出对 attr()content 以外的属性的支持是实验性的。我建议参考the Can I use... page,因为如果/当浏览器开始支持这种用法时,它可能会更新。
    【解决方案2】:

    似乎有办法解决它using vars

    .content{
        --x: 1;
        width: calc(100px * var(--x));
        background: #f00;
    }
    
    [data-x="1"] { --x: 1; }
    [data-x="2"] { --x: 2; }
    [data-x="3"] { --x: 3; }
    
    /*doesn't look like this works unfortunately
    [data-x] { --x: attr(data-x); }
    seems to set all the widths to some really large number*/
    

    注释掉的部分本来是完美的,这可能与您的想法不起作用的原因相同,但似乎 css 没有执行您在 javascript 中可能习惯的漂亮的自动转换(@987654327 @).
    attr() 返回的是字符串,而不是数字,这可以通过添加 .content:after { content:var(--x) } 来查看;什么都不会打印,--x 是一个数字,content 接受字符串。

    如果有一些 css 函数可以转换,我觉得这将是解决这个问题的关键。


    看起来在CSS4 中强制转换(嗯,解释) 将是一件事情,而且它会像

    .content{
        width: calc(100px * attr(data-x number, 1));
        background: #f00;
    }
    

    到目前为止,甚至没有浏览器支持这个实验性规范,但我会在支持时更新。

    【讨论】:

    • 这非常棒,即使没有 attr() 支持!它可以允许定义一些非常好的布局!
    • 仅供参考,IE 不支持 CSS 变量,Edge 正在慢慢实现。大多数其他浏览器都支持它们! caniuse.com/#feat=css-variables
    • 回顾这个和我对[it] seems to set all the widths to some really large number 的评论,它让我想到如果 CSS 不强制转换,它可能会尝试使用字符串 as 数字.所以我尝试将data-x="&amp;#x01;" 设置为1&amp;#x02; 用于2 等等,但宽度根本没有设置。浏览器必须已修补以根本不尝试使用字符串变量。我想知道这在过去是否可行..
    • 我希望还为时不晚。对我来说,这也是一个有效的答案,因为 attr 倾向于是动态的,所以仍然需要 JS 来设置该属性的值。然后,我们可以设置内联样式,例如 element.setAttribute('style',`"--x: ${x}"`); 或者以相同的方式使用 textContent 修改样式元素。这将在支持 css vars 的浏览器中完美运行。
    • 另外我们可以用这种方式转换calc单元:calc(1UNIT * (YOUR OPERATIONS) ) ex calc(1px * 16/9 )
    【解决方案3】:

    目前 attr() 函数在 Chrome 中不起作用。

    一个几乎同样好的解决方案是使用 CSS 变量:

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          :root {
             --module-size: 100px;
             --data-x:1; /* Default value */
           }
    
          .content{
              width: calc(var(--module-size) * var(--data-x));
              border: 1px solid;
          }
        </style>
      </head>
      <body>
        <div class="content" style="--data-x:1">
            This box should have a width of 100px
        </div>
    
        <div class="content" style="--data-x:2">
            This box should have a width of 200px
        </div>
    
        <div class="content"  style="--data-x:3">
            This box should have a width of 300px
        </div>
      </body>
    </html>
    

    【讨论】:

    • 工作就像一个魅力!谢谢!
    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 2013-12-12
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    相关资源
    最近更新 更多