1. 实现垂直水平居中?
1. 已知子元素宽高
-
设置子元素为绝对定位,父元素为相对定位,通过calc计算
.father { position: relative; } .son { position: absolute; left: calc(50% - 50px); top: calc(50% - 50px); }
-
设置子元素为绝对定位,父元素为相对定位,结合负margin
.father { position: relative; } .son { position: absolute; width: 100px; height: 100px; left: 50%; top: 50%; margin-left: -50px; margin-top: -50px; }
2. 已知父元素高度
-
子元素设为行级元素,父元素设置text-align和line-height
.father { text-align: center; height: 500px; line-height: 500px; } .son { display: inline-block; }
3. 父元素和子元素宽高均未知
-
设置父元素为相对定位,子元素绝对定位,设置子元素边界为0,结合margin
.father { position: relative; } .son { position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; }
-
设置子元素绝对定位,left和top为50%,结合transfrom: translate()
.father { position: relative; } .son { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); }
-
flex布局
.father { display: flex; justify-content: center; align-items: center; }
-
网格布局,可设置父类样式或者子类自身样式
// 1. 父类设置水平垂直居中 .father { display: grid; justify-items: center; align-items: center; } // 2. 子元素设置自身水平垂直居中 .father { display: grid; } .son { justify-self: center; align-self: center; }
2. 两种盒模型的区别
-
1、标准盒模型
一块区域的总宽度 = width(content) + 2padding + 2border + marginbox的width属性 = content-width,不包括padding和border
-
2、IE6混杂模型(怪异模型)
一块区域的总宽度 = width + margin
width = 2padding + 2border + width(content)box的width属性 = content-width + 2padding + 2border
-
3、box-sizing: border-box ; content-box
3. 列举一下行内和块级元素(至少6个),以及二者的区别(笔试题)
-
block:
header center footer nav address div p form ul li table h1-h6
-
inline:
span img input label select textarea strong i em code sub sup
-
区别:
块级元素独占一行,宽、高、内边距、外边距可控。
行内元素和相邻的行内元素依次排列,宽高、上下的内边距和外边距不可控。
除非设置行内块元素
4. 说说你对语义化的理解
- HTML语义化让页面结构更清晰,便于浏览器和搜索引擎解析,即使在没有CSS样式的情况下,也以一种文档格式显示,而且是容易阅读的;
- 搜索引擎的爬虫也依赖HTML标记来确定上下文和各个关键字的权重,利于SEO; - 阅读源代码的人更容易将网站分块,便于阅读理解和维护。
1. strong标签和b标签的区别
b标签只是一个简单的粗体标签,强调的是字体加粗的效果,strong标签具有语义化,更关注strong标签下的关键词,更利于SEO
2. i标签和em标签的区别
同上,i标签只是无意义的斜体,而em表示一般的强调文本,具有语义,更利于SEO
5. 利用CSS画出三角形和平行四边形
- 三角形和梯形利用border和transparent实现
- 平行四边形利用transform: skew(-30deg);实现
/* 三角形 */
.trangle {
display: inline-block;
border-width: 100px 100px 100px 100px;
border-style: solid;
border-color: transparent transparent orange;
}
/* 直角三角形 */
.spec {
display: inline-block;
border-width: 100px 100px 100px 0px;
border-style: solid;
border-color: transparent transparent orange;
}
/* 梯形 */
.trangle {
display: inline-block;
width: 100px;
height: 100px;
border-width: 100px 100px 100px 100px;
border-style: solid;
border-color: transparent transparent orange;
}
/* 平行四边形 */
.parallelogram {
width: 200px;
height: 200px;
background: orange;
transform: skewX(-30deg);
}
6. position的取值方式有几种,sticky有了解过嘛?
absolute relative fixed sticky static inherit不常用
sticky粘性定位
元素在跨越特定阈值前为相对定位,之后为固定定位
.box {
position: sticky;
top: 10px;
height: 100px;
background-color: green;
}
sticky的应用场景
- 吸顶导航
- 固定侧边栏或者页脚
- 实现页面滚动条
- 列表锚点
- 时间轴
8. 为什么要清除浮动,不清除会有什么问题?有几种实现方式
float指定一个元素沿其容器的左侧或右侧放置,该元素会从正常的文档流中移除,产生浮动流。
会对后面元素的排版造成了影响,所以要清除浮动带来的副作用。
-
浮动的元素会具有行内块元素的特性
-
块级元素不能识别,比如image span 以及带有BFC属性的元素都可以识别到浮动的元素。
2. 清除浮动的几种实现方式
-
额外标签法
在浮动元素后添加一个空白的块级标签,设置
clear:both
属性缺点:改变了DOM解构
-
触发父级BFC,inline-block, float , overflow
父级添加overflow属性,通过触发BFC的方式,实现清除浮动。
缺点:给父类增加了额外的属性,有可能影响元素的排版
-
使用after伪元素清除浮动
.clearfix::after { content: "", display: block; clear: both; } /* IE */ .clearfix { *zoom: 1 }
-
给父级添加双伪元素清除浮动
// 双伪元素清除浮动和单伪元素清除浮动的区别 .clearfix::before, .clearfix:after { content:"", display: block; clear: both; } /* IE */ .clearfix { *zoom: 1 } 双伪元素清除浮动,是清除容器的前后浮动,而after只能清除容器内部后面的浮动,如果容器外面的上方也有浮动元素,那下方的容器有可能跑到上方跟上面浮动的元素占一排 双伪元素清除浮动后等于是关闭了容器前后浮动流,无论前后有没有浮动流元素,都不会和当前容器产生任何关系
9. BFC
Block Formatting Context 块级格式化上下文
1. BFC是什么
Block Formatting Context 块级格式化上下文
BFC可以理解为一个独立的布局环境,这个环境下的子元素不会影响外面的布局,HTML在这个环境下遵循此规则
2. BFC的规则
- BFC容器内,block是一个一个从上到下排列
- BFC容器内,box的外边距由margin决定,两个相邻元素的垂直外边距由最大margin决定
- BFC容器内,子元素不会影响外面
- BFC容器内,计算BFC高度时,浮动元素也参与计算
2. 如何触发BFC
- position: absolute/fixed;
- display: inline-block;
- float: left;
- overflow: hidden;
- display: flex/table-cell;
3. BFC解决了什么问题
- margin 塌陷
- 没有解决margin合并问题
4. 补充
1. margin合并(重叠)和margin塌陷
-
margin重叠
块的上外边距和下外边据有时合并为单个边距,取单个边距的最大值,这种行为成为margin合并
- 同一层相邻元素之间
-
margin塌陷
没有内容将父元素和后代元素分开
子类块元素与父类外边距重叠,重叠部分会移除到父级块元素外面
10. IFC是什么?
Inline Formatting Context 内联格式化上下文
11. 为什么有时候用translate来改变位置而不是定位
translate 是 transform 属性的⼀个值。改变transform或opacity不会触发浏览器重新布局(reflow)或重绘(repaint),只会触发复合(compositions)。⽽改变绝对定位会触发重新布局,进⽽触发重绘和复合。
transform使浏览器为元素创建⼀个 GPU 图层,但改变绝对定位会使⽤到 CPU。 因此translate()更⾼效,可以缩短平滑动画的绘制时间。
translate改变位置时,元素依然会占据其原始空间,绝对定位就不会发⽣这种情况。
12. 图片之间有空白间隔,li与li之间有空白间隔是什么原因引起的?
1. 空白间隔的产生原因
浏览器会把inline内联元素间的空白字符(空格、换行、Tab等)渲染成一个空格。为了美观,通常是一个放在一行,这导致
换行后产生换行字符,它变成一个空格,占用了一个字符的宽度。
浏览器会把inline内联元素之间的空白字符(空格,换行tab)渲染称为一个空格。
代码编写时为了便于阅读,元素之间是有空白的,这就是空白的原因。
2. 解决方法
- 父容器设置font-size: 0; 子元素设置font-size为正常大小
- 子元素设置浮动,父容器清除浮动
- 将代码放置在一行
- 父容器设置letter-spacing: -5px; 子元素设置为normal
13. CSS伪类和伪元素的区别是什么?有哪些?
1. 伪类
用于已有元素处于某种状态为其添加对应的样式,比如:
:hover :active :foucs :link
2. 伪元素
用于创建一些在DOM中不存在的元素,并为其添加样式。比如:
::before ::after first-letter ::first-line
两者最大的区别就是有没有创建一个文档树之外的元素
CSS3中规范使用双冒号表示伪元素,以此来区分伪类和伪元素。