CSS属性:字体属性和文本属性

  • CSS的单位
  • 字体属性
  • 文本属性
  • 定位属性:position、float、overflow等

    CSS的单位

    html中的单位只有一种,那就是像素px,所以单位是可以省略的,但是在CSS中不一样。
    CSS中的单位是必须要写的,因为它没有默认单位。

绝对单位

1 in=2.54cm=25.4mm=72pt=6pc

各种单位的含义:

  • in:英寸Inches (1 英寸 = 2.54 厘米)
  • cm:厘米Centimeters
  • mm:毫米Millimeters
  • pt:点Points,或者叫英镑 (1点 = 1/72英寸)
  • pc:皮卡Picas (1 皮卡 = 12 点)

相对单位

px:像素
em:印刷单位相当于12个点
%:百分比,相对周围的文字的大小

为什么说像素px是一个相对单位呢,这也很好理解。比如说,电脑屏幕的的尺寸是不变的,但是我们可以让其显示不同的分辨率,在不同的分辨率下,单个像素的长度肯定是不一样的啦。
百分比%这个相对单位要怎么用呢?这里也举个例子:

image.png

font 字体属性

CSS中,有很多非布局样式(与布局无关),包括:字体、行高、颜色、大小、背景、边框、滚动、换行、装饰性属性(粗体、斜体、下划线)等。

这一段,我们先来讲一下字体属性。
css样式中,常见的字体属性有以下几种:

  1. p {
  2. font-size: 50px; /*字体大小*/
  3. line-height: 30px; /*行高*/
  4. font-family: 幼圆,黑体; /*字体类型:如果没有幼圆就显示黑体,没有黑体就显示默认*/
  5. font-style: italic ; /*italic表示斜体,normal表示不倾斜*/
  6. font-weight: bold; /*粗体*/
  7. font-variant: small-caps; /*小写变大写*/
  8. }

行高

CSS中,所有的行,都有行高。盒子模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的。
如下图所示:
image.png

上图中,我们设置行高为30px,30px * 6 = 180px,通过查看审查元素,这个p标签的高度果然为180px。而且我们发现,我们并没有给这个p标签设置高度,显然是内容将其撑高的。
垂直方向来看,文字在自己的行里是居中的。比如,文字是14px,行高是24px,那么padding就是5px:

image.png

为了严格保证字在行里面居中,我们的工程师有一个约定: 行高、字号,一般都是偶数。这样可以保证,它们的差一定偶数,就能够被2整除。

如何让单行文本垂直居中

小技巧:如果一段文本只有一行,如果此时设置行高 = 盒子高,就可以保证单行文本垂直居中。这个很好理解。
上面这个小技巧,只适用于单行文本垂直居中,不适用于多行。如果想让多行文本垂直居中,还需要计算盒子的padding。计算方式如下:

image.png

vertical-align: middle; 属性

vertical-align属性可用于指定行内元素(inline)、行内块元素(inline-block)、表格的单元格(table-cell)的垂直对齐方式。主要是用于图片、表格、文本的对齐。

代码举例:

  1. vertical-align: middle; /*指定行级元素的垂直对齐方式。*/

关于这一点,连 MDN 上都没我讲得详细。MDN上的原话是 “vertical-align 用来指定行内元素(inline)或表格单元格(table-cell)元素的垂直对齐方式。” MDN上的这种描述是不完整的,漏掉了行内块元素(inline-block)。

字号、行高、字体三大属性

(1)字号:

  1. font-size:14px;

(2)行高:

  1. line-height:24px;

(3)字体:(font-family就是“字体”,family是“家庭”的意思)

  1. font-family:"宋体";

是否加粗属性以及上面这三个属性,我们可以连写:(是否加粗、字号 font-size、行高 line-height、字体 font-family)

格式:

  1. font: 加粗 字号/行高/ 字体

举例:

  1. font: 400 14px/24px "宋体";

PS:400是normal,700是bold。
上面这几个属性可以连写,但是有一个要求,font属性连写至少要有字号和字体,否则连写是不生效的(相当于没有这一行代码)。

2、字体属性的说明:

(1)网页中不是所有字体都能用,因为这个字体要看用户的电脑里面装没装,比如你设置:

  1. font-family: "华文彩云";

上方代码中,如果用户的 Windows 电脑里面没有这个字体,那么就会变成宋体。
页面中,中文我们一般使用:微软雅黑、宋体、黑体。英文使用:Arial、Times New Roman。页面中如果需要其他的字体,就需要单独安装字体,或者切图。

(2)为了防止用户电脑里,没有微软雅黑这个字体。就要用英语的逗号,提供备选字体。如下:(可以备选多个)

  1. font-family: "微软雅黑","宋体";

上方代码表示:如果用户电脑里没有安装微软雅黑字体,那么就是宋体。

(3)我们须将英语字体放在最前面,这样所有的中文,就不能匹配英语字体,就自动的变为后面的中文字体:

  1. font-family: "Times New Roman","微软雅黑","宋体";

上方代码的意思是,英文会采用Times New Roman字体,而中文会采用微软雅黑字体(因为美国人设计的Times New Roman字体并不针对中文,所以中文会采用后面的微软雅黑)。比如说,对于smyhvae哈哈哈这段文字,smyhvae会采用Times New Roman字体,而哈哈哈会采用微软雅黑字体。

可是,如果我们把中文字体写在前面:(错误写法)

  1. font-family: "微软雅黑","Times New Roman","宋体";

上方代码会导致,中文和英文都会采用微软雅黑字体。

(4)所有的中文字体,都有英语别名。
微软雅黑的英语别名:

  1. font-family: "Microsoft YaHei";

宋体的英语别名:

  1. font-family: "SimSun";

于是,当我们把字号、行高、字体这三个属性合二为一时,也可以写成:

  1. font:12px/30px "Times New Roman","Microsoft YaHei","SimSun";

(5)行高可以用百分比,表示字号的百分之多少。
一般来说,百分比都是大于100%的,因为行高一定要大于字号。

比如说, font:12px/200% “宋体”等价于font:12px/24px “宋体”200%可以理解成word里面的2倍行高。
反过来, font:16px/48px “宋体”;等价于font:16px/300% “宋体”

字体加粗属性

  1. .div {
  2. font-weight: normal; /*正常*/
  3. font-weight: bold; /*加粗*/
  4. font-weight: 100;
  5. font-weight: 200;
  6. font-weight: 900;
  7. }

在设置字体是否加粗时,属性值既可以填写normalbold这样的加粗字体,也可以直接填写 100至900 这样的数字。normal的值相当于400,bold的值相当于700。

文本属性

CSS样式中,常见的文本属性有以下几种:

  • letter-spacing: 0.5cm ; 单个字母之间的间距
  • word-spacing: 1cm; 单词之间的间距
  • text-decoration: none; 字体修饰:none 去掉下划线、underline 下划线、line-through 中划线、overline 上划线
  • color:red; 字体颜色
  • text-align: center; 在当前容器中的对齐方式。属性值可以是:left、right、center(在当前容器的中间)、justify
  • text-transform: lowercase; 单词的字体大小写。属性值可以是:uppercase(单词大写)、lowercase(单词小写)、capitalize(每个单词的首字母大写)

这里来一张表格的图片吧,一览无遗:

image.png

列表属性

  1. ul li{
  2. list-style-image:url(images/2.gif) ; /*列表项前设置为图片*/
  3. margin-left:80px; /*公有属性*/
  4. }

另外还有一个简写属性叫做list-style,它的作用是:将上面的多个属性写在一个声明中。
我们来看一下list-style-image属性的效果:

image.png

给列表前面的图片加个边距吧,不然显示不完整:
image.png

这里来一张表格的图片吧,一览无遗:

image.png

overflow属性:超出范围的内容要怎么处理

overflow属性的属性值可以是:

  • visible:默认值。多余的内容不剪切也不添加滚动条,会全部显示出来。
  • hidden:不显示超过对象尺寸的内容。
  • auto:如果内容不超出,则不显示滚动条;如果内容超出,则显示滚动条。
  • scroll:Windows 平台下,无论内容是否超出,总是显示滚动条。Mac 平台下,和 auto 属性相同。

针对上面的不同的属性值,我们来看一下效果:
举例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <style type="text/css">
  8. div{
  9. width: 100px;
  10. height: 100px;
  11. background-color: #eee;
  12. margin-right: 100px;
  13. float: left;
  14. }
  15. #div1{
  16. overflow: auto;/*超出的部分让浏览器自行解决*/
  17. }
  18. #div2{
  19. overflow: visible;/*超出的部分会显示出来*/
  20. }
  21. #div3{
  22. overflow: hidden;/*超出的部分将剪切掉*/
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <div id="div1">其实很简单 其实很自然 两个人的爱由两人分担 其实并不难 是你太悲观 隔着一道墙不跟谁分享 不想让你为难 你不再需要给我个答案</div>
  28. <div id="div2">其实很简单 其实很自然 两个人的爱由两人分担 其实并不难 是你太悲观 隔着一道墙不跟谁分享 不想让你为难 你不再需要给我个答案</div>
  29. <div id="div3">其实很简单 其实很自然 两个人的爱由两人分担 其实并不难 是你太悲观 隔着一道墙不跟谁分享 不想让你为难 你不再需要给我个答案</div>
  30. </body>
  31. </html>

