前言
最近一直在找工作,并且面试不是很顺利,过程中也暴露了自己的不足,虽然自己平时工作过程中有记录的习惯,不过一直以来都很畏惧写博客,心里总是有些包袱,觉得自己还不够,输出的东西可能会误导人,就这么自己吓自己,一吓就吓了好几年,这次面试算是一个契机,本篇总结一些面试过程中 css 的常见问题,希望可以帮到有需要的人
CSS 选择器和优先级
优先级从高到低(1、2并不属于选择器,但属于CSS样式计算的一部分):
- !important
- style 行业样式
- ID 选择器
- · 类选择器 .foo { color: #666 }
· 属性选择器 [foo] { color: #666 }
· 伪类 :hover { color: #333 } - 标签选择器 p {}
- · 通配选择器 *
· 选择符 + > ~ 空格 ||
· 逻辑组合伪类 :not() :is() :where
inline、block、inline-block 区别
display
css中有两个 "块级" 和 "内联" 两个盒子,块级盒子用来设置元素参与布局的规则(元素可以在一行显示,还是换行显示);内联盒子负责宽高、内容展示等功能。通过 display 来设置元素内部和外部的显示类型(即盒子规则)以及用于子元素的布局(如 flex、grid)
block 块级元素
特点
- 会独占一行,并且自动填满宽度(和父元素宽度一致)
- 可以设置 width、height、line-height、margin 和 padding
常见的块级元素:
<div></div> <address></address> <form></form> <canvas></canvas> <form></form> <hr>
<header></header> <h1>~<h6> <p></P> <table></table>
inline 内联元素
也叫行内元素,只会占据元素本身包含的空间 特点
- 可以和其他元素在同一行显示
- 不可设置 width、height、顶部和底部的边距(margin-top、margin-bottom)
- 元素高度是自身内容的高度
常见的内联元素:
<a></a> <em></em> <strong></strong> <span></span> <img> <script></script> <label></label>
inline-block 内联块级元素
特点
- 可以和其他元素在同一行显示
- 可以设置 width、height、顶部和底部的边距
常见的内联块级元素:
<button></button> <input /> <textarea></textarea>
BFC 块级格式化上下文
定义:成为BFC的元素会变成一个与外界隔绝的独立容器,其内部元素的布局不会影响到外部的元素
如何成为BFC ?
- html 根元素
- float 的值不为 none
- overflow 的值为 auto、scroll 或 hidden
- display 的值为 table-cell、table-caption 和 inline-block 中的其中一个
- position 的值不为 relative 和 static
特点及应用
- BFC元素不会和外界元素发生 margin 重叠(重叠了就影响到外部元素布局了,有违定义)
- 清除浮动
垂直水平居中
absolute + 负 margin(需要知道子元素宽高)
绝对定位的百分比是相对于父元素的宽高,定位是基于子元素的左上角,期望效果是子元素可以居中显示,所以需要让子元素向左上方移动半个身位,利用 margin 为负值时让元素向相反方向定位来实现
.parent {
width: 400px;
height: 400px;
background-color: aqua;
position: relative;
}
.child {
position: absolute;
top: 50%;
left: 50%;
width: 100px;
height: 100px;
margin: -50px 0 0 -50px;
background-color: antiquewhite;
}
垂直水平居中
absolute + margin auto(需要知道子元素宽高)
.parent {
width: 400px;
height: 400px;
background-color: aqua;
position: relative;
}
.child {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100px;
height: 100px;
margin: auto;
background-color: antiquewhite;
}
absolute + transform(无需知道子元素宽高)
.parent {
width: 400px;
height: 400px;
background-color: aqua;
position: relative;
}
.child {
position: absolute;
top: 50%;
left: 50%;
width: 100px;
height: 100px;
transform: translate(-50%, -50%);
background-color: antiquewhite;
}
flex(无需知道子元素宽高)
.parent {
width: 400px;
height: 400px;
display: flex;
justify-content: center;
align-items: center;
}
无需设置子元素
grid(无需知道子元素宽高)
.parent {
width: 400px;
height: 400px;
display: grid;
justify-items: center;
align-items: center;
}
无需设置子元素
flex
一维布局模型,每次只能处理一个维度(横向或纵向)上的元素布局
子元素上的 flex
子元素上的flex属性是 flex-grow、flex-shrink、flex-basis 的缩写,flex: 1 等同于 flex:1 1 0%
flex-grow:指定了容器剩余空间多余时候的分配规则
flex-shrink:指定了容器剩余空间不足时候的分配规则
flex-basis:指定的分配基础尺寸
画 0.5px 的边框
为目标元素设置伪元素选择器并设置 border,其宽高设置为目标元素的 2 倍,再将伪元素选择器缩放为原来的一半来实现 border 的一半。(需要通过 transform-origin 设置缩放的原点,默认按元素中心缩放,即 center)
.box {
position: relative;
border: none;
height: 100px;
width: 100px;
}
.box::after {
content: "";
position: absolute;
border: 1px solid #000;
top: 0;
left: 0;
box-sizing: border-box;
width: 200%;
height: 200%;
transform: scale(0.5);
transform-origin: left top;
}