【CSS】CSS3从入门到深入(复习查漏向


CSS3从入门到深入(复习查漏向

pre_section

CSS:层叠样式表,决定网页表现

网页为多层结构,CSS为每一层设置样式,最后显示最上一层

CSS语句 = 选择器 + 声明块


形式

  • 内联样式

    style="CSS语句"作为标签属性,仅本标签可以使用

  • 内部样式表

    head标签中使用style标签+CSS语句,仅当前文件可以使用

  • 外部样式表

    CSS语句作为独立文件,HTML需要使用时通过


常用选择器

  • 元素选择器

    根据标签选择元素,如,p{}、h1{}、div{}

  • id选择器

    根据id属性值选择元素,如,#key{}

  • 类选择器

    根据class属性选择元素,如,.key{}

  • 通配选择器

    全部元素,*{}

  • 属性选择器

    [attribute=value]attributevalue的元素

    [attribute^=value]attributevalue开头的元素

    [attribute$=value]attributevalue结尾的元素

    [attribute*=value]attribute含有value的元素

    xx[attribute],含有attributexx元素

复合选择器

  • 交集选择器

    div.classdiv标签的有class的元素

  • 分组选择器

    key1,key2多个选择器如果相同则组合

关系选择器(父子祖先关系

  • 子元素选择器

    div > span{}

  • 后代选择器

    div span{}

  • 兄弟选择器

    p + span{} p下一个span元素

    p ~ span{} p下面所有span元素

伪类选择器

:first-child 第一个且是某个标签的元素

:last-child 最后一个且是某个标签的元素

xx:only-child 选择xx是其他元素的唯一孩子

:nth-child(n,2n,2n+1,even,odd) 第n个且是某个标签的元素

相对元素的所有子元素中的指定位置

:first-of-type 第一个是某个标签的元素

xx xxx:only-of-type 选择xx内存在xxx唯一的元素

相对所有指定类型的指定位置

xx:empty 无后代的xx标签

xx:not(选择器kk)kk以外的xx元素

伪元素选择器

::first-letter 第一个字母

::first-line 第一行

::selection 选中部分

::before 元素开始,结合content属性

::after 元素结束,结合content属性

超链接选择器

a:link{} 链接未访问过的

a:visited{} 链接访问过的

a:hover{} 鼠标移入时

a:active{} 链接点击未释放时

建议顺序:LVHA

选择器练习

CSS Diner

选择器优先级

选择器 权重
内联样式 1000
id选择器 0100
类 伪类选择器 0010
元素选择器 0001
通配选择器 0000
继承样式

比较优先级时会将选择器权重累加,如div#id > #id,(但始终不会越级

同等优先级后者有效


声明块

长度单位

像素px固定像素点数,20px

百分比:相对于父元素属性的百分比

em$ \text(x)em = \text(x)*fontsize(父) px$

rem$ \text(x)em = \text(x)*fontsize() px$

颜色单位

颜色英文名:red···

RGB值:rgb(255,255,255)-白

RGBA值:rgb+不透明度rgb(255,255,255,255)

16进制:rgb16进制表示,#xxyyzz

HSL值:hsl(277,50%,50%),H:色相(0 - 360),S:饱和度(0% - 100%),L:亮度(0% - 100%)

盒子模型

CSS将任何元素视为矩形,盒子由内容区(content)、内边距(padding)、边框(border)、外边距(margin)

内容区widthheight决定

边框border-widthborder-colorborder-style

border-width :默认3px

border-color :默认黑色

border-style:线性solid、点状虚线dotted、线状虚线dashed、双线double

border: 10px red solid

内边距

边框内容区共同决定可见区大小,背景颜色会延伸至内边距上

padding: xx xx xx xx

外边距

margin-top
    - 上外边距,设置一个正值,元素会向下移动
margin-right
    - 默认情况下设置margin-right不会产生任何效果
margin-bottom
    - 下外边距,设置一个正值,其下边的元素会向下移动
margin-left
    - 左外边距,设置一个正值,元素会向右移动
margin - 类似于 padding
	- margin也可以设置负值,如果是负值则元素会向相反的方向移动

外边距不会影响盒子可见框的大小,margin会影响到盒子实际占用空间

水平布局

元素的水平方向的布局:
    元素在其父元素中水平方向的位置由以下几个属性共同决定
        margin-left
        border-left
        padding-left
        width
        padding-right
        border-right
        margin-right
一个元素在其父元素中,水平布局必须要满足以下的等式
margin-left+border-left+padding-left+width+padding-right+border-right+margin-right = 其父元素内容区的宽度 (必须满足)
 - 如果相加结果使等式不成立,则称为过度约束,则等式会自动调整
     - 调整的情况:
        - 如果这七个值中没有为 auto 的情况,则浏览器会自动调整margin-right值以使等式满足
     - 这七个值中有三个值和设置为auto
           width
           margin-left
           maring-right
     - 如果某个值为auto,则会自动调整为auto的那个值以使等式成立
      	  - 如果将一个宽度和一个外边距设置为auto,则宽度会调整到最大,设置为auto的外边距会自动为0
          - 如果将三个值都设置为auto,则外边距都是0,宽度最大
          - 如果将两个外边距设置为auto,宽度固定值,则会将外边距设置为相同的值

垂直布局

子元素是在父元素的内容区中排列的,
    如果子元素的大小超过了父元素,则子元素会从父元素中溢出
    使用 overflow 属性来设置父元素如何处理溢出的子元素
    可选值:
         visible 默认值 子元素会从父元素中溢出,在父元素外部的位置显示
         hidden 溢出内容将会被裁剪不会显示
         scroll 生成两个滚动条,通过滚动条来查看完整的内容
         auto 根据需要生成滚动条
    overflow: auto

margin折叠

垂直外边距的重叠(折叠)
    - 相邻的垂直方向外边距会发生重叠现象
        - 兄弟元素
          - 兄弟元素间的相邻垂直外边距会取两者之间的较大值(两者都是正值)
          - 特殊情况:
              如果相邻的外边距一正一负,则取两者的和
              如果相邻的外边距都是负值,则取两者中绝对值较大的
        - 父子元素
          - 父子元素间相邻外边距,子元素的会传递给父元素(上外边距)

行内元素盒模型

行内元素的盒模型
   - 行内元素不支持设置宽度和高度
   - 行内元素可以设置padding,但是垂直方向padding不会影响页面的布局
   - 行内元素可以设置border,垂直方向的border不会影响页面的布局
   - 行内元素可以设置margin,垂直方向的margin不会影响布局

display 用来设置元素显示的类型
    可选值:
        inline 将元素设置为行内元素
        block 将元素设置为块元素
        inline-block 将元素设置为行内块元素 
                行内块,既可以设置宽度和高度又不会独占一行
        table 将元素设置为一个表格
        none 元素不在页面中显示

visibility 用来设置元素的显示状态
    可选值:
        visible 默认值,元素在页面中正常显示
        hidden 元素在页面中隐藏 不显示,但是依然占据页面的位置

box-sizing 盒子大小

默认情况下,盒子可见框的大小由内容区、内边距和边框共同决定
	box-sizing 用来设置盒子尺寸的计算方式(设置width和height的作用)
        可选值:
            content-box 默认值,宽度和高度用来设置内容区的大小
            border-box 宽度和高度用来设置整个盒子可见框的大小
                width 和 height 指的是内容区 和 内边距 和 边框的总大小
                	即 width*height就是整个盒子大小

盒子轮廓圆角及阴影

轮廓:

outline 用来设置元素的轮廓线,用法和border一模一样
    轮廓和边框不同的点,就是轮廓不会影响到可见框的大小  

阴影:

box-shadow 用来设置元素的阴影效果,阴影不会影响页面布局 
	box-shadow: 10px 10px 10px 颜色
    第一个值 水平偏移量 设置阴影的水平位置 正值向右移动 负值向左移动
    第二个值 垂直偏移量 设置阴影的水平位置 正值向下移动 负值向上移动
    第三个值 阴影的模糊半径
    第四个值 阴影的颜色

圆角:

border-radius: 用来设置圆角 圆角设置的圆的半径大小
border-top-left-radius:  
border-top-right-radius 
border-bottom-left-radius:  
border-bottom-right-radius:  
border-top-left-radius:50px 100px; 
   border-radius 可以分别指定四个角的圆角
       四个值 左上 右上 右下 左下
       三个值 左上 右上/左下 右下 
       两个个值 左上/右下 右上/左下   
border-radius: 20px / 40px;    设置椭圆  //横向 - 纵向
将元素设置为一个圆形 
border-radius: 50%;

浮动

通过浮动可以使一个元素向其父元素的左侧或右侧移动
    使用 float 属性来设置于元素的浮动
        可选值:
            none 默认值 ,元素不浮动
            left 元素向左浮动
            right 元素向右浮动
    注意,元素设置浮动以后,水平布局的等式便不需要强制成立
        元素设置浮动以后,会完全从文档流中脱离,不再占用文档流的位置,
            所以元素下边的还在文档流中的元素会自动向上移动
    浮动的特点:
        1、浮动元素会完全脱离文档流,不再占据文档流中的位置
        2、设置浮动以后元素会向父元素的左侧或右侧移动,
        3、浮动元素默认不会从父元素中移出
        4、浮动元素向左或向右移动时,不会超过它前边的其他浮动元素
        5、如果浮动元素的上边是一个没有浮动的块元素,则浮动元素无法上移
        6、浮动元素不会超过它上边的浮动的兄弟元素,最多最多就是和它一样高 

脱离文档流的特点:
    块元素:
        1、块元素不在独占页面的一行
        2、脱离文档流以后,块元素的宽度和高度默认都被内容撑开
    行内元素:
        行内元素脱离文档流以后会变成块元素,特点和块元素一样
    另外,CSS貌似默认会将字体独立出来,效果同块元素特性
可结合上图分析

浮动的高度坍塌及BFC

高度塌陷的问题:

在浮动布局中,父元素的高度默认是被子元素撑开的,
    当子元素浮动后,其会完全脱离文档流,子元素从文档流中脱离
    将会无法撑起父元素的高度,导致父元素的高度丢失
  父元素高度丢失以后,其下的元素会自动上移,导致页面的布局混乱 

BFC(Block Formatting Context) 块级格式化环境

- BFC是一个CSS中的一个隐含的属性,可以为一个元素开启BFC
   开启BFC该元素会变成一个独立的布局区域
- 元素开启BFC后的特点:
   1.开启BFC的元素不会被浮动元素所覆盖
   2.开启BFC的元素子元素和父元素外边距不会重叠
   3.开启BFC的元素可以包含浮动的子元素
- 可以通过一些特殊方式来开启元素的BFC:
   1、设置元素的浮动(不推荐)
   2、将元素设置为行内块元素(不推荐)
   3、将元素的overflow设置为一个非visible的值
	  - 常用的方式 为元素设置 overflow:hidden 开启其BFC 以使其可以包含浮动元素

clear

如果我们不希望某个元素因为其他元素浮动的影响而改变位置,
    可以通过clear属性来清除浮动元素对当前元素所产生的影响
clear
    - 作用:清除浮动元素对当前元素所产生的影响
    - 可选值:
        left 清除左侧浮动元素对当前元素的影响
        right 清除右侧浮动元素对当前元素的影响
        both 清除两侧中最大影响的那侧
    原理:
        设置清除浮动以后,浏览器会自动为元素添加一个上外边距,
            以使其位置不受其他元素的影响

防止高度坍塌的最优法

高度塌陷块选择器::after{
    content: '';
    clear: both;
    display: block;
}
// 推荐-经典
.clearfix::before,
.clearfix::after{
    content: '';
    display: table;
    clear: both;
}
只需在需要防止度塌陷和外边距重叠的元素加上这个类 - clearfix

定位-position

定位(position)
    - 定位是一种更加高级的布局手段
    - 通过定位可以将元素摆放到页面的任意位置
    - 使用position属性来设置定位
        可选值:
            static 默认值,元素是静止的没有开启定位
            relative 开启元素的相对定位
            absolute 开启元素的绝对定位
            fixed 开启元素的固定定位
            sticky 开启元素的粘滞定位
偏移量(offset)
	left - right - top - bottom

相对定位

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

包含块

包含块( containing block )
    - 正常情况下:
        包含块就是离当前元素最近的祖先块元素
    - 绝对定位的包含块:
        包含块就是离它最近的开启了定位的祖先元素,
            如果所有的祖先元素都没有开启定位则根元素就是它的包含块
    - html(根元素、初始包含块)

绝对定位

绝对定位: position: absolute;
    -绝对定位的特点:
       1.开启绝对定位后,如果不设置偏移量元素的位置不会发生变化
       2.开启绝对定位后,元素会从文档流中脱离
       3.绝对定位会改变元素的性质,行内变成块,块的宽高被内容撑开
       4.绝对定位会使元素提升一个层级
       5.绝对定位元素是相对于其包含块进行定位的

固定定位

固定定位: position: fixed;
    - 固定定位也是一种绝对定位,所以固定定位的大部分特点都和绝对定位一样
        唯一不同的是固定定位永远参照于浏览器的视口进行定位
        固定定位的元素不会随网页的滚动条滚动

粘滞定位

粘滞定位: position: sticky;
    - 粘滞定位和相对定位的特点基本一致,
        不同的是粘滞定位可以在元素到达某个位置时将其固定
如:
 	position: sticky;
 	top: 10px;

定位下布局规则

水平布局
	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
- 因为left 和 right的值默认是auto,所以如果不指定left和right
    则等式不满足时,会自动调整这两个值
垂直方向布局的等式的也必须要满足
    top + margin-top/bottom + padding-top/bottom + border-top/
bottom + height = 包含块的高度

定位下层级

对于开启了定位元素,可以通过z-index属性来指定元素的层级
    z-index需要一个整数作为参数,值越大元素的层级越高
        元素的层级越高越优先显示
    如果元素的层级一样,则优先显示靠下的元素
    祖先的元素的层级再高也不会盖住后代元素

字体-font

color 字体颜色
font-size 字体大小
    相关单位
    em 相当于当前元素的一个font-size
    rem 相对于根元素的一个font-size
font-family 字体族(字体的格式)
        serif  衬线字体
        sans-serif 非衬线字体
        monospace 等宽字体
            - 指定字体的类别,浏览器会自动使用该类别下的字体
    - font-family 可以同时指定多个字体,多个字体间使用,隔开
        字体生效时优先使用第一个,第一个无法使用则使用第二个 以此类推
===========================
@font-face {
    /* 指定字体的名字 */
    font-family:'myfont' ;
    /* 服务器中字体的路径 */
    src: url('···'); //format("truetype")
}
引用: font-family: myfont;
line height
- 行高指的是文字占有的实际高度
- 可以通过line-height来设置行高
    行高可以直接指定一个大小(px em)
    也可以直接为行高设置一个整数
        如果是一个整数的话,行高将会是字体的指定的倍数
- 行高经常还用来设置文字的行间距
    行间距 = 行高 - 字体大小
字体框
    - 字体框就是字体存在的格子,设置font-size实际上就是在设置字体框的高度
行高会在字体框的上下平均分配

font: font-weight font-style font-size/font-height font-family

font-weight 字重 字体的加粗 
 可选值:
     normal 默认值 不加粗
     bold 加粗
     100-900 九个级别 ···
font-style 字体的风格
    normal 正常的
    italic 斜体 ···

文本

text-align 文本的水平对齐
    可选值:
        left 左侧对齐
        right 右对齐
        center 居中对齐
        justify 两端对齐
vertical-align 设置元素垂直对齐的方式(子元素相对父元素
    可选值:
        baseline 默认值 基线对齐
        top 顶部对齐
        bottom 底部对齐
        middle 居中对齐
img{
    vertical-align: !baseline; //消除底部缝隙
}
text-decoration 设置文本修饰
    可选值:
        none 什么都没有
        underline 下划线
        line-through 删除线
        overline 上划线
text-decoration: overline red dotted;
white-space 设置网页如何处理空白
    可选值:
        normal 正常
        nowrap 不换行
        pre 保留空白
overflow: hidden;
text-overflow: ellipsis;

背景

background-color 设置背景颜色
background-image 设置背景图片 
    - 可以同时设置背景图片和背景颜色,这样背景颜色将会成为图片的背景色
    - 如果背景的图片小于元素,则背景图片会自动在元素中平铺将元素铺满
    - 如果背景的图片大于元素,将会一个部分背景无法完全显示
    - 如果背景图片和元素一样大,则会直接正常显示
background-repeat 用来设置背景的重复方式
    可选值:
        repeat 默认值 , 背景会沿着x轴 y轴双方向重复
        repeat-x 沿着x轴方向重复
        repeat-y 沿着y轴方向重复
        no-repeat 背景图片不重复
background-position 用来设置背景图片的位置
    设置方式:
        通过 top left right bottom center 几个表示方位的词来设置背景图片的位置
            使用方位词时必须要同时指定两个值,如果只写一个则第二个默认就是center
        通过偏移量来指定背景图片的位置:
            水平方向的偏移量 垂直方向变量
background-clip 
    可选值:
        border-box 默认值,背景会出现在边框的下边
        padding-box 背景不会出现在边框,只出现在内容区和内边距
        content-box 背景只会出现在内容区
background-origin 背景图片的偏移量计算的原点
        padding-box 默认值,background-position从内边距处开始计算
        content-box 背景图片的偏移量从内容区处计算
        border-box 背景图片的变量从边框处开始计算
background-size 设置背景图片的大小
    第一个值表示宽度 
    第二个值表示高度
    - 如果只写一个,则第二个值默认是 auto
    cover 图片的比例不变,将元素铺满
    contain 图片比例不变,将图片在元素中完整显示
===========================
background-color
background-image
background-repeat
background-position
background-size
background-origin
background-clip
background-attachment
- backgound 背景相关的简写属性,所有背景相关的样式都可以通过该样式来设置
    并且该样式没有顺序要求,也没有哪个属性是必须写的
    注意:
        background-size必须写在background-position的后边,并且使用/隔开
            background-position/background-size
        background-origin background-clip 两个样式 ,orgin要在clip的前边

渐变

线性渐变

linear-gradient()
linear-gradient(red,yellow) 红色在开头,黄色在结尾,中间是过渡区域
- 线性渐变的开头,我们可以指定一个渐变的方向
    to left
    to right
    to bottom
    to top
    deg deg表示度数
    turn 表示圈
- 渐变可以同时指定多个颜色,多个颜色默认情况下平均分布,
    也可以手动指定渐变的分布情况
repeating-linear-gradient() 可以平铺的线性渐变
// 例:
background-image: linear-gradient(red,yellow,#bfa,orange);
background-image: linear-gradient(red 50px,yellow 100px, green 120px, orange 200px);
background-image: repeating-linear-gradient(to right ,red, yellow 50px);

径向渐变

radial-gradient(大小 at 位置, 颜色 位置 ,颜色 位置 ,颜色 位置)
    大小:
        circle 圆形
        ellipse 椭圆
        closest-side 近边	
        closest-corner 近角
        farthest-side 远边
        farthest-corner 远角
    位置:
        top right left center bottom
//background-image: radial-gradient(farthest-corner at 100px 100px, red , #bfa)

表格样式

border-spacing: 指定边框之间的距离
border-spacing: 0px;
border-collapse: collapse; 设置边框的合并

如果表格中没有使用tbody而是直接使用tr,
    那么浏览器会自动创建一个tbody,并且将tr全都放到tbody中
    tr不是table的子元素
// 如:
tbody > tr:nth-child(odd){
    background-color: #bfa;
}

过渡(transition)

- 通过过渡可以指定一个属性发生变化时的切换方式
- 通过过渡可以创建一些非常好的效果,提升用户的体验
transition-property: 指定要执行过渡的属性  
   多个属性间使用,隔开 如:transition-property: height , width;
   如果所有属性都需要过渡,则使用all关键字
   大部分属性都支持过渡效果,注意过渡时必须是从一个有效数值向另外一个有效数值进行过渡(ps: auto -> xx 过渡失效)
transition-duration: 指定过渡效果的持续时间
transition-timing-function: 过渡的时序函数
   指定过渡的执行的方式  
   可选值:
       ease 默认值,慢速开始,先加速,再减速
       linear 匀速运动
       ease-in 加速运动
       ease-out 减速运动
       ease-in-out 先加速 后减速
       cubic-bezier() 来指定时序函数
           https://cubic-bezier.com
       steps() 分步执行过渡效果
           可以设置第二个值:
               end , 在时间结束时执行过渡(默认值)
               start , 在时间开始时执行过渡
transition-delay: 过渡效果的延迟,等待一段时间后在执行过渡
transition 可以同时设置过渡相关的所有属性,只有一个要求,如果要写延迟,则两个时间中第一个是持续时间,第二个是延迟
           例:transition:2s margin-left 1s cubic-bezier(.24,.95,.82,-0.88);

动画

动画和过渡类似,都可以实现动画效果
    不同的是过渡需要在某个属性发生变化时才会触发
    动画可以自动触发动态效果
# 关键帧   
  设置动画效果,必须先要设置一个关键帧,关键帧设置了动画执行每一个步骤
例:
@keyframes test {
    /* from表示动画的开始位置 也可以使用 0% */
    from{
        margin-left: 0;
        background-color: orange;
    } 
    /* to动画的结束位置 也可以使用100%*/
    to{
        background-color: red;
        margin-left: 700px;
    }
}
# 给元素设置动画
animation-name: 要对当前元素生效的关键帧的名字
animation-duration: 动画的执行时间
animation-delay: 动画的延时
animation-timing-function: ease-in-out; 同过渡时序函数
animation-iteration-count:(n 次数|infinite 无限执行) 动画执行的次数
animation-direction 指定动画运行的方向
    可选值:
      normal 默认值  从 from 向 to运行 每次都是这样 
      reverse 从 to 向 from 运行 每次都是这样 
      alternate 从 from 向 to运行 重复执行动画时反向执行
      alternate-reverse 从 to 向 from运行 重复执行动画时反向执行
animation-play-state: 设置动画的执行状态 
    可选值:
        running 默认值 动画执行
        paused 动画暂停
animation-fill-mode: 动画的填充模式
    可选值:
        none 默认值 动画执行完毕元素回到原来位置
        forwards 动画执行完毕元素会停止在动画结束的位置
        backwards 动画延时等待时,元素就会处于开始位置
        both 结合了forwards 和 backwards
animation: name duration timing-function delay iteration-count direction fill-mode;

变形

变形指通过CSS来改变元素的形状或位置
    - 变形不会影响到页面的布局,不会脱离文档流
transform 设置元素的变形效果
  - 平移:
      translateX() 沿着x轴方向平移
      translateY() 沿着y轴方向平移
      translateZ() 沿着z轴方向平移
          - 平移元素,百分比是相对于自身计算的
      - z轴平移,调整元素在z轴方向的位置,z轴平移属于立体效果(近大远小),默认情况下网页不支持透视,
      	可以通过设置网页的视距呈现效果,
      	/* 设置当前网页的视距为800px,即人眼距离网页的距离 */
	    perspective: 800px;
  - 旋转:使元素沿着 x y 或 z 旋转指定的角度
      rotateX()、rotateY()、rotateZ()
      	`n`deg `n`turn
      transform: rotateY(180deg) translateZ(400px);  先转后平移
      transform: translateZ(400px) rotateY(180deg);  先平移后转
  - 缩放:对元素进行缩放
  	  scaleX() 水平方向缩放
	  scaleY() 垂直方向缩放
	  scale() 双方向的缩放
	  transform-origin: 20px 20px; 变形的原点
	  	  默认:center

CSS预处理-less

# css原生也支持变量的设置
/* html根元素样式中设置变量 */
html{
   --color:#ff0;
   --length:200px;
}
变量使用:
/* calc()计算函数 */
width: calc(200px*2);
height: var(--length);
background-color: var(--color);
/* css原生变量设置兼容性差 */
# less是一门css的预处理语言
    - less是一个css的增强版,通过less可以编写更少的代码实现更强大的样式
    - 在less中添加了许多的新特性:像对变量的支持、对mixin的支持... ...
    - less的语法大体上和css语法一致,但是less中增添了许多对css的扩展,
        所以浏览器无法直接执行less代码,要执行必须向将less转换为css,然后再由浏览器执行

less语法

# 直接利用层级关系
body{
    width: 100px;
    height: 100px;
    div{
        color: red;
    }
    > .box{}
    &:hover{} // &表示外层父元素名字,这里即 &=body
    
}
# 注释
/**/ 会被解析到css文件中
// less注释,不会解析到css文件中
# 变量
@color: red;
.box{
    color: @color;
}
@classname: boxclass;
.@{classname}{
    background-image: url("@{name}···");
}
div{
    width: 300px;
    height: $width;
}
# extend 扩展
.p1{
    width: 100px;
    height: 200px;
}
//:extend() 对当前选择器扩展指定选择器的样式(选择器分组)
.p2:extend(.p1){
    color: red;
}
# mixin 混合
.p3{
    //直接对指定的样式进行引用,这里就相当于将p1的样式在这里进行了复制
    //mixin 混合
    .p1();
}
// 在选择器后边添加一个括号,这时我们就创建了一个mixins:混合函数
.p4(){
    width: 100px;
    height: 100px;
}
.p5{
    .p4;
}
//混合函数 在混合函数中可以直接设置变量
.test(@w:100px,@h:200px,@bg-color:red){
    width: @w;
    height: @h;
    border: 1px solid @bg-color;
}
div{
    //调用混合函数,按顺序传递参数
    // .test(200px,300px,#bfa);
    .test(300px);
    // .test(@bg-color:red, @h:100px, @w:300px);
}
// less内部定义好的原生函数 ···
span{
    color: average(red,blue);
}
span:hover{
    background-color: darken(#bfa,50%);
}
# 运算
  - 在less中所有的数值都可以直接进行运算( + - * / )
width: 100px + 100px;
height: 100px/2;
# 导入less进行合并
  - import用来将其他的less引入到当前的less
@import "xxx.less";
# 配置less.map.css
  - 将以下文件写入less配置文件settings.json中
"editor.minimap.enabled": true,
"less.compile": {
    "compress": true, // true => remove surplus whitespace
    "sourceMap": true, // true => generate source maps (.css.map files)
    "out": true // false => DON'T output .css files (overridable per-file, see below)
}

flex-弹性盒

pre

flex是CSS3新的布局手段,兼容性比浮动差,但减少了很多浮动带来的问题
但随着微软首先提出放弃IE支持,相信以后前端会紧跟这种趋势,flex会用的越来越多

简介

flex使元素具有弹性,让元素可以跟随页面的大小的改变而改变
- 弹性容器
    - 要使用弹性盒,必须先将一个元素设置为弹性容器
    - 我们通过 display 来设置弹性容器
        display:flex  设置为块级弹性容器
        display:inline-flex 设置为行内的弹性容器
- 弹性元素
    - 弹性容器的子元素是弹性元素(弹性项)
    - 弹性元素可以同时是弹性容器

属性

# flex-direction 指定容器中弹性元素的排列方式
 可选值:
     row 默认值,弹性元素在容器中水平排列(左向右)
         - 主轴 自左向右
     row-reverse 弹性元素在容器中反向水平排列(右向左)
         - 主轴 自右向左
     column 弹性元素纵向排列(自上向下)
     column-reverse 弹性元素方向纵向排列(自下向上)
 主轴:
     弹性元素的排列方向称为主轴
 侧轴:
     与主轴垂直方向的称为侧轴
# flex-grow 指定弹性元素的增长系数
- 当父元素有多余空间的时,子元素如何伸展
- 父元素的剩余空间,会按照比例进行分配
# flex-shrink 指定弹性元素的收缩系数
- 当父元素中的空间不足以容纳所有的子元素时,如果对子元素进行收缩
# flex-wrap: 
 设置弹性元素是否在弹性容器中自动换行
 可选值:
     nowrap 默认值,元素不会自动换行
     wrap 元素沿着辅轴方向自动换行
     wrap-reverse 元素沿着辅轴反方向换行
# flex-flow:  wrap 和 direction 的简写属性
  - flex-flow: row wrap;
# justify-content(主轴
    - 如何分配主轴上的空白空间(主轴上的元素如何排列)
    - 可选值:
        flex-start 元素沿着主轴起边排列
        flex-end 元素沿着主轴终边排列
        center 元素居中排列
        space-around 空白分布到元素两侧
        space-between 空白均匀分布到元素间
        space-evenly 空白分布到元素的单侧
# align-items(辅轴
   - 元素在辅轴上如何对齐
   - 元素间的关系
       - 可选值:
           stretch 默认值,将元素的长度设置为相同的值
           flex-start 元素不会拉伸,沿着辅轴起边对齐
           flex-end 沿着辅轴的终边对齐
           center 居中对齐
           baseline 基线对齐
# align-content: 辅轴空白空间的分布,属性类比justify-content
# align-self: 用来覆盖当前弹性元素上的align-items
# flex-basis 指定的是元素在主轴上的基础长度
    如果主轴是 横向的 则 该值指定的就是元素的宽度
    如果主轴是 纵向的 则 该值指定的是就是元素的高度
    - 默认值是 auto,表示参考元素自身的高度或宽度
    - 如果传递了一个具体的数值,则以该值为准
# flex 可以设置弹性元素所有的三个样式
    flex 增长 缩减 基础;
        initial "flex: 0 1 auto".
        auto  "flex: 1 1 auto"
        none "flex: 0 0 auto" 弹性元素没有弹性
# order 决定弹性元素的排列顺序

移动端适配

pre

# 分辨率:1920 x 1080 屏幕中像素点的数量
# 物理像素,上述所说的点就属于物理像素
# CSS像素,编写网页时,我们所用像素都是CSS像素
  - 浏览器在显示网页时,需要将CSS像素转换为物理像素然后再呈现
  - 一个css像素最终由几个物理像素显示,由浏览器决定:
      默认情况下在pc端,一个css像素 = 一个物理像素
# 视口(viewport)
    - 视口就是屏幕中用来显示网页的区域
    - 可以通过查看视口的大小,来观察CSS像素和物理像素的比值
   例 - 默认情况下:
        视口宽度 1920px(CSS像素)
                1920px(物理像素)
                - 此时,css像素和物理像素的比是 1:1
      - 放大两倍的情况:
        视口宽度 960px(CSS像素)
                1920px(物理像素)
                - 此时,css像素和物理像素的比是1:2
      - 我们可以通过改变视口的大小,来改变CSS像素和物理像素的比值

完美适配

每一款移动设备设计时,都会有一个最佳的像素比
https://material.io/resources/devices/
设置视口大小 device-width表示设备的(完美视口)宽度

# vm、vh
100vw = 一个视口的宽度
1vw = 1%视口宽度
# rem
1 rem = 1 html的字体大小

响应式布局-RWD

RWD - 即网页可以根据不通的设备或窗口大小呈现出不同的效果
      网页在不同设备上会响应式布局以呈现出最好的视觉效果。
# 媒体查询 
   语法: @media 查询规则{}
       媒体类型:
           all 所有设备
           print 打印设备
           screen 带屏幕的设备
           speech 屏幕阅读器
           - 可以使用,连接多个媒体类型,这样它们之间就是一个或的关系
       可以在媒体类型前添加一个only,表示只有。
           only的使用主要是为了兼容一些老版本浏览器
# 媒体特性:
   width 视口的宽度
   height 视口的高度
   min-width 视口的最小宽度(视口大于指定宽度时生效)
   max-width 视口的最大宽度(视口小于指定宽度时生效)

网格系统

# 设置
display: grid|inline-grid;
# 属性
网格列(Grid Columns)
网隔行(Grid Rows)
网格间隙(Grid Gaps)
 - 设置网格间隙
grid-column-gap
grid-row-gap
grid-gap
网格行(Grid Lines)
 - 设置网格元素大小范围
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 3;
 - 定义网格布局中的列数,并可定义每列的宽度
grid-template-columns
 - 定义每列的高度
grid-template-rows
 - 在容器内对齐整个网格
justify-content
 - 垂直对齐容器内的整个网格
align-content
 - 将元素放置在哪些列上
grid-column
    - grid-column: 1 / 5;  第 1 列开始并在第 5 列之前结束
    - grid-column: 1 / span 3;  第 1 列开始,并跨越 3 列
grid-row 同 grid-column
grid-area: grid-row-start、grid-column-start、grid-row-end 和 grid-column-end 属性的简写属性。
    - grid-area: 1 / 2 / 5 / 6;
grid-area/grid-template-area 命名网格项
    - grid-area: myArea;
    - grid-template-areas: 'myArea myArea myArea myArea myArea';
    - grid-template-areas: 'myArea myArea . . .';
    - grid-template-areas:
    	'header header header header header header'
    	'menu main main main right right'
    	'menu footer footer footer footer footer';
元素顺序
grid-area: 1 / 3 / 2 / 4; row-start/column-start/row-end/column-end

计数器

counter-reset - 创建或重置计数器
counter-increment - 递增计数器值
content - 插入生成的内容
counter() 或 counters() 函数 - 将计数器的值添加到元素

示例

# example-1
body {
  counter-reset: section;
}
h1::before {
  counter-increment: section;
  content: "Section " counter(section) ": ";
}

嵌套计数器

body {
  counter-reset: section;
}
h1 {
  counter-reset: subsection;
}
h1::before {
  counter-increment: section;
  content: "Section " counter(section) ". ";
}
h2::before {
  counter-increment: subsection;
  content: counter(section) "." counter(subsection) " ";
}
# 为页面(section)创建一个计数器,为每个 

元素(subsection)创建一个计数器。