效果:
image.png

鼠标的属性 cursor

鼠标的属性cursor有以下几个属性值:

  • auto:默认值。浏览器根据当前情况自动确定鼠标光标类型。
  • pointer:IE6.0,竖起一只手指的手形光标。就像通常用户将光标移到超链接上时那样。
  • hand:和pointer的作用一样:竖起一只手指的手形光标。就像通常用户将光标移到超链接上时那样。

比如说,我想让鼠标放在那个标签上时,光标显示手状,代码如下:

  1. p:hover{
  2. cursor: pointer;
  3. }

另外还有以下的属性:(不用记,需要的时候查一下就行了)

  • all-scroll :  IE6.0 有上下左右四个箭头,中间有一个圆点的光标。用于标示页面可以向上下左右任何方向滚动。
  • col-resize :  IE6.0 有左右两个箭头,中间由竖线分隔开的光标。用于标示项目或标题栏可以被水平改变尺寸。
  • crosshair :  简单的十字线光标。
  • default :  客户端平台的默认光标。通常是一个箭头。
  • hand :  竖起一只手指的手形光标。就像通常用户将光标移到超链接上时那样。
  • move :  十字箭头光标。用于标示对象可被移动。
  • help :  带有问号标记的箭头。用于标示有帮助信息存在。
  • no-drop :  IE6.0 带有一个被斜线贯穿的圆圈的手形光标。用于标示被拖起的对象不允许在光标的当前位置被放下。
  • not-allowed :  IE6.0 禁止标记(一个被斜线贯穿的圆圈)光标。用于标示请求的操作不允许被执行。
  • progress :  IE6.0 带有沙漏标记的箭头光标。用于标示一个进程正在后台运行。
  • row-resize :  IE6.0 有上下两个箭头,中间由横线分隔开的光标。用于标示项目或标题栏可以被垂直改变尺寸。
  • text :  用于标示可编辑的水平文本的光标。通常是大写字母 I 的形状。
  • vertical-text :  IE6.0 用于标示可编辑的垂直文本的光标。通常是大写字母 I 旋转90度的形状。
  • wait :  用于标示程序忙用户需要等待的光标。通常是沙漏或手表的形状。
  • *-resize :  用于标示对象可被改变尺寸方向的箭头光标。

    1. w-resize | s-resize | n-resize | e-resize | ne-resize | sw-resize | se-resize | nw-resize
  • url ( url ) :  IE6.0 用户自定义光标。使用绝对或相对 url 地址指定光标文件(后缀为 .cur 或者 .ani )。

滤镜

这里只举一个滤镜的例子吧。比如说让图片变成灰度图的效果,可以这样设置滤镜:

  1. <img src="3.jpg" style="filter:gray()">

举例代码:

  1. <body>
  2. <table>
  3. <tr>
  4. <td>原始图片</td>
  5. <td>图片加入黑白效果</td>
  6. </tr>
  7. <tr>
  8. <td><img src="3.jpg"></td>
  9. <td><img src="3.jpg" style="filter:gray()"></td> /*滤镜:设置图片为灰白效果*/
  10. </tr>
  11. </table>
  12. </body>

效果如下:(IE有效果,google浏览器无效果)
image.png

延伸:
滤镜本身是平面设计中的知识。如果你懂一点PS的话···打开PS看看吧:

image.png

导航栏的制作

现在,我们利用float浮动属性来把无序列表做成一个简单的导航栏吧,效果如下:
image.png

