前端 - 笔记 - CSS - 移动Web【过渡 + 平面 / 空间转换 + 动画 + Flex + 移动适配(rem、vw、vh) + 响应式 + Grid】

436 阅读13分钟

壹、❗❗ 移动Web

一、过渡

transition: property duration timing-function delay;
	property        : 规定过渡效果所针对的CSS属性名称
	duration        : 规定过渡所需要的时间
	timing-function : 规定过渡的速度曲线
	linear          : 匀速
	ease            : 慢速开始,然后变快,慢速结束
  delay           : 规定过渡延迟多长时间开始执行

二、平面转换

  • 行内元素添加 transform 不生效
  • 添加 transform 属性的元素,优先级 高于 其他元素
  • 添加 transform 属性的元素不会影响其他盒子的位置

2.1 位移

  • 正负 百分比相对于盒子自身尺寸)、正负像素值
  • 如果只给 一个值,表示 x轴方向 移动的距离
  • ⚠ 添加 transform 属性的元素 不会影响 其他盒子的位置
    • margin 会影响其他盒子的位置
    • 定位不会影响其他元素的位置
transform: translate(水平移动距离, 垂直移动距离);
transform: translateX();
transform: trasnlateY();
  • 拓展
    • 子盒子在父盒子中居中(三种方法:定位+margin、定位+transform、flex[justify-content、align-items])
    • .son {
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%);  // 不影响其他盒子的位置
      }
      

2.2 旋转

取值为 ,则表示 顺时针 取值为 ,则表示 逆时针

transform: rotate(度数);
	正负度数(deg)
transform: translate() rotace(); --- 复合属性(旋转会改变坐标轴方向)
  • 拓展
    • 旋转原点
    • transform-origin: 原点水平位置 原点垂直位置;
      	像素单位数值
      	方位名词
      	百分比(参照盒子自身尺寸)
      

2.3 缩放

给盒子加scale,盒子里的一切都会跟着变化 不会影响其他盒子的位置

transform: scale(X轴缩放倍数, Y轴缩放倍数);
	scale > 1 =>放大,scale < 1 => 缩小
	scale 只有一个值表示 X,Y轴等比例缩放

2.4 渐变

background-image: linear-gradient(to方向,颜色1,颜色2, ... ,颜色n);
	transparent --- 透明
  • 拓展:
    • opacity --- 不透明度属性( 0[ 完全透明 ] <= opacity <=1[ 不透明 ] )
    • 对图像,颜色或者页面中的其他元素都有效
    • 给父元素设置 opacity ,所有的子元素都会继承 opacity 属性
    • 当 opacity=0 的时候,完全透明,但是元素还是会占据原来的位置

三、空间转换

3.1 空间位移

transform: translate3d(x, y, z);
transform: translateX();
transform: translateY();
transform: translateZ();   // Z轴的位移距离要依赖 透视属性 才能看见
	像素单位数值
	百分比

3.2 透视属性(添加给父级)

  • 子元素 具有 透视属性,**元素本身 **默认还是 平面元素
perspective: 800px~1200px(建议取值);

空间转换时,为元素添加 近大远小 的效果

3.3 空间旋转

  • 左手法则:
    • 左手握住旋转轴, 拇指指向正方向, 手指弯曲方向为旋转正方向
transform: rotate3d(x, y, z, 角度度数);	 // x, y, z --- x, y, z取值为 0~1 之间的数字  自定义一个旋转轴转动
transform: rotateX(值);
transform: rotateY(值);
transform: rotateZ(值);

3.4 立体呈现 (添加给父级)

  • 子元素 处于真正的 3D空间
transform-style: preserve-3d;
使子元素处于3d空间

3.5 空间缩放

transform: scale3d(x, y, z);
transform: scaleX(倍数);
transform: scaleY(倍数);
transform: scaleZ(倍数);

四、动画

4.1 定义动画

  1. 完成 --> 两个状态之间的变化
@keyframes 动画名称 {
  from {}
  to {}
}
  1. 完成 --> 多个状态间的变化
@keyframes 动画名称 {
  0% {}
  10% {}
  15% {}
   .
   .
   .
  100% {}		/* 这里的百分数表示这一段动画占总时间的多少 */
}
  • 如果盒子默认状态和动画开始状态一样,可以省略初始状态

4.2 使用动画

动画名称动画时间 必须 赋值 取值不分先后 如果有两个时间值,第一个表示 动画时长,第二个表示 延迟时间

animation: 动画名称 动画花费时长 速度曲线 延迟时间 重复次数 动画方向 执行完毕时的状态;
            infinite  --- 无限循环
            alternate --- 反向运动
            linear    --- 匀速 
            backwards --- 动画停留在最初的状态
            forwards  --- 动画停留在结束的状态
  • 拆分写法:image-20220908143942585
  • 拓展:
    • 逐帧动画
    • 速度曲线:steps(N),把动画的过程等分成N份(N与精灵图小图片个数相等)
    • animation: figure 1s infinite steps(12);
      
  • 能够使用 animation属性 给一个元素加多个动画
    animation: 动画1, 动画2, 动画N;
    
  • 拓展:暂停动画
    • animation-play-state: paused;
      

