28

是否可以在我的 CSS 文件的 calc() 函数中执行平方根函数?我读过 calc() 只支持基本运算符,如 + - * 和 /。

理想情况下,它看起来像这样:

width: calc(50% - (sqrt(7200))px);

如果 calc() 没有 sqrt 函数,我该怎么办?

4

4 回答 4

26

正如其他人建议的那样,如果处理重复值,只需使用预处理器,或者直接从计算器复制/粘贴,例如 sqrt(2) = 1.4142135623730950488016887242097。

但是如果真的非要用动态的方式在CSS中动态计算平方根,不用JS,当然有。虽然对于大多数情况来说,5 的精度似乎就足够了,但对于您示例中的数字 7200,我们应该将其提高到 9+ 的精度,除非您可以做出更接近结果的初步猜测,但这是毫无疑问的目前。

但是,如果使用从其他答案/建议生成的输出,如果不进行优化,这将使您的文档膨胀 50.000 多个额外字符。

由于我们动态使用它,我们应该使用 CSS 变量,这会稍微限制浏览器的兼容性,但到现在(2018 年 3 月)它已经拥有大约 88% 的全球支持。

开始了:

#test {
    --number: 7200;
    --guess01: calc((var(--number) + ( var(--number) / var(--number))) / 2);
    --guess02: calc((var(--guess01) + ( var(--number) / var(--guess01))) / 2);
    --guess03: calc((var(--guess02) + ( var(--number) / var(--guess02))) / 2);
    --guess04: calc((var(--guess03) + ( var(--number) / var(--guess03))) / 2);
    --guess05: calc((var(--guess04) + ( var(--number) / var(--guess04))) / 2);
    --guess06: calc((var(--guess05) + ( var(--number) / var(--guess05))) / 2);
    --guess07: calc((var(--guess06) + ( var(--number) / var(--guess06))) / 2);
    --guess08: calc((var(--guess07) + ( var(--number) / var(--guess07))) / 2);
    --guess09: calc((var(--guess08) + ( var(--number) / var(--guess08))) / 2);
    --guess10: calc((var(--guess09) + ( var(--number) / var(--guess09))) / 2);

    width:calc(50% - (var(--guess10) * 1px));
    height:200px;
    background: black;
    padding:20px;
    color:#fff;
}
<div id="test">Width is 50% - sqrt(7200) in px</div>

于 2018-03-24T06:19:38.220 回答
13

您可以使用 CSS 的预处理系统。例如,您可以使用CompassSass。Compass 有一个sqrt功能。

为什么?也许是为了打印样式,或者也许是为了试验中庸之道。

于 2013-04-27T11:28:09.527 回答
8

根据这里的规范http://www.w3.org/TR/css3-values/#calc

calc() 函数允许将具有加法 ('+')、减法 ('-')、乘法 ('*') 和除法 ('/') 的数学表达式用作分量值。'calc()' 表达式使用标准运算符优先规则表示其包含的数学计算的结果。它可以在任何允许使用<length>, <frequency>, <angle>, <time>, <number>, 或<integer>值的地方使用。'calc()' 表达式的组成部分可以是文字值、'attr()' 或 'calc()' 表达式,或解析为上述类型之一的值。

所以你现在不能直接在css中计算平方根..不幸的是:(

于 2013-06-27T20:50:34.717 回答
5

我相信您对动态计算数字的平方根感兴趣。与普遍的看法相反,您应该能够仅使用 calc 来近似数字的平方根。不幸的是,应该是一个与现实不同的世界。实际上,或者至少是 chrome,css 中最伟大的东西 calc 令人讨厌地受限于无法使用 2 个可变被乘数进行乘法或除法。在所说的完美世界中,以下内容将起作用。单击运行代码片段

var nth=document.getElementById('nth'),
    percision=document.getElementById('percision'),
    counter=document.getElementById('counter'),
    input=document.getElementById('input'),
    output=document.getElementById('output');

percision.oninput = function(){
    counter.innerText = percision.value;
};
//var base = "(X+A/X)/2";
var base = 'calc(calc(X + calc(A / X)) / 2)';
(nth.onchange = percision.onchange =
input.onchange = function(){
    nth.value = parseInt(nth.value);
    counter.innerText = percision.value;
    var cur=base, i=percision.value;
    while (i--){
        cur = cur.replace(/X/g, base);
    }
    cur = cur.replace(/A/g, input.value)
             .replace(/X/g, '1');
    output.value = cur;
})();
body, body *:not(script) {
  white-space: nowrap;
  margin-top: 4px;
  margin-top: 4px;
  font-family: monospace;
}
h1 {
  text-align: center;
  margin-bottom: 10px;
}
#nth {
  width: 64px;
  text-align: center;
}
nthText {
  visibility: hidden; /* not yet implemented */
  display: none;
}
#percision {
 width: 192px;
}
#input {
 width: calc(100% - 154px);
}
textarea {
 max-height: 64px;
 min-width: calc(100% - 10px);
 width: calc(100% - 10px);
 max-width: calc(100% - 10px);
 white-space: initial !important;
}
<h1 style="text-align:center">CSS sqrt function generator</h1>
<nthText>Nth root: <input id="nth" type="text" placeholder="2" value="2" /><br /></nthText>
Percision: <sub>(min)</sub> <input id="percision" type="range" min="1" max="20" value="5" /> <sub>(max)</sub> (<span id="counter">5</span> repetitions)<br />
CSS to be rooted: <input id="input" type="text" placeholder="calc(calc(5vw * 5vh) - 3em)" value="calc(calc(5vw * 5vh) - 3em)" /><br />
<textarea id="output" resize="x" rows="4" onclick="this.select()"></textarea><br />
(click on the textarea above and press <b>Ctrl</b><small>+</small><b>C</b> to copy)

浏览器对此方法的支持:IE9+(因为只需要 calc 函数)

于 2017-04-21T22:31:31.410 回答