8、CSS权威指南--第 4 章(p121)值和单位

 

4.1 关键字、字符串和其他文本值

样式表中的一切都是文本,但是有些类型的值表示的是字符串本身,而不是数字或颜色等。表示字符串本身的值有 URL 和让人难以置信的图像。

4.1.1 关键字

有时,声明的值用一个词表示,这叫关键字。接受关键字的属性,所取的关键字必须在那个属性允许使用的关键字范围之内。

如果两个属性使用相同的关键字,在不同的属性中相同的关键字可能具有不一样的行为。

全局关键字

CSS 定义了几个“全局”关键字,规范中的每个属性都能使用: inherit 、 initial 、unset 。

inherit 关键字:把元素某个属性的值设为与父元素同一属性的值一样。也就是说。这个关键字强制继承,即便是在通常情况下不继承时。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        
        div div {
            border: 2px solid green;
            border: inherit; /* border 属性通常默认是不继承的 */
            width: 50px;
            height: 50px;
            
        }
        body>div {
            border: 2px solid red; 
            width: 100px;
            height: 100px;
        }
        span {border: inherit;}
    </style>
</head>
<body>
    <div>
        <div></div>
        <span>我歌且谣</span>
    </div>
    
</body>
</html>

 

initial 关键字 :把属性的值设为预定义的初始值,相当于“重设”值。

unset 关键字:unset 是 inherit 和 initial 的通用替身。对继承的属性来说, unset 的作用与 inherit 一样,对于不继承的属性来说,unset 的作用与 initial 一样。

以上三个全局关键字在所有的属性中都可以使用,有个特殊的属性只接受这几个全局关键字:all

all 表示除 direction 和 unicode-bidi 之外的所有属性。因此,如果一个元素声明 all: inherit ,意思是除 direction 和 unicode-bidi 之外的所有属性都从父元素上继承值。

4.1.2 字符串

字符串值指放在单引号或双引号内的任意字符串序列,定义可取的值时以 <string> 表示。

字符串中还可以有引号,只要不与外层的引号同样就行,此外也可以使用反斜线转义。注意,字符串界定符只能使用直引号。

如果字符串中有换行,可以转义换行符。

4.1.3 URL

绝对URL 相对URL ,略。