五、❗❗ Flex布局

逻辑分辨率(1X1)px = 物理分辨率(2X2)px 制作网页参考的是逻辑分辨率 视口标签作用(移动端):实现视口宽度与设备宽度保持一致,如果没有视口宽度标签,html的宽度是980px PC端视口 宽度为 设备的逻辑分辨率

  • 布局:
    • 百分比布局(流式布局)
      • 宽度自适应,高度固定
    • Flex布局(弹性布局)
      • 避免浮动脱标的问题(避免浮动布局中脱离文档流现象发生)
      • 组成:弹性容器(父元素)+ 弹性盒子(子盒子)
      • 弹性盒子默认沿着主轴排列主轴-水平方向 | 侧轴-垂直方向如果 弹性盒子 没有设置 宽度,它的 宽度 就是 内容 的 宽度。 如果 弹性盒子 没有设置 高度,或者取得是 stretch 属性值,它的 高度 就是 父元素 的 高度。 亲 父元素 开启 flex 布局,如果 子元素 是 行内元素 设置宽高 生效。

5.1 设置方式

给父元素添加 display: flex; (必须是紧挨着的上一级,亲父亲)
子元素可自动挤压或拉伸

在Flex布局模型中,调节主轴或侧轴的对齐方式来设置盒子之间的距离

5.2 主轴对齐方式(设置给弹性容器)

  • 单行 弹性盒子 对齐方式
justify-content: 属性值;
	flex-start		 ---  默认值,起点开始依次排序
	flex-end			 ---	终点开始,依次排序
	/* 常用 */
	center	       ---  沿主轴居中排序
	space-around   ---  弹性盒子沿主轴均匀排列,空白间距均分在弹性盒子两侧
	space-between  ---	弹性盒子沿主轴均匀排列,空白间距均分在相邻弹性盒子之间
	space-evenly   ---	弹性盒子沿主轴均匀排列,弹性盒子与容器之间间距相等

5.3 侧轴对齐方式(设置给弹性容器)

align-items: 属性值;
	flex-start	---  默认值,起点开始依次排序
	flex-end 		---	 终点开始依次排序
	/* 常用 */
	center			---  沿侧轴居中排列
	stretch	 		---	 默认值,弹性盒子沿着主轴线被拉伸至铺满容器(前提是弹性盒子本身没有设置高度)

5.4 控制弹性盒子在侧轴的对齐方式(设置给弹性盒子)

align-self: 属性值;
	flex-start	---  默认值,起点开始依次排序
	flex-end	  ---	 终点开始依次排序
	/* 常用  */
	center	    ---  沿侧轴居中排列
	stretch	    ---	 默认值,弹性盒子沿着主轴线被拉伸至铺满容器(前提是弹性盒子本身没有设置高度)

5.5 伸缩比(设置给弹性盒子)

使用 flex 属性修改弹性盒子伸缩比
flex: N;
     N(整数)-> 将父级剩余尺寸分成N份,该弹性盒子占用父级剩余尺寸的N份
占用父盒子剩余尺寸
  • 拓展:
    • 当弹性盒子太多时,弹性盒子默认不会换行,弹性容器会自动压缩弹性盒子(弹性盒子变形),想要不变形添加 flex-shrink 属性,属性值为 0
    • // 内容收缩的量 0表示不收缩
      // 给弹性盒子添加
      flex-shrink: 0;
      

5.6 Flex修改主轴方向(加给弹性容器)

指定了内部元素是如何在 flex 容器中布局的,定义了主轴的方向

flex-direction: 属性值;
	row	 					   ---  行,水平(默认值)
	column 					 ---  列,垂直		/* 常用 */
	row-reverse 		 ---  行,从右到左
	column-reverse   ---  列,从下到s			

5.7 弹性盒子换行(加给弹性容器)

flex-wrap: wrap;
默认值:nowrap  /* 不换行 */

5.8 调整行对齐方式(加给弹性容器)

  • 弹性盒子 换行 之后,行与行之间 的 对齐方式
align-content: 属性值;
		属性值和 justify-content 基本相同
		flex-start			---	 默认值,起点开始依次排序
		flex-end				---	 终点开始,依次排序
		/* 常用 */
		center					---  沿主轴居中排序
		space-around		---  弹性盒子沿主轴均匀排列,空白间距均分在弹性盒子两侧
		space-between		---	弹性盒子沿主轴均匀排列,空白间距均分在相邻盒子之间
		space-evenly   ---	弹性盒子沿主轴均匀排列,弹性盒子与容器之间间距相等

