CSS篇

197 阅读16分钟

选择器

1.css中的选择器有哪些?

1.元素选择器,ID选择器,CLASS选择器,通配符*

2.复合选择器

  • 1.交集选择器,选择同时符合多个条件元素 语法:选择器1选择器2选择器3……
  • 2.选择器分组(并集选择器),同时选择多个选择器的对应元素 语法:选择器1,选择器2……

3.关系选择器

  • 子元素选择器:父元素 > 子元素
  • 后代元素选择器:祖先 后代
  • 选择下一个兄弟:前一个 + 后一个
  • 选择下边所有兄弟:前一个 ~ 后一个

4.属性选择器

  • [属性名]选择含有指定属性的元素
  • [属性名=属性值]选择含有指定属性和属性值的元素
  • [属性名^=属性值]选择属性值以指定开头的元素
  • [属性名$=属性值]选择属性值以指定结尾的元素
  • [属性名*=属性值]选择属性值含有某值的元素

5.伪类选择器

  • :first-child 选中第一个子元素
  • :last-child 选中最后一个子元素
  • :nth-child() 选中第n个子元素 特殊值:
  • nth-child(n)表示第n个
  • nth-child(2n/even)表示第偶数个
  • nth-child(2n+1/odd)表示第奇数个(以上是在所有元素中排序) 下面是在同类元素中进行排序
  • :first-of-type
  • :last-of-type
  • :nth-of-type()
  • :not() 将符合条件的元素从选择器中去除 例:ul > li:not(:nth-of-type(2)){}

6.伪元素选择器

  • ::first-letter 表示第一个字母
  • ::first-line 表示第一行
  • ::selection 选中的内容
  • ::befor 元素的开始(需要搭配conten:''使用)
  • ::after 元素的结束(需要搭配conten:''使用)

选择器的优先级

标题
内联1000
ID100
类和伪元素10
元素选择器1
通配符0
继承的样式没有优先级

比较优先级时,需要将所有的选择器的优先级进行相加计算,最后优先级越高,则越优先计算(分组选择器是分组单独计算的),如果优先级计算后相同,此时则优先使用靠下的样式
可以在某个样式后添加!important,该样式会获取到最高优先级甚至超过内联样式的优先级,但是注意,要谨慎使用,因为修改起来比较难。
color:red !important ; ps:选择器的累加不会超过其最大的数量级,类选择器最高也不会超过ID选择器

超链接

<a href="https://www.baidu.com/" target="_blank">点我跳转</a> target指定超链接打开位置

  • _self:表示在当前页面打开超链接
  • _blank:表示在新的页面打开超链接 跳转到当前页面的顶部
  • <a href="#"></a>
    

javascript:;表示占位符,点击超链接不会跳转

  • <a href="javascript:;"></a>
    

替换元素img

<img src="../img/pic01.webp" alt="图片"> alt:图片无法加载时,图片的描述(搜索引擎识别图片根据alt内容来识别)
img特性:修改一个width,其height会等比例缩放

图片格式

  • jpeg(jpg):支持颜色比较丰富,不支持透明度,不支持东突,一般显示照片
  • gif:支持的颜色比较少,支持简单透明度,支持动图
  • png:支持的颜色丰富,支持复杂度透明,不支持动图
  • webp:谷歌新推出的图片格式(兼容性不太好)
  • base64:将图片使用base64进行编码,也就是将图片转化成字符(图片-> 字符),通过字符引入图片。一般都是需要和网页一起加载图片才会使用base64 ps:在使用图片时候,需要注意,效果一样的,使用文件小的,效果不一样的,选择使用效果好的图片

像素

像素是由一个个的小点点构成的,不同屏幕的像素大小是不同的,像素越小的屏幕显示的效果越清晰,所以同样的200px在不同的设备下显示的效果不一样。

  • 百分比 相对其父元素属性的百分比
    设置百分比可以使子元素跟随父元素的改变而改变
  • em em是相对于元素的字体大小来计算的
    1em = 1 font-size
    em会根据字体大小的改变而改变,参照自身字体大小
  • rem rem是相对于根元素(html字体大小)的字体大小来计算

