是否可以在我的 CSS 文件的 calc() 函数中执行平方根函数?我读过 calc() 只支持基本运算符,如 + - * 和 /。
理想情况下,它看起来像这样:
width: calc(50% - (sqrt(7200))px);
如果 calc() 没有 sqrt 函数,我该怎么办?
是否可以在我的 CSS 文件的 calc() 函数中执行平方根函数?我读过 calc() 只支持基本运算符,如 + - * 和 /。
理想情况下,它看起来像这样:
width: calc(50% - (sqrt(7200))px);
如果 calc() 没有 sqrt 函数,我该怎么办?
正如其他人建议的那样,如果处理重复值,只需使用预处理器,或者直接从计算器复制/粘贴,例如 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>
根据这里的规范http://www.w3.org/TR/css3-values/#calc
calc() 函数允许将具有加法 ('+')、减法 ('-')、乘法 ('*') 和除法 ('/') 的数学表达式用作分量值。'calc()' 表达式使用标准运算符优先规则表示其包含的数学计算的结果。它可以在任何允许使用
<length>
,<frequency>
,<angle>
,<time>
,<number>
, 或<integer>
值的地方使用。'calc()' 表达式的组成部分可以是文字值、'attr()' 或 'calc()' 表达式,或解析为上述类型之一的值。
所以你现在不能直接在css中计算平方根..不幸的是:(
我相信您对动态计算数字的平方根感兴趣。与普遍的看法相反,您应该能够仅使用 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 函数)