image-20220713121026900image-20220713121101525111.pngimage-20220713121458078.pngimage-20220713121407860

六、移动适配

网页元素的宽高都要随着设备的宽度等比缩放

6.1 rem

  • 相对单位 : rem单位 是 相对于 HTML标签的字号 计算结果 (网页的 根 是 html标签)
    • 1rem = 1html标签字号大小
    • 拓展:1em = 1个当前标签字体大小
  • 要使用 rem 就必须先给 根标签(html标签) 添加 font-size
  • 使用 rem 需要引入 flexble.js 文件

6.1.1 媒体查询

  • 设置差异化CSS样式
  • 媒体查询 能够 检测视口的宽度,然后编写差异化的CSS样式
  • 使用媒体查询,根据不同的视口宽度设置不一样的 根标签 字号
  • 语法:
    • @media (媒体特性) {
        选择器 {
          CSS属性
        }
      }
      
    • eg:
      <style>
          * {
             margin: 0;
             padding: 0;
          }
      
          /* @media (width: 375px) {
             html {
                font-size: 37.5px;
             }
          } */
      
          .box {
             display: flex;
             width: 10rem;
             height: 1rem;
             margin:  0 auto;
             background-color: skyblue;
          }
      
          .left {
             width: 5rem;
             height: 1rem;
             background-color: pink;
             font-size: 1rem;
             line-height: 1rem;
          }
      
          .right {
             width: 5rem;
             height: 1rem;
             background-color: green;
             font-size: 1rem;
             line-height: 1rem;
          }
      
          /* 320 <= width <= 720 */
          /* 视口宽度大于等于720的时候不变 */
          @media (min-width: 720px) {
             html {
                font-size: 72px !important;
             }
          }
      
          /* 视口宽度小于等于320的时候不变 */
          @media (max-width: 320px) {
             html {
                font-size: 32px !important;
             }
          }
      </style>
      
      
      <body>
         <div class="box">
            <div class="left">白日依山尽</div>
            <div class="right">黄河入海流</div>
         </div>
      
         <script src="./js/flexible.js"></script>
      </body>
      
  • 目前 rem 布局方案中,将 网页 等分10份HTML标签的字号视口宽度1/10
  • rem适配方案分析:
    • 设计稿:750px宽
      
      一、以px为单位
      
          1)在750px宽的设计稿中量数据,得到px数值  如:100px
          2)量出来的px数值写入样式代码中
          3)经过以上操作,就得到了 “样式文件A”,“样式文件A” 可以把页面宽度变成750px宽
      
          结论:那么得到的样式可以把页面变成750px宽
          
          问题1:页面的宽度会是多少?750px
          问题2:页面中宽度会跟随窗口的变化而变化吗?不会,因为设置的都是确切的px数值
      
          不合适
      
      二、把单位由px换成rem   “样式文件A”把页面变成10rem
      
          把设计稿宽度假设为10rem,即 750px=10rem,那么 1rem = 75px
          以此比例关系为准,把所有px都换成rem
      
          1)在750px宽的设计稿中量数据,得到px数值  如:150px
          2)将px数值转化为rem为单位,并设置到样式代码中  150/75 rem
              (把量出来的所有数值都除以75  把结果设置为rem单位)
      
          得到一套可以把页面变成10rem宽的样式 —— “样式文件A”
          结论:那么 “样式文件A” 可以把页面变成10rem宽
      
          问题1:页面的宽度是固定的像素宽度吗?不是  10rem
          问题2:页面的宽度受什么影响?html标签的字体大小影响
          问题3:页面宽度跟随HTML标签字体大小变化时,页面内容是都等比例变化?是
      
          终极目标:把页面(10rem)刚好放到移动端设备(10rem)中
      
      三、把设备设置为10rem宽   “样式文件B”把移动端设备变成10rem宽
      
          可以把html标签的字体大小设置为屏幕宽度的十分之一
              “媒体查询”、“javascript”
      
          通过媒体查询在不同设备宽度状态下设置HTML标签字体大小为屏幕宽度的10分之1
              “样式文件B”
      
      四、总结
      
          现状:
              页面被“样式文件A”设置为10rem宽    设备被“样式文件B”设置为10rem宽
          则:
              页面在设备中完美显示
      
      • 拓展:用户可拓展

      • <meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable">
        

