|
|
|
|
|
字體單位是相對測量單位,是根據(jù)其他一些值計算的,可以動態(tài)變化。
與字體相關(guān)的測量單位有如下幾個:
單位 | 描述 |
---|---|
em | 元素字體大小 |
ex | 小寫字母高度x |
ch | 寬度0 |
rem | 根元素字體大小 |
em
對于font-size
這是繼承的字體大小,對于其他屬性,它是已經(jīng)為 font-size
計算過的當(dāng)前字體大小.。
為了查看這一點,讓我們使用以下代碼:
body {
/* 基本字體大小 */
字體大小:42px;
}
DIV {
/* 繼承父字體并縮小一半 */
字體大小:.5em;
}
/* 每種情況下的邊框有多厚? */
.box-1 {
邊框?qū)挾龋?.5em;
}
.box-2 {
邊框?qū)挾龋?em;
}
結(jié)果這樣
粉色條紋是高度為1em
的漸變,以便可以進行比較。
兩個塊具有相同的字體大小,相對于父元素 (font-size: .5em;
) 縮小一半。
現(xiàn)在如何將框架厚度設(shè)置為等于字體大?。?/strong>
border-width: .5em
使框架比需要的薄兩倍,這是因為父字體大小僅使用font-size
,而border
從font-size
中獲取計算值。
因此,如果某個地方當(dāng)前字體大小不需要使用font-size
,則不需要復(fù)制大小值,只需指定1em
。右側(cè)塊具有正確厚度的框架。
另一個了解em
字體字符如何關(guān)聯(lián)的演示。彩色條的高度為1em
,因此可以看到它1em
大致對應(yīng)于字符的高度,考慮到大寫字母和下降字母:
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gradients stripes with 1em height</title>
<style>
DIV {
--stripe-height: 1em;
background: linear-gradient(palegreen, palegreen var(--stripe-height), transparent 0, transparent calc(var(--stripe-height) * 2), pink 0, pink calc(var(--stripe-height) * 3), transparent 0, transparent calc(var(--stripe-height) * 4), paleturquoise 0, paleturquoise calc(var(--stripe-height) * 5), transparent 0, transparent calc(var(--stripe-height) * 6));
background-size: 100% calc(var(--stripe-height) * 6);
line-height: 1;
font-size: 2rem;
text-align: center;
outline: 1px solid #DDD;
}
DIV:nth-child(2) {
background-position: 0 calc(var(--stripe-height) * -3);
}
DIV:nth-child(3) {
background-position: 0 calc(var(--stripe-height) * -4);
}
DIV:nth-child(4) {
background-position: 0 calc(var(--stripe-height) * -1);
}
BODY {
background: white;
min-height: 100vh;
display: grid;
grid-template-columns: repeat(2, -webkit-max-content);
grid-template-columns: repeat(2, max-content);
align-items: center;
align-content: center;
justify-content: center;
gap: 1rem;
}
.arial {
font-family: Arial, sans-serif;
}
.courier {
font-family: Courier New, monospace;
}
.georgia {
font-family: georgia;
}
.comic-sans {
font-family: Comic Sans MS;
}
P {
margin: 0;
}
</style>
</head>
<body>
<div class="arial">
<p>Arial</p>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
<div class="georgia">
<p>Georgia</p>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
<div class="comic-sans">
<p>Comic Sans</p>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
<div class="courier">
<p>Courier</p>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
</body>
</html>
大小em
在任何地方都不是固定的,是在使用時根據(jù)父字體大小計算的。例如,如果這樣設(shè)置字體大小:
DIV {
font-size: .75em;
}
然后將幾個 div
嵌套在一起,下一個 div
的字體大小將小于前一個:
test.html
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>Nested em</title>
<style>
DIV {
font-size: 0.75em;
padding: 0.25em 1em;
line-height: 1.5;
text-align: center;
outline: 1px solid #DDD;
}
DIV > DIV {
margin-top: 0.25em;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
grid-template-columns: repeat(2, -webkit-min-content);
grid-template-columns: repeat(2, min-content);
align-items: center;
align-content: center;
justify-content: center;
gap: 1rem;
font-family: Arial, sans-serif;
font-size: 4rem;
}
</style>
</head>
<body>
<div>
.75em
<div>
.75em
<div>
.75em
<div>
.75em
<div>
.75em
</div>
</div>
</div>
</div>
</div>
</body>
</html>
因為1em
是當(dāng)前繼承的字體大小,并且.75em
是繼承字體縮小了四分之一。對于每個新的嵌套 div
,首先繼承父級的縮小字體,然后也以指定的方式縮小。
如果想指定em
重用組件的大小,需要記住這一點:當(dāng)元素相互嵌套時,計算出的em
值可能不是你想要得到的值。
ex
ex
-是小寫字母x
的高度。如果字體沒有合適的度量,瀏覽器將嘗試ex
自行計算,如果由于某種原因不能這樣計算,ex
則認為等同于.5em
。
在下面演示中,顏色條的高度為1ex
,對于所選字體,1ex
將等于小x
的高度:
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Gradients stripes with 1ex height</title>
<style>
DIV {
--stripe-height: 1ex;
background: linear-gradient(palegreen, palegreen var(--stripe-height), transparent 0, transparent calc(var(--stripe-height) * 2), pink 0, pink calc(var(--stripe-height) * 3), transparent 0, transparent calc(var(--stripe-height) * 4), paleturquoise 0, paleturquoise calc(var(--stripe-height) * 5), transparent 0, transparent calc(var(--stripe-height) * 6));
background-size: 100% calc(var(--stripe-height) * 6);
line-height: 1;
font-size: 2rem;
text-align: center;
outline: 1px solid #DDD;
}
DIV:nth-child(1) {
background-position: 0 -1.4ex;
}
DIV:nth-child(2) {
background-position: 0 -3.1ex;
}
DIV:nth-child(3) {
background-position: 0 -5.4ex;
}
DIV:nth-child(4) {
background-position: 0 -7ex;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
grid-template-columns: repeat(2, -webkit-max-content);
grid-template-columns: repeat(2, max-content);
align-items: center;
align-content: center;
justify-content: center;
gap: 1rem;
}
.arial {
font-family: Arial, sans-serif;
}
.courier {
font-family: Courier New, monospace;
}
.georgia {
font-family: georgia;
}
.comic-sans {
font-family: Comic Sans MS;
}
P {
margin: 0;
}
</style>
</head>
<body>
<div class="arial">
<p>Arial</p>
<p>abcdefgxxxx</p>
</div>
<div class="georgia">
<p>Georgia</p>
<p>abcdefgxxxx</p>
</div>
<div class="comic-sans">
<p>Comic Sans</p>
<p>abcdefgxxxx</p>
</div>
<div class="courier">
<p>Courier</p>
<p>abcdefgxxxx</p>
</div>
</body>
</html>
讓我們看看ex
字體如何影響它,以及ex
與em
有什么關(guān)系。
在此演示中,左側(cè)組中的方塊的大小為1em
,右側(cè)組中的方塊的大小為2ex
,因此你可以檢查它們ex
是否等于em
的一半。此外,每個方塊都有自己的字體:
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>1em vs 2ex</title>
<style>
.box--em .cell {
width: 1em;
height: 1em;
}
.box--ex .cell {
width: 2ex;
height: 2ex;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
grid-template-columns: repeat(2, -webkit-max-content);
grid-template-columns: repeat(2, max-content);
align-items: center;
justify-content: center;
gap: 2rem;
font-size: 80px;
font-family: Arial, sans-serif;
}
.title {
margin: 0;
margin-bottom: 0.4em;
font-size: 0.35em;
text-align: center;
font-weight: normal;
}
.cells {
--gap: 1rem;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--gap);
align-items: center;
justify-content: center;
justify-items: center;
padding: var(--gap);
background: linear-gradient(#DDD 1px, transparent 0, transparent var(--gap), #DDD calc(var(--gap) + 1px), #DDD calc(var(--gap) + 2px), transparent 0), linear-gradient(90deg, #DDD 1px, transparent 0, transparent var(--gap), #DDD calc(var(--gap) + 1px), #DDD calc(var(--gap) + 2px), transparent 0);
background-position: center;
background-size: 100% calc(var(--gap) + 2px), calc(var(--gap) + 2px) 100%;
background-repeat: no-repeat;
}
.cell {
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
.cell::before {
font-size: 0.18em;
}
.arial {
background: palegreen;
font-family: Arial, sans-serif;
}
.arial::before {
content: "Arial";
line-height: 1;
}
.courier {
background: pink;
font-family: Courier New, monospace;
}
.courier::before {
content: "Courier";
}
.georgia {
background: paleturquoise;
font-family: Georgia;
}
.georgia::before {
content: "Georgia";
}
.comic-sans {
background: palegoldenrod;
font-family: Comic Sans MS;
}
.comic-sans::before {
content: "Comic Sans";
}
</style>
</head>
<body>
<div class="box box--em">
<h2 class="title">1em</h2>
<div class="cells">
<div class="cell arial"></div>
<div class="cell georgia"></div>
<div class="cell comic-sans"></div>
<div class="cell courier"></div>
</div>
</div>
<div class="box box--ex">
<h2 class="title">2ex</h2>
<div class="cells">
<div class="cell arial"></div>
<div class="cell georgia"></div>
<div class="cell comic-sans"></div>
<div class="cell courier"></div>
</div>
</div>
</body>
</html>
與em
不同的是,ex
大小會隨字體而變化,并且在所有情況下2ex
都不等于1em
,即不能依賴.5
中的比例。
ex
就像em
,它繼承父級的字體大小:
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Nested ex</title>
<style>
DIV {
font-size: 0.9ex;
padding: 0 0.5ex 0.25ex;
line-height: 1.3;
text-align: center;
outline: 1px solid #DDD;
}
DIV > DIV {
margin-top: 0.25ex;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
grid-template-columns: repeat(2, -webkit-min-content);
grid-template-columns: repeat(2, min-content);
align-items: center;
align-content: center;
justify-content: center;
gap: 1rem;
font-family: Arial, sans-serif;
font-size: 10rem;
}
</style>
</head>
<body>
<div>
.9ex
<div>
.9ex
<div>
.9ex
<div>
.9ex
</div>
</div>
</div>
</div>
</body>
</html>
ch
ch
— 字符寬度0
。對于等寬字體,這是任何字符的精確寬度;對于其他字體,這是一個窄字符的近似寬度。如果由于某種原因無法計算寬度,則后備值將為.5em
。
警告不要嘗試使用ch
字符來設(shè)置容器的寬度,因為它不能按預(yù)期工作。在下面的演示中,每個文本塊的寬度設(shè)置如下:
DIV {
width: 10ch;
}
塊寬度僅適用于等寬字體,在某些字體中它適用于數(shù)字(Arial, Comic Sans),在其他情況下不能期望它1ch
等于字符寬度:
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Unit ch</title>
<style>
DIV {
width: 10ch;
--stripe-width: 1ch;
background: linear-gradient(90deg, palegreen, palegreen var(--stripe-width), transparent 0, transparent calc(var(--stripe-width) * 2), pink 0, pink calc(var(--stripe-width) * 3), transparent 0, transparent calc(var(--stripe-width) * 4), paleturquoise 0, paleturquoise calc(var(--stripe-width) * 5), transparent 0, transparent calc(var(--stripe-width) * 6));
background-size: calc(var(--stripe-width) * 6) 100%;
line-height: 1.2;
font-size: 1.8rem;
text-align: center;
outline: 1px solid #DDD;
}
DIV:nth-child(1) {
background-position: 0 -1.4ex;
}
DIV:nth-child(2) {
background-position: 0 -3.1ex;
}
DIV:nth-child(3) {
background-position: 0 -5.4ex;
}
DIV:nth-child(4) {
background-position: 0 -7ex;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
grid-template-columns: repeat(2, -webkit-max-content);
grid-template-columns: repeat(2, max-content);
align-items: center;
align-content: center;
justify-content: center;
gap: 2rem;
}
.arial {
font-family: Arial, sans-serif;
}
.courier {
font-family: Courier New, monospace;
}
.georgia {
font-family: georgia;
}
.comic-sans {
font-family: Comic Sans MS;
}
P {
margin: 0;
}
</style>
</head>
<body>
<div class="arial">
<p>Arial</p>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
<div class="georgia">
<p>Georgia</p>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
<div class="comic-sans">
<p>Comic Sans</p>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
<div class="courier">
<p>Courier</p>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
</body>
</html>
我們來比較1em
、2ex
和2ch
:
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>1em vs 2ex vs 2ch</title>
<style>
.box--em .cell {
width: 1em;
height: 1em;
}
.box--ex .cell {
width: 2ex;
height: 2ex;
}
.box--ch .cell {
width: 2ch;
height: 2ch;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
grid-template-columns: repeat(3, -webkit-max-content);
grid-template-columns: repeat(3, max-content);
align-items: center;
justify-content: center;
gap: 2rem;
font-size: 70px;
font-family: Arial, sans-serif;
}
.title {
margin: 0;
margin-bottom: 0.4em;
font-size: 0.35em;
text-align: center;
font-weight: normal;
}
.cells {
--gap: 1rem;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--gap);
align-items: center;
justify-content: center;
justify-items: center;
padding: var(--gap);
background: linear-gradient(#DDD 1px, transparent 0, transparent var(--gap), #DDD calc(var(--gap) + 1px), #DDD calc(var(--gap) + 2px), transparent 0), linear-gradient(90deg, #DDD 1px, transparent 0, transparent var(--gap), #DDD calc(var(--gap) + 1px), #DDD calc(var(--gap) + 2px), transparent 0);
background-position: center;
background-size: 100% calc(var(--gap) + 2px), calc(var(--gap) + 2px) 100%;
background-repeat: no-repeat;
}
.cell {
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
.cell::before {
font-size: 0.18em;
}
.arial {
background: palegreen;
font-family: Arial, sans-serif;
}
.arial::before {
content: "Arial";
line-height: 1;
}
.courier {
background: pink;
font-family: Courier New, monospace;
}
.courier::before {
content: "Courier";
}
.georgia {
background: paleturquoise;
font-family: Georgia;
}
.georgia::before {
content: "Georgia";
}
.comic-sans {
background: palegoldenrod;
font-family: Comic Sans MS;
}
.comic-sans::before {
content: "Comic Sans";
}
</style>
</head>
<body>
<div class="box box--em">
<h2 class="title">1em</h2>
<div class="cells">
<div class="cell arial"></div>
<div class="cell georgia"></div>
<div class="cell comic-sans"></div>
<div class="cell courier"></div>
</div>
</div>
<div class="box box--ex">
<h2 class="title">2ex</h2>
<div class="cells">
<div class="cell arial"></div>
<div class="cell georgia"></div>
<div class="cell comic-sans"></div>
<div class="cell courier"></div>
</div>
</div>
<div class="box box--ch">
<h2 class="title">2ch</h2>
<div class="cells">
<div class="cell arial"></div>
<div class="cell georgia"></div>
<div class="cell comic-sans"></div>
<div class="cell courier"></div>
</div>
</div>
</body>
</html>
顯然:
1ch
更大1ex
(寬度0
大于高度x
);1ch
不等于em
一半;ch
可能會隨字體而變化。 rem
rem
是root em
根元素的字體大小;對于網(wǎng)頁來說,這是 element html。默認字體大小為16px,該值在規(guī)范中并不固定,但被所有瀏覽器使用。
如果用戶在瀏覽器設(shè)置中設(shè)置不同的值,它將覆蓋根元素的字體大小。也就是說,如果你需要制作一個會縮放到用戶選擇的字體大小的界面,那么使用rem
。
重要的是要了解rem
大小只能針對html,例如,采用以下樣式:
BODY {
font-size: 24px;
}
DIV {
font-size: 1rem;
}
如果rem
可以覆蓋任何地方,文本就會增加,但這并沒有發(fā)生:
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Try to override rem in body</title>
<style>
HTML {
font-size: 16px;
}
BODY {
font-size: 24px;
}
DIV {
font-size: 1rem;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
align-items: center;
justify-content: center;
font-family: Arial, sans-serif;
}
P {
margin: 0;
text-align: center;
}
DIV {
--stripe-height: 24px;
background: linear-gradient(palegreen, palegreen var(--stripe-height), transparent 0, transparent calc(var(--stripe-height) * 2), pink 0, pink calc(var(--stripe-height) * 3), transparent 0, transparent calc(var(--stripe-height) * 4), paleturquoise 0, paleturquoise calc(var(--stripe-height) * 5), transparent 0, transparent calc(var(--stripe-height) * 6));
background-size: 100% calc(var(--stripe-height) * 6);
line-height: 1;
outline: 1px solid #DDD;
}
</style>
</head>
<body>
<div>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
</body>
</html>
顏色條的高度24px
,以便有東西可以比較。
如果覆蓋元素html
的字體大小,一切都會正常:
HTML {
font-size: 24px;
}
DIV {
font-size: 1rem;
}
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Change html font-size</title>
<style>
HTML {
font-size: 24px;
}
DIV {
font-size: 1rem;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
align-items: center;
justify-content: center;
font-family: Arial, sans-serif;
}
DIV {
--stripe-height: 24px;
background: linear-gradient(palegreen, palegreen var(--stripe-height), transparent 0, transparent calc(var(--stripe-height) * 2), pink 0, pink calc(var(--stripe-height) * 3), transparent 0, transparent calc(var(--stripe-height) * 4), paleturquoise 0, paleturquoise calc(var(--stripe-height) * 5), transparent 0, transparent calc(var(--stripe-height) * 6));
background-size: 100% calc(var(--stripe-height) * 6);
line-height: 1;
outline: 1px solid #DDD;
}
P {
margin: 0;
text-align: center;
}
</style>
</head>
<body>
<div>
<p>1234567890</p>
<p>ABCDEFGHIJ</p>
<p>abcdefghij</p>
</div>
</body>
</html>
與em
不同的是,rem
它始終僅包含根元素的字體大小,因此嵌套不會影響任何內(nèi)容:
test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Nested rem</title>
<style>
HTML {
font-size: 24px;
}
DIV {
font-size: 0.9rem;
padding: 0.25rem 0.5rem;
line-height: 1.3;
text-align: center;
outline: 1px solid #DDD;
}
DIV > DIV {
margin-top: 0.25rem;
}
BODY {
background: white;
min-height: 100vh;
display: grid;
grid-template-columns: repeat(2, -webkit-min-content);
grid-template-columns: repeat(2, min-content);
align-items: center;
align-content: center;
justify-content: center;
gap: 1rem;
font-family: Arial, sans-serif;
font-size: 10rem;
}
</style>
</head>
<body>
<div>
.9rem
<div>
.9rem
<div>
.9rem
<div>
.9rem
</div>
</div>
</div>
</div>
</body>
</html>
這允許你制作尺寸與基本字體大小相關(guān)的組件,但不依賴于彼此之間的元素嵌套。
總結(jié)
本文詳細介紹字體單位:em、ex、ch、rem等,通過本文的學(xué)習(xí),你應(yīng)該對字體單位有了更加充分的了解。