• CSS理论

      样式的书写位置

      行内样式

      内嵌样式

      用的最多,把需要用的css代码都集中放到style标签里面

      链接样式

      如果css代码很多的话,可以单独打包到一个文件里面,然后这样导入,做到html和css的分离。

      导入样式

      跟链接样式类似,可以导入外部的css代码,不过这个是写在style里面的。一共有6种写法。

      也就是说css不关心引号的写法,没有也可以。

      元素的显示模式

      块级元素

       

      常见的有<h1>到<h6>、<div>、<ul>、<ol>、<li>

       

      行内元素

       

      常见的有<a>、<span>、<strong>

      行内块元素

       

      常见的有<img/>、<input/>、<td>

      显示模式的转化

      有时候,一些行内元素也需要转化成块级元素。比如说a标签,我们有时候需要a标签的面积比较大,以便用户点击,但是又设置不了其宽高,这就很不方便。此时我们就可以使用display属性就可以进行转化了。

      同样的,有时候我们也需要转化成其他的元素。

       

      CSS样式的特性

      层叠性

      css中,如果设置相同的样式,那么新设置的会覆盖掉原来的。

      继承性

      css中,子标签会继承父标签的部分样式。

       

      继承的属性主要都是文字和颜色相关的。

      选择器的权重

      如果两个选择器对同一个元素进行样式的设置,那么究竟以谁的为准呢?

      答案是以id选择器为准,这是因为css的选择器实际上有一套隐藏的权重,根据选择器的权重来判断最终的样式。

       

      选择器权重
      通配符选择器、继承0000
      元素选择器0001
      类选择器、伪类选择器0010
      ID选择器0100
      行内样式1000
      !important无穷大

       

      要注意两点

      1. 继承的权重是0

      最终文字会是红色,因为id选择器给父元素设置的样式权重是0,也就是说只要子元素设置了样式,就会覆盖掉父元素的。

      其实这个用的很多,比如说a标签等一些标签就会有默认的样式,其本质就是:

      所以对body设置样式body{color:red;},你会发现a标签根本没有变化。这就是因为body的样式继承到a之后,权重为0.然后被a标签的元素选择器给覆盖掉了。

       

      1. !important的权重是无穷大

      最终颜色会是蓝色,因为设置了!important之后,样式的权重就会无穷大。

      权重的叠加

      对于复合选择器,选择器的权重则是各个选择器权重的和。

      在本例中,颜色最终会变成darkred。因为ul是一个元素选择器,权重为1;li权重也是1,两个一加权重就是2了。比单独一个li权重大。所以最终是暗红色。

       

      要注意a:hover这种选择器权重是11。a是1,伪类选择器是10,一加是11。

      基本样式速查

      文字相关

      复合属性

      其中 font-size 和 font-family 属性不能省略。

      字符间距

       

      文字竖向排列

       

      文字颜色

       

       

      文字大小

      要注意!

      这种情况对h1等h标签不起作用,标题标签比较特殊,需要单独设置。

      文字加粗

      斜体

       

      文本对齐

       

      文本装饰

       

      行间距

      描述
      normal默认。设置合理的行间距。
      某数字设置数字,此数字会与当前的字体尺寸相乘来设置行间距。
      某某px设置固定的行间距。
      %基于当前字体尺寸的百分比行间距。
      inherit规定应该从父元素继承 line-height 属性的值。

      行间距包括了三部分

      而文字的大小是固定的,font-size设置了多少就是多少,所以改变行间距本质上就是改变上下边距的大小。例如我字体大小是20px,行间距是24px,那么上下边距就是2px。要注意:上下边距一定是相等的。

       

      文字阴影

      参数描述
      第一个参数必需。阴影离文字的水平距离。允许负值。
      第二个参数必需。阴影离文字的垂直距离。允许负值。
      第三个参数可选。代表这个阴影有多模糊。
      第四个参数可选。阴影的颜色。

       

      首行缩进

       

      字体族

      这个可以指定字体,默认从左开始,如果电脑没有装这个字体,就会使用右边的字体。如果都没有,就会使用浏览器默认字体。

      如果字体中间有空格,需要加引号,如果没有可以不加。

       

      除了加载本地字体,也可以加载外部字体

       

      禁止文本换行

      文本省略

      需要同时设置三个属性

       

      列表相关

       

      背景相关

      复合属性

       

      背景颜色

      背景颜色默认都是透明的

       

      背景图片

       

      背景图片重复

      背景尺寸

       

      背景开始的位置

      设置background-attachment:fixed;才能兼容 Firefox 和 Opera 浏览器。

       

      background-position有两个值,第一个是x轴的坐标,第二个是y轴的。

      其中right centercenter right顺序可以互换。因为right只能表示水平方向,所以center只能是垂直方向。两边互换浏览器也能分析出来。也就是说方位名词的顺序可以互换

      如果只写了一个参数,那么另一个默认是center

       

      常用的位置:

       

      背景附着

      注意!在使用radial-gradient等情况的时候,建议加上这个,可以方式背景重复

      背景渐变

       

      1. 径向渐变

      2. 线性渐变

         

      尺寸相关

      宽度

       

      溢出

      如果你的文本过大,超过了设计的尺寸,就会发生溢出

       

      边框相关

       

      鼠标相关

      一般搭配伪类使用

       

      鼠标悬停样式

      描述
      url想传送的url
      default默认光标(通常是一个箭头)
      auto默认。浏览器设置的光标。
      crosshair光标呈现为十字线。
      pointer光标呈现为指示链接的指针(一只手)
      move此光标指示某对象可被移动。
      e-resize此光标指示矩形框的边缘可被向右(东)移动。
      ne-resize此光标指示矩形框的边缘可被向上及向右移动(北/东)。
      nw-resize此光标指示矩形框的边缘可被向上及向左移动(北/西)。
      n-resize此光标指示矩形框的边缘可被向上(北)移动。
      se-resize此光标指示矩形框的边缘可被向下及向右移动(南/东)。
      sw-resize此光标指示矩形框的边缘可被向下及向左移动(南/西)。
      s-resize此光标指示矩形框的边缘可被向下移动(南)。
      w-resize此光标指示矩形框的边缘可被向左移动(西)。
      text此光标指示文本。
      wait此光标指示程序正忙(通常是一只表或沙漏)。
      help此光标指示可用的帮助(通常是一个问号或一个气球)。

       

      列表

       

      其他常用样式

      透明

      请设置在[0-1]之间

      圆角

      禁止用户选中

       

      盒子阴影

      说明
      h-shadow必需的。水平阴影的位置。允许负值
      v-shadow必需的。垂直阴影的位置。允许负值
      blur可选。模糊距离,就是有多糊。
      spread可选。阴影的大小
      color可选。阴影的颜色。在CSS颜色值寻找颜色值的完整列表
      inset可选。内阴影,元素凹进去的感觉。

       

       

      盒模型

      概述

      盒模型相关的样式包括:

      CSS认为,每一个文档的元素都是一个盒子,这个盒子包括自身的大小,边框大小,内边距和外边距.如下图:

      CSS 框模型

      如果在浏览器(以chrome为例)里面用开发者工具查看,可以发现,实际上内外边距,外边距还有边框都是占地方的,

      image-20200913130056030

      image-20200913130003875

      这些样式的区别就在于,内边距是算在元素本身的大小里面的,啥意思呢,就比如你元素宽20px,内边距你两边各加10px,那么你这个元素整体就宽40px.边框也是一样的,但是外边距不会算在元素里面。

      也就是说内边距和边框会影响盒子大小。

      边框

      概述

      一个元素有上下左右四个边框(废话),css允许分别定义各个方向上边框的样式.比如说

      分别为上,右,下,左指定不同颜色.也就是从上开始,顺时针排列.

      如果只写三个,那么第一个是上边框,第二个是左右边框,第三个是下边框.

      只写两个的话就是上下边框,左右边框

      一个的话肯定就是全部红喽;

      这样分别指定样式的操作,在边框里面是通用的,也可以来指定宽度,表现等.如果不想这样隐式指定,也可以显示指定.

      像这样子,直接指定也是可以的.

      注意:!!!!!!!!!!!!!!只有把width,style和color都指定了之后才能正常显示边框,否则不会显示!!!!!!!!!!!!!!!!!!.

      边框样式

      描述
      none定义无边框。
      hidden与 "none" 相同。不过应用于表时除外,对于表,hidden 用于解决边框冲突。
      dotted定义点状边框。在大多数浏览器中呈现为实线。
      dashed定义虚线。在大多数浏览器中呈现为实线。
      solid定义实线。
      double定义双线。双线的宽度等于 border-width 的值。
      groove定义 3D 凹槽边框。其效果取决于 border-color 的值。
      ridge定义 3D 垄状边框。其效果取决于 border-color 的值。
      inset定义 3D inset 边框。其效果取决于 border-color 的值。
      outset定义 3D outset 边框。其效果取决于 border-color 的值。
      inherit规定应该从父元素继承边框样式。

      边框宽度

      描述
      thin定义细的边框。
      medium默认。定义中等的边框。
      thick定义粗的边框。
      某某px自定义宽度
      inherit规定应该从父元素继承边框宽度。

      边框颜色

      跟字体颜色一样,详情参考颜色表.

      边框合并

      边框圆角化

      这个玩意的原理,就是用一个半径为10px的圆和四条边做切线,半径越大,角就越圆。

       

       

      根据这个原理,我们可以制造出圆形和圆角矩形

       

      圆角属性也可以分别设置四个角,从左上角开始,顺时针转一圈。也可以单独设置。

       

      简写

      因为边框想要生效必须指定三个属性,写起来确实很麻烦,为了增加程序员的寿命,HTML支持边框的简写

      像这样,可以一次性设置三个属性.

      内边距

       

      若设置width,padding会增加盒模型的大小。但是若不设置width,则不会影响其大小。

       

      第一种虽然设置了padding,但是不会影响盒子大小

      内盒子

       

      第二种加了width,则会影响盒子大小。

      内盒子

       

      外边距

      概述

       

      对于一个块级盒子,可以设置外边距使其水平居中

       

      注意!对于行内元素,请只设置左右的外边距。如果非要设置,请转换成块级元素。

      外边距塌陷

      当子元素和父元素同时设置了 margin-top属性时,子元素并不会真的和父元素有外边距。而是和父元素的外边距重叠。值为其中较大的那项。

       

      image-20210411224401226

      可以看到,子元素并没有向下移动,而是和父元素整体向下了。而且向下的值为max(100px,50px)。

      外边距坍塌的解决

      1. 为父元素设置上边框

      1. 为父元素设置上内边距

      1. 为父元素设置overflow: hidden;

      清除网页默认的内外边距

      网页自带内外边距,我们在写代码时需要先手动清除。

      选择器

      基本选择器

      通配符选择器

      就是全选的意思,选中html文档中所有的元素.

      元素选择器

      可以直接选择某一个标签,然后直接对HTML中所有这种标签进行批量编辑.

      这个就是让所有p标签内部文字颜色变为红色.

      类选择器

      可以批量选择自定义的类,用于某一类特定的标签。

      而且在html中,一个标签可以指定多个类,但是要用空格隔开。

      html:

      css:

      一般类选择器选择的都是某一类标签,在需要添加这个类的标签前面加上class,后面可以指定想要的类,类名可以随便起.在css里面用点类名的办法,选择所有该类.

      一般来说,类选择器都是批量选择很多该类的标签,比如说ul的列表,li有很多很多条,为每一个li单独设计样式岂不是累死了,所以可以给他们起一个类名item,批量添加这些li的样式.

      ID选择器

      只能选择某一个特定的标签,一般只有一些特殊含义的标签才用起ID.还是刚才的例子.

      html:

      css:

      ID选择器中,css用#加ID名就可以选中标签,一般一个网页里面这个语言列表可能就这么一个,所以比较特殊,可以用ID选择器来选中,直接操作这个标签.

      复合选择器

      包含选择器

      选择所有div里面所有的span标签,子元素里面的span标签也会被选上,

       

      子选择器

      选择div下的子元素,只能选择最近一层子元素,也就是亲儿子。里面的span不会被选上。

       

      相邻选择器

      说是选相邻,其实也不是真正的相邻元素,它只能按照+前后的顺序排列的元素,也就是说#s1之后必须是#s2,顺序颠倒也不行。

      兄弟选择器

      相邻选择器选择的元素必须是相邻的同级元素,而兄弟选择器的要求就低一点了,只要是在#s1后定义的#s2就能被选中,中间可以不用相邻,隔着其他元素也可以。

      并集选择器

      如果你想同时给多个不同元素设置样式,可以用并集选择器

      像这样,彼此之间用逗号隔开,表示同时选中。

      伪类选择器

      名字虽然很酷,其实没那么复杂,这个玩意可以来操作一些特殊的类,比如超链接的样式,输入框聚焦后的样式等等。写法就是在需要添加的元素后面冒号,然后加入想加入的伪类即可。

      动态伪类

      锚点伪类

      行为伪类

       

      顺序问题

      注意!!!!!

      这几个伪类在书写时顺序不能乱动,必须按照下面的顺序来,否则不能正常显示。

       

      结构伪类

      first-child

      顾名思义,就是选择第一个子元素,但是这里面有很多坑,必须注意

      先看html:

       

      image-20200913141409114

      image-20200913141347709

      before和after

      可以用这两个伪类,在某个元素前面或后面插入文本.用content来控制文本内容.

      状态伪类

      这个是用来选择表单元素的。

      选中所有可用的表单元素

      此时将会把文本框和按钮都选中,因为默认情况下表单元素是enabled

      选中所有不可用的表单元素

       

      属性选择器

      如果你想选择带某个属性的标签,可以用属性选择器.但是里面也有很多坑,需要注意.

      这个例子就是选择所有有href属性的a标签.也可以同时指定多个属性:

      这个就是选择同是有href和title属性的a标签

      选择某个有具体属性的标签,注意这个要求严格等于,也就是说你的class也必须是"A B",多一个空格都不行.这时候我们就可以使用下面的写法了.

      用这个~可以表示含有A的class,不用严格匹配.

      属性选择器也支持三种正则语法:

      选择a标签的超链接中包含"dashepi.com"这个字符串的所有a标签

      选择href以"www."开头的a标签

      选择href以".cn"结尾的a标签

      1.  

       

      浮动带来的问题

       

      高度塌陷

       

      清除浮动

      我们布局时,父元素的高度有时候并不是确定的,比如说纵向的导航栏,数量有可能改变。所以说我们不能把高度写死。但是不写高度又会发生高度塌陷。怎么办呢?

      这时候就需要我们来想办法解决高度塌陷了。这就是我们大名鼎鼎的清除浮动

      清除浮动有三种方法:

      在子元素的最后面额外加一个标签。而且必须是块级元素

      属性设置为hidden、scroll、auto都可以。

       

      清除浮动最终解决代码

      只要给父元素加上这个类就可以了。

      不用管它什么意思

       

      BFC

      概述

      BFC(Block formatting context)直译为"块级格式化上下文"。如果开启了BFC,元素就会被单独划分一个BFC的渲染区域,不会影响外界。BFC可以理解为元素的一个隐藏属性。

      如果在布局的时候出现了不符合预期的时候,就可以开启BFC。

       

       

      开启BFC

      1. 根元素<html>

      2. 设置浮动,并且float不是none

      3. 设置绝对定位,position为absolute或者fixed

      4. 设置overflow,除了visible和clip都可以

      5. contain值为layout、content、paint的元素

      6. 设置display为flow-root等

       

      高度塌陷

      刚才我们说过,一般,浮动的元素都要有一个文档流的父元素,以便布局。

       

      你会发现,我这个父元素加了一个height之后,才能显示背景颜色。如果把height去掉,背景颜色就会消失。也就是说如果子元素浮动,那么父元素的高度就会塌陷为0。也就是说父元素无法被浮动的子元素撑开。而文档流中,父元素会被子元素撑开的。

      解决:在父元素添加overflow: hidden

      外边距塌陷

      当两个div都设置了外边距的时候,

      1. 两个块元素是父子关系

      2. 两个块元素上下挨着

       

      浮动元素覆盖

       

       

      如果开启了BFC,元素之间就不会相互干扰了

       

       

      传统布局

      传统布局使用dispaly、float、position这三个属性来布局。

      position

       

       

       

      float

       

      一旦加了浮动的属性,就会出现一些特殊的特性

       

      所谓的浮动,正如字面含义一样,确确实实是漂浮起来了。也就是说,没有浮动的元素,会自动往上跑。浮动的元素会把它给盖住。

       

       

       

      Flex布局

      传统的网页布局是靠 display 属性 + position属性 + float属性完成的,不仅难用,而且bug频出。后来W3C忽悠引出了flex布局,用于替代传统布局。

      flex是Flexible Box的缩写,意思是弹性布局。采用了flex布局的元素被称为flex容器(flex container),它的子元素会自动成为flex项目(flex item)

      开启flex的方式为:

      以下是几个注意点:

       

      父元素的属性

      flex-direction

      主轴方向,默认主轴方向水平向右。

      作用
      row(默认值)水平方向,方向从左到右
      row-reverse水平方向,方向从右到左
      column垂直方向,方向从上向下
      column-reverse垂直方向,方向从下向上

      justify-content

      主轴上元素的排列方式,假设主轴方向为默认值。

      作用
      flex-start(默认值)从主轴开始的位置排列元素,也就是靠左对齐
      flex-end从主轴最后的位置排列元素,也就是靠右对齐
      center元素居中排列
      space-around元素在主轴上均匀分布
      space-between先贴紧两边,再平均排列剩余的元素

      flex-wrap

      控制元素是否换行。flex布局中,子元素不会自动换行,而是会自动调整width,强行加到一行里面。

      作用
      nowrap(默认值)不换行
      wrap换行

      align-items

      控制侧轴上子元素的对齐方式(单行),侧轴就是不是主轴的轴,主轴是x,那么侧轴就是y。主轴是y,那么侧轴就是x。

      它的属性和主轴排列是一样的,假设侧轴是从上到下。

      作用
      flex-start(默认值)从侧轴开始的位置排列元素,也就是靠上对齐
      flex-end从侧轴最后的位置排列元素,也就是靠下对齐
      center元素居中排列
      stretch拉伸,将子元素的高度拉到和父元素一样。前提是不能给子元素设置高度
      baseline沿着子元素中的第一行文字对齐

      align-content

      如果子元素设置了flex-wrap,也就是变成了多行,此时就可以使用这个属性了。

      作用
      flex-start(默认值)从主轴开始的位置排列元素,也就是靠上对齐
      flex-end从主轴最后的位置排列元素,也就是靠下对齐
      center元素居中排列
      space-around元素在侧轴上均匀分布
      space-between先贴紧上下,再平均排列剩余的元素
      stretch设置子元素均分父元素的高度

      felx-flow

      符合属性,相当于设置了flex-directionflex-wrap

       

      子元素的属性

      flex

      这个属性代表了子元素在分配剩余空间时的权重。也就是说如果有3个子元素,而且都不设定宽度,那么flex:1;,就说明每元素的权重都是1,最后结果就是三等分。如果某一个元素的flex是2,就说明它的权重为2,最终它占二分之一,其余元素各四分之一。

      而且要注意,这个flex分配的是剩余空间,假如父元素100xp,有几个子元素已经设定了宽度20px,那么flex将会分配80xp的宽度。

      align-self

      可以单独控制某个元素在侧轴上的排列。和align-items完全一样。

      作用
      flex-start(默认值)从侧轴开始的位置排列元素,也就是靠上对齐
      flex-end从侧轴最后的位置排列元素,也就是靠下对齐
      center元素居中排列
      stretch拉伸,将子元素的高度拉到和父元素一样。前提是不能给子元素设置高度
      baseline沿着子元素中的第一行文字对齐

      order

      按照数值进行排列,数值越小越靠前。默认值为0。

       

      Grid布局

      和flex一样,采用了grid布局的元素被称为grid容器(grid container),它的子元素会自动成为grid项目(grid item)。要注意的是,项目只是指第一层的子元素,子元素里面的子元素不是项目。

       

       

       

       

       

      动画

      定义与使用

      定义:

      使用:

      动画序列

      from to只能用于一个过程,一次执行完,如果想要分步执行,可以设置时间点,来设置每一个时间点的状态。

      常用的属性

      属性描述
      @keyframes规定动画。
      animation所有动画属性的简写属性,除了 animation-play-state 属性。
      animation-name规定 @keyframes 动画的名称。
      animation-duration规定动画完成一个周期所花费的秒或毫秒。默认是 0。
      animation-timing-function规定动画的速度曲线。默认是 "ease"。
      animation-delay规定动画何时开始。默认是 0。
      animation-iteration-count规定动画被播放的次数。默认是 1。
      animation-direction规定动画是否在下一周期逆向地播放。默认是 "normal"。
      animation-play-state规定动画是否正在运行或暂停。默认是 "running"。
      animation-fill-modenone:不改变默认行为。 forwards :当动画完成后,保持最后一个属性值(在最后一个关键帧中定义)。

      缓慢执行样式

       

      3D转换

      坐标规定

      image-20201029174447753

      3D位移

      可以直接来创建某一方向的位移

      但是要注意,如果把这三行代码放在一起,后面的会覆盖上面的,所以如果想同时设置多个坐标,需要用其他方法。

      3D透视

      就是指的近大远小,如果想要某一个元素拥有透视,需要给其父元素设置透视

       

       

      高级属性

      滤镜

       

      scroll-snap-type

      父元素设置这个

      子元素这个

       

       

      值与单位

      长度

      颜色

      具名颜色

      指可以直接使用颜色名字来设置颜色

      例如:

       

      RPG与RGBA

      可以用RGB颜色,三个值的取值范围是0~255或者0~100%,但是颜色值不能混用百分数和整数。

      例如:

      而RGBA则是在RGB的基础上增加了透明度,alpha值范围是0~1。alpha为0的时候代表完全透明,1代表完全不透明。

      十六进制RGB和RGBA

      因为RGB取值范围是0~255,所以可以使用十六进制的00到FF来一一替换。

      例如:

      如果十六进制中两个数字一样,那么可以缩写。

       

      若加上透明通道,则可以在后面再加两个十六进制数

      HSL和HSLA

      HSL代表着Hue、Saturation、Lightness。色相取值为0~360,饱和度取值为0~100%,明度取值为0~100%。

      例如:

       

      CSS函数

      var和calc

      可以用来定义和计算变量

      变量用用两个减号--来开启,使用时直接用var加变量名即可

       

      附录1——动画案例

      热点图

      使用逐帧动画

      炫彩背景

       

      附录2——常用样式

      normalize.css

       

       

      附录3——实用技巧

      元素垂直水平居中

      如果只设置了left和top,那么实际上是左上角居中了,而不是真正的居中。

       

      如果是flex布局则可以

       

      行内元素和行内块元素水平居中

      只需要给父元素设置text-algin: center;就可以了。

       

      文字垂直居中

      css本身没有这个操作,但是我们可以设置文字行高等于其高度,这样就可以自动垂直居中了。

       

      设置长宽相等

      设置标签水平垂直居中

      设置背景图片全屏

      设置div全屏

      有的时候需要把div全屏显示,但是发现它只能被里面的子元素撑起来,这是因为原来浏览器默认的body,和html是没有高度的。或者说高度是auto的。所以只需要把这两个都设置为100%就可以了。

      用border实现一个三角形

       

      样式案例

      滚动贴合

      横向滚动

      背景增加灰色效果

      可以选择多重渲染,让图片也加上颜色滤镜