文档流

显示器实际上是一层摞着一层的,通过css样式可以分别为每一层设置样式。这些层中,最底下的一层称为文档流,,文档流是网页的基础。
对于我们来说,元素主要有两个状态:在文档流中;不在文档流中。
元素在文档流中有什么特点

  • 块元素: 块元素在页面中独占一行(自上向下垂直排列)
    默认宽度是父元素的全部(会把父元素撑满)
    默认高度是被内容(子元素)撑开
  • 行内元素: 行内元素不会独占页面一行,只会占自身大小
    行内元素在页面中自左向右水平排列,如果一行之中,不能容下行内元素,元素会换到第二行
    行内元素的默认宽度和高度都是被内容撑开

盒模型

css将页面中的所有元素都设置为了一个矩形的盒子,将元素设置矩形盒子后,对页面的布局就变成了不同的盒子摆放到不同的位置。 标准盒模型

image.png IE盒模型

image.png

每一个盒子都有一下几个部分
内容区(content):元素中的所有子元素和文本都在内容区中排列,内容区的大小由width和height两个属性设置
内边距(padding):内容和边框的距离,会影响盒子的大小
边框(border):盒子的边缘,边框的大小会影响盒子的大小(宽度 颜色 模式)
ps:盒子的可见框大小,由内容+内边距+边框 决定的
外边距(magin):盒子和其他盒子的距离,不会影响盒子可见框的大小,但会影响盒子位置,会影响盒子实际占用空间,元素在页面中是按照左向右的顺序排列,margin-left和margin-top是移动自己,margin-bottom和margin-right移动其他元素,如果设置负值,则往相反方向移动。

  • margin:10px 20px 30px 40px ;值分别代表top right bottom left
  • margin:10px 20px 40px ;值分别代表top left/right bottom
  • margin:10px 20px ;值分别代表top/bottom left/right
  • margin:10px ;值代表top/bottom/left/right

水平布局

水平布局:元素在其父元素中水平方向的位置由一下几个属性共同决定
margin-left + padding-left + border-left + width + border-right + padding-right + margin-right = 父元素内容区的宽度(必须满足该等式)

以上等式必须满足,如果相加结果等式不成立,则称为过渡约束,等式会自动调整,如果七个值没有auto情况,浏览器会自动调整margin-right使等式满足。
这七个值中可设置为auto: width margin-left margin-right

  • 如果某个值为auto,则会调整为auto那个值以使等式成立
  • 如果将一个宽度和一个外边距设置为auto,则宽度会调整到最大,设置为auto的外边距会自动为0
  • 如果三个值都设置为auto,则外边距都是0,宽度最大
  • 如果将两个外边距设置为auto,宽度值固定,则会将外边距设置为相同的值(经常利用这个特点来设置一个元素在其父元素中水平居中)
width:100px;//设置固定值
margin:0 auto;

外边距折叠

外边距重叠(margin):相邻垂直方向外边距会发生重叠现象 兄弟元素:(兄弟间的外边距重叠对于开发是有利的,不需要处理)

  • 如果相邻外边距都是正值,取两者较大的那个
  • 如果相邻的外边距一正一负,取两者的和
  • 如果相邻的外边距都是负值,取两者绝对值较大的那个 父子元素:父子元素间相邻外边距,子元素的会传递给父元素(只针对上外边距)

外边距折叠处理方法

1.开启BFC

        #box3{
            width: 200px;
            height: 200px;
            background-color: #bfa;
            overflow: hidden;

        }
        #box4{
            width: 100px;
            height: 100px;
            margin-top: 100px;
            background-color: bisque;
        }

2.使用::before

        #box3{
            width: 200px;
            height: 200px;
            background-color: #bfa;

        }
        #box4{
            width: 100px;
            height: 100px;
            margin-top: 100px;
            background-color: bisque;
        }
        #box3::before{
            content: " ";
            display: table;
        }

行内元素的盒模型

行内元素:行内元素不支持设置长度和宽度,并且padding、margin、border垂直方向(top、bottom)不生效\