6.2 vw / vh

  • 相对单位(相对视口的尺寸
  • vw 和 vh 不可以一起使用(全面屏)
1vw = 1/100 视口宽度
1vh = 1/100 视口高度

6.3 rem适配方案的做法

  • rem是相对与跟标签字号的大小,1rem是视口宽度的1/10;将视口宽度等分成10份,设置跟标签字号为1份,
  • 假如拿到的是375px的设计稿,将375等分成10份,一份就是37.5px,也就是1rem=37.5px,将再设计稿中量取的数据由px全部转换成rem单位(按照37.5:1的比例),这样设备宽度不再是固定的像素值,而是固定的10rem

6.4 vw/vh适配方案的做法

  • vw(vh)视口宽度的1/100(视口高度的1/10)
  • 假如拿到的是375px的设计稿,将375等分成100份,1vw=3.75px,安扎这个1/100的比例曲江设计稿中量取的数据全部转换成vw单位。

❌七、Less语法

  • Vs Code安装插件 Easy-LESS
    • less 是一个CSS预处理器,Less文件后缀是.less
  • 浏览器不识别Less代码,网页要引入对应的CSS文件
  • 使用Less语法
    • less 里面可以 定义变量、计算、嵌套、导入、导出
    • &不生成后代选择器,表示当前选择器,通常配合伪元素使用

7.1 变量

@width: 10px;
@height: @width + 10px;
#header {
  width: @width;
  height: @height;
}

编译为:
#header {
  width: 10px;
  height: 20px;
}

7.2 混合

混合(Mixin)是一种将一组属性从一个规则集包含(或混入)到另一个规则集的方法。假设我们定义了一个类(class)如下:

.bordered {
  border-top: dotted 1px black;
  border-bottom: solid 2px black;
}
如果我们希望在其它规则集中使用这些属性呢?没问题,我们只需像下面这样输入所需属性的类(class)名称即可,如下所示:

#menu a {
  color: #111;
  .bordered();
}

.post a {
  color: red;
  .bordered();
}
.bordered 类所包含的属性就将同时出现在 #menu a.post a 中了。(注意,你也可以使用 #ids 作为 mixin 使用。)

7.3 导入

导入文件名 必须要用 引号包裹 ,且以 分号结尾

如果导入的文件是 .less 扩展名,则可以将扩展名省略掉:
@import 'library'; // library.less
@import 'typo.css';

7.4 导出

// 不是注释 ,必须写

// out: ../a.css
// out: ./abc/

7.5 禁止导出

// 不是注释, 必须写 , 必须以 引号结尾

// out: false;

八、响应式

  • 随着屏幕大小的不同,有着不同的布局(同一套代码,适配不同的屏幕宽度)

8.1 媒体查询(核心)

  • 根据设备宽度的变化,设置差异化样式
语法:
@media (媒体特性) {
  选择器 {
    样式
  }
}
媒体特性常用方法:	max-width(从大到小写)
				 				min-width(从小到大写)

媒体查询完整写法(了解)

@media 关键词 媒体类型 (媒体特性) { CSS代码 }

link写法


<link rel="stylesheet" href="路径" media="(媒体特性)">

8.2 BootStrap前端UI框架

栅格系统

版心类名: .container 默认已被指定宽度且居中
.container-fluid , 所有应用该类名的盒子,宽度均为 100%
.row 自带 -15px 的间距

BootSrrap3 默认将网页分成12等份,默认将所有的视口分成四种

超小屏幕小屏幕中等屏幕大屏幕
响应断点(视口宽度)< 768px>= 768px>= 992px>= 1200px
别名xssmmdlg
容器宽度100%750px970px1170px
类前缀col-xs-*col-sm-*col-md-*col-lg-*
列数12121212
列间隙30px30px30px30px
 *  : 占12份里的几份
hidden - 屏幕状态
在指定屏幕状态下隐藏,其他屏幕状态下显示
/* 中屏 和 超小屏 隐藏 */
<span class="hidden-md hidden-xs"></span>

九、❗❗ 网格布局

网格容器 + 网格项目 + 网格轨道

9.1 开启网格布局

display: gird;
display: inline-gird;

9.2 网格轨道

9.2.1 设置列宽

grid-template-columns: ;
	取值:写每一列的宽度,中间用逗号隔开
	eg:
            /* 设置3列,第一列宽度100px,第二列宽度50px,第三列宽度60px */
            grid-template-columns: 100px, 50px, 60px; 

如果 每一列宽度相等,可以使用 repeat() 函数

grid-template-columns: repear(几列, 宽度);
eg:
    /* 设置3列,每一列的宽度是100px */
    grid-template-columns: repear(3, 100px);

9.2.2 设置行高

设置几行,每一行的高是多少

gird-template-rows: ;
	取值:写每一行的高度,中间用逗号隔开
	eg:
            /* 设置3行,第一行高度100px,第二行高度50px,第三行高度60px */
            grid-template-rows: 100px, 50px, 60px; 

如果 每一行高度相等,可以使用 repeat() 函数

grid-template-columns: repear(几行, 高度);
eg:
    /* 设置3行,每一行的高度是100px */
    grid-template-rows: repear(3, 100px);

9.3 网格项目之间的距离

grid-gap: 像素值;