文档流 (normal flaw)
正常文档流方向:从左至右,从上至下
inline元素(内联元素)
流动方向:从左到右,到达最右边才会换行(遇到行尾可一个元素占两行)
宽度:由内联元素的总和决定,设置宽高不生效
高度:由line-height间接决定,跟height无关(字体也会影响它的高度,涉及行盒)
例:文本格式化标签、a、span
block元素(块级元素)
流动方向:从上到下,每一个元素都另起一行
宽度:默认(auto)自动计算宽度,由其内的文档流决定
高度:由内部文档流元素决定,设置宽高生效
例:h1-6、p、div、ul、ol、dl、dd、dt、li
inline-block元素(行内块元素)
流动方向:从左到右 (遇到行尾不会一个元素占两行)
宽(高)度:结合inline和block特点,设置宽高生效
例:input、button、img
脱离文档流 (容器的高度不加脱离文档流元素的高度)
绝对定位:position:absolute/fixed
浮动:float
转换
以上三种元素可互相转换:display:inline/block/inline-block
注意:
一般不写width:100%,容易有bug
不能在inline元素内嵌套block元素
内容溢出解决方法:(当内容的宽度或高度大于容器)
overflow:hidden; 直接隐藏了超出范围的内容
overflow:visible; 是直接显示溢出部分
overflow:scroll; 永远显示(可滑动滚动条查看所有内容,即使内容没有溢出也有滚动条)
overflow:auto; 可灵活设置(内容溢出时可滑动滚动条查看所有内容(内容无溢出时不显示滚动条),若文档流内的某个人元素过于宽了,会显示x轴的滚动条,但是文档流内的内容显示不会发生改变,它只会显示第一屏的内容。(overflow可以分为overflow-x和overflow-y))
盒模型
-
content-box(内容盒):内容就是盒子的边界
content-box width=内容宽度 只包含content,不包含border
-
border-box(边框盒):
border-box width=内容宽度+padding+border 包含border、padding和content
-
外边距合并(上下合并)原则:
1.兄弟合并:两个元素之间的上下外边距会合并(两个同级元素,1设置了margin-bottum为10px,2设置了margin-top为10px;但是他们之间的距离还是10px)
取消兄弟合并:display:inline-block
2.父子合并:第一个元素和最后一个元素会跟他们的父元素外边距合并,以值大的为准
取消父子合并:
-
在父元素上加overflow:hidden挡住 -
在父元素上加padding/border挡住 -
使用display:flex;
基本单位
- 长度单位
- px:像素
- em:相对于自身font-size的倍数
- 百分数
- 整数
- rem:代表根元素(通常为元素)的font-size大小
- vw:视口的最初有块的宽度的 1%
- vh: 视口的初始拥有块的高度的1%
- 颜色
- 十六进制#FF6600或者#F60
- RGBA 颜色 rgb(红,绿,蓝) ,rgba(红,绿,蓝,透明度)
- hsl颜色(色相,饱和度,亮度), hsla颜色(色相,饱和度,亮度,透明度)
css布局知识
1.两种布局
-
固定宽度,一般960/1000/1024(px)
-
不固定宽度布局,主要靠文档流的原理布局
2.第三种布局
- 响应式布局,它是一种混合布局,pc上固定宽度,手机上不固定宽度
3.布局思路
-
从小到大(先定下整体布局,再完善局部)
-
从小到大(先完成局部,然后组合成大布局)
如何选择用那种布局呢?
float布局
-
在子元素加上float和width
-
在父元素上加上clearfix .clearfix:after{content:' ';display : block; clear: both;}(一定要加)
-
border有时候会干扰布局,直接将border:改成outline:
-
块级元素居中:
margin: 0 auto;(容易出现bug) margin-left: auto;margin-right: auto;(更好!)
3.平均布局:解决最后一个元素乱跑的问题,用负margin
flex布局
cotainer 容器 (以下是用在容器上的属性)
让一个元素变成container:display:flex / display:inline-flex;
主轴(默认横轴)
- flex-direction (定义主轴流动方向)取值:
- row 横向,从左至右,顺序
- row-reverse 横向,从右至左,倒序
- column 纵向,从上至下,顺序
- column-reverse 纵向,从下至上,倒序
- flex-wrap(定义是否换行):wrap/nowrap
- flex-flow(缩写):flex-direction|flex-wrap
主轴元素
- justify-content(主轴对齐方式)取值:
- stretch 均匀排列每个元素
- flex-start 从行首起始位置开始排列
- flex-end 从行尾开始排列
- center 居中
- space-around 均匀排列每个元素(首个元素放置于起点,末尾元素放置于终点)
- space-between 余下空间在元素之间平均分布,靠边
- space-evenly 余下空间平均分布
次轴(默认纵轴)
- align-items(次轴对齐方式)取值:
- stretch 均匀排列每个元素的高度
- flex-start 从起始位置开始排列
- flex-end 从行尾开始排列
- center 居中
多行内容
- align-content(多行内容对齐方式)取值:
- flex-start 从起始位置开始排列
- flex-end 从行尾开始排列
- center 排列元素都在中间
- stretch 把空间撑满
- space-between 均匀排列每行(首行元素放置于起点,末尾元素放置于终点)
- space-around 余下空间在每行之间平均分布
-
flex之其内的items(以下是用在容器内元素上的属性)
order(items的排列顺序):container里默认items的oder:0,元素oder值越大越靠后,可有负值
flex-grow(控制如何变胖):把剩余空间分成n份,可指定每个item占几份,数值越大占比越多
flex-shrink(控制如何变瘦):缩窄时,数值越大贡献越多。一般写flex-shrink:0防止变瘦,默认是1,无负值
flex-basis(控制基准宽度):指定了 flex 元素在主轴方向上的初始大小,默认auto
flex(缩写):flex-grow | flex-shrink | flex-basis 默认为flex:0,1,auto
align-self(调整元素自己的位置): align-self: auto | flex-start | flex-end | center | baseline | stretch;
grid布局(简单语法)
cotainer 容器
- 让一个元素变成container:display:grid/inline-grid;
grid-template-columns 定义每一列的列宽 grid-template-columns:1 px 2px 3px 4px 5px; (5列,还可以给线取名字例如:[firstline] 1px;也能以fr为单位,这样写它会以平均分布,相当于格子一样) 可用多种单位:(grid-template-columns:100px 3em 40%)
grid-template-rows 定义每一行的行高 grid-template-row:1px 2px 3px ; (3行)
**grid-row-start/grid-row-end:定义元素在行上开始和结尾的位置 **
grid-column-start/grid-column-end:定义元素在行上开始和结尾的位置
-
grid-column-start:2; 从第二列开始 -
grid-column-end:3;到第三列结束 -
grid-row-start:2;从第二行开始 -
grid-row-start:3;到第三行结束
**grid-gap:12px; 可控制两个元素之间的间隙(grid-column-gap/grid-row-gap) **
grid-template-sreas 可给元素分区
例如:grid-template-sreas:
"header heaer header"
"asaid main ad"
"footer footer footer"
简写:grid-area: grid-row-start | grid-cloumn-start | grid-row-end | grid-column-end,通过基线(line),跨度(span)或没有(自动)的网格放置在 grid row 中指定一个网格项的大小和位置,继而确定grid-area的边界
**order:规定了弹性容器中的可伸缩项目在布局时的顺序。元素按照 order 属性的值的增序进行布局。拥有相同 order 属性值的元素按照它们在源代码中出现的顺序进行布局(适用元素:Flex items, grid items, and absolutely-positioned flex and grid container children)**用法:order:5; order:-5;
一个例子:grid-template-columns:1fr 5fr;grid-template-rows: 20% 20% 20% 20% 20%;
css定位
一个div的分层
- 一个div完整的分为5层,从下到上依次为:background>border>块级子元素>浮动元素>内联子元素(文字是后来者居上)
- 同一个结构中,内联子元素越靠后出现,层级越往上(后来者居上 )
- 浮动元素脱离文档流就是往上浮了一层,浮动元素和文档流互不影响
** 注意:**
- z-index可以调整层级,默认auto(不创建层叠上下文)
- 创建层叠上下文(常用):z-index、flex、opacity、transform
- z-index:0/1/2/-1/-2 值越大越靠上(会创建层叠上下文,意思就是另起一个作用域)
- 每个层叠上下文都是一个新的作用域,只有处在同一个作用域中的z-index才能进行比较
- opacity与background区别:opacity影响作用域内所有(元素)内容,background只影响背景
position
position的五个取值:
-
static 默认值 待在文档流中
-
relative 相对定位,层级升起来,但不脱离文档流
-
absolute 绝对定位,以祖先元素中最近的非static元素为基准定位
-
fixed 固定定位 以viewport(视口)为基准进行定位
-
sticky 粘滞定位
注意:
-
子绝父相,如果写了absolute一般都要补relative
-
如果写了absolute或者fixed,一般都要补top和left(某些浏览器不写的话会出错)
-
white space:nowrap 文字内容不换行
-
relative 在文档流中占的位置不变,但显示看起来变了
-
善于用 left:100%; left:50%+负margin
-
fixed元素的父元素使用了transform,fixed定位会失效
css动画
渲染原理
浏览器渲染过程
- 根据HTML构建HTML树(DOM)
- 根据CSS构建CSS树(CSSDOM)
- 将两棵树合并成一颗渲染树(render tree)
- layout布局(文档流,盒模型,计算大小和位置)
- paint绘制(把边框颜色,文字颜色,阴影等画出来)
- component合成(根据层叠关系展示画面)
三种样式更新方式
- 第一种,全走
div.remove()会触发当前消失,其他元素relayout
-
第二种,跳过layout 改变背景颜色,直接repaint + composite
-
第三种,跳过layout和paint 改变transform,只需composite
注意必须全屏查看效果,在iframe里看有问题
transform
- translate(位移) :
- translatX X轴方向移动
- translateY Y轴方向移动
- transateZ Z轴方向移动(垂直于平面的轴,使用时要配合在父元素上加perspective才行)
- translate3d(x,y,z)
注意:
- translate(-50%,50%)可做绝对定位元素的居中
- scall(缩放):scallX() sallY() scall()
- rotate(旋转):以垂直于平面的轴线旋转 rotateX() roateY() rotate()
- tansition(过渡):指定状态变化所需要的时间
- transition:属性名 过渡时间 过渡方式 延迟
过渡方式(transition-timing-function,以下只是部分)
(1)linear:匀速
(2)ease-in:加速
(3)ease-out:减速
(4)cubic-bezier函数:自定义速度模式
(5)ease:逐渐放慢
简写:
transition:transition-duration | transition-delay | transition-property | transition-timing-function
display和visibility的区别:
display: none;是彻底消失,不在文档流中占位,浏览器也不会解析该元素;不会被子元素继承。visibility:hidden;是视觉上消失了,在文档流中占位,浏览器会解析该元素;会被子元素继承。
animation
animation语法
animation:时长|过渡方式|延迟|次数|方向|填充模式|是否暂停|动画名; 时长:1s或者1000ms
过渡方式:跟transition取值一样,如linear
次数:3或者2.4或者infinite
方向:reverse | alternate| alternate-reverse
填充模式:none | forwards | backwards | both
是否暂停:paused | running
注:以上所有属性都有对应的单独属性
@keyframes语法
- @keyframes 动画名 { from { transform: translatex(0%);}
to { transform: translatex ( 100%);} }
- @keyframes 动画名 { 0% { top: 0; 1eft: 0;}
30% { top: 50px; }
50%,72% { left: 520px;}
100% { top: 100px; left: 100%;}}
案例: 地址 js.jirengu.com/jogoduhapo/…
~~本文为 无恙Iron 的原创文章,著作权归本人和饥人谷所有,转载务必注明来源~~