display的属性值:

  • inline -> 行内元素
  • block -> 块元素
  • inline-block -> 行内块元素(既可以设置宽度又不会独占一行)
  • table ->表格
  • none -> 元素不在页面中显示(不占据页面空间) visibility的属性值:
  • visible -> (默认值)元素在页面中正常显示
  • hidden -> 隐藏,不显示元素,但是依然占据页面位置

浮动

浮动:可以使元素向其父元素的左侧或向右移动
元素设置浮动后,水平布局等式就不需要强制成立了,会完全从文档流中脱离,不再占用文档流位置,元素下边的还在文档流中的元素会自动向上移动
浮动的特点

  • 1)浮动元素会完全脱离文档流,不再占据文档流的位置
  • 2)设置浮动以后,元素会向父元素的左侧或右侧移动
  • 3)浮动元素默认不会从父元素中移出
  • 4)浮动元素向左或向右移动时,不会超过它前面的其他浮动元素
  • 5)浮动元素不会超过它上边的浮动的兄弟元素,最多就是和它一样高
  • 6)浮动元素不会盖住文字,文字会自动环绕在浮动元素的周围 块元素设置浮动后,脱离文档流的特点:块元素不再独占一页面一行;脱离文档流以后,块元素的宽度和高度默认都被内容撑开
    行内元素设置浮动后,脱离文档流的特点:行内元素脱离文档流,会变成和块元素一样效果

高度塌陷

高度塌陷:在浮动布局中,父元素的高度默认是被子元素撑开的,当子元素浮动后,会完全脱离文档流,子元素从文档流中脱离,将会无法撑起父元素高度,导致父元素的高度丢失

解决高度塌陷方法

方法一:开启BFC

        #box1{
            border: 5px burlywood solid;
            /* 开启BFC */
            overflow: hidden;
        }
        #box2{
            float: left;
            width: 100px;
            height: 100px;
            background-color: #bfa;
        }

方法二:使用伪类::after

        #box1{
            border: 5px burlywood solid;
        }
        #box2{
            float: left;
            width: 100px;
            height: 100px;
            background-color: #bfa;
        }
        #box1::after{
            content: "";
            clear: both;
            display: block;
        }

clearfix处理外边距折叠和高度塌陷

        #box1{
            border: 5px burlywood solid;
        }
        #box2{
            float: left;
            width: 100px;
            height: 100px;
            margin-top: 50px;
            background-color: #bfa;
        }
        .clearfix::before,
        .clearfix::after{
            content: "";
            display: table;
            clear: both;
        }
    <div id="box1" class="clearfix">
        <div id="box2"></div>
    </div>

BFC块级格式化环境

BFC是CSS中的一个隐含属性,可以为一个元素开启BFC,开启BFC该元素会变成一个独立的布局区域,通常通过overflow:hidden;来开启BFC 元素开启BFC后的特点:

  • 1)开启BFC的元素不会被浮动元素所覆盖
  • 2)开启BFC的元素子元素和父元素外边距不会重叠
  • 3)开启BFC的元素可以包含浮动的子元素

clear

clear:清除浮动元素对当前元素所产生的影响

  • left -> 清除左侧浮动元素对当前元素所产生的影响
  • right -> 清除右侧浮动元素对当前元素所产生的影响
  • both -> 清除两侧对当前影响最大的 clear清除浮动原理:设置清除浮动以后,浏览器会自动为元素添加一个上外边距,以使其位置不受其他元素影响。

元素定位

开启定位:当元素position设置不为static时,即为开启定位
当元素开启了定位以后,通过偏移量来设置元素位置

  • 水平位置:top bottom
  • 垂直位置:left right

相对定位(relative)

  • 1.元素开启定位后,如果不设置偏移量元素不会发生任何变化
  • 2.相对定位是参照于元素在文档流的中的位置进行定位
  • 3.相对定位会提升元素的层级
  • 4.相对定位不会使元素脱离文档流,不会改变元素的性质,块元素还是块元素,行内元素还是行内元素