代码:

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style type="text/css">
  7. ul{
  8. list-style: none;/*去掉列表前面的圆点*/
  9. width: 420px;
  10. height: 60px;
  11. background-color: black;/*设置整个导航栏的背景为灰色*/
  12. }
  13. li{
  14. float: left;/*平铺*/
  15. margin-right: 30px;
  16. margin-top: 16px;
  17. }
  18. a{
  19. text-decoration: none;/*去掉超链的下划线*/
  20. font-size: 20px;
  21. color: #BBBBBB;/*设置超链的字体为黑色*/
  22. font-family:微软雅黑;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <ul>
  28. <li><a href="">博客园</a></li>
  29. <li><a href="">新随笔</a></li>
  30. <li><a href="">联系</a></li>
  31. <li><a href="">订阅</a></li>
  32. <li><a href="">管理</a></li>
  33. </ul>
  34. </body>
  35. </html>

实现效果如下:
image.png

CSS属性:背景属性

background 的常见背景属性

css2.1 中,常见的背景属性有以下几种:(经常用到,要记住)

  • background-color:#ff99ff; 设置元素的背景颜色。
  • background-image:url(images/2.gif); 将图像设置为背景。
  • background-repeat: no-repeat; 设置背景图片是否重复及如何重复,默认平铺满。(重要)
    • no-repeat不要平铺;
    • repeat-x横向平铺;
    • repeat-y纵向平铺。
  • background-position:center top; 设置背景图片在当前容器中的位置。
  • background-attachment:scroll; 设置背景图片是否跟着滚动条一起移动。
    属性值可以是:scroll(与fixed属性相反,默认属性)、fixed(背景就会被固定住,不会被滚动条滚走)。
  • 另外还有一个综合属性叫做background,它的作用是:将上面的多个属性写在一个声明中。

CSS3 中,新增了一些background属性:

  • background-origin
  • background-clip 背景裁切
  • background-size 调整尺寸
  • 多重背景

上面这几个属性经常用到,需要记住。现在我们逐个进行讲解。

background-color:背景颜色的表示方法

css2.1 中,颜色的表示方法有三种:单词、rgb表示法、十六进制表示法。
比如红色可以有下面的三种表示方法:

  1. background-color: red;
  2. background-color: rgb(255,0,0);
  3. background-color: #ff0000;

CSS3 中,有一种新的表示颜色的方式:RGBA或者HSLA。
RGBA、HSLA可应用于所有使用颜色的地方。

下面分别介绍。

用英语单词表示

能够用英语单词来表述的颜色,都是简单颜色,比如red、green、blue、orange、gray等。代码举例:

  1. background-color: red;

RGB 表示法

RGB 表示三原色“红”red、“绿”green、“蓝”blue。
光学显示器中,每个像素都是由三原色的发光原件组成的,靠明亮度不同调成不同的颜色的。r、g、b的值,每个值的取值范围0~255,一共256个值。

比如红色:

  1. background-color: rgb(255,0,0);

黑色:

  1. background-color: rgb(0,0,0);

颜色可以叠加,比如黄色就是红色和绿色的叠加:

  1. background-color: rgb(255,255,0);

RGBA 表示法

  1. background-color: rgba(0, 0, 255, 0.3);
  2. border: 30px solid rgba(0, 255, 0, 0.3);

代码解释

  • RGBA 即:Red 红、Green 绿、Blue 蓝、Alpha 透明度。
  • R、G、B 的取值范围是:0~255;透明度的取值范围是 0~1。

RGB色彩模式:

  • 自然界中绝大部分颜色都可以用红、绿、蓝(RGB)这三种颜色波长的不同强度组合而得,这就是人们常说的三原色原理。
  • RGB三原色也叫加色模式,这是因为当我们把不同光的波长加到一起的时候,可以得到不同的混合色。例:红+绿=黄色,红+蓝=紫色,绿+蓝=青。
  • RGB各有256级(0-255)亮度,256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。

在数字视频中,对RGB三基色各进行8位编码就构成了大约1678万种颜色,这就是我们常说的真彩色。所有显示设备都采用的是RGB色彩模式。

十六进制表示法

比如红色:

  1. background-color: #ff0000;

所有用#开头的色值,都是16进制的。
这里,我们就要学会16进制与10进制之间的转换。下面举几个例子。

16进制:用16作为基数的计数系统。用数字0-9和字母a-f(或其大写A-F)表示0到15。

问:16进制中的28等于10进制的多少?
答:2*16+8 = 40。

16进制中的af等于10进制的多少?
答:10 * 16 + 15 = 175

以此类推:

  • ff0000等于rgb(255,0,0)。

  • background-color: #123456;等价于background-color: rgb(18,52,86);

十六进制可以简化为3位,所有#aabbcc的形式,能够简化为#abc。举例如下:

比如:

  1. background-color:#ff0000;

等价于:

  1. background-color:#f00;

比如:

  1. background-color:#112233;

等价于:

  1. background-color:#123;

但是,比如下面这个是无法简化的:

  1. background-color:#222333;

再比如,下面这个也是无法简化的:

  1. background-color:#123123;

几种常见的颜色简写可以记住。如下:

  1. #000 黑
  2. #fff 白
  3. #f00 红
  4. #222 深灰
  5. #333 灰
  6. #ccc 浅灰

HSLA 表示法

举例:

  1. background-color: hsla(240,50%,50%,0.4);

解释:

  • H 色调,取值范围 0~360。0或360表示红色、120表示绿色、240表示蓝色。
  • S 饱和度,取值范围 0%~100%。值越大,越鲜艳。
  • L 亮度,取值范围 0%~100%。亮度最大时为白色,最小时为黑色。
  • A 透明度,取值范围 0~1。

如果不知道 H 的值该设置多少,我们不妨来看一下色盘

image.png

推荐链接:配色宝典

关于设置透明度的其他方式:
(1)opacity: 0.3; 会将整个盒子及子盒子设置透明度。也就是说,当盒子设置半透明的时候,会影响里面的子盒子
(2)background: transparent; 可以单独设置透明度,但设置的是完全透明(不可调节透明度)。

background-repeat属性

background-repeat:no-repeat;设置背景图片是否重复及如何重复,默认平铺满。属性值可以是:

  • no-repeat(不要平铺)
  • repeat-x(横向平铺)
  • repeat-y(纵向平铺)

这个属性在开发的时候也是经常用到的。我们通过设置不同的属性值来看一下效果吧:

(1)不加这个属性时:(即默认时)(背景图片会被平铺满)
image.png

PS:padding的区域也是有背景图的。

(2)属性值为no-repeat(不要平铺)时:
image.png

(3)属性值为repeat-x(横向平铺)时:

image.png

其实这种属性的作用还是很广的。举个例子,设计师设计一张宽度只有1px、颜色纵向渐变的图片,然后我们通过这个属性将其进行水平方向的平铺,就可以看到整个页面都是渐变的了。

在搜索引擎上搜“平铺背景”,就可以发现,周期性的图片可以采用此种方法进行平铺。

(4)属性值为repeat-y(纵向平铺)时:

image.png

background-position属性

background-position属性指的是背景定位属性。公式如下:
在描述属性值的时候,有两种方式:用像素描述、用单词描述。下面分别介绍。

1、用像素值描述属性值:
格式如下:

  1. background-position:向右偏移量 向下偏移量;

属性值可以是正数,也可以是负数。比如:100px 200px-50px -120px
举例如下:
image.png

image.png

2、用单词描述属性值:

格式如下:

  1. background-position: 描述左右的词 描述上下的词;
  • 描述左右的词:left、center、right
  • 描述上下的词:top 、center、bottom

比如说,right center表示将图片放到右边的中间;center center表示将图片放到正中间。

比如说,bottom表示图片的底边和父亲底边贴齐(好好理解)。

位置属性有很多使用场景的。我们来举两个例子。

场景2:(通栏banner)

很多网站的首页都会有banner图(网站最上方的全屏大图叫做「通栏banner」),这种图要求横向的宽度特别大。比如说,设计师给你一张1920*465的超大banner图,如果我们把这个banner图作为img标签直接插入网页中,会有问题的:首先,图片不在网页的中间;其次,肯定会出现横向滚动条。如下图所示:

(一)CSS 基础语法 - 图21

正确的做法是,将banner图作为div的背景图,这样的话,背景图超出div的部分,会自动移溢出。需要给div设置的属性如下:

  1. div{
  2. height: 465px;
  3. background-image: url(http://img.smyhvae.com/20170813_1053.jpg);
  4. background-position: center top;
  5. background-repeat: no-repeat;
  6. }

上方代码中,我们给div设置height(高度为banner图的高度),不需要设置宽度(因为宽度会自动霸占整行)。效果如下:

(一)CSS 基础语法 - 图22

上图可以看出,将banner图作为div的背景后,banner图会永远处于网页的正中间(水平方向来看)。

background-attachment 属性

  • background-attachment:scroll; 设置背景图片是否固定。属性值可以是:
    • fixed(背景就会被固定住,不会被滚动条滚走)。
    • scroll(与fixed属性相反,默认属性)

background 综合属性

background属性和border一样,是一个综合属性,可以将多个属性写在一起。
举例1:

  1. background:red url(1.jpg) no-repeat 100px 100px fixed;

等价于:

  1. background-color:red;
  2. background-image:url(1.jpg);
  3. background-repeat:no-repeat;
  4. background-position:100px 100px;
  5. background-attachment:fixed;

以后,我们可以用小属性层叠掉大属性。

上面的属性中,可以任意省略其中的一部分。
比如说,对于下面这样的属性:

  1. background: blue url(images/wuyifan.jpg) no-repeat 100px 100px;

效果如下:
image.png

background-size属性:背景尺寸

background-size属性:设置背景图片的尺寸。
格式举例:

  1. /* 宽、高的具体数值 */
  2. background-size: 500px 500px;
  3. /* 宽高的百分比(相对于容器的大小) */
  4. background-size: 50% 50%; // 如果两个属性值相同,可以简写成:background-size: 50%;
  5. background-size: 100% auto; //这个属性可以自己试验一下。
  6. /* cover:图片始终填充满容器,且保证长宽比不变。图片如果有超出部分,则超出部分会被隐藏。 */
  7. background-size: cover;
  8. /* contain:将图片完整地显示在容器中,且保证长宽比不变。可能会导致容器的部分区域为空白。 */
  9. background-size: contain;

这里我们对属性值 covercontain 进行再次强调:

  • cover:图片始终填充满容器,且保证长宽比不变。图片如果有超出部分,则超出部分会被隐藏。
  • contain:将图片完整地显示在容器中,且保证长宽比不变。可能会导致容器的部分区域留白。

代码举例:(这张图片本身的尺寸是 1080 * 1350)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <style>
  8. .img_wrap {
  9. display: flex;
  10. }
  11. .img {
  12. width: 200px;
  13. height: 200px;
  14. border:1px solid red;
  15. background: url(http://img.smyhvae.com/20191006_1330.jpg) no-repeat;
  16. margin-right: 20px;
  17. }
  18. .div1 {
  19. background-size: cover;
  20. }
  21. .div2{
  22. background-size: contain;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <section class="img_wrap">
  28. <div class="img div1"></div>
  29. <div class="img div2"></div>
  30. </section>
  31. </body>
  32. </html>

效果如下:

image.png

在上方代码的基础之上,再加一个 background-position: center属性之后,图片就会在容器里居中显示

image.png

背景原点:background-origin 属性

background-origin 属性:控制背景从什么地方开始显示。
格式举例:

  1. /* 从 padding-box 内边距开始显示背景图 */
  2. background-origin: padding-box; //默认值
  3. /* 从 border-box 边框开始显示背景图 */
  4. background-origin: border-box;
  5. /* 从 content-box 内容区域开始显示背景图 */
  6. background-origin: content-box;

如果属性值设置成了border-box,那边框部分也会显示图片哦。

如下图所示:
image.png

background-clip属性:设置元素的背景(背景图片或颜色)是否延伸到边框下面

格式举例:
background-clip: content-box; 超出的部分,将裁剪掉。属性值可以是:

  • border-box 超出 border-box 的部分,将裁剪掉
  • padding-box 超出 padding-box 的部分,将裁剪掉
  • content-box 超出 content-box 的部分,将裁剪掉

假设现在有这样的属性设置:

  1. background-origin: border-box;
  2. background-clip: content-box;

上方代码的意思是,背景图片从边框部分开始加载,但是呢,超出内容区域的部分将被裁减掉。

同时设置多个背景

我们可以给一个盒子同时设置多个背景,用以逗号隔开即可。可用于自适应局。
代码举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .box {
  8. height: 416px;
  9. border: 1px solid #000;
  10. margin: 100px auto;
  11. /* 给盒子加多个背景,按照背景语法格式书写,多个背景使用逗号隔开 */
  12. background: url(images/bg1.png) no-repeat left top,
  13. url(images/bg2.png) no-repeat right top,
  14. url(images/bg3.png) no-repeat right bottom,
  15. url(images/bg4.png) no-repeat left bottom,
  16. url(images/bg5.png) no-repeat center;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div class="box"></div>
  22. </body>
  23. </html>

实现效果如下:
(一)CSS 基础语法 - 图27

上方代码中,我们其实给盒子设置了五张小图,拼成的一张大图。当改变浏览器窗口大小时,可以自适应布局。

渐变:background-image

渐变是CSS3当中比较丰富多彩的一个特性,通过渐变我们可以实现许多炫丽的效果,有效的减少图片的使用数量,并且具有很强的适应性和可扩展性。

渐变分为:

  • 线性渐变:沿着某条直线朝一个方向产生渐变效果。
  • 径向渐变:从一个中心点开始沿着四周产生渐变效果。
  • 重复渐变。

见下图:

image.png

线性渐变

格式:

  1. background-image: linear-gradient(方向, 起始颜色, 终止颜色);
  2. background-image: linear-gradient(to right, yellow, green);

参数解释:

  • 方向可以是:to leftto rightto topto bottom、角度30deg(指的是顺时针方向30°)。

格式举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. div {
  8. width: 500px;
  9. height: 100px;
  10. margin: 10px auto;
  11. border: 1px solid #000;
  12. }
  13. /* 语法:
  14. linear-gradient(方向,起始颜色,终止颜色);
  15. 方向:to left to right to top to bottom  角度 30deg
  16. 起始颜色
  17. 终止颜色
  18. */
  19. div:nth-child(1) {
  20. background-image: linear-gradient(to right, yellow, green);
  21. }
  22. /* 不写方向,表示默认的方向是:从上往下 */
  23. div:nth-child(2) {
  24. background-image: linear-gradient(yellow, green);
  25. }
  26. /* 方向可以指定角度 */
  27. div:nth-child(3) {
  28. width: 100px;
  29. height: 100px;
  30. background-image: linear-gradient(135deg, yellow, green);
  31. }
  32. /* 0%的位置开始出现黄色,40%的位置开始出现红色的过度。70%的位置开始出现绿色的过度,100%的位置开始出现蓝色 */
  33. div:nth-child(4) {
  34. background-image: linear-gradient(to right,
  35. yellow 0%,
  36. red 40%,
  37. green 70%,
  38. blue 100%);
  39. }
  40. /* 颜色之间,出现突变 */
  41. div:nth-child(5) {
  42. background-image: linear-gradient(45deg,
  43. yellow 0%,
  44. yellow 25%,
  45. blue 25%,
  46. blue 50%,
  47. red 50%,
  48. red 75%,
  49. green 75%,
  50. green 100%
  51. );
  52. }
  53. div:nth-child(6) {
  54. background-image: linear-gradient(to right,
  55. #000 0%,
  56. #000 25%,
  57. #fff 25%,
  58. #fff 50%,
  59. #000 50%,
  60. #000 75%,
  61. #fff 75%,
  62. #fff 100%
  63. );
  64. }
  65. </style>
  66. </head>
  67. <body>
  68. <div></div>
  69. <div></div>
  70. <div></div>
  71. <div></div>
  72. <div></div>
  73. <div></div>
  74. </body>
  75. </html>

效果如下:
image.png

举例:按钮

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>CSS3 渐变</title>
  6. <style>
  7. html, body {
  8. height: 100%;
  9. }
  10. body {
  11. margin: 0;
  12. padding: 0;
  13. background-color: #f8fcd4;
  14. }
  15. .nav {
  16. width: 800px;
  17. text-align: center;
  18. padding-top: 50px;
  19. margin: 0 auto;
  20. }
  21. /*设置按钮基本样式*/
  22. .nav a {
  23. display: inline-block;
  24. width: 100px;
  25. height: 30px;
  26. text-align: center;
  27. line-height: 30px;
  28. font-size: 14px;
  29. color: #fff;
  30. text-decoration: none;
  31. border: 1px solid #e59500;
  32. background-color: #FFB700;
  33. background-image: linear-gradient(
  34. to bottom,
  35. #FFB700 0%,
  36. #FF8C00 100%
  37. );
  38. }
  39. </style>
  40. </head>
  41. <body>
  42. <div class="nav">
  43. <a href="javascript:;">导航1</a>
  44. <a href="javascript:;">导航2</a>
  45. <a href="javascript:;">导航3</a>
  46. <a href="javascript:;">导航4</a>
  47. <a href="javascript:;">导航5</a>
  48. <a href="javascript:;">导航6</a>
  49. </div>
  50. </body>
  51. </html>

效果:

image.png

径向渐变

格式:

  1. background-image: radial-gradient(辐射的半径大小, 中心的位置, 起始颜色, 终止颜色);
  2. background-image: radial-gradient(100px at center,yellow ,green);

解释:围绕中心点做渐变,半径是150px,从黄色到绿色做渐变。
中心点的位置可以是:at left right center bottom top。如果以像素为单位,则中心点参照的是盒子的左上角。
当然,还有其他的各种参数。格式举例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. div {
  8. width: 250px;
  9. height: 250px;
  10. border: 1px solid #000;
  11. margin: 20px;
  12. float: left;
  13. }
  14. /*
  15. 径向渐变:
  16. radial-gradient(辐射的半径大小, 中心的位置,起始颜色,终止颜色);
  17. 中心点位置:at left right center bottom top
  18. */
  19. /*辐射半径为100px,中心点在中间*/
  20. div:nth-child(1) {
  21. background-image: radial-gradient(100px at center, yellow, green);
  22. }
  23. /*中心点在左上角*/
  24. div:nth-child(3) {
  25. background-image: radial-gradient(at left top, yellow, green);
  26. }
  27. div:nth-child(2) {
  28. background-image: radial-gradient(at 50px 50px, yellow, green);
  29. }
  30. /*设置不同的颜色渐变*/
  31. div:nth-child(4) {
  32. background-image: radial-gradient(100px at center,
  33. yellow 0%,
  34. green 30%,
  35. blue 60%,
  36. red 100%);
  37. }
  38. /*如果辐射半径的宽高不同,那就是椭圆*/
  39. div:nth-child(5) {
  40. background-image: radial-gradient(100px 50px at center, yellow, green);
  41. }
  42. </style>
  43. </head>
  44. <body>
  45. <div class="box"></div>
  46. <div class="box"></div>
  47. <div class="box"></div>
  48. <div class="box"></div>
  49. <div class="box"></div>
  50. </body>
  51. </html>

效果如下:
image.png

举例:利用径向渐变和边框圆角的属性,生成按钮。代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>CSS3 渐变</title>
  6. <style>
  7. div:nth-child(1) {
  8. width: 200px;
  9. height: 200px;
  10. margin: 40px auto;
  11. border-radius: 100px;
  12. background-color: yellowgreen;
  13. }
  14. div:nth-child(2) {
  15. width: 200px;
  16. height: 200px;
  17. margin: 40px auto;
  18. border-radius: 100px;
  19. background-color: yellowgreen;
  20. background-image: radial-gradient(
  21. 200px at 100px 100px,
  22. rgba(0, 0, 0, 0),
  23. rgba(0, 0, 0, 0.5)
  24. );
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div></div>
  30. <div></div>
  31. </body>
  32. </html>

效果如下:
image.png

上图中,给第二个div设置的透明度是从0到0.5。如果设置的透明度是从0到0,则样式无变化,和第一个div一样。如果设置的透明度是从1到1,则盒子是全黑的。

clip-path:裁剪出元素的部分区域做展示

clip-path属性可以创建一个只有元素的部分区域可以显示的剪切区域。区域内的部分显示,区域外的隐藏。

虽然clip-path不是背景属性,但这个属性非常强大,但往往会结合背景属性一起使用,达到一些效果。

举例:(鼠标悬停时,放大裁剪的区域)

  1. .div1 {
  2. width: 320px;
  3. height: 320px;
  4. border: 1px solid red;
  5. background: url(http://img.smyhvae.com/20191006_1410.png) no-repeat;
  6. background-size: cover;
  7. /* 裁剪出圆形区域 */
  8. clip-path: circle(50px at 100px 100px);
  9. transition: clip-path .4s;
  10. }
  11. .div1:hover{
  12. /* 鼠标悬停时,裁剪出更大的圆形 */
  13. clip-path: circle(80px at 100px 100px);
  14. }

clip-path属性的好处是,即使做了任何裁剪,容器的占位大小是不变的。比如上方代码中,容器的占位大小一直都是 320px * 320px。这样的话,也方便我们做一些动画效果。

clip-path: polygon()举例:
image.png

另外,通过 clip-path: (svg) 可以导入svg矢量图,实现 iOS图标的圆角。这里就不详细展开了。

CSS样式表和选择器

  • CSS 概述
  • CSS 和 HTML 结合的三种方式:行内样式表内嵌样式表外部样式表
  • CSS 四种基本选择器:标签选择器类选择器ID选择器通用选择器
  • CSS 几种扩展选择器:后代选择器交集选择器并集选择器
  • CSS 样式优先级

CSS 概述

CSS:Cascading Style Sheet,层叠样式表。CSS 的作用就是给 HTML 页面标签添加各种样式,定义网页的显示效果。简单一句话:CSS 将网页内容和显示样式进行分离,提高了显示功能。
css 的最新版本是 css3,我们目前学习的是 css2.1。 因为 css3 和 css2.1 不矛盾,必须先学 2.1 然后学 3。

接下来我们要讲一下为什么要使用 CSS。

HTML 的缺陷:

  1. 不能够适应多种设备
  2. 要求浏览器必须智能化足够庞大
  3. 数据和显示没有分开
  4. 功能不够强大

CSS 优点:

  1. 使数据和显示分开
  2. 降低网络流量
  3. 使整个网站视觉效果一致
  4. 使开发效率提高了(耦合性降低,一个人负责写 html,一个人负责写 css)

比如说,有一个样式需要在一百个页面上显示,如果是 html 来实现,那要写一百遍,现在有了 css,只要写一遍。现在,html 只提供数据和一些控件,完全交给 css 提供各种各样的样式。

CSS 的重点知识点

盒子模型、浮动、定位

CSS 整体感知

我们先来看一段简单的 css 代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <style>
  7. p {
  8. color: red;
  9. font-size: 30px;
  10. text-decoration: underline;
  11. font-weight: bold;
  12. text-align: center;
  13. font-style: italic;
  14. }
  15. h1 {
  16. color: blue;
  17. font-size: 50px;
  18. font-weight: bold;
  19. background-color: pink;
  20. }
  21. </style>
  22. </head>
  23. <body>
  24. <h1>我是大标题</h1>
  25. <p>我是内容</p>
  26. </body>
  27. </html>

解释如下:
image.png

我们写 css 的地方是 style 标签,就是“样式”的意思,写在 head 里面。后面的课程中我们将知道,css 也可以写在单独的文件里面,现在我们先写在 style 标签里面。

如果在 VS Code 中输入<st或者<style然后按 tab 键,可以自动生成的格式如下:(建议)

  1. <style type="text/css"></style>

type 表示“类型”,text 就是“纯文本”,css 也是纯文本。
css 对换行不敏感,对空格也不敏感。但是一定要有标准的语法。冒号,分号都不能省略。

CSS 语法

语法格式:(其实就是键值对)

  1. 选择器{ 属性名: 属性值; 属性名: 属性值; }

或者可以写成:

  1. 选择器 {
  2. k: v;
  3. k: v;
  4. k: v;
  5. k: v;
  6. }
  7. 选择器 {
  8. k: v;
  9. k: v;
  10. k: v;
  11. k: v;
  12. }

解释:

  • 选择器代表页面上的某类元素,选择器后一定是大括号。
  • 属性名后必须用冒号隔开,属性值后用分号(最后一个属性可以不用分号,但最好还是加上分号)。
  • 冒号和属性值之间可以留一个空格(编程习惯的经验)。
  • 如果一个属性有多个值的话,那么多个值用空格隔开。

举例:

  1. p {
  2. color: red;
  3. }

完整版代码举例:

  1. <style type="text/css">
  2. p {
  3. font-weight: bold;
  4. font-style: italic;
  5. color: red;
  6. }
  7. </style>
  8. <body>
  9. <p>前端修炼手册</p>
  10. <p>新人快速提升</p>
  11. <p>寻求突破</p>
  12. </body>

效果:

image.png

css 代码的注释

格式:

  1. <style type="text/css">
  2. /*
  3. 具体的注释
  4. */
  5. p {
  6. font-weight: bold;
  7. font-style: italic;
  8. color: red;
  9. }
  10. </style>

注意:CSS 只有/* */这种注释,没有//这种注释。而且注释要写在<style>标签里面才算生效哦。

接下来,我们要开始真正地讲 css 的知识咯。

css 怎么学?CSS 有两个知识部分:
1) 选择器,怎么选;
2) 属性,样式是什么

CSS 的一些简单常见的属性

我们先来接触 CSS 的一些简单常见的属性,因为接下来需要用到。后期会专门用一篇文章来写 CSS 的属性。

字体颜色:

  1. color:red;

color 属性的值,可以是英语单词,比如 red、blue、yellow 等等;也可以是 rgb、十六进制(后期详细讲)。

字号大小:

  1. font-size:40px;

font 就是“字体”,size 就是“尺寸”。px 是“像素”。单位必须加,不加不行。

背景颜色:

  1. background-color: blue;

background 就是“背景”。

加粗:

  1. font-weight: bold;

font 是“字体” weight 是“重量”的意思,bold 粗。

不加粗:

  1. font-weight: normal;

normal 就是正常的意思。

斜体:

  1. font-style: italic;

italic 就是“斜体”。

不斜体:

  1. font-style: normal;

下划线:

  1. text-decoration: underline;

decoration 就是“装饰”的意思。

没有下划线:

  1. text-decoration:none;

CSS 的书写方式

CSS 的书写方式,实就是问你 CSS 的代码放在哪个位置。CSS 代码理论上的位置是任意的,但通常写在**<style>**标签里
CSS 的书写方式有三种:

  1. 行内样式:在某个特定的标签里采用 style 属性。范围只针对此标签。
  2. 内嵌样式(内联样式):在页面的 head 标签里里采用<style>标签。范围针对此页面。
  3. 外链样式:引入外部样式表 CSS 文件。这种引入方式又分为两种:
    • 3.1 采用<link>标签。例如:<link rel = "stylesheet" type = "text/css" href = "a.css"></link>
    • 3.2 采用 import 导入,必须写在<style>标签中。然后用类似于@import url(a.css) ;这种方式导入。

下面来详细讲一讲这三种方式。

1、CSS 和 HTML 结合方式一:行内样式

采用 style 属性。范围只针对此标签适用。
该方式比较灵活,但是对于多个相同标签的同一样式定义比较麻烦,适合局部修改。

举例:

  1. <p style="color:white;background-color:red">前端修炼手册</p>

2、CSS 和 HTML 结合方式二:内嵌样式表

在 head 标签中加入<style>标签,对多个标签进行统一修改,范围针对此页面。
该方式可以对单个页面的样式进行统一设置,但对于局部不够灵活。

举例:

  1. <style type="text/css">
  2. p {
  3. font-weight: bold;
  4. font-style: italic;
  5. color: red;
  6. }
  7. </style>
  8. <body>
  9. <p>前端修炼手册</p>
  10. <p style="color:blue">新人快速提升</p>
  11. </body>

3、CSS 和 HTML 结合方式三:引入外部样式表 css 文件

引入样式表文件的方式又分为两种:

  • (1)采用**<link>**标签。例如:<link rel = "stylesheet" type = "text/css" href = "a.css"></link>
  • (2)采用 import,必须写在<style>标签中,并且必须是第一句。例如:@import url(a.css) ;

两种引入样式方式的区别:外部样式表中不能写标签,但是可以写 import 语句。

具体操作如下:
我们先在 html 页面的同级目录下新建一个a.css文件,那说明这里面的代码全是 css 代码,此时就没有必要再写<style>标签这几个字了。
a.css的代码如下:

  1. p {
  2. border: 1px solid red;
  3. font-size: 40px;
  4. }

上方的 css 代码中,注意像素要带上 px 这个单位,不然不生效。
然后我们在 html 文件中通过<link>标签引入这个 css 文件就行了。效果如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <link rel="stylesheet" type="text/css" href="a.css"></link>
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <p>前端修炼手册</p>
  10. <p style="color:blue">新人快速提升</p>
  11. </body>
  12. </html>

这里再讲一个补充的知识:**<link>**标签的 rel 属性:。其属性值有以下两种:

  • stylesheet:定义的样式表
  • alternate stylesheet:候选的样式表

看字面意思可能比较难理解,我们来举个例子,一下子就明白了。
举例:

现在我们来定义 3 个样式表:

a.css:定义一个实线的黑色边框

  1. div {
  2. width: 200px;
  3. height: 200px;
  4. border: 3px solid black;
  5. }

b.css:蓝色的虚线边框

  1. div {
  2. width: 200px;
  3. height: 200px;
  4. border: 3px dotted blue;
  5. }

c.css:来个背景图片

  1. div {
  2. width: 200px;
  3. height: 200px;
  4. border: 3px solid red;
  5. background-image: url('1.jpg');
  6. }

然后我们在 html 文件中引用三个样式表:

  1. <link rel = "stylesheet" type = "text/css" href = "a.css"></link>
  2. <link rel = "alternate stylesheet" type = "text/css" href = "b.css" title="第二种样式"></link>
  3. <link rel = "alternate stylesheet" type = "text/css" href = "c.css" title="第三种样式"></link>

上面引入的三个样式表中,后面两个样式表作为备选。注意备选的样式表中,title 属性不要忘记写,不然显示不出来效果的。现在来看一下效果:(在 IE 中打开网页)
(一)CSS 基础语法 - 图36

CSS 的四种基本选择器

CSS 选择器:就是指定 CSS 要作用的标签,那个标签的名称就是选择器。
CSS 的选择器分为两大类:基本选择器和扩展选择器。

基本选择器:

  • 标签选择器:针对一类标签
  • ID 选择器:针对某一个特定的标签使用
  • 类选择器:针对你想要的所有标签使用
  • 通用选择器(通配符):针对所有的标签都适用(不建议使用)

下面来分别讲一讲。

1、标签选择器:选择器的名字代表 html 页面上的标签

标签选择器,选择的是页面上所有这种类型的标签,所以经常描述“共性”,无法描述某一个元素的“个性”。

举例:

  1. p{ font-size:12px; }

上方选择器的意思是说:所有的<p>标签里的内容都将显示 12 号字体。

效果:
image.png

【总结】需要注意的是:

  1. 所有的标签,都可以是选择器。比如 ul、li、label、dt、dl、input。
  2. 无论这个标签藏的多深,一定能够被选择上。
  3. 选择的所有,而不是一个。

2、ID 选择器:规定用#来定义

针对某一个特定的标签来使用,只能使用一次。css 中的 ID 选择器以”#”来定义。
举例:

  1. #mytitle{ border:3px dashed green; }

效果:
image.png

id 选择器的选择符是“#”。

任何的 HTML 标签都可以有 id 属性。表示这个标签的名字。这个标签的名字,可以任取,但是:

  • (1)只能有字母、数字、下划线。
  • (2)必须以字母开头。
  • (3)不能和标签同名。比如 id 不能叫做 body、img、a。

另外,特别强调的是:HTML 页面,不能出现相同的 id,哪怕他们不是一个类型。比如页面上有一个 id 为 pp 的 p,一个 id 为 pp 的 div,是非法的!

一个标签可以被多个 css 选择器选择:
比如,我们可以同时让标签选择器和 id 选择器作用于同一个标签。如下:

image.png

然后我们通过网页的审查元素看一下效果:

image.png

现在,假设选择器冲突了,比如 id 选择器说这个文字是红色的,标签选择器说这个文字是绿色的。那么听谁的?
实际上,css 有着非常严格的计算公式,能够处理冲突.

一个标签可以被多个 css 选择器选择,共同作用,这就是“层叠式”的第一层含义(第一层含义和第二层含义,放到 css 基础的第三篇文章里讲)。

3、类选择器:规定用圆点.来定义

针对你想要的所有标签使用。优点:灵活。
css 中用.来表示类。举例如下:

  1. .one{ width:800px; }

效果:
image.png

和 id 非常相似,任何的标签都可以携带 id 属性和 class 属性。class 属性的特点:

  • 特性 1:类选择器可以被多种标签使用。
  • 特性 2:同一个标签可以使用多个类选择器。用空格隔开。举例如下:(正确)
    1. <h3 class="teshu zhongyao">我是一个h3啊</h3>

初学者常见的错误,就是写成了两个 class。举例如下:(错误)

  1. <h3 class="teshu" class="zhongyao">我是一个h3啊</h3>

类选择器使用的举例:
类选择器的使用,能够决定一个人的 css 水平。
比如,我们现在要做下面这样一个页面:

image.png

正确的思路,就是用所谓“公共类”的思路,就是我们类就是提供“公共服务”,比如有绿、大、线,一旦携带这个类名,就有相应的样式变化。对应 css 里的代码如下:

  1. <style type="text/css">
  2. .lv {
  3. color: green;
  4. }
  5. .da {
  6. font-size: 30px;
  7. }
  8. .underline {
  9. text-decoration: underline;
  10. }
  11. </style>

然后让每个标签去选取自己想要用的类选择器:

  1. <p class="lv da">段落1</p>
  2. <p class="lv xian">段落2</p>
  3. <p class="da xian">段落3</p>

也就是说:
(1)不要去试图用一个类名,把某个标签的所有样式写完。这个标签要多携带几个类,共同完成这个标签的样式。
(2)每一个类要尽可能小,有“公共”的概念,能够让更多的标签使用。

问题:到底用 id 还是用 class?
答案:尽可能的用 class,除非极特殊的情况可以用 id。

原因:id 是 js 用的。也就是说,js 要通过 id 属性得到标签,所以 css 层面尽量不用 id,要不然 js 就很别扭。另一层面,我们会认为一个有 id 的元素,有动态效果。
举例如下:
image.png

上图所示,css 和 js 都在用同一个 id,会出现不好沟通的情况。
我们记住这句话:类上样式,id 上行为。意思是说,class属性交给 css 使用,id属性交给 js 使用。

上面这三种选择器的区别:

  • 标签选择器针对的是页面上的一类标签。
  • ID 选择器是只针对特定的标签(一个),ID 是此标签在此页面上的唯一标识。
  • 类选择器可以被多种标签使用。

4、通配符*:匹配任何标签

通用选择器,将匹配任何标签。不建议使用,IE 有些版本不支持,大网站增加客户端负担。
效率不高,如果页面上的标签越多,效率越低,所以页面上不能出现这个选择器。

举例:

  1. * {
  2. margin-left: 0px;
  3. margin-top: 0px;
  4. }

效果:
image.png

CSS 的几种高级选择器

高级选择器:

  • 后代选择器:用空格隔开
  • 交集选择器:选择器之间紧密相连
  • 并集选择器(分组选择器):用逗号隔开
  • 伪类选择器

下面详细讲一下这几种高级(扩展)选择器。

1、后代选择器: 定义的时候用空格隔开

对于E F这种格式,表示所有属于 E 元素后代的 F 元素,有这个样式。空格就表示后代。
后代选择器,就是一种平衡:共性、特性的平衡。当要把某一个部分的所有的什么,进行样式改变,就要想到后代选择器。

后代选择器,描述的是祖先结构。
看定义可能有点难理解,我们来看例子吧。

举例 1:

  1. <style type="text/css">
  2. .div1 p {
  3. color: red;
  4. }
  5. </style>

空格就表示后代。.div1 p 表示.div1的后代所有的p
这里强调一下:这两个标签不一定是连续紧挨着的,只要保持一个后代的关联即可。也就是说,选择的是后代,不一定是儿子。
举例:

  1. <style type="text/css">
  2. h3 b i {
  3. color: red;
  4. }
  5. </style>

上方代码的意思是说:定义了<h3>标签中的<b>标签中的<i>标签的样式。
同理:h3 和 b 和 i 标签不一定是连续紧挨着的,只要保持一个后代的关联即可。

效果:
image.png

或者还有下面这种写法:
image.png

上面的这种写法,<h3>标签和<i>标签并不是紧挨着的,但他们保持着一种后代关系。
还有下面这种写法:(含类选择器、id 选择器都是可以的)

image.png

我们在开头说了:后代选择器,描述的是一种祖先结构。我们举个例子来说明这句话:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Document</title>
  6. <style type="text/css">
  7. div div p {
  8. color: red;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <div>
  14. <div class="div2">
  15. <div class="div3">
  16. <div class="div4">
  17. <p>我是什么颜色?</p>
  18. </div>
  19. </div>
  20. </div>
  21. </div>
  22. </body>
  23. </html>

上面 css 中的div div p,也能使文字的颜色变红。通过浏览器的审查元素,我们可以看到 p 元素的祖先列表:
image.png

讲到这里,我们再提一个 VS Code 的快捷键:
在 VS Code 中输入p#haha,按 tab 键后,会生成<p id="haha"></p>
在 VS Code 中输入p.haha,按 tab 键后,会生成<p class="haha"></p>

2、交集选择器:定义的时候紧密相连

定义交集选择器的时候,两个选择器之间紧密相连。一般是以标签名开头,比如div.haha,再比如p.special
如果后一个选择器是类选择器,则写为div.special;如果后一个选择器 id 选择器,则写为div#special

来看下面这张图就明白了:

image.png

  1. h3.special {
  2. color: red;
  3. }

选择的元素要求同时满足两个条件:必须是 h3 标签,然后必须是 special 标签。

举例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>交集选择器测试</title>
  6. <style type="text/css">
  7. h3.special {
  8. color: red;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <h3 class="special zhongyao">标题1</h3>
  14. <h3 class="special">我也是标题</h3>
  15. <p>我是段落</p>
  16. </body>
  17. </html>

效果如下:
image.png

注意,交集选择器没有空格。所以,没有空格的div.red(交集选择器)和有空格的div .red(后代选择器)不是一个意思。
交集选择器可以连续交:(一般不要这么写)

  1. h3.special.zhongyao {
  2. color: red;
  3. }

上面这种写法,是 IE7 开始兼容的,IE6 不兼容。

3、并集选择器:定义的时候用逗号隔开

三种基本选择器都可以放进来。
举例:

  1. p,h1,.title1,#one {
  2. color: red;
  3. }

效果:
image.png

CSS选择器:伪类

伪类:同一个标签,根据其不同的种状态,有不同的样式。这就叫做“伪类”。伪类用冒号来表示。
比如div是属于box类,这一点很明确,就是属于box类。但是a属于什么类?不明确。因为需要看用户点击前是什么状态,点击后是什么状态。所以,就叫做“伪类”。

静态伪类选择器、动态伪类选择器

伪类选择器分为两种。
(1)静态伪类:只能用于超链接的样式。如下:

  • :link 超链接点击之前
  • :visited 链接被访问过之后

PS:以上两种样式,只能用于超链接。
(2)动态伪类:针对所有标签都适用的样式。如下:

  • :hover “悬停”:鼠标放到标签上的时候
  • :active “激活”: 鼠标点击标签,但是不松手时。
  • :focus 是某个标签获得焦点时的样式(比如某个输入框获得焦点)

超链接的四种状态

a标签有4种伪类(即对应四种状态),要求背诵。如下:

  • :link “链接”:超链接点击之前
  • :visited “访问过的”:链接被访问过之后
  • :hover “悬停”:鼠标放到标签上的时候
  • :active “激活”: 鼠标点击标签,但是不松手时。

对应的代码如下:

  1. <style type="text/css">
  2. /*让超链接点击之前是红色*/
  3. a:link{
  4. color:red;
  5. }
  6. /*让超链接点击之后是绿色*/
  7. a:visited{
  8. color:orange;
  9. }
  10. /*鼠标悬停,放到标签上的时候*/
  11. a:hover{
  12. color:green;
  13. }
  14. /*鼠标点击链接,但是不松手的时候*/
  15. a:active{
  16. color:black;
  17. }
  18. </style>

记住,在css中,这四种状态必须按照固定的顺序写

a:link 、a:visited 、a:hover 、a:active

如果不按照顺序,那么将失效。“爱恨准则”:love hate。必须先爱,后恨。
看一下这四种状态的动图效果:
(一)CSS 基础语法 - 图52

超链接的美化

问:既然a{}定义了超链的属性,和a:link{}定义了超链点击之前的属性,那这两个有啥区别呢?

答:
**a{}****a:link{}**的区别:

  • a{}定义的样式针对所有的超链接(包括锚点)
  • a:link{}定义的样式针对所有写了href属性的超链接(不包括锚点)

超链接a标签在使用的时候,比较难。因为不仅仅要控制a这个盒子,也要控制它的伪类。
我们一定要将a标签写在前面,将:link、:visited、:hover、:active这些伪类写在后面。
针对超链接,我们来举个例子:

(一)CSS 基础语法 - 图53

为了实现上面这个效果,完整版代码如下:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  5. <title>Document</title>
  6. <style type="text/css">
  7. *{
  8. margin: 0;
  9. padding: 0;
  10. }
  11. .nav{
  12. width: 960px;
  13. height: 50px;
  14. border: 1px solid red;
  15. margin: 100px auto;
  16. }
  17. .nav ul{
  18. /*去掉小圆点*/
  19. list-style: none;
  20. }
  21. .nav ul li{
  22. float: left;
  23. width: 120px;
  24. height: 50px;
  25. /*让内容水平居中*/
  26. text-align: center;
  27. /*让行高等于nav的高度,就可以保证内容垂直居中*/
  28. line-height: 50px;
  29. }
  30. .nav ul li a{
  31. display: block;
  32. width: 120px;
  33. height: 50px;
  34. }
  35. /*两个伪类的属性,可以用逗号隔开*/
  36. .nav ul li a:link , .nav ul li a:visited{
  37. text-decoration: none;
  38. background-color: purple;
  39. color:white;
  40. }
  41. .nav ul li a:hover{
  42. background-color: orange;
  43. }
  44. </style>
  45. </head>
  46. <body>
  47. <div class="nav">
  48. <ul>
  49. <li><a href="#">网站栏目</a></li>
  50. <li><a href="#">网站栏目</a></li>
  51. <li><a href="#">网站栏目</a></li>
  52. <li><a href="#">网站栏目</a></li>
  53. <li><a href="#">网站栏目</a></li>
  54. <li><a href="#">网站栏目</a></li>
  55. <li><a href="#">网站栏目</a></li>
  56. <li><a href="#">网站栏目</a></li>
  57. </ul>
  58. </div>
  59. </body>
  60. </html>

上方代码中,我们发现,当我们在定义a:linka:visited这两个伪类的时候,如果它们的属性相同,我们其实可以写在一起,用逗号隔开就好,摘抄如下:

  1. .nav ul li a{
  2. display: block;
  3. width: 120px;
  4. height: 50px;
  5. }
  6. /*两个伪类的属性,可以用逗号隔开*/
  7. .nav ul li a:link , .nav ul li a:visited{
  8. text-decoration: none;
  9. background-color: purple;
  10. color:white;
  11. }
  12. .nav ul li a:hover{
  13. background-color: orange;
  14. }

如上方代码所示,最标准的写法,就是把link、visited、hover这三个伪类都要写。但是前端开发工程师在大量的实践中,发现不写link、visited也挺兼容。写法是:

a:link、a:visited都是可以省略的,简写在a标签里面。也就是说,a标签涵盖了link、visited的状态(前提是都具有了相同的属性)。写法如下:

  1. .nav ul li a{
  2. display: block;
  3. width: 120px;
  4. height: 50px;
  5. text-decoration: none;
  6. background-color: purple;
  7. color:white;
  8. }
  9. .nav ul li a:hover{
  10. background-color: orange;
  11. }

当然了,在写a:linka:visited这两个伪类的时候,要么同时写,要么同时不写。如果只写a属性和a:link属性,不规范。

动态伪类举例

我们在第一段中描述过,下面这三种动态伪类,针对所有标签都适用。

  • :hover “悬停”:鼠标放到标签上的时候
  • :active “激活”: 鼠标点击标签,但是不松手时。
  • :focus 是某个标签获得焦点时的样式(比如某个输入框获得焦点)

我们不妨来举下例子。

举例1:

  1. <style type="text/css">
  2. /*
  3. 伪类选择器:动态伪类
  4. */
  5. /*
  6. 让文本框获取焦点时:
  7. 边框:#FF6F3D这种橙色
  8. 文字:绿色
  9. 背景色:#6a6a6a这种灰色
  10. */
  11. input:focus{
  12. border:3px solid #FF6F3D;
  13. color:white;
  14. background-color:#6a6a6a;
  15. }
  16. /*
  17. 鼠标放在标签上时显示蓝色
  18. */
  19. label:hover{
  20. color:blue;
  21. }
  22. /*
  23. 点击标签鼠标没有松开时显示红色
  24. */
  25. label:active{
  26. color:red;
  27. }
  28. </style>

效果:
(一)CSS 基础语法 - 图54

利用这个hover属性,我们同样对表格做一个样式的设置:
表格举例:

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style type="text/css">
  7. /*整个表格的样式*/
  8. table{
  9. width: 300px;
  10. height: 200px;
  11. border: 1px solid blue;
  12. /*border-collapse属性:对表格的线进行折叠*/
  13. border-collapse: collapse;
  14. }
  15. /*鼠标悬停时,让当前行显示#868686这种灰色*/
  16. table tr:hover{
  17. background: #868686;
  18. }
  19. /*每个单元格的样式*/
  20. table td{
  21. border:1px solid red;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <table>
  27. <tr>
  28. <td></td>
  29. <td></td>
  30. <td></td>
  31. <td></td>
  32. </tr>
  33. <tr>
  34. <td></td>
  35. <td></td>
  36. <td></td>
  37. <td></td>
  38. </tr>
  39. <tr>
  40. <td></td>
  41. <td></td>
  42. <td></td>
  43. <td></td>
  44. </tr>
  45. </table>
  46. </body>
  47. </html>

效果:

(一)CSS 基础语法 - 图55

CSS样式表的继承性和层叠性

  • CSS的继承性
  • CSS的层叠性
    • 计算权重
    • 权重问题大总结
    • CSS样式表的冲突的总结
  • 权重问题深入
    • 同一个标签,携带了多个类名
    • !important标记

CSS的继承性

我们来看下面这样的代码,来引入继承性:
image.png

上方代码中,我们给div标签增加红色属性,却发现,div里的每一个子标签<p>也增加了红色属性。于是我们得到这样的结论:

有一些属性,当给自己设置的时候,自己的后代都继承上了,这个就是继承性。

继承性是从自己开始,直到最小的元素。
但是呢,如果再给上方的代码加一条属性:

image.png
上图中,我们给div加了一个border,但是发现只有div具备了border属性,而p标签却没有border属性。于是我们可以得出结论:

  • 关于文字样式的属性,都具有继承性。这些属性包括:color、 text-开头的、line-开头的、font-开头的。
  • 关于盒子、定位、布局的属性,都不能继承。

以后当我们谈到css有哪些特性的时候,我们要首先想到继承性。而且,要知道哪些属性具有继承性、哪些属性没有继承性。

CSS的层叠性

层叠性:计算权重

层叠性:就是css处理冲突的能力。 所有的权重计算,没有任何兼容问题!

CSS像艺术家一样优雅,像工程师一样严谨。
我们来看一个例子,就知道什么叫层叠性了。

image.png

上图中,三种选择器同时给P标签增加颜色的属性,但是,文字最终显示的是蓝色,这个时候,就出现了层叠性的情况。
当多个选择器,选择上了某个元素的时候,要按照如下顺序统计权重:

  • id 选择器
  • 类选择器、属性选择器、伪类选择器
  • 标签选择器、伪元素选择器

因为对于相同方式的样式表,其选择器排序的优先级为:ID选择器 > 类选择器 > 标签选择。
以下是整理的一份详细的选择器权重及优先级:

选择器 格式 优先级权重
id选择器 #id 100
类选择器 .classname 10
属性选择器 a[ref=“eee”] 10
伪类选择器 li:last-child 10
标签选择器 div 1
伪元素选择器 li:after 1
相邻兄弟选择器 h1+p 0
子选择器 ul>li 0
后代选择器 li a 0
通配符选择器 * 0

对于选择器的优先级:

  • 标签选择器、伪元素选择器:1;
  • 类选择器、伪类选择器、属性选择器:10;
  • id 选择器:100;
  • 内联样式:1000;

层叠性举例

举例1:计算权重

image.png

如上图所示,统计各个选择器的数量,优先级高的胜出。文字的颜色为红色
PS:不进位,实际上能进位(奇淫知识点:255个标签,等于1个类名)但是没有实战意义!

举例2:权重相同时

image.png

上图可以看到,第一个样式和第二个样式的权重相同。但第二个样式的书写顺序靠后,因此以第二个样式为准(就近原则)。

举例3:具有实战性的例子

image.png
现在我要让一个列表实现上面的这种样式:第一个li为红色,剩下的li全部为蓝色。
如果写成下面这种代码是无法实现的:

image.png

无法实现的原因很简单,计算一下三个选择器的权重就清楚了,显然第二个样式被第一个样式表覆盖了。

正确的做法是:(非常重要
image.png

上图中,第二个样式比第一个样式的权重要大。因此在实战中可以实现这种效果:所有人当中,让某一个人为红,让其他所有人为蓝。
这种方式好用是好用,但用好很难。

就拿上方代码来举例,为了达到这种效果,即为了防止权重不够,比较稳妥的做法是:把第二个样式表照着第一个样式表来写,在此基础上,给第二个样式表再加一个权重。
上面这个例子很具有实战性。

举例4:继承性造成的影响

这里需要声明一点:

如果不能直接选中某个元素,通过继承性影响的话,那么权重是0。

为了验证上面这句话,我们来看看下面这样的例子:
image.png

另外:如果大家的权重相同,那么就采用就近原则:谁描述的近,听谁的。举例如下:(box3 描述得最近,所以采用 box3 的属性)
image.png

上方代码的文字版如下:

  1. <!DOCTYPE html>
  2. <html lang="">
  3. <head>
  4. <meta />
  5. <meta />
  6. <meta />
  7. <title>Document</title>
  8. <style>
  9. #box1 {
  10. color: red;
  11. }
  12. #box2 {
  13. color: green;
  14. }
  15. #box3 {
  16. color: blue;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="box1">
  22. <div id="box2">
  23. <div id="box3"><p>猜猜我是什么颜色</p></div>
  24. </div>
  25. </div>
  26. </body>
  27. </html>

层叠性:权重计算ç大总结(非常重要)

层叠性。层叠性是一种能力,就是处理冲突的能力。当不同选择器,对一个标签的同一个样式,有不同的值,听谁的?这就是冲突。css有着严格的处理冲突的机制。
通过列举上面几个例子,我们对权重问题做一个总结。

image.png

上面这个图非常重要,我们针对这个图做一个文字描述:

  • 选择上了,数权重,(id的数量,类的数量,标签的数量)。如果权重一样,谁写在后面听谁的。
  • 没有选择上,通过继承影响的,就近原则,谁描述的近听谁的。如果描述的一样近,比如选择器权重,如果权重再一样重,谁写在后面听谁的。

CSS样式表的冲突的总结

  • 1、对于相同的选择器(比如同样都是类选择器),其样式表排序:行级样式 > 内嵌样式表 > 外部样式表(就近原则)
  • 2、对于相同类型的样式表(比如同样都是内部样式表),其选择器排序:ID选择器 > 类选择器 > 标签选择器
  • 3、外部样式表的ID选择器 > 内嵌样式表的标签选择器

总结:就近原则。ID选择器优先级最大。

举例:如果都是内嵌样式表,优先级的顺序如下:(ID 选择器 > 类选择器 > 标签选择器)

image.png

另外还有两个冲突的情况:

  • 1、对同一个标签,如果用到的都是内嵌样式表,且权重一致,那它的优先级:定义的CSS样式表中,谁最近,就用谁。
  • 2、对于同一个标签,如果用到的都是外部样式表,且权重一致,那它的优先级:html文件中,引用样式表的位置越近,就用谁。

例如:
image.png

题目演示

CSS的层叠性讲完了,我们来做几个题目吧。

题目1

image.png

题目2

image.png

题目3

image.png

题目4

image.png

权重问题深入

同一个标签,携带了多个类名,有冲突:

这里需要补充两种冲突的情况:

  • 1、对同一个标签,如果用到了了多个相同的内嵌样式表,它的优先级:定义的样式表中,谁最近,就用谁。
  • 2、对于同一个标签,如果引用了多个相同的外部样式表,它的优先级:html文件中,引用样式表的位置越近,就用谁。

例如:(就近原则)
image.png

上图中,文字显示的颜色均为红色。因为这和在标签中的挂类名的书序无关,只和css的顺序有关。

!important标记:优先级最高

来看个很简单的例子:
image.png

上图中,显然id选择器的权重最大,所以文字的颜色是红色。
如果我们想让文字的颜色显示为绿色,只需要给标签选择器的加一个!important标记,此时其权重为无穷大。如下:

image.png

important是英语里面的“重要的”的意思。我们可以通过如下语法:

  1. k:v !important;

来给一个属性提高权重。这个属性的权重就是无穷大
注意,一定要注意语法的正确性。

正确的语法:

  1. font-size:60px !important;

错误的语法:

  1. font-size:60px; !important; 不能把!important写在外面
  2. font-size:60px important; 不能忘记感叹号

!important标记需要强调如下3点:

(1)!important提升的是一个属性,而不是一个选择器

  1. p{
  2. color:red !important; 只写了这一个!important,所以只有字体颜色属性提升了权重
  3. font-size: 100px ; 这条属性没有写!important,所以没有提升权重
  4. }
  5. #para1{
  6. color:blue;
  7. font-size: 50px;
  8. }
  9. .spec{
  10. color:green;
  11. font-size: 20px;
  12. }

所以,综合来看,字体颜色是red(听important的);字号是50px(听id的)。

(2)!important无法提升继承的权重,该是0还是0

比如HTML结构:

  1. <div>
  2. <p>哈哈哈哈哈哈哈哈</p>
  3. </div>

有CSS样式:

  1. div{
  2. color:red !important;
  3. }
  4. p{
  5. color:blue;
  6. }

由于div是通过继承性来影响文字颜色的,所以!important无法提升它的权重,权重依然是0。
干不过p标签,因为p标签是实实在在选中了,所以字是蓝色的(以p为准)。

(3)!important不影响就近原则
如果大家都是继承来的,按理说应该按照“就近原则”,那么important能否影响就近原则呢?
答案是:不影响。远的,永远是远的。不能给远的写一个important,干掉近的。

为了验证这个问题,我们可以搞两层具有继承性的标签,然后给外层标签加一个!important,最终看看就近原则有没有被打破。举例如下:
image.png

PS:做网站的时候,!important 尽量不要用。否则会让css写的很乱。

知识回顾

CSS属性

加粗,倾斜,下划线:

  1. font-weight:bold;
  2. font-style:italic;
  3. text-decoration:underline;

背景颜色、前景色:

  1. background-color:red;
  2. color:red;

class和id的区别

class用于css的,id用于js的。
1)class页面上可以重复。id页面上唯一,不能重复。
2)一个标签可以有多个class,用空格隔开。但是id只能有id。

各种选择器(浏览器兼容性)

IE6层面兼容的选择器: 标签选择器、id选择器、类选择器、后代、交集选择器、并集选择器、通配符。如下:

  1. p
  2. #box
  3. .spec
  4. div p
  5. div.spec
  6. div,p
  7. *

IE7能够兼容的:儿子选择器、下一个兄弟选择器。如下:

  1. div>p
  2. h3+p

IE8能够兼容的:

  1. ul li:first-child
  2. ul li:last-child

css两个性质

  • 继承性:好的事儿。继承从上到下,哪些能?哪些不能?
  • 层叠性:冲突,多个选择器描述了同一个属性,听谁的?

再看几个题目:
image.png

image.png

image.png

image.png