css l数字相加,CSS calc()的完整指南
CSS具有calc()執行基本數學運算的特殊功能。
.main-content {
/* 從100vh減去80px */
height: calc(100vh - 80px);
}
在本指南中,我將介紹有關此非常有用的功能的所有知識。 推薦閱讀之前寫過一篇類似文章《css3 calc()屬性介紹以及自適應布局使用方法》。
calc()用于值
可以使用calc()函數的唯一地方是值。請看下面這些示例,其中我們為許多不同的屬性設置值。
.el {
font-size: calc(3vw + 2px);
width: calc(100% - 20px);
height: calc(100vh - 20px);
padding: calc(1vw + 5px);
}
它也可以僅用于屬性的一部分,例如:
.el {
margin: 10px calc(2vw + 5px);
border-radius: 15px calc(15px / 3) 4px 2px;
transition: transform calc(1s - 120ms);
}
它甚至可以成為構成屬性一部分的另一個函數的一部分!例如,在顏色漸變屬性中使用calc():
.el {
background: #1E88E5 linear-gradient(
to bottom,
#1E88E5,
#1E88E5 calc(50% - 10px),
#3949AB calc(50% + 10px),
#3949AB
);
}
calc()用于長度和其他數字事物
請注意,以上所有示例本質上都是基于數字的。我們將討論一些數字使用方法的注意事項(因為有時不需要單位),但這是用于數字數學的,而不是字符串或類似的東西。
.el {
/* 不可以! */
counter-reset: calc("My " + "counter");
}
.el::before {
/* 不可以! */
content: calc("Candyman " * 3);
}
CSS有很多長度,它們都可以用于calc():
px
%
em
rem
in
mm
cm
pt
pc
ex
ch
vh
vw
vmin
vmax
當然沒有單位數也可以接受,例如line-height: calc(1.2 * 1.2);,如transform: rotate(calc(10deg * 5));。
當我們不用calc()去執行任何計算時,它仍然有效:
.el {
/* 有點怪,不過還好 */
width: calc(20px);
}
不接受媒體查詢
如果calc()使用正確(將長度單位用作屬性的值),則將其calc()應用于媒體查詢時無法使用。
@media (max-width: 40rem) {}
/* 不可以 */
@media (min-width: calc(40rem + 1px)) {}
混合單元
這也許是最能體現calc()價值的功能!上面幾乎每個示例都已經做到了這一點,但只是要指出一點,這里混合了不同的長度單元:
width: calc(100% - 20px);
這就是說:元素的寬度為負20像素。
有字面上沒有辦法預先計算出在流體寬度的情況下單獨的像素值。換句話說,calc()無法使用Sass之類的東西進行預處理,以嘗試完成polyfill。不需要,因為瀏覽器支持很好。但是要點是,當我們以這種方式混合單位時,必須在瀏覽器中(“運行時”)完成操作,這是的大部分值calc()。
這是混合單元的其他一些示例:
transform: rotate(calc(1turn + 45deg));
animation-delay: calc(1s + 15ms);
這些可能會被預處理,因為它們混合了與運行時確定的任何單位都不相關的單位。
與預處理器數學比較
我們剛剛介紹了無法預處理calc()可以做的最有用的事情。但是有一點需要注意,例如,Sass內置了數學功能,因此可以執行以下操作:
$padding: 1rem;
.el[data-padding="extra"] {
padding: $padding + 2rem;
margin-bottom: $padding * 2;
}
甚至帶有單位的數學也可以在這里工作,將相同單位的值相加或乘以無單位數。但是你不能混合使用單位,并且它也有類似的限制calc()(例如,乘法和除法必須使用無單位的數字)。
數學計算
例如,通過calc()假設你需要計算準確1 / 7個元素的寬度
.el {
/* 這更容易理解 */
width: calc(100% / 7);
/* 傳統的寫法 */
width: 14.2857142857%;
}
這可能會在某種自行創建的CSS API中獲得成功,例如:
[data-columns="7"] .col { width: calc(100% / 7); }
[data-columns="6"] .col { width: calc(100% / 6); }
[data-columns="5"] .col { width: calc(100% / 5); }
[data-columns="4"] .col { width: calc(100% / 4); }
[data-columns="3"] .col { width: calc(100% / 3); }
[data-columns="2"] .col { width: calc(100% / 2); }
calc()的數學運算符
數學運算符+,-,*,和/ 對于大家來說并不陌生。但是這里在使用它們的方式上有所不同。
加號(+)和減號(-)要求兩個數字均為長度
.el {
/* 有效 👍 */
margin: calc(10px + 10px);
/* 無效 👎 */
margin: calc(10px + 5);
}
無效的值會使整個單獨的聲明無效。
除(/)要求第二個數字不能為無單位
.el {
/* 有效👍 */
margin: calc(30px / 3);
/* 無效 👎 */
margin: calc(30px / 10px);
/* 無效👎 (不能除以0) */
margin: calc(30px / 0);
}
乘法(*)要求數字之一為無單位
.el {
/* 有效👍 */
margin: calc(10px * 3);
/* 有效 👍 */
margin: calc(3 * 10px);
/* 無效 👎 */
margin: calc(30px * 3px);
}
空格很重要
可以進行加法和減法。
.el {
/* 有效👍 */
font-size: calc(3vw + 2px);
/* 無效 👎 */
font-size: calc(3vw+2px);
/* 有效 👍 */
font-size: calc(3vw - 2px);
/* 無效 👎 */
font-size: calc(3vw-2px);
}
負數是可以的(例如calc(5vw - - 5px)),但這是一個例子,說明空白不僅是必需的,而且是有用的。
之所以需要在+和-之間設置間距,實際上是因為解析問題。例如,2px-3px被解析為數字“2”和單位“px-3px”,+還有其他問題,比如“被數字語法占用了”。我猜空白應該與自定義屬性的- -語法有關,但不是!
乘法和除法不需要運算符周圍的空格。但是我個人建議為了可讀性還是有必要加上
外部的空白無關緊要。我們甚至可以根據需要進行換行:
.el {
/* Valid 👍 */
width: calc(
100% / 3
);
}
但是請注意這一點:calc和()括號之間沒有空格。
.el {
/* 無效👎 */
width: calc (100% / 3);
}
嵌套calc(calc())
.el {
width: calc(
calc(100% / 3)
-
calc(1rem * 2)
);
}
calc()里面嵌套的calc()是可以忽略掉的,因為它的父級是單獨工作的:
.el {
width: calc(
(100% / 3)
-
(1rem * 2)
);
}
在這種情況下,即使沒有括號,也會遵循數學中的加減乘除的“操作順序”規則。也就是說,除法和乘法首先發生(在加法和減法之前),因此根本不需要括號。可以這樣寫:
.el {
width: calc(100% / 3 - 1rem * 2);
}
如果我們確實需要先進行加法或減法,則需要給它們加上必要的括號就可以啦。
.el {
width: calc(100% + 2rem / 2);
width: calc((100% + 2rem) / 2);
}
CSS自定義屬性和calc()使用
除了calc()混合單元的驚人功能外,接下來最令人驚訝的是calc()可將其與自定義屬性一起使用。自定義屬性可以在隨后的計算中使用:
html {
--spacing: 10px;
}
.module {
padding: calc(var(--spacing) * 2);
}
我敢肯定,你可以想象一個CSS設置,其中設置一堆CSS自定義屬性,然后讓其余的CSS根據需要使用它們,從而在頂部進行大量配置。
自定義屬性也可以相互引用。下面是一個例子,其中使用了一些數學(注意,首先缺少calc()函數),然后再應用。(它最終必須在calc()中。)
html {
--spacing: 10px;
--spacing-L: var(--spacing) * 2;
--spacing-XL: var(--spacing) * 3;
}
.module[data-spacing="XL"] {
padding: calc(var(--spacing-XL));
}
你可能不喜歡這樣,因為你需要記住calc()在哪里使用該屬性,但從可讀性的角度來看,這是可能的,而且可能很有趣。
自定義屬性可以來自HTML,這有時是一件非常酷和有用的事情。
... ... ...div {
/* 索引值來自HTML(帶有回退) */
animation-delay: calc(var(--index, 1) * 0.2s);
}
添加單位
如果你處于這樣一種情況:沒有單位的數字更容易存儲,或者提前用沒有單位的數字進行數學運算,你可以一直等到你應用數字乘以1和單位來添加單位。
html {
--importantNumber: 2;
}
.el {
/* Number stays 2, but it has a unit now */
padding: calc(var(--importantNumber) * 1rem);
}
色彩值的使用
像RGB和HSL這樣的顏色格式有可以使用calc()處理的數字。例如,設置一些基本HSL值,然后更改它們以形成自己創建的系統(示例):
html {
--H: 100;
--S: 100%;
--L: 50%;
}
.el {
background: hsl(
calc(var(--H) + 20),
calc(var(--S) - 10%),
calc(var(--L) + 30%)
)
}
不能將calc()和attr()合并
CSS中的attr()函數看起來很吸引人,就像你可以從HTML中提取屬性值并使用它們一樣。但是
...div {
/* 不行 */
color: attr(data-color);
}
這里沒有“類型”,所以attr()的唯一用途是與content屬性一起使用的字符串。這意味著這樣是有效的:
div::before {
content: attr(data-color);
}
我之所以提到這一點,是因為試圖以這種方式提取一個數字以用于計算可能會很有誘惑力,例如:
....grid {
display: grid;
/* 這兩項工作都沒有 */
grid-template-columns: repeat(attr(data-columns), 1fr);
grid-gap: calc(1rem * attr(data-gap));
}
幸運的是,這并不重要,因為HTML中的自定義屬性同樣有用甚至更多!
....grid {
display: grid;
/* 好了! */
grid-template-columns: repeat(var(--columns), 1fr);
grid-gap: calc(var(--gap));
}
瀏覽器工具
瀏覽器開發工具會傾向于在樣式表中編寫calc()時向你顯示它。
如果需要計算出的值,可以使用“計算”??選項卡(在所有瀏覽器的DevTools中,至少是我所知道的)向你顯示。
瀏覽器支持
該瀏覽器支持數據來自Caniuse,它具有更多詳細信息。數字表示瀏覽器支持該版本及更高版本的功能。
如果確實需要支持更早版本(例如IE 8或Firefox 3.6),通常的技巧是在使用calc()以下屬性或值之前添加另一個屬性或值:
.el {
width: 92%; /* Fallback */
width: calc(100% - 2rem);
}
當然也有很多已知的問題calc(),不過它們都是針對舊瀏覽器的。
Firefox <59不支持 calc() 顏色功能。范例: color: hsl(calc(60 * 2), 100%, 50%)。
當IE 9 – 11 用于任何值box-shadow 時,將不會呈現該 屬性 calc()。
width: calc() 用在表格單元格上時,在IE 9-11和Edge都不支持
如果要將calc()用作包含視口單位等的流體類型情況下,請確保包含使用rem或em的單位,以便用戶仍然可以根據需要通過放大或縮小來控制字體的上下起伏。
總結
以上是生活随笔為你收集整理的css l数字相加,CSS calc()的完整指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css3 div跳动动画_CSS3实现闪
- 下一篇: 问题解决:System.TypeLoad