绝对定位(absolute)

  • 1.开启绝对定位后,如果不设置偏移量,元素的位置不会发生变化
  • 2.绝对定位元素会从文档流中脱离
  • 3.绝对定位会改变元素的性质,行内元素变成块元素,块的宽度被内容撑开
  • 4.绝对定位会使元素提升一个层级
  • 5.绝对定位是相对于其包含块进行定位的 包含块:1)正常情况下,包含块就是离当前元素最近的块元素
    2)绝对定位包含块:包含块就是离它最近的开启了定位的祖先元素,如果所有的祖先元素都没有开启定位,则根元素(html,也称初始包含块)是它的包含块。

固定定位(fixed)

固定定位也是一种绝对定位,固定定位的大部分特点和绝对定位一样,唯一不同的是,固定定位永远参照于浏览器视口进行定位

粘滞定位(sticky)

粘滞定位的特点和相对定位基本一致

开启了定位后的水平布局和垂直布局特点

水平布局
left+margin-left+border-left+padding-left+width+padding-right+border-right+margin-right+right = 包含块的宽度

当开启了绝对定位以后:

  • 如果9个值中没有auto,则自动调整right以使等式满足
  • 如果有auto,则自动调整auto

可设置auto值:margin width left right

ps:因为left和right的值默认是auto,如果left和right未设置,等式不满足则会调整这两个值

垂直方向布局 top+margin-top/bottom+padding-top/bottom+margin-top/bottom+height = 包含块的高度

元素的层级(z-index)

  • 值越大层级越高,越优先显示
  • 如果元素层级一样,则优先显示靠下的元素
  • 祖先元素的层级再高,也不会盖住后代元素

flex布局

display: flex;//设置flex布局
注意:设置flex布局后,父元素和子元素的float、clear、vertical-align属性将失效,flex布局中,容器相当于父元素,项目相当于直接子元素

  • flex-direction:设置主轴方向,属性值有row(默认) row-reverse column column-reverse 主轴方向是可变化的,主轴确定好,另外一个则是侧轴\
    

flex-direction: row;
image.png
flex-direction:row-reverse;
image.png
flex-direction:column;

image.png
flex-direction:column-reverse;

image.png

  • justify-content:设置主轴上子元素排列方式(使用之前要确定好主轴方向)
    
  • flex-start 表示从头部开始,从左向右排列
  • flex-end 表示从尾部开始,元素尾部贴右边
  • center 在主轴居中对齐
  • space-around 平分剩余空间,每个项目的左外边距和右外边距都是一样大小的
  • space-between 先贴两边,再平分剩余空间
  • space-evenly 项目间等间距 justify-content: space-around; image.png
    justify-content: space-between; image.png
    justify-content: space-evenly; image.png\
  • flex-wrap:设置子元素是否换行
    
  • nowrap:不换行(默认)
  • wrap:换行
  •  align-items:设置侧轴子元素排列方式(单行)
    
  • flex-start:头部对齐。
  • flex-end:尾部对齐。
  • center:中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
  • align-conten:设置侧轴上子元素排列方式,只用用于子项目换行的情况(多行)
    
  • flex-start:起点对齐。
  • flex-end:终点对齐。
  • center:中点对齐。
  • space-between:两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。
  • flex-flowflex-direction flex-wrap;主轴和换行的简写
    

ps:以上都是容器的属性
项目属性:

  • flex 定义子项目分配剩余空间,用flex表示占多少份(flex属性是flex-grow, flex-shrink 和 flex-basis的简写)
  • order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0
  • flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大
  • flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小
  • flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间
  • align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性

背景设置

  • background-img
  • background-repeat 设置背景的重复方式
  •  repeat 默认值,沿X轴、Y轴两方向重复
    
  •  repeat-x 沿着x轴方向重复
    
  •  repeat-y 沿着y轴方向重复
    
  •  no-repeat 背景图片不重复
    
  • background-position 设置背景图片的位置
  • topleftbottomright、center (必须同时指定两个值)
    
  • background-clip 设置背景的范围
  • border-box 背景会出现在边框下边
    
  • padding-box 背景不会出现在边框,只出现在内容区和内边距区域
    
  • content-box 背景只会出现在内容区
    
  • background-origin 背景图片的偏移量计算的原点
  • paddding-box、content-box、border-box
    
  • background-size 设置背景图片的大小
  • 第一个值表示宽度,第二个值表示高度,如果只写一个,则第二个默认auto
  • contain 图片比例不变,将图片在元素中完整显示
    
  • cover 图片比例不变,将元素铺满
    
  • background-attachment 背景图片是否跟随元素移动
  • background 所有属性的简写 ps:background-size必须写在background-position后边(以这种形式background-position/background-size)
    background-origin需要写在background-clip的前面

