CSS基础总结
前言
css
,cascading style sheets,叠层样式表,用于设置和布置网页 - 例如,更改内容的字体,颜色,大小和间距,将其拆分为多个列,或添加动画和其他装饰功能。—— MDN
基本语法
h1{
background-color: blue;
position: fixed;
}
/*或者
<h1 style="background-color: blue; position: fixed;">...</h1>
*/
注释使用/* */
/*单行注释*/
/*
多行注释
*/
!注意:css代码一定要按照语法规则来写,不然一个错误会导致整段代码废掉,只要{}
内存在错误,则{}
内的CSS代码都是无效的。一定要写;
,别写成,
。
—— 参考CSS语法规则
css样式属性非常多,不必所有都学,掌握常用的,剩下在项目中慢慢熟练;
就像字典里的字一样,并不是所有字都要吃透,一样的道理(偷懒的理由);
一、CSS代码位置
1. 行内
第一种是inline styling,也就是直接在标签里,设置该标签的css
样式。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网页的title</title>
</head>
<body style="background-color: aqua;">
<p style="color:red">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolore neque reiciendis deserunt quas modi repellat explicabo optio nihil facere, labore facilis veritatis totam perferendis tenetur incidunt consequatur similique rem! Nihil.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi ea, unde quaerat iste error officiis velit vel repellendus, repudiandae ullam molestiae, veniam beatae incidunt esse! Odit itaque expedita laudantium sit?
</p>
</body>
</html>
可以看到设置css
属性的标签,样式发生了变化。
行内样式的方法,只对当前标签起作用,只修改该标签的样式;
2. 内联
第二种internal Styling,内部样式,在HTML
文件内部的head
元素中使用style
标签,用css
语法,对文件下的指定标签全局引用样式;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网页的title</title>
<style>
p{
color:red;
background-color: rgb(119, 207, 36)
}
body{
background-color: aqua;
}
</style>
</head>
<body>
<p >
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolore neque reiciendis deserunt quas modi repellat explicabo optio nihil facere, labore facilis veritatis totam perferendis tenetur incidunt consequatur similique rem! Nihil.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi ea, unde quaerat iste error officiis velit vel repellendus, repudiandae ullam molestiae, veniam beatae incidunt esse! Odit itaque expedita laudantium sit?
</p>
</body>
</html>
3. 外联
第三种external Styling,外部文件引用。
创建.css
文件,在文件内写css
样式,在HTML
文件内部的head
元素中使用link
标签导入外部文件,对特定标签全局引用样式;
/*index.css文件*/
p{
color:red;
background-color: rgb(119, 207, 36)
}
body{
background-color: aqua;
}
h1{
color: blueviolet;
}
<!-index.html文件-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网页的title</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<h1>
title
</h1>
<p >
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolore neque reiciendis deserunt quas modi repellat explicabo optio nihil facere, labore facilis veritatis totam perferendis tenetur incidunt consequatur similique rem! Nihil.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi ea, unde quaerat iste error officiis velit vel repellendus, repudiandae ullam molestiae, veniam beatae incidunt esse! Odit itaque expedita laudantium sit?
</p>
<p>
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Neque itaque minima aut cupiditate consequatur ullam similique perferendis sit, ex laboriosam amet illo voluptate debitis illum velit. Sapiente necessitatibus numquam eaque.
</p>
</body>
</html>
三种使用CSS样式的优先级,理论上就近原则:行内>内联>外联导入;
而一般情况下,都推荐使用第三种用法external Styling,在外部文件引用,增加项目的可维护性,且能在多个页面使用;
而第一种情况,则会在对特殊样式要求上,起到很好的作用;
二、CSS selectors 选择器
1. 全局选择器(universal selector)
使用*
可以对全局,所有标签下的内容做一个样式设定;
* {
color : #0000ff;
}
2. 元素、class、id选择器
在HTML中,所有的标签,都可以设置它们的class
和id
属性。
class
属性值可能会有重复的,并且一个标签可以设置多个class
,使用空格隔开;
<p class="blueText blueBgColor">...</p> <!-这个标签有两个class值,blueText 和 blueBgColor-->
而id
属性必须是唯一的、单一的。
<p class="blue_text" id="p1">...</p>
<p class="blue_text" id="p2">...</p>
CSS样式,则可以通过选择对应的标签名、class
属性值或者id
属性值来设定;
语法:
- element selector ,直接使用标签名来选择标签
p {
color : rgb(255,255,0);
}
- class selector, 使用
.class属性值
来选择对应属性值下的样式设定;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网页的title</title>
<style>
.red_text{
color:red;
}
.blue_bgColor{
background-color : aqua;
}
</style>
</head>
<body>
<p class="red_text">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolore neque reiciendis deserunt quas modi repellat explicabo optio nihil facere, labore facilis veritatis totam perferendis tenetur incidunt consequatur similique rem! Nihil.
</p>
<p class="red_text blue_bgColor">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi ea, unde quaerat iste error officiis velit vel repellendus, repudiandae ullam molestiae, veniam beatae incidunt esse! Odit itaque expedita laudantium sit?
</p>
</body>
</html>
- id selector ,使用
#id值
来选择对应id值的内容做样式设定;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网页的title</title>
<style>
.red_text{
color:red;
}
#p1{
background-color : aqua;
}
#p2{
color : black;
background-color : blue;
}
</style>
</head>
<body>
<p class="red_text" id="p1">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolore neque reiciendis deserunt quas modi repellat explicabo optio nihil facere, labore facilis veritatis totam perferendis tenetur incidunt consequatur similique rem! Nihil.
</p>
<p class="red_text" id="p2">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi ea, unde quaerat iste error officiis velit vel repellendus, repudiandae ullam molestiae, veniam beatae incidunt esse! Odit itaque expedita laudantium sit?
</p>
</body>
</html>
- 优先级高的选择器会覆盖掉与优先级低重复的样式属性;
- 三种选择器的优先级是:id>class>标签名,因为id是唯一单一的,所以是最特殊的,优先级也最高。
- 并且三种选择器可以结合一起使用
p.red_text#p1{ /*选择标签为 p,class为 red_text,id为 p1的元素*/
background-color : aqua;
color:red;
}
/*还有
p.red_text{}
p#p1{}
.red_text#p1{}
*/
3. 多选(grouping selector)
可以选择多个目标来做统一样式,中间使用,
隔开;
代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网页的title</title>
<style>
h1,h2,
h3,
p#p2{
background-color: aqua;
color: red;
}
</style>
</head>
<body>
<h1>title 1 </h1>
<h2>title 2 </h2>
<h3>title 3 </h3>
<p class="red_text" id="p1">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Dolore neque reiciendis deserunt quas modi repellat explicabo optio nihil facere, labore facilis veritatis totam perferendis tenetur incidunt consequatur similique rem! Nihil.
</p>
<p class="red_text" id="p2">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi ea, unde quaerat iste error officiis velit vel repellendus, repudiandae ullam molestiae, veniam beatae incidunt esse! Odit itaque expedita laudantium sit?
</p>
</body>
</html>
4.后代(descendant selector)
- 后代选择器,父子元素之间,使用空格隔开
- 例如,
div.link1 a{}
就是:
<div class="link1">
<a>...</a> <!-- 选择该元素 -->
</div>
div.link2 a.blueT{}
就是:
<div class="link2">
<a class="blueT">...</a> <!-- 选择该元素 -->
</div>
div.link2 .blueT{}
就是
<div class="link2">
<tag class="blueT">...</tag> <!-- tag可以是任何标签,并选择该元素 -->
</div>
- 可以通过鼠标放到选择器上,能看到选择器的选择目标
代码示例:
<!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.link1 a{
color: red;
}
div.link2 a.blueT{
color: blue;
}
</style>
</head>
<body>
<div class="link1">
<a href="https://developer.mozilla.org/zh-CN/">MDN官网</a>
<a href="https://www.w3.org/">W3C官网</a>
</div>
<div class="link2">
<a class="blueT" href="https://www.runoob.com/w3c/w3c-tutorial.html">菜鸟教程</a>
</div>
</body>
</html>
5.属性选择器( attribute selector)
- 语法
标签名[属性名="属性值"]{}
- 例如
input[type="text"]{}
就是选择input标签,并且type="text"的元素
代码示例:
<!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>
input[type="text"]{
color:red;
margin: 1px;
}
input[type="number"]{
color:green;
margin: 1px;
}
input[type="email"]{
color:blue;
margin: 1px;
}
</style>
</head>
<body>
<label for="name">name</label>
<input id="name" type="text" name="name"/>
<br>
<label for="age">age</label>
<input id="age" type="text" name="age"/>
<br>
<label for="phone">phone</label>
<input id="phone" type="number" name="phone"/>
<br>
<label for="email">email</label>
<input id="email" type="email" name="email"/>
<br>
</body>
</html>
6.伪类( pseudo classes)
- 指定要选择的元素的特殊状态
- 标签状态改变要做哪些事情
- 语法
选择元素:行为状态{}
textarea.textA:hover{}
,选择textarea
标签,class为textA
的元素, 使用:hover
:hover
是移入鼠标事件,只有鼠标移入之后, 对应的css
代码才会生效- 常用的pseudo classes
:hover
,移入鼠标:focus
, 焦点聚焦该元素时:active
,按住鼠标时
- 更多伪类,参考MDN官网
示例代码:
<!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>
textarea{
background: red;
}
textarea.textA:hover{
background-color: burlywood;
}
textarea.textB:focus{
background-color: aqua;
}
textarea.textC:active{
background-color: darkolivegreen;
}
</style>
</head>
<body>
<textarea name="text1" class="textA" id="text1" cols="30" rows="10"></textarea>
<textarea name="text2" class="textA" id="text2" cols="30" rows="10"></textarea>
<textarea name="text3" class="textA" id="text3" cols="30" rows="10"></textarea>
<br>
<textarea name="text4" class="textB" id="text4" cols="30" rows="10"></textarea>
<textarea name="text5" class="textB" id="text5" cols="30" rows="10"></textarea>
<textarea name="text6" class="textB" id="text6" cols="30" rows="10"></textarea>
<br>
<textarea name="text7" class="textC" id="text7" cols="30" rows="10"></textarea>
<textarea name="text8" class="textC" id="text8" cols="30" rows="10"></textarea>
<textarea name="text9" class="textC" id="text9" cols="30" rows="10"></textarea>
<br>
</body>
</html>
7.伪元素(pseudo element)
- 伪元素是一个附加至选择器末的关键词
- 允许对被选择元素的特定部分进行样式修改
- 常用的一些伪元素:
::after
元素内容尾部的设定::before
元素内容前部的设定::first-letter
元素内容的第一个字::selection
选择的元素内容(双击全选,按住鼠标左键滑动)
- 更多伪元素,参考MDN官网
示例代码:
<!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>
p::before{
content: ">>";
color: red;
}
p::after{
content: "<<<<";
color: blue;
}
h1::first-letter{
font-size: 3rem;
}
h2::selection,p.c1::selection{
background-color: aqua;
}
</style>
</head>
<body>
<h1 class="h1">heading1</h1>
<h2 class="h2">heading2</h2>
<p class="c1">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequuntur, in qui nulla perspiciatis, nesciunt quis voluptate inventore soluta explicabo quod cupiditate! Velit similique alias eveniet quibusdam harum asperiores rerum quia.
</p>
<p class="c2">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Velit, veritatis labore? Cupiditate, reprehenderit beatae. Labore beatae recusandae reiciendis tempora repudiandae molestiae eos. Cum mollitia ad obcaecati voluptatum dolorum laborum deleniti?
</p>
<p class="c3">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias deleniti cumque minus quos aperiam quia ab temporibus eaque ducimus accusantium, error libero harum repellendus laudantium accusamus sed facere iusto unde.
</p>
</body>
</html>
注意:与伪元素比较,伪类 能够根据状态改变元素样式。
三、CSS代码规则
1.叠层、阶层(cascade)
cascade
,就是cascading style sheets
里的cascading
,表示CSS
代码遵守从上到下的规则。
例如在js
代码的变量中:
let a ;
a = 0;
a = 1;
a = 2;
自然的,编译后,a
是等于2
的,这就是从上到下的代码规则,同一变量赋值,后面会覆盖前面的,在css
中也有这种规则。
- 当选择器一模一样时, 后面的样式表会覆盖前面的样式
- 越下面的代码, 越是后面被执行
p{
color: blue;
}
p{
color: red;
}
p{
color: green;
}
p.c1{
color: darkmagenta;
}
- 后面的
p
选择器会覆盖前面的p
,而p.c1
只会对class为c1
标签做样式, 不会覆盖所有的p
标签。
2.权值、特定度(Specificity)
- 将上面的选择器变换顺序, 发现
p
选择器, 并不会覆盖p.c1
的样式;
p.c1{
color: blue;
}
p{
color: red;
}
Specificity
---- 特定度(权值),css选择器
有不同的权值, 通过id
、class
、tag(标签)
来加权;
- id - 权值(1,0,0)
- class - 权值(0,1,0)
- tag - 权值(0,0,1)
- 数字越前面,权值越高,故而权值大小:
id > class > tag
; - 例如,
p.c1
的权值为(0,1,1)
,p.c1#i1
的权值为(1,1,1)
; 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>
p.c1#i1{
color: darkmagenta;
}
p.c1{
color: blue;
}
p.c2{
color: green;
}
p{
color: red;
}
</style>
</head>
<body>
<p class="c1" id="i1">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequuntur, in qui nulla perspiciatis, nesciunt quis voluptate inventore soluta explicabo quod cupiditate! Velit similique alias eveniet quibusdam harum asperiores rerum quia.
</p>
<p class="c1" >
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Velit, veritatis labore? Cupiditate, reprehenderit beatae. Labore beatae recusandae reiciendis tempora repudiandae molestiae eos. Cum mollitia ad obcaecati voluptatum dolorum laborum deleniti?
</p>
<p class="c2">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias deleniti cumque minus quos aperiam quia ab temporibus eaque ducimus accusantium, error libero harum repellendus laudantium accusamus sed facere iusto unde.
</p>
<p class="c3">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur, accusamus, iure minima est dicta recusandae, delectus at earum distinctio odit beatae voluptates consequuntur! Maxime architecto, nisi ipsa provident iste assumenda?
</p>
</body>
</html>
- !权值只在
外联
或内联
样式中,而行内
样式,优先级远远高于外联和内联。 - inline styling > id > class > element > inheritance
3.继承(Inheritance)
- 元素的
css
样式,来自于:- 自身的
css
样式 Inheritance
, 继承自父辈元素的
- 自身的
在浏览器按下F12
如图,可以看到,h1
的样式一部分是自身的,还有一部分是通过继承的;
四、CSS颜色
网页中色彩样式非常重要,它决定了网页的美观,CSS中使用颜色的方式,一般有以下几种;
- reserved color 保留关键字
现代浏览器都支持140种颜色名称,像常用的red
、blue
、green
、white
等等,参考CSS颜色保留关键字,可以在CSS中直接使用
p{
color : red;
}
- RGB、RGBA,三原色
这是电脑中,取得颜色最常用的一种方式。R
就是red
、G
就是green
、B
就是blue
,也就是常说的三原色,由它们取值大小组成所有CSS中任意颜色。
它们的值对应三种颜色的强度,取值范围为0~255
,也就是一字节,直接使用取得对应颜色rgb(0~255,0~255,0~255)
;
这种方式能取得共256*256*256
种颜色,相比关键字,rgb
能取得大自然相对更为完整的颜色组合;
p{
color : rgb(255,0,0);/*red为255,另外两种颜色值为0,就是红色*/
}
h1{
color : rgb(0,0,0);/*值都为0,什么都没有,一片漆黑,就是black*/
}
h2{
color : rgb(255,255,255);/*都为最大时,三种颜色交汇为白色*/
}
rgba
,在取得颜色的基础加上了alpha
,透明度,它的值介于0~1
之间,rgba(0~255,0~255,0~255,0~1)
,而0就是完全透明了;
- hex,十六进制 hexadecimal
使用十六进制的颜色编码,获取对应颜色,取值范围#000000~#ffffff
,共6个十六进制数。
其实它与rgb
是相互对应的,16*16===256
,前两个数就是对应的red
值,中间两个数对应green
的值,最后两个数对应blue
的值;
例如rgb(255,0,0)===#ff0000
、rgb(255,255,0)===#ffff00
、rgb(255,255,255)===#ffffff
—参考
p{
color : #0000ff; /*blue*/
}
h1{
color : #000000; /*black*/
}
- HSL 颜色
HSL就是Hue-saturation-lightness的缩写,色相-饱和度-亮度;
一般情况下,都会使用前三种方式取得所要得颜色,使用这种配颜色的方式不常见,具体可以参考CSS-hsl
五、文字样式
-
CSS
里有两种单位:absolute
绝对单位relative
相对单位
-
绝对单位
cm
,mm
,ln
,px(像素)
,pt
,pc
-
相对单位
em
,ex
,ch
,rem
,vw
,vh
,vmax
,%
-
网页预设的字体大小默认为
16px
,浏览器设备可以更改字体的预设大小 -
rem
相对网页预设大小的倍数,1rem=16px
(1倍的预设,不一定是16px),2rem=32px
-
所以相对大小
rem
会比px
好用,不同人群根据自己需要更改设备的预设字体时,网页字体也会相应改变 -
常用属性:
示例代码:
<!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>
p.px{
font-size : 32px ;
}
p.rem{
font-size : 2rem ;
}
p.textAlign{
text-align : center ;
}
p.textDecoration{
text-decoration: line-through;
}
p.fontFamily{
font-family: 'Courier New', Courier, monospace;
font-weight: 800;
text-indent: 2rem;
}
</style>
</head>
<body>
<p class="px">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum maxime commodi tempore impedit at! Cumque amet
vitae, error vero dolor, aliquid modi sit et labore, nihil eveniet incidunt vel itaque.
</p>
<p class="rem">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias, quae. Pariatur atque quidem illum non odio
earum, aperiam alias consequatur inventore laudantium possimus quos voluptatibus quia nesciunt veritatis ut?
Labore.
</p>
<p class="textAlign">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequuntur, in qui nulla perspiciatis, nesciunt quis
voluptate inventore soluta explicabo quod cupiditate! Velit similique alias eveniet quibusdam harum asperiores
rerum quia.
</p>
<p class="textDecoration">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Temporibus dicta animi placeat neque necessitatibus
iusto, harum est et dolorum aliquid. Quisquam laboriosam corporis nemo ut harum dignissimos aliquid, sapiente
at!
</p>
<p class="fontFamily">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Laboriosam voluptatum ex dolores quia totam perspiciatis inventore minus omnis dolor nostrum?
</p>
</body>
</html>
六、背景设置
-
background-color
背景颜色 -
background-image
背景图片 -
background-size: cover;
背景图片大小
-具体参考; -
background-position: center;
背景图片位置
-具体参考;
示例代码
<!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>
body {
background-image: url("https://joeschmoe.io/api/v1/random");
background-size: cover;
background-position: center;
}
p {
background-color: aqua;
}
</style>
</head>
<body>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum maxime commodi tempore impedit at! Cumque amet
vitae, error vero dolor, aliquid modi sit et labore, nihil eveniet incidunt vel itaque.
</p>
</body>
</html>
background
属性,是两者的结合体:
background: url("https://joeschmoe.io/api/v1/random");
/* */
background: aqua;
七、盒模型(Box Model)
- 在
html
中,所有的元素都是box
,并且都是有宽(width
)和高(height
)的盒子; - 一个盒子必须包含以下几个属性:
content
内容(就是元素的内容)padding
内间距border
外框margin
外间距
- 故而每个
html
元素,都至少包含以上六个属性;
----MDN;
1.盒模型的属性
一、内间距 padding
- 通过
padding-top
,padding-right
,padding-bottom
,padding-left
,分别设置盒的上下左右内间距; - 通过
padding
设置,该属性可以有多个值:padding: 1rem;
,设置上下左右都一样的;padding: 2rem 1rem;
,设置上下,左右;padding: 1rem 2rem 3rem 4rem;
,设置上右下左;
示例代码:
<!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>
button.b1 {
/* padding-top: 2rem; */
/* padding-left: 3rem; */
/* padding :1rem; */
/* padding :1rem 2rem; */
padding: 1rem 2rem 3rem 4rem;
}
</style>
</head>
<body>
<button class="b1">
内容
</button>
</body>
</html>
- 在浏览器中用开发者工具查看,打开element–>点击要查看的元素,所在的代码行 :
- 通过浏览器的盒模型,能直观看到
padding
各个方向上的值;
二、外间距margin
它的属性与padding
非常相似
- 可以设置
margin-top
,margin-right
,margin-bottom
,margin-left
的值 - 通过
margin
设置,该属性可以有多个值:margin: 1rem;
,设置上下左右都一样的;margin: 2rem 1rem;
,设置上下,左右;margin: 1rem 2rem 3rem 4rem;
,设置上右下左;
示例代码:
<!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>
button {
/* margin-top: 2rem; */
/* margin-left: 3rem; */
/* margin :1rem; */
/* margin :1rem 2rem; */
margin: 1rem 2rem 3rem 4rem;
}
</style>
</head>
<body>
<button class="col1 row1">
内容
</button>
<button class="col2 row1">
内容
</button>
<button class="col3 row1">
内容
</button>
<br>
<button class="col1 row2">
内容
</button>
<button class="col2 row2">
内容
</button>
<button class="col3 row2">
内容
</button>
<br>
<button class="col1 row3">
内容
</button>
<button class="col2 row3">
内容
</button>
<button class="col3 row3">
内容
</button>
<br>
</body>
</html>
三、外框border
- 外框有粗细、颜色、线条等等;
border: 5px solid black
,5px
就是线条粗细,solid
就是实线,black
是线条颜色;
----border属性;
示例代码:
<!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>
button.b1 {
padding: 10px;
border: 10px solid black;
}
</style>
</head>
<body>
<button class="b1">
内容
</button>
</body>
</html>
四、宽高(width 、height)
元素
宽高设定需要注意两个方面:
- 元素是
block元素
还是inline元素
:
* 宽度和高度只能在`block元素`中设定;
* 在`inline元素`的高度和宽度只与内容有关,不能设定;
- 宽高设定的对象 :
----可以使用box-sizing
属性;
* 默认是内容的宽和高;
* 通过box-sizing属性设定
示例代码:
<!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>
h1 {
background: #000;
color: beige;
width: 50vw;
height: 30vh;
}
a {
background: royalblue;
color: white;
text-decoration: none;
padding: 0.75rem 1rem;
width: 200px;/*不生效*/
height: 300px;/*不生效*/
}
a:hover {
background: darkslateblue;
}
</style>
</head>
<body>
<h1>这是标题,是block元素</h1>
<a href="https://developer.mozilla.org/zh-CN">这是一个超链接,也是一个inline元素</a>
</body>
</html>
五、其他补充
相对单位 Relative units
-
%
,设定的宽度和高度,就是相对于父元素
的宽度和高度; -
vw
,viewport width
相对设备视窗宽度, 取值范围0-100
,相对于百分比; -
vh
,viewport height
相对设备视窗高度, 取值范围0-100
; -
使用相对单位,能更好的适应不同设备视窗大小;
<!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>
.box1 {
background: #000;
width: 500px;
height: 500px;
}
.box2 {
background: aqua;
width: 50%;
height: 50%;
}
.box3 {
background: mediumaquamarine;
width: 50vw;
height: 30vh;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="box1">
<div class="box2"></div>
</div>
<div class="box3"></div>
</body>
</html>
2. 行内与块级元素
-
block
元素
默认宽度:100% -
inline
元素
不能设定width和height
在html
中,有块级block
和行内inline
两种类型元素,在css
中则可以通过display
来任意设定,元素是block
还是inline
;
- 例如
a标签
设定display: block;
之后,就可以设定元素的宽高;
示例代码:
<!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>
a {
background: royalblue;
color: white;
text-decoration: none;
padding: 0.75rem 1rem;
display: block;
width: 200px;
height: 300px;
}
a:hover {
background: darkslateblue;
}
</style>
</head>
<body>
<a href="https://developer.mozilla.org/zh-CN">这是一个超链接</a>
</body>
</html>
inline-block
既是inline
也是block
,将两者结合;
block
元素 ,默认宽度:100%,可改变inline
元素,默认宽度是内容长度,不可改变
-
所以
inline-block
,就是默认宽度是内容宽度,并且可改变 -
在
html
中,有5个inline-block
属性的标签:img
、input
、button
、select
、textarea
-
它们像
inline element
在排版上从左到右,又像block element
可以设定高度和宽度
3. 补充
margin
属性在对inline element
设定时,要注意,它不能设定上下margin
,只能设定左右的margin
;
示例代码:
<!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>
a {
background: royalblue;
color: white;
text-decoration: none;
padding: 0.75rem 1rem;
margin: 4rem;
/* display: inline-block; */
}
a:hover {
background: darkslateblue;
}
</style>
</head>
<body>
<h1>title</h1>
<a href="https://developer.mozilla.org/zh-CN">a标签</a>
</body>
</html>
- 可以看到,对
a标签
设定margin
时,上下的margin
并不生效,但是浏览器盒子中却是显示有上下的margin
,这是需要注意的地方;
----参考官方文档;
- 注意这段话,设置
inline element
垂直方向上的margin
,是没有作用的; - 所以,要想上下
margin
生效,要给inline
元素加上display: block;
或display: inline-block;
Display type | Example | width \ height | margin | padding \ border |
---|---|---|---|---|
inline | <a> , <span> … | 无法调整 | 只能调整左右 | 可调 |
block | <h1> ,<div> ,<section> … | 可以调整 | 上下左右皆可 | 可调 |
inline-block | <img> ,<input> … | 可以调整 | 上下左右皆可 | 可调 |
flex-level | 任何在flex 下的元素 | 可以调整 | 上下左右皆可 | 可调 |
八、CSS元素位置(position)
----MDN;
1. 静态位置 static
position:static
,CSS默认的position
,不需要特别去设定- 前面说的inline element在排版上从左到右,block 则是从上到下,这就是static静态的排版
- No Stacking context (非叠层上下文)
初始示例代码:
<!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.container {
width: 500px;
height: 1000px;
background: #000000;
}
.box {
width: 200px;
height: 200px;
}
.box1 {
background: #ff0000;
}
.box2 {
background: #00ff00;
}
.box3 {
background: #0000ff;
}
</style>
</head>
<body>
<div class="container">
<div class="box box1"></div>
<div class="box box2"></div>
<div class="box box3"></div>
</div>
</body>
</html>
2.相对位置relative
- 相对:是指相对元素本身;
- 通过
top
,right
,bottom
,left
属性设置相对距离; - 通过
z-index
属性设置z轴
值,决定元素的前后位置(叠层上下文);
还是上面的示例代码,修改box1
样式,添加position
属性:
.box1 {
background: #ff0000;
position: relative;
left: 100px;
top: 100px;
}
可以得到,原来位置
在当前位置
的左100px
和上100px
:
- 想要绿色方块在上面,使用
z-index
属性:
.box2 {
background: #00ff00;
z-index: 3;
}
可以看到z-index
并没有生效,这是因为,position
默认是static
,它是非叠层上下文
,不存在z-index
属性,需要设定position
才能生效;
.box2 {
background: #00ff00;
position: relative;
z-index: 3;
}
3.绝对位置 absolute
当元素使用absolute
定位时,会有以下几个特点:
- 元素会被移出正常文档流(normal flow),并不为元素预留空间;
- 它相对于
最近已经定位的祖先元素
(只要position
是非static
的元素)来确定位置,如果没有则是:最外层的<html>
元素—initial containing block
(上下滑动栏在最上方,左右滑动栏在最左边); Stacking context
(叠层上下文);
回到初始代码,在box2
上加上绝对位置:
.box2 {
background: #00ff00;
position: absolute;
bottom: 0;
right: 0;
- 此时
box2
相对的是浏览器视窗
,通过top, right, bottom, left 属性设置box2
与对应边框的距离; - 绿色的
box2
此时已经被移出css正常文档流,蓝色的box3
向上移动,填补空下的位置; - 当放大缩小浏览器视窗时,
box2与边框距离
会保持不变;
再修改box
的定位方式看看:
div.container {
width: 500px;
height: 1000px;
background: #000000;
position: relative;
/* position: absolute; */
}
- 可以看到,此时最近已经定位的祖先元素是
div.container
,所以box2
的绝对定位,就是相对于div.container
的;
4.固定位置Fixed
与absolute
非常相似
- 元素会被移出正常文档流(normal flow),并不为元素预留空间;
- 相对于浏览器视窗,与
absolute
不同的是,absolute
的元素在滑动位置时,元素也会跟着移动,而fixed
的元素在滑动位置时,元素则是固定不动的; - 当元素祖先的
transform
,perspective
或filter
属性非none
时,容器由视口改为该祖先; Stacking context
(叠层上下文);
回到初始的示例代码,还是对box2
做修改:
.box2 {
background: #00ff00;
position: fixed;
top: 10px;
right: 100px;
}
把container
容器也做长一点:
div.container {
width: 500px;
height: 2000px;
background: #000000;
}
- 此时,上下滑动,绿色的
box2
会在窗口一直保持不变,常用作于导航栏;
5.粘性位置Sticky
- 在css正常文档流里(遵守css
normal flow
); sticky
元素会“固定”在离它最近的一个拥有“滚动机制”(overflow
)的祖先上;Stacking context
(叠层上下文);
初始示例代码,对box2
做修改:
div.container {
width: 500px;
height: 2000px;
background: #000000;
}
...
.box2 {
background: #00ff00;
position: sticky;
top: 0px;
}
...
- 可以看到,
box2
还在之前的css正常文档流里,当向下滑动时,它会粘在预设好的距离上,所以sticky
元素,也常用作于导航栏;
最后:
- 在没有对元素设定
position
属性时,默认都是static
,静态位置; - 只有
static
元素,不能做z-index
的设定,其他四种都行;
九、CSS其他常用属性
1.css默认样式(default)
html
里的h1~h6
、p
等元素都有自带的默认样式;- 通过
F12
开发者工具查看; - 更多的默认样式查看,参考W3C官网;
示例代码:
<!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>
</head>
<body>
<h1>title</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptatem, ducimus!</p>
</body>
</html>
2.列表样式(List)
- 通过
list-style-type
可以设定列表里,每个子列表的标识符; - 对
ul
或者ol
进行样式设定;
<!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>
ul {
list-style-type: armenian;
}
ol {
list-style-type: lower-alpha;
}
</style>
</head>
<body>
<ul>
<li>北京</li>
<li>上海</li>
<li>广州</li>
<li>深圳</li>
</ul>
<ol>
<li>北京</li>
<li>上海</li>
<li>广州</li>
<li>深圳</li>
</ol>
</body>
</html>
3.表格样式(Table)
border-collapse
、border
、padding
、width
、height
等常用属性;
<!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>
table {
width: 200px;
height: 100px;
}
table,
th,
td {
border: 1px solid #000; /*设置边框*/
border-collapse: collapse; /*合并多边框*/
}
th,
td {
padding: 0.5rem 0.75rem;
}
th {
background: aqua;
color: #fff;
font-size: 1.5rem;
}
td:hover {
background: aqua;
}
</style>
</head>
<body>
<table>
<tr>
<th>name</th>
<th>age</th>
<th>phone</th>
</tr>
<tr>
<td>王子</td>
<td>20</td>
<td>147258</td>
</tr>
<tr>
<td>公主</td>
<td>19</td>
<td>369852</td>
</tr>
</table>
</body>
</html>
4.透明度(opacity)和鼠标(cursor)
opacity
属性取0~1
,表示透明度;cursor
设定鼠标移动到该元素的鼠标样式,(a标签链接默认cursor: pointer
),更多参考MDN介绍;
示例代码:
<!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>
h1,
p {
opacity: 0.5;
}
p {
cursor: pointer;
}
</style>
</head>
<body>
<h1>title</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae fugit quae fuga suscipit porro tempore, quis
eius cumque aliquid aperiam. Pariatur doloribus modi officia voluptatibus optio dicta tempore officiis delectus.
</p>
<h1>titie2</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Beatae, veniam!</p>
</body>
</html>
- 将鼠标放到
p
元素上,可以发现鼠标样式改变了;
5.转换属性transition
-
可以为一个元素在不同状态之间切换的时候定义不同的过渡效果;
----MDN-transition
-
语法规则
transition: value1 value2 value3
,该属性可以放入三个值:value1
放的是需要转换效果的属性,例如background
–>对该属性设定转换效果,all
–>所有属性;value2
放的是过度时间
(1s
–>1秒)value3
–>动画样式(ease
等)
示例代码:
<!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>
p.p1 {
/* transition: background-color 2s ease; */
/* transition: color 2s ease; */
transition: all 2s ease;
}
p:hover {
background-color: aqua;
color: blue;
}
</style>
</head>
<body>
<h1>title</h1>
<p class="p1">Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae fugit quae fuga suscipit porro
tempore, quis
eius cumque aliquid aperiam. Pariatur doloribus modi officia voluptatibus optio dicta tempore officiis delectus.
</p>
<h1>titie2</h1>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Beatae, veniam!</p>
<p class="p1">Lorem ipsum dolor sit amet consectetur adipisicing elit. Sit, quaerat?</p>
</body>
</html>
6. 变换 transform
一、 translate() 移位,transform:translate(value1,value2)
value1
: 右移的权值,当为负值时即为左移,例如100px
、20%
;value2
: 下移的权值,当为负值时即为上移;transform:translate(100px,200px)
初始示例代码:
<!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.container {
width: 800px;
height: 800px;
background: #000000;
}
.box {
width: 100px;
height: 100px;
background-color: aqua;
transition: all 1s;/*增加渐变过程,可选*/
}
.box:hover {
transform: translate(100px, 200px);
}
</style>
</head>
<body>
<div class="container">
<div class="box"></div>
</div>
</body>
</html>
- 当鼠标放上去时就会发生盒子位移;
也可以直接使用,修改上面的CSS样式,先不加transform
属性:
div.container {
width: 800px;
height: 800px;
background: #000000;
position: relative;
}
.box {
width: 100px;
height: 100px;
background-color: aqua;
position: absolute;
top: 50%;/*以父元素的50%*/
left: 50%;
}
- 想要个居中的盒子,但是如下,得到只有
左上角的点
是居中的;
- 修改
box
里的css样式,加入transform
属性:
.box {
width: 100px;
height: 100px;
background-color: aqua;
position: absolute;
top: 50%;/*以父元素的50%*/
left: 50%;
transform: translate(-50%, -50%);/*以自身的-50%*/
}
- 此时盒子向上左各移动,自身
50%
的距离,得到一个居中的盒子;
二、rotate() 旋转,transform:rotate(value)
;
value
值即为角度,顺时针为正,逆时针为负;
以上面的初始示例代码,仅修改CSS部分属性:
.box:hover {
transform: rotate(90deg);
/* transform: rotate(-90deg); */
}
- 鼠标放上去时,
box
就会产生旋转效果;
三、 scale() 放大缩小,transform:scale(value1,value2)
;
value1
值为宽度放大缩小倍数;value2
值为高度放大缩小倍数;- 也可以只放一个value,就是宽高的倍数;
以上面的初始示例代码,修改:
.box:hover {
transform: scale(2,3);
/* transform: scale(0.5); */
}
- 鼠标放上去时,
box
就会按设定放大缩小;
当然,放大缩小也可以直接设定:
.box:hover {
width: 200px;
height: 300px;
}
- 直接修改原盒子的宽高,与
transform: scale()
有本质区别; - 直接修改原盒子的宽高,它的中心点是左上角;
transform: scale()
放大缩小,中心点则是盒子正中心;
四、3D变换
transform: rotateX()
、transform: rotateY()
、transform: rotateZ()
,在原来的rotate()
上加上坐标轴;
.box:hover {
/* transform: rotateX(90deg); */
/* transform: rotateY(90deg); */
transform: rotateZ(90deg);
}
7. 动画(animation)
- @keyframes ,动画设置的语法:
@keyframes 动画名{ from{ } to{ } }
- animation-name,使用的动画名,
animation-name: 动画名
- animation-duration,动画渐变时间,
animation-duration: 时间(s)
- animation-delay,动画开始延迟时间,
animation-delay: 时间(s)
- animation-iteration-count,动画循环,
animation-iteration-count: 次数;
循环次数 - animation-direction,动画运行方向,
animation-direction: alternate;
反复 - animation-timing-function,时间函数,
animation-timing-function: ease-in;
先快后慢 - animation-fill-mode,动画结束后的位置
------参考MDN
- 类似padding、margin,animation属性也有比较快速的写法,语法:
animation: name duration timing-function delay iteration-count direction
初始示例代码:
<!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.container {
width: 800px;
height: 800px;
background: #000000;
}
.box {
width: 100px;
height: 100px;
background-color: aqua;
}
</style>
</head>
<body>
<div class="container">
<div class="box"></div>
</div>
</body>
</html>
- 在初始代码加上动画:
- @keyframes设置动画样式;
animation-name: cross;
给box
绑定动画;animation-duration: 2s;
,渐变过程2s;animation-delay: 2s;
,延迟2s后开始;animation-iteration-count: infinite;
无限循环;animation-direction: alternate;
按原来方向反复;animation-timing-function: ease-in;
先慢后快;
.box {
width: 100px;
height: 100px;
background-color: aqua;
animation-name: cross;
animation-duration: 2s;
animation-delay: 2s;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-timing-function: ease-in;
/*快速写法如下:*/
/* animation: cross 2s ease-in 2s infinite alternate; */
/* animation: cross 2s ease-in 2; */
position: relative;
}
@keyframes cross {
from {
background-color: aqua;
top: 0;
left: 0;
}
to {
background-color: blueviolet;
top: 700px;
left: 700px;
}
}
- 由于动画运行后总是回到初始位置,可以加上
animation-fill-mode: forwards;
使动画固定在结束位置:
上面代码做一些修改:
.box {
width: 100px;
height: 100px;
background-color: aqua;
animation-name: cross;
animation-duration: 2s;
animation-delay: 2s;
animation-fill-mode: forwards;
/* animation: cross 2s ease-in forwards; */
position: relative;
}
- 可以看到动画结束时,不会回到原来的位置了,而是固定在结束位置;
8. 其他
- border-radius边框圆角,
border-radius: 50%;
方形直接变成圆形;MDN
<!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.container {
width: 800px;
height: 800px;
background: #000000;
position: relative;
border-radius: 20px;
}
.box {
width: 100px;
height: 100px;
background-color: aqua;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
}
</style>
</head>
<body>
<div class="container">
<div class="box"></div>
</div>
</body>
</html>
- overflow, 设定无法适应时的操作,例如元素溢出父元素时,应采取的操作,MDN参考
<!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.container {
width: 800px;
height: 800px;
background: #000000;
overflow: scroll;
}
.box {
width: 100px;
height: 100px;
background-color: aqua;
animation: cross 2s ease-in forwards;
position: relative;
}
@keyframes cross {
from {
background-color: aqua;
top: 0;
left: 0;
}
to {
background-color: blueviolet;
top: 700px;
left: 900px;
}
}
</style>
</head>
<body>
<div class="container">
<div class="box"></div>
</div>
</body>
</html>
终!