css基础
- 1. 请简述 css 盒子模型
- 1. BFC是什么?
- 2. BFC布局规则
- 3. 创建BFC的方式
- 4. BFC的作用
- 5. BFC、IFC、GFC 和 FFC都是什么?
- 6. 比较 opacity: 0、visibility: hidden、display: none
- 7. li 与 li 之间有看不见的空白间隔是什么原因引起的?如何解决?
- 8. 弹性盒子布局属性有那些请简述?
- 9. Web Components(未来)有什么期待吗?
- 10. 定位的属性值有何区别?
- 11.css选择器有哪些?
- 11.css选择器权重
- 选择器优先级
- 12. css那些属性可以继承?
- 13. 行内元素、块级元素、行内块元素有哪些?
- 14. px,rem,em 的区别
- 15. 请简述媒体查询
- animation和transition的区别
# 1. 请简述 css 盒子模型
查看答案
一个 css 盒子从外到内可以分成四个部分:
- margin(外边距)
- border (边框)
- padding(内边距)
- content(内容)
标准盒模型中的宽度(类似于box-sizing中的content-box),只是设置 content(内容)的宽和高,不包括padding和border。
怪异盒模型中的宽度(类似于box-sizing中的border-box),真正的宽高还包括padding和border:
- 盒子真正的宽应该是:content宽度 + left padding + right padding + left border + right border
- 盒子真正的高应该是:content高度 + top padding + bottom padding + top border + bottom border
# 1. BFC是什么?
查看答案
BFC 就是块级格式上下文,是页面盒模型布局中的一种 CSS 渲染模式,相当于一个独立的容器,里面的元素和外部的元素相互不影响。
# 2. BFC布局规则
查看答案
- 内部Box从上向下依次放置
- 垂直方向margin在同一个BFC容器中外边距重叠,取最大的值
- 子元素的margin-left与父元素的border-left相邻
- BFC不会与float box重叠,会依次排列
- BFC的子元素不会影响外界,反之一样
- BFC也会参与计算高度
# 3. 创建BFC的方式
查看答案
- html根元素或者包含根元素的元素
- float浮动:值不为none
- 绝对定位:值不是static或者relative
- overflow:不为visible
- display:为表格布局或者弹性布局:inline-block,table-ceil,table-caption,flex...
- column-span:all
# 4. BFC的作用
查看答案
- 清除浮动
- 可以解决margin塌陷问题(让父元素变成BFC,overflow:hidden)
- 可以解决margin上下外边距合并问题(其中一个换成新的BFC或者中间添加一个BFC)
- 实现多栏布局(比如左边固定,右边自适应,给右边变成BFC)
# 5. BFC、IFC、GFC 和 FFC都是什么?
查看答案
# BFC(Block formatting contexts)
块级格式上下文页面上的一个隔离的渲染区域。
# IFC(Inline formatting contexts)
内联格式上下文
- IFC 的 line box(线框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的 padding/margin 影响)
- IFC 中的 line box 一般左右都贴紧整个 IFC,但是会因为 float 元素而扰乱。
- float 元素会位于 IFC 与 line box 之间,使得 line box 宽度缩短。
- 同个 IFC 下的多个 line box 高度会不同。
- IFC 中是不可能有块级元素的
- 当插入块级元素时(如 p 中插入 div)会产生两个匿名块与 div 分隔开,即产生两个 IFC。每个 IFC 对外表现为块级元素,与 div 垂直排列。
# IFC的作用
- 水平居中:当一个块要在环境中水平居中时,设置其为 inline-block 则会在外层产生 IFC,通过 text-align 则可以使其水平居中。
- 垂直居中:创建一个IFC,用其中一个元素撑开父元素的高度,然后设置其 vertical-align: middle,其他行内元素则可以在此父元素下垂直居中。
# GFC(GrideLayout formatting contexts)
网格布局格式化上下文
- 当为一个元素设置 display 值为 grid 的时候,此元素将会获得一个独立的渲染区域。
- 我们可以通过在网格容器(grid container)上定义网格定义行(grid definition rows)和网格定义列(grid definition columns)属性
- 在网格项目(grid item)上定义网格行(grid row)和网格列(grid columns)为每一个网格项目(grid item)定义位置和空间。
# GFC的作用
首先同样是一个二维的表格,但 GridLayout 比 table:
- 有更加丰富的属性来控制行列
- 有更加丰富的属性来控制对齐
- 更为精细的渲染语义
# FFC(Flex formatting contexts)
自适应(flex container)格式上下文。Flexbox 定义了伸缩容器内伸缩项目该如何布局。
- display 值为 flex 或者 inline-flex 的元素将会生成自适应容器
- 可惜这个牛逼的属性只有谷歌和火狐支持,不过在移动端也足够了,至少 safari 和 chrome 还是 OK 的。
- Flex Box 由伸缩容器和伸缩项目组成。通过设置元素的 display 属性为 flex 或 inline-flex 可以得到一个伸缩容器。
- 设置为 flex 的容器被渲染为一个块级元素,而设置为 inline-flex 的容器则渲染为一个行内元素。
- 伸缩容器中的每一个子元素都是一个伸缩项目。
- 伸缩项目可以是任意数量的。
- 伸缩容器外和伸缩项目内的一切元素都不受影响。
# 6. 比较 opacity: 0、visibility: hidden、display: none
查看答案
- display: none (不占空间,不能点击)(场景,显示出原来这里不存在的结构)
- visibility: hidden(占据空间,不能点击)(场景:显示不会导致页面结构发生变动,不会撑开)
- opacity: 0(占据空间,可以点击)(场景:可以跟transition搭配)
# 7. li 与 li 之间有看不见的空白间隔是什么原因引起的?如何解决?
查看答案
浏览器会把inline内联元素间的空白字符(空格、换行、Tab等)渲染成一个空格。为了美观,通常是一个放在一行,这导致换行后产生换行字符,它变成一个空格,占用了一个字符的宽度。
解决办法:
- 为设置
float:left
。不足:有些容器是不能设置浮动,如左右切换的焦点图等。 - 将所有写在同一行。不足:代码不美观。
- 将内的字符尺寸直接设为0,即
font-size:0
。不足:中的其他字符尺寸也被设为0,需要额外重新设定其他字符尺寸,且在Safari浏览器依然会出现空白间隔。 - 消除的字符间隔
letter-spacing:-8px
。不足:这也设置了内部的字符间隔,因此需要将内部的字符间隔设为默认letter-spacing:normal
。
# 8. 弹性盒子布局属性有那些请简述?
查看答案
- Flex-direction:弹性容器中子元素排列方式(主轴排列方式)
- Flex-wrap:设置弹性盒子的子元素超出父容器时是否换行
- Flex-flow:是 flex-direction 和 flex-wrap 简写形式
- Align-item:设置弹性盒子元素在侧轴上的对齐方式
- Align-content:设置行对齐
- Justify-content:设置弹性盒子元素在主轴上的对齐方式
# 9. Web Components(未来)有什么期待吗?
查看答案
- 原生规范,无需框架
- 原生使用,无需编译
- 真正的css scope
# 10. 定位的属性值有何区别?
查看答案
Position 有四个属性值:relative absolute fixed static
- relative 相对定位,不脱离文档流,相对于自身定位
- absolute 绝对定位,脱离文档流,相对于距离最近的有定位信息的祖先元素定位
- fixed 固定定位,脱离文档流,相对于浏览器窗口定位
- static 默认值,元素出现在正常的流中
# 11.css选择器有哪些?
查看答案
- css2 选择器:
- 元素选择器
- id选择器
- 群组选择器
- 类选择器
*
通配符选择器- 后代选择器
- css2伪类选择器:
a:link
a:visited
a:hover
a:active
- css3 选择器:
- 空格
>
+
相邻兄弟选择器~
通用选择器(查找后面所有)
- 结构伪类选择器:
- 查找第几个
nth-child(n)
- 查找同一类型第几个
nth-of-type
- 查找唯一类型
only-of-type
- 查找第几个
- 属性选择器:
- 根据标签属性查找
[attr=value]
:root
查找根元素html标签:empty
查赵空标签
- 根据标签属性查找
- 目标伪类选择器(表单):
:enabled
查找可以使用的标签:disabled
查找禁止使用的标签:checked
查找被选中的标签
- 伪元素选择器
::selection
设置选中文本内容的高亮显示(只能用于背景色和文本颜色)
- 否定伪类选择器:not()
- 语言伪类选择器:lang(取值)
# 11.css选择器权重
查看答案
- 元素选择器 1
- 伪元素选择器 1
- class选择器 10
- 伪类选择器 10
- 属性选择器 10
- id选择器 100
- 内联样式的权重 1000
- 包含选择器权重 权重之和
- 继承样式权重 0
# 选择器优先级
查看答案
!important > id选择器 > class选择器 > 标签选择器 > 继承的样式
样式表的来源不同时,优先级顺序为:内联样式> 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式
# 12. css那些属性可以继承?
查看答案
Css 继承特性主要是文本方面
- 所有元素可继承:
- visibility
- cursor
- 块级元素可继承:
- text-indent
- text-align
- 列表元素可继承:
- list-style
- list-style-type
- list-style-position
- list-style-image
- 内联元素可继承:
- letter-spacing 字母间距
- word-spacing 段落间距
- line-height 行高
- color 字体颜色
- font 字体
- font-family 字体种类
- font-size 字体大小
- font-style 字体样式
- font-variant 小型大写字母文本
- font-weight 字体粗细
- text-decoration 文本修饰
- text-transform 转换不同元素中的文本
- direction 文本方向
# 13. 行内元素、块级元素、行内块元素有哪些?
查看答案
- 行内元素:相邻的行内元素会排列在同一行,不会独占一行,根据内容撑开盒子,设置宽高无效。
- a
- br
- i
- em
- img
- input
- select
- span
- sub
- sup
- u
- textarea
- 块级元素:会独占一行 可以设置宽高等属性
- div
- h1-h6
- hr
- p
- ul
- ol
- table
- address
- blockquote
- dir
- from
- menu
- 行内块元素:相邻元素但是可以设置宽高等属性
- button
- del
- iframe
- ins
# 14. px,rem,em 的区别
查看答案
px
绝对长度单位,像素px是相对于显示器屏幕分辨率来说的
em
相对长度单位,相对于当前对象内文本的字体尺寸
- em 的值并不是固定的
- em 会继承父级元素的字体大小(参考物是父元素的font-size)
rem
相对长度单位,相对于html根元素的font-size
- 1em = 1rem = 16px
- 在body中加入font-size: 62.5%,这样直接就是原来的px数值除以10加上em就可以
- 缺点:比如小说网站,屏幕越小的移动设备如果用了rem肯定文字就越小, 就会导致看文章的时候特别费眼
# 15. 请简述媒体查询
查看答案
媒体查询扩展了 media 属性, 就是根据不同的媒体类型设置不同的 css 样式,达到自适应的目的。
# animation和transition的区别
查看答案
animation:
创建动画序列,需要使用animation属性或其子属性,该属性允许配置动画时间、时长以及其他动画细节,但该属性不能配置动画的实际表现,动画的实际表现是由@keyframes 规则实现,具体情况参见使用 keyframes 定义动画序列小节部分。
transition:
也可实现动画。 transition 强调过渡,是元素的一个或多个属性发生变化时产生的过渡 效果,同一个元素通过两个不同的途径获取样式,而第二个途径当某种 改变发生 (例如 hover)时才能获取样式,这样就会产生过渡动画。