@important url(path...) 注意: url 和 开始括号 “( ”之间不能由空格。

4.1.4 图像

图像值引用的是图像,句法使用 <image> 表示。 <image> 值基本上就是 <url>值。不过在更高级的用户代理中, <image> 表示下面三种值中的一个:

<url>  :指向外部资源的 URL 标识符,这里指图像的 URL 。

<image-set> :一系列图像,根据值中的条件选择。可以用来根据不同设备的屏幕密度或者分辨率显示不同的背景图片(background-image)或者遮罩图片(mask-image)等。

参考:我们一起学习CSS image-set() « 张鑫旭-鑫空间-鑫生活 (zhangxinxu.com)

<gradient> : 线性渐变或径向渐变图像,可以是耽搁的,也可以是重复的。

4.1.5 标识符

在CSS标识符命名中可以使用包含字符(a-zA-Z0-9)和ISO 10646字符字符集中的字符,也可以使用连字符(-)和下划线(_);同时,起始部分不能是数字,或两个连字符"-"或一个两个连字符"-"或一个"-"连字符后跟一个数字。

标识符也可以包含转义字符和任何ISO10646字符数字代码。

css中的特殊字符包含:!, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^,`, {, |, }, ~
这些字符需要转义才能用于命名,在其前面加上反斜杠"\"转义来取消这些字符的特定含义。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
          #\! {color: red;}
          .\# {color: green;}
      
    </style>
</head>
<body>
    <div>
        <span id="!">我歌且谣</span>
        <span class="#">急支糖浆,新冠咳嗽</span>
    </div>    
</body>
</html>

4.2 数字和百分数

这两种值的特别之处在于,他们是很多其他类型值的基础。

4.2.1 整数

  即整数,在取值句法中,整数值用 <integer> 表示 。

4.2.2 数字

即数字,数轴上的数字。在取值句法中,数字值用 <number> 表示。

4.2.3 百分数

即百分数, 句法取值用 <percentage> 表示。百分数值始终相对于另一个值,另一个值可以是任何值。

接受百分数值的属性都会定义取值范围,以及百分比相对什么计算。

4.2.4弹性值 

弹性值是 <number> 后跟 fr 。因此,单位弹性值是 1fr。这个概念由栅格布局引入,用于把布局中不受限制的控件分成几部分。

4.3 距离

长度值用整数或负数后跟一个标注表示,不过有些属性只接受正数。此外,还可以使用实数,即带小数点的数字,如 10.5 , 或 4.561 。

长度的后面是一个缩写,表示长度的单位。长度为 0 时是唯一的例外,此时无需单位。长度单位分两种,绝对长度单位和相对长度单位。

4.3.1 绝对长度单位

绝对长度单位有 7 个,如下:

英寸(in)美国尺子所用的英寸

厘米(cm)世界上其他地方使用的尺子上的厘米。1英寸=2.54厘米,1厘米=0.394英寸。

毫米(mm)1厘米=10毫米,1英寸=25.4毫米,1毫米=0.0394英寸。

四分之一毫米(q)1厘米=40个 q 单位,1毫米=4q。

点(pt)点是一个标准的印刷度量单位,在打印机和打字机上已经使用数十年,字处理程序也使用多年了。

             按照惯例,1英寸有72点。因此,吧大写字母设为12点的意思是文本的高度为 1/6 英寸高。如p{font-size:18pt;} 与 p{font-size:0.25in;}等效。

派卡(pc)也是印刷术语,1派卡=12点,因此,1英寸=6派卡。

像素(px)像素是屏幕上的点,不过CSS定义的像素较为抽象。在CSS中,1像素所占的尺寸够1英寸中放下96个像素。很多用户代理忽略这个定义,而是直接使用屏幕上的像素。

                 缩放页面或打印时要考虑缩放,此时100px宽的元素经渲染后得到的宽度可能大于设备上的100个小点。

4.3.2 分辨率单位

随着媒体查询和响应式设计的出现,为了描述显示器的分辨率,出现了三个新单位。

点每英寸(dpi)在长为1英寸的范围内能显示的点数。可以指出打印机输出的点,也可以指LED屏幕等设备上的物理像素点,或者垫子墨水屏上的图像单元。

点每厘米(dpcm)与dpi类似,不过测量的范围是1厘米,而不是1英寸。

点每像素单位(dppx)CSS中每个px单位显示的点数,从CSS3起,1dppx相当于96doi,因为CSS就是按照这个换算比例定义像素单位的。不过这个比例在CSS未来版本中可能会变。

截至2017年年末,这些单位只能在媒体查询中使用。比如说,创作人员可以让一个媒体查询快中的样式只用于分辨率超过 500 dpi 的显示器:

@media (min-resolution: 500dpi) { /* 样式规则 */ }

4.3.3 相对长度单位

em 和 ex 单位 :

按CSS的定义,1 em 等于元素的 font-size 属性值。如果元素的 font-size 为14像素,那么对那个元素来说, 1 em 等于14像素。 如果使用 em 设定字号,那么它相对父元素的字号而言。

ex 指所用字体中小写字母 x  的高度。因此,如果两个段落的字号都是 24 点,但是使用的字体不同,那么 ex 的值也不一样。这是因为不同字体中的 x 高度有所不同。

rem 单位  :与 em 单位类似,rem 也是基于声明的字号。二者之间的区别是(很微小),em 相对当前元素的字号计算,而 rem 始终相对于根元素计算。

ch 单位:CSS3新增了一个有趣的单位: ch 。这个单位基本上可以理解为 “一个字符” 。

CSS3规范是这样定义的: 等于渲染时所用字体中 "0" (零,U+0030) 字形的进距。“进距” 其实是CSS3自造的,对应于字体排版印中的 “进宽” 。

简单来说,字形的进宽指一个字形的起点到下一个字形的起点之间的距离。一般情况下,这段距离等于字形本身的宽度加上侧边的间距。(间距可以为正也可为负)

CSS 把 ch 单位定义为所用字体中一个零的进宽。对于等宽字体来说,所有字符的宽度都是 1ch 。而非等宽字体则可能比 “0” 宽,也可能比“0”窄,因此不能认为是 1ch 宽。

视区相关的单位:CSS3 还新增了三个与视区尺寸相关的单位。

视区宽度单位(vw)这个单位是根据视区的宽度计算,然后除以100。如视区的宽度是937像素,那么1vw等于9.37px。如果视区宽度有变,vw 的值会随之改变。

视区高度单位(vh)这个单位根据视区的高度计算,然后除以100。如果视区的高度是650像素,那么1vh等于6.5px。如果视区高度有变,vh 的值随之改变。

4.4 计算值

为了方便数学计算,CSS 提供了 cale() 值。括号内可以使用简单的数学算式。允许加减乘除以及括号。

在运算时,会检查括号内的各个值的类型,确保是兼容的。检查方式如下:

+ 和 - 号两侧的值必须使用相同的单位类型。因此,5 + 2.7 是有效的,结果为7.7;而 5em + 2.7 是无效的,因为一个是长度单位,一个是纯数字。

注意:5em + 20px 是有效的,因为 em  和 px 都是长度单位。

* 计算的两个值中,必须有一个是<number> ,因此,2.5rem * 2 和2rem * 2.5 都是有效的,结果为 5rem 。但2.5rem * 2.5rem 是无效的,因为rem平方是面积,而不是长度单位了。

/ 计算两个值中右边的那个必须是 <number> 。即必须符合 N / 数字 , N可以有单位,也可以没有。如30em / 2.75 是有效的。而30 / 2.75em 是无效的。

此外,任何情况下都不能除以零。如30px / 0 是不被允许的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        /* em */
        .d1 {font-size: 36px;}
        .d1 p {font-size: 1em;}  /* 此处的 em 相对于父元素 div 的font-size */  
        body>span {font-size: 1em;} /* 此处的 em 相对于 html 的font-size */   
        
        /* ex */
        .d2 :nth-child(1) {font-family: 'Courier New'; font-size: 10ex;} 
        .d2 :nth-child(2) {font-family: Courier; font-size: 10ex;} 
        .d2 :nth-child(3) {font-family:  monospace; font-size: 10ex;} 

        /* rem */ 
        .d3 p {font-size: 1.3rem;}

        /* ch */ 
        .d4 {position: relative;}
        .d4 div {
            position: absolute;
            top: 1.1ch;
            width: 10ch;
            border-top: 3px solid red;
        }

        /* 视区相关单位 vw  vh  vmin  vmax */
        .d5 span:nth-of-type(1) {font-size: 3vw;}
        .d5 span:nth-of-type(2) {font-size: 3vh;}
        .d5 span:nth-of-type(3) {font-size: 3vmin;}
        .d5 span:nth-of-type(4) {font-size: 3vmax;}

        /* calc() */
        .d6 {
            width: 160px; 
            height: 160px; 
            border: 1px solid red;
            margin: 0;
            
        }
        
        .d6 div {
            width: calc(80% - 15px);
            height: calc(80% - 35px);
            border: 1px solid red;
            margin: calc(15% - 10px)  auto; /* 此时父元素margin为零,但依旧有效??margin会跨级传递??盒模型数值对不上0啊 */
        }
      
    </style>
</head>
<body>
    <div class="d1">
        <p> 理论上,1 em 等于所用字体中小写字母 m 的宽度 。 其实, “em"这个名称就是由此而来这是一个古老的排版术语。然而,CSS没有才用这个定义。</p>
    </div>    
    <span>相对长度单位中的“相对”是指其长度是相对其他东西而言的。</span>
    <div class="d2">
        <span>x</span>
        <span>x</span>
        <span>x</span>
    </div><br>

    <div class="d3">
        <p>
            rem 的实际作用相当于重设字号:不管祖辈元素把字号设为多大,font-size: 1rem;都会把字号还原成根元素设定的大小。  
        </p>
        <span>1rem = 根元素的font-size的属性值。</span>
    </div><br>

    <div class="d4">
        <span>0000000000</span> <!-- 10个零 -->
        <div></div>
    </div><br>

    <div class="d5">
        <span>这里使用 vw 单位(试着改变浏览器窗口大小)</span><br>
        <span>这里使用 vh 单位</span><br>
        <span>这里使用 vmin 单位</span><br>
        <span>这里使用 vmax 单位</span><br>
    </div><br>

    <div class="d6">
        <div>calc() 允许运算 + 、 - 、 * 、 / 。其中 + 、 - 两个符号前后必须要有空格</div>
    </div>
</body>
</html>

 

4.5 属性值

attr() 函数返回被选择元素的属性值。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        div::after {content: attr(num);}
    </style>
</head>
<body>
    <div num="123"></div>    
</body>
</html>

 4.6 颜色

 CSS中可以使用颜色名,十六进制、RGB和RGBa格式、HSL 和 HSLa

4.6.1-4.6.2

RGB句法是 rgb(color),其中color是三个值,可以是百分数或整数。百分数的值是 0%~100% , 整数的取值范围是 0 ~ 255 。但是,一个颜色值中不能混用整数和百分数,如 rgb(15% , 100 , 36) 是无效的。

百分数与整数之间的转换关系是,百分数乘以255即可得到百分数对应的整数。 R代表红色red,G代表绿色green,B代表黑色black。

RGBa中,a是alpha表示不透明度。取值范围是0~1,0表示完全透明,1表示完全不透明。

十六进制表示法与三个整数表示法在数值上是等效的。

4.6.3 HSL 和 HSLa 颜色

 HSL是 hue(色相) ,Saturation(饱和度) 和 Lightness(明度)的简称。其中色相是角度值,取值范围是 0 - 360,饱和度是从 0(无饱和度)~100(完全饱和)的百分数,明度是从 0 (全暗)~100(全明)的百分数。

色相分布在一个色相环上,随着角度的旋转得到色谱上的不同颜色。 0度是红色,选装360度有回到红色。

4.6.4 颜色关键字

有两个特殊的关键字可以在任何允许使用颜色值的地方使用: transparent 和 currentColor 。

transparent表示完全透明的颜色,与 rgb(0,0,0) 等效。

currentColor 的意思是,获取当前元素 color 的属性值,并使用。如 div {color: red; border-color: currentColor; }

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            color: red;
            background-color: currentColor;             
        }
    </style>
</head>
<body>
    <div></div>    
</body>
</html>

4.7 角度

角度一般用 <angle> 表示。即一个 <number> 后跟下列四个单位中的一个。

deg :度数,完整的圆周是360度。

grad :百分度(gradian,也叫grade或gon),完整的圆周是400百分度。

rad : 弧度,完整的圆周是 2π (近似于6.28)。

turn : 圈数,一个完整的圆的一周。这个单位在旋转动画中最有用,比如让一个元素旋转10圈就是 10turn 。

4.8 时间和频率

 属性是时间时,是一个 <number> 值后跟一个 s(秒)或 ms(毫秒)。时间值常用在过渡和动画中使用,用于定义持续时间或延迟时间。1s = 1000ms 。

视听CSS中有一种值 <frequency> ,它是一个 <number> 值后跟 Hz(赫兹)或KHz(千赫兹)。这个单位的标识符不区分大小写。Hz 和 hz 是等效的。

4.9 位置

位置值用于指定图像在背景区域中的位置,使用<position> 表示。

如果只声明一个值。例如 left 或 25% ,那么第二个值将被设为 center。

如果声明两个值,而且第一个值是长度或百分数,那么前一个始终是横向值。

如果声明是四个值,必须有两个长度或百分数,而且前面都得是关键字。

三个值的处理方式跟四个值一样,不过最后一个偏移量将设为零,即不偏移。

(完全没看懂,额...)

4.10 自定义值

2017年末,CSS新增了一个特性,这个特性的术语是“自定义属性”,不过它的作用其实是在CSS中创建变量。这个名称词不达意,它并不创建特殊的CSS属性。

自定义属性(有时候也被称作CSS 变量或者级联变量)是由 CSS 作者定义的,它包含的值可以在整个文档中重复使用。

由自定义属性标记设定值(比如: --main-color: black;),由 var() 函数来获取值(比如: color: var(--main-color);)复杂的网站都会有大量的 CSS 代码,通常也会有许多重复的值。

举个例子,同样一个颜色值可能在成千上百个地方被使用到,如果这个值发生了变化,需要全局搜索并且一个一个替换(很麻烦哎~)。自定义属性在某个地方存储一个值,然后在其他许多地方引用它。

另一个好处是语义化的标识。比如,--main-text-color 会比 #00ff00 更易理解,尤其是这个颜色值在其他上下文中也被使用到。自定义属性受级联的约束,并从其父级继承其值。

自定义标识符以两个连字符开头(--),调用的方法是使用 var() 值类型。被定义的标识符是区分大小写的。(CSS变量只能替换值)

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        html {
            --alison: #639;
            --david: #AEA;
        }
        h1 {color: var(--alison);}
        h2 {color: var(--david);}
    </style>
</head>
<body>
    <h1>这些自定义的标识符通常被称为“CSS变量”,这解释了为什么使用var()调用它们。</h1>
    <h2>不过要记住,自定义标识符没有编辑语言中的变量那样的功能全面。</h2>
    <p>其实,自定义标识符更像是文本编辑器中的宏,作用只是把一个值替换成另一个。</p>
</body>
</html>

另外,自定义属性还有个特性:拥有作用域。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        html {
            --d-color: #639;/* 紫色 */
        }
        div {--d-color: #F60;}/* 橙色 */
        div span {color: var(--d-color);}
        p {color: var(--d-color);}
    </style>
</head>
<body>
    <div>
        <span>这里将使用橙色</span>
    </div>
    <p>这里将使用紫色</p>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        html {
            --d-color: #639;/* 紫色 */
            --d-width: 1px;
            --w-number: 160;
            --d-height: 1px;
            --h-number: 100;
        }
        div {--d-color: #F60;}/* 橙色 */
        div span {color: var(--d-color);}
        p {color: var(--d-color);}
        div {
            width: calc(var(--d-width)*var(--w-number)); /* var()后,不能跟单位,如: var(...)px */
            height: calc(var(--d-height)*var(--h-number));
            border: 1px solid red;
        }
    </style>
</head>
<body>
    <div>
        <span>这里将使用橙色</span>
    </div>
    <p>这里将使用紫色</p>
</body>
</html>

如果想试试自定义属性,又担心支持情况,可别忘了能查询特性的 @supports() ,这样遇到不支持的用户代理,使用变量的样式规则便隐藏起来:

@supports (color: var(--custom)) {

        /* 使用变量的规则 */

}

@supports (--custom:value) {

        /* 替代样式 */

}

(@supports 用于检测浏览器是否支持 CSS 的某个属性。其实就是条件判断,如果支持某个属性可以写一套样式,如果不支持某个属性,可以提供另外一套样式作为替补。可以放在代码的顶层,也可以嵌套在任何其他条件组规则中。)

 

 

posted @ 2023-01-24 00:48  我歌且谣  阅读(141)  评论(0编辑  收藏  举报