前言:大家好,我是忆白,本文根据慕课网双越老师《一天时间迅速准备前端面试 快速构建初级前端知识体系》课程整理的面试常考题目以及相应知识扩展,持续更新。
如何理解 HTML 语义化
- 让人更容易读懂(增加代码可读性、可维护性)
- 让搜索引擎更容易读懂(SEO)
- 提升无障碍性(通过屏幕阅读器给盲人读页面内容)
块状元素和内联元素
- 块状(display: block/table) :
div
、h1-h6
、p
、ul
、ol
、li
、table
、header
、footer
、aside
、section
、form
、table
等 - 内联(display: inline/inline-block):
span
、img
、input
、button
、a
、b
、q
、i
、em
、label
等
盒模型宽度计算
如下代码:计算 div1 的 offsetWidth 是多少?
<style>
#div1 {
width: 100px;
padding: 10px;
border: 1px solid #ccc;
margin: 10px;
}
</style>
<div id="div1"></div>
复制代码
- 首先了解一下offsetWidth的定义:offsetWidth = (内容宽度 + 内边距 + 边框),不包含外边距
-
因此,答案为:(100 + 2×10 + 2×1) px = 122px
-
那么如果想让
offsetWidth
等于100px,如何做呢?首先了解一下两种盒子模型。
两种盒子模型
- W3C盒子模型(content-box): padding和border不被包含在定义的width和height之内。对象的实际宽度等于设置的width值和border、padding之和,即 ( Element width = width + border + padding ) 此属性表现为标准模式下的盒模型。
- IE的盒子模型(border-box): padding和border被包含在定义的width和height之内。对象的实际宽度就等于设置的width值,即使定义有border和padding也不会改变对象的实际宽度,即 ( Element width = width ) 。
- 一般默认是使用w3c的盒子模型,我们可以通过在样式中添加:
box-sizing: border-box
切换为IE盒模型,此时就可以实现上面所说的让offsetWidth
等于100px了。
margin 纵向重叠问题
下面 AAA 和 BBB 之间的距离是多少?
<style>
p {
font-size: 16px;
line-height: 1;
margin-top: 10px;
margin-bottom: 15px;
}
</style>
<p>AAA</p>
<p></p>
<p></p>
<p></p>
<p>BBB</p>
复制代码
- 相邻元素的
margin-top
和margin-bottom
会发生重叠(取两者之间的大值) - 空白内容的
<p></p>
也会发生重叠 - 答案:15px
margin负值问题
margin-top
和margin-left
设置负值,元素分别向上、向左移动margin-right
设置负值,右侧元素左移,自身元素不受影响margin-bottom
负值,下方元素会上移,自身元素不受影响
BFC的理解与应用
1、什么是 BFC ? 如何应用?
- Block format context,块级格式化上下文
- 一块独立的渲染区域,内部元素的渲染不会影响边界以外的元素
2、形成 BFC 的常见条件?
- float 不是 none
- position 是 absolute 或 fixed
- overflow 不是 visible
- display 是 flex、inline-block 等
3、BFC 的常见应用
- 清除浮动
float布局问题、手写clearfix
圣杯布局和双飞翼布局
- 三栏布局,中间一栏最先加载和渲染(内容最重要)
- 两侧内容固定,中间内容随宽度自适应
- 一般用于PC网页
-
大致步骤:
- 使用float布局
- 两侧使用margin负值,以便和中间内容横向重叠
- 防止中间内容被两侧覆盖,一个用padding一个用margin
手写clearfix
.clearfix:after {
content: '';
display: table;
clear: both;
}
复制代码
flex弹性布局
1、常见容器属性
常见容器属性 | 属性功能 |
---|---|
flex-direction | 设置主轴方向 |
justify-content | 设置主轴子元素排列方式 |
flex-wrap | 设置子元素是否换行 |
align-content | 设置侧轴上子元素的排列方式(多行) |
align-items | 设置侧轴上子元素的排列方式(单行) |
flex-flow | 复合属性,相当于设置了 flexdirection和 flex-wrap |
flex-direction 设置主轴方向
属性值 | 说明 |
---|---|
row(默认值) | 主轴为水平方向【从左到右】 |
row-reverse | 主轴为水平方向【从右到左】 |
column | 主轴为垂直方向【从上到下】 |
column-reverse | 主轴为垂直方向【从下到上】 |
flex-wrap 设置换行
flex布局中默认子元素不换行,如果不设置换行,增加元素装不开时,会缩小子项的宽度,以强行放入父盒子一行展示
属性 | 说明 |
---|---|
nowrap(默认) | 不换行 |
wrap | 换行,第一行在上方 |
wrap-reverse | 换行,第一行在下方 |
justify-content 设置主轴对齐方式
属性值 | 对齐方式(以默认主轴为例) |
---|---|
flex-start(默认值) | 左对齐 |
flex-end | 右对齐 |
center | 居中对齐 |
space-between | 两边贴边,平分剩余空间(重要) |
space-around | 平分剩余空间给每个子项,两侧不贴边 |
space-evenly | 均匀分布 |
align-items 侧轴对齐方式(单行)
属性值 | 说明 |
---|---|
flex-start | 从上到下 |
flex-end | 从下到上 |
center | 居中对齐(重要) |
stretch | 没设置高度时(沿侧轴拉伸至父盒子高) |
align-content 设置侧轴上的子元素排列方式(多行)
设置子项在侧轴上的排列方式,并且只能用于子项出现换行的情况(多行),在单行下是没有效果的。
属性值 | 说明 |
---|---|
flex-start | 在侧轴的头部开始排列 |
flex-end | 在侧轴的尾部开始排列 |
center | 在侧轴中间显示 |
space-around | 子项在侧轴平分剩余空间 |
space-between | 子项在侧轴分布两头,再平分剩余空间 |
stretch | 设置子项高度平分父元素高度 |
2、子项常见属性
flex属性
定义子项目分配剩余空间,用flex来表示占多少份数。
align-self 控制子项自己在侧轴上的排列方式
align-self
属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性。默认值auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
3、flex画色子
考察对flex的应用,上代码:
<head>
<style>
.box {
display: flex;
/* 设置主轴(x轴)两端对齐*/
justify-content: space-between;
width: 200px;
height: 200px;
border: 2px solid #ccc;
padding: 20px;
}
.item {
width: 40px;
height: 40px;
border-radius: 50%;
background-color: #666;
}
/* 第二个圈沿侧轴(y轴)居中对齐 */
.item:nth-child(2) {
align-self: center;
}
/* 第三个圈沿侧轴(y轴)底部对齐 */
.item:nth-child(3) {
align-self: end;
}
</style>
</head>
<body>
<div class="box">
<span class="item"></span>
<span class="item"></span>
<span class="item"></span>
</div>
</body>
复制代码
absolute 和 relative 分别依据什么定位?
relative
依据自身定位,相对于自己原来的位置移动的(移动位置的时候参照点是自己原来的位置),并且不会影响其他外界元素(不脱离标准流,仍然占有原来的位置)。absolute
依据最近一层的定位元素(absolute relative fixed
)定位,如果一直往上找都没有定位元素,则依据body
元素定位。绝对定位不再占有原先的位置(脱离标准流)。
居中对齐的实现方式
水平居中
- inline元素:text-align: center
- block元素:margin: auto
- absolute元素:(left: 50% + marigin-left: 负值)向右移动父元素50%,再向左移动自身一半(比如自身宽度200px,就可以marigin-left: -100px,这里也可以用translateX(-50%))。
- translateX:(marigin-left: 50%; transform: translateX(-50%))
- flex:(display: flex; justify-content: center)
垂直居中
- inline元素:line-hight等于height值
- absolute元素:(top: 50% + marigin-top: 负值)
- absolute元素:(top:50%; transfom: translate(-50%, -50%))
- absolute元素:top,left,botton,right = 0 + marigin: auto
- flex:(display: flex; align-items: center)
line-height如何继承的问题
下面的代码中,p标签的行高将会是多少?
<style>
body {
font-size: 20px;
line-height: 200%;
}
p {
font-size: 16px;
}
</style>
<body>
<p>AAA</p>
</body>
复制代码
这里答案为 40 px
- 如果父元素写具体数值,如30px,则子元素继承该值(比较好理解)
- 如果父元素写比例,如1.5 ,则继承该比例,假如body是1.5,那么p标签就是16×1.5=24px(比较好理解)
- 写百分比,如 200%,则继承父元素字号大小乘以百分比计算出来的值(考点,也是一个坑)
rem是什么?响应式的常用方案有哪些?
rem 是一个长度单位
- px,绝对长度单位,最常用
- em,相对长度单位,相对于父元素字体大小font-size,不常用
- rem,相对长度单位,相对于根元素(html)的字体大小font-size(假设html的font-szie是100px,那么1 rem就是100px),常用于响应式布局
响应式布局常用方案
- 通过媒体查询media-query,根据不同的屏幕宽度设置根元素字体大小 font-size,再通过rem实现响应式。
- flex布局
- 百分比布局
- vw和vh
网页视口尺寸与 vw-vh
rem实现响应式存在一个小弊端:有阶梯型,不能对应每一个宽度的像素都实现响应式,只能设置某一段范围内,呈现阶梯型变化。
网页视口尺寸,以高度为例
window.screen.height
整个设备的屏幕高度window.innerHeight
网页视口高度,可视区域高度document.body.clientHeight
body高度,随网页内容多少变化
vw 和 vh
- vh 网页视口高度的 1/100
- vw 网页视口宽度的 1/100
- vmax为vw和vh的最大值,vmin为vw和vh的最小值
写在最后
如果你觉得我写的还不错,可以给我点个赞哦,如果有写错的地方,也欢迎大家评论指出,谢谢。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END