在 css calc 函数中使用模数

Posted

技术标签:

【中文标题】在 css calc 函数中使用模数【英文标题】:Using modulus in css calc function 【发布时间】:2016-03-29 20:49:51 【问题描述】:

有没有办法在 css calc 函数中使用或实现模运算符? 我知道有 mod 运算符并且 IE 支持它,但是其他浏览器呢?

例如

#element-id
     width: calc( 100%  mod 5 );

【问题讨论】:

没办法.. 如果您通过 php 服务器提供 html 文件(例如),请将样式放在 html 标记中。这样你就可以计算了。 100% mod 5 到底是什么? 100 mod 5 将始终为零-但我认为您希望在“mod 5”发生之前将 100% 转换为像素.. 例如,如果它是 304 像素宽,那么在 mod 之后宽度将变为 4px 5点? 【参考方案1】:

简单地说……“不”。

MDN

表达式可以是任何简单的表达式,结合以下运算符,使用标准运算符优先规则:

+ 加法。

- 减法。

* 乘法。至少有一个参数必须是<number>

/ 除法。右侧必须是<number>

【讨论】:

【参考方案2】:

恐怕只有 Internet Explorer 支持 mod 功能,而且一直是dropped from the CSS spec,所以其他浏览器不太可能很快支持它。

【讨论】:

你有没有IE支持或支持mod功能的参考?现在好像不行了。 很遗憾没有。对不起。我什至不记得我指的是哪个版本:-/ 那太糟糕了。如果您找到或记得,请发布。【参考方案3】:

很遗憾,recent specs 中不再提及 mod 运算符。

calc() 函数允许将带有加法 (+)、减法 (-)、乘法 (*) 和除法 (/) 的数学表达式用作分量值。

您可能想求助于使用 javascript 来实现这种行为。

var el = document.getElementById('element-id');
el.style.width = (100 % 5) + '%';

【讨论】:

【参考方案4】:

浏览器不再支持此运算符。 您只能将 标准操作与 calc 一起使用:

添加+ 减法- 乘法* 部门/

此calc() article 提供了对该功能的进一步详细说明。

【讨论】:

【参考方案5】:

如果您动态生成 CSS,我创建了一个小类来执行简单的函数,例如 abs()、ceil()、floor()、mod() 和 sign()——它可以用来构建复杂的计算规则您可以将其作为参数传递给彼此。如果您使用“var(--my-variable)”作为参数,则将使用 CSS 变量。 注意:它最适用于原始数字,并且有一个实用函数 toUnit 可以在最后转换为像素(等)。

可以这样调用,以jquery为例来设置样式:

 $('#my-element').css('width', `$cssHack.toUnit(cssHack.mod(254,25),'px')`)

下面是类的代码(es6,无依赖):

class cssHack

    //primary used for dynamic css variables-- pass in 'var(--dynamic-height)'
    static toUnit(val,unit)
    
        unit='1'+unit;
        return ` calc($val * $unit) `;
    

    static round(val)
    
        // the magic number below is the lowest possible integer, causing a "underflow" that happily results in a rounding error we can use for purposeful rounding.
        return ` calc($val * $Number.MIN_VALUE / $Number.MIN_VALUE) `;
    

    static abs(val)
    
        return ` max($val, calc($val * -1)) `;
    

    static floor(val)
    
        return cssHack.round(` calc($val - .5) `);
    

    static ceil(val)
    
        return cssHack.round( `calc($val + .5) `);
    

    static sign(val)
       
        let n = ` min($val,0) `; //if val is positive then n =0. otherwise n=val.
        let isNegative= ` min($cssHack.ceil(cssHack.abs(n)),1) `;
        let p = ` max($val,0) `; //if val is negative then n=0, otherwise n = val;
        let isPositive= ` min($cssHack.ceil(cssHack.abs(p)),1) `;
        return ` calc($isPositive + calc($isNegative * -1)) `;
    

    static mod(val, base)
    
        let abs = cssHack.abs(val);
        let div = ` calc($abs / $base)`;
        let dec = ` calc($div - $cssHack.floor(div))`;
        return cssHack.round(` calc($dec * $base) `);
    

【讨论】:

以上是关于在 css calc 函数中使用模数的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 CSS 中的 Transform:Scale 函数中使用 Calc 吗?

在 React Js 中使用 CSS/Jquery calc 函数

使用css的calc() 函数计算宽高

使用css的calc() 函数计算宽高

CSS中常用函数和渐变效果

CSS calc()函数