表单

表单:用于将本地的数据提交给远程服务器

    <!-- 表单:用于将本地的数据提交给远程服务器 -->
    <!-- action表单提交的服务器地址 -->
    <form action="formsubmit.html">
        <!-- 文本框 -->
        文本框:<input type="text" name="text">
        <br></br>

        <!-- 提交按钮 value:用来指定按钮文字-->
        <input type="submit" name="submit" id="" value="注册">
        <input type="submit" name="submit" id="" >
        <br></br>

        <!-- 密码框 -->
        密码:<input type="password" name="pwd" id="">
        <br></br>

        <!-- 单选按钮 checked默认选中-->
        <!-- ps:像这种选择框必须指定一个value属性(用来辨别哪个选择框),value属性会作为用户填写的值传递到服务器 -->
        <input type="radio" name="radiobtn" id="" value="btn1">
        <input type="radio" name="radiobtn" id="" value="btn2" checked>
        <br></br>

        <!-- 多选框 -->
        <input type="checkbox" name="checkbox" value="test01">
        <input type="checkbox" name="checkbox" value="test02">
        <input type="checkbox" name="checkbox" value="test03">
        <br></br>

        <!-- 下拉列表 -->
        <select name="choose" id="">
            <option value="opt01">选项一</option>
            <option value="opt02">选项二</option>
            <option value="opt03">选项三</option>
        </select>

    </form>

表格

    <!-- align="center"表示表格居中显示 -->
    <table border="1" align="center">
        <!-- tr表示一行 -->
        <tr>
            <!-- th表示表格头部的单元格 -->
            <th>姓名</th>
            <th>年龄</th>
            <th>班级</th>
        </tr>
        <tr>
            <!-- td表示一个单元格 -->
            <td>小明</td>
            <td>18</td>
            <td>高二</td>
        </tr>
        <tr>
            <td>小红</td>
            <td>17</td>
            <td>高二</td>
        </tr>
        <tr>
            <td>小华</td>
            <td>19</td>
            <td>高二</td>
        </tr>
        <tr>
            <td></td>
            <!-- colspan横向合并   rowspan表示纵向合并 -->
            <td colspan="2">合计人数</td>
        </tr>
    </table>

<thead><tbody><tfoot>的使用

    <table class="tablepart" border="1" align="center">
        <!-- 使用这三部分,即使顺序打乱了,也还是表格的形式 头部还是头部,底部还是底部-->
        <thead>
            <th>头部</th>
            <th>头部</th>
        </thead>
        <tbody>
            <tr>
                <td>主体</td>
                <td>主体</td>
            </tr>
        </tbody>
        <tfoot>
            <tr>
                <td colspan="2">底部</td>
            </tr>
        </tfoot>
    </table>

表格样式设置

        table{
            width: 50%;
            /* 设置边框合并 */
            border-collapse:collapse ;
        }
        /* 隔行变色 */
        tr:nth-child(2n){
            background-color: aquamarine;
        }
        /*
        注意:如果表格未使用tbody,直接使用的tr,浏览器慧自动创建tbody,并且将tr都存到tbody中
        此时table就不是tr的父元素,table > tr 这种形式选择不到tr
        tbody才是tr的父元素 tbody > tr
        */
        .tablepart{
            margin-top: 100px;
            background-color: #bfa;

        }
        .tablepart td,th{
            height: 50px;
            /* vertical-align: middle; */
        }
        .tablepart tr td{
            /* 默认情况下,内容在td中是垂直居中的 */
            /* vertical-align: middle; */
            text-align: center;

        }
        .tablepart tfoot{
            background-color: antiquewhite;
            
        }