给大家推荐一个实用面试题库
1、前端面试题库 (面试必备) 推荐:★★★★★
地址:web前端面试题库
BFC
块级格式上下文(block format context)是页面一块独立的渲染区域,具有一套独立的渲染规则
- 内部的盒子会在垂直的方向上一个接一个地放置
- 同一个bfc内部相邻的盒子margin会发生重叠,与方向无关
- 每个元素的左外边距和包含块的左边界相接触(从左到右),即使浮动元素也是如此(bfc的子元素不会超出包含块,但绝对定位可以)
- 清除浮动只能清除同一BFC在它前面的元素的浮动
- BFC就是页面上的一个隔离的独立容器,里面的元素和外部的元素互不影响
- 计算BFC的高度时,考虑BFC所包含的所有元素,连浮动元素也参与计算;
- bfc的区域不会与float的元素区域重叠 目的是为了形成一个相对于外界完全独立的空间,让里面的元素和外部的元素互不影响
如何创建 bfc
- html 根元素
- 浮动 float不为none
- 绝对定位 position为absolute/fixed
- 行内块元素 display为inline-block
- overflow 不为 visible或者clip(auto/hidden)
- diplay为flow-root
- 弹性元素 display为flex或flex-inline
- 表格单元格 display为table-cell
- 表格标题 display为table-caption
- 匿名表格单元格元素 display为table、table-row、table-row-gr藕片、table-header-group、table-footer-group、inline-table
- contain的值为layout、content、paint
- 网格元素 display为grid或grid-inline
- 多列容器column-count或column-width值不为auto,且含有column-count:1的元素
- column-span值为all的元素会创建一个新的格式化上下文,即使该元素没有包裹在一个多列容器中
bfc 的作用
- 清除内部或者外部的浮动
- 防止同一 bfc 容器中的相邻元素间的外边距重叠问题
使用场景
- 高度坍塌(内部浮动导致的问题)
<style> .father{ background-color:red; /* 解决 */ /* display:flow-root */ /* overflow:auto */ } .son1{ background-color: blue; width: 100px; height: 200px; float: left; } .son2{ background-color: green; width: 200px; height: 100px; } </style> </head> <body> <div class="father"> <div class="son1"></div> <div class="son2"></div> </div> </body>
2. 外边距折叠
- 外边距合并
- 三栏布局
<html> <style type="text/css"> .left{ float: left; width: 200px; height: 100px; background-color: green; } .right{ float: right; width: 200px; height: 100px; background-color: pink; } .center{ overflow: hidden; /* 如果不写,center的width和wrapper的width一样 */ height: 100px; background-color: yellow; } </style> </head> <body> <div class="wrapper"> <div class="left"></div> <div class="right"></div> <div class="center"></div> </div> </body> </html>
居中
定宽高
- absolute+负margin
- absolute+margin auto
- absolute+calc 不定宽高
- absolute+transform
- lineheight
- writing-mode
- table
- css-table
- flex
- grid
absolute+负margin
<div class="father"> <div class="son"></div> </div>
.father { position: relative; } .son { position: absolute; left: 50%; top: 50%; margin-left: -(父元素宽度-子元素宽度)/2 px; margin-top: -(父元素高度-子元素高度)/2 px; }
absolute+auto
<div class="father"> <div class="son"></div> </div>
.father{ position: relative; width: 200px; height: 200px; background-color: red; } .son{ background-color: black; position: absolute; width: 100px; height: 100px; left: 0; right: 0; top: 0; bottom: 0; margin: auto; }
absolute+cale
<div class="father"> <div class="son"></div> </div>
.father { width: 200px; height: 200px; position: relative; } .son { width: 100px; height: 100px; position: absolute; top:cale(50% - 50px); left:cale(50% - 50px); }
absollute+transform
.father { position: relative; } .son { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); }
flex
.father { display: flex; justify-content: center; align-items: center; }
grid
.father { display: grid; } .son { justify-self: center; align-self: center; }
一些概念
- 屏幕尺寸:用对角来计算。1英寸=2.54厘米
- 像素:硬件和软件所能控制的最小单位。
- 屏幕分辨率:一个屏幕具体由多少个像素点组成
- 物理像素:设备的像素点个数
- 逻辑像素:让n个像素当一个像素使用
- 视觉视口
- 理想视口:所谓理想视口,即页面绘制区域可以完美适配设备宽度的视口大小,不需要出现滚动条即可正常查看网站的所有内容,且文字图片清晰,如所有iphone的理想视口宽度都为320px,安卓设备的理想视口有320px、360px等等。 width=device-width 宽度等于屏幕宽度 initial-scale=1缩放等于1 maximum-scale=2最大缩放等于2 minimum-scale=0.5最小缩放等于0.5 user-scalable=no不允许缩放
<meta name="viewport" content="width=device-width,initial-scale=1" />
移动端适配方案
rem
<head> <meta name="viewport" content="width=device-width,initial-scale=1.0" user-scalable="no"/> <style> .box{ width:10rem; } </style> <script> function setRootRem(){ const root = document.documentElement; const scale = root.clientWidth / 10; root.style.fontSize = scale + 'px' } setRootRem() window.addEventListener('resize', setRootRem) </script> </head>
但这样我们会发现在写布局的时候会非常复杂,也就是你需要自己手动去计算一下对应的rem值,比如上面的font-size设计稿上是20px,那我们就要计算一下20px对应的rem是多少,按我们上面的规则,1px = 1/37.5rem,所以20px应该对应20/37.5 = 0.53rem。所以这种方案我们通常搭配着CSS预处理器使用。 rem.less
@device-width:375; @rem:(@device-width/10rem)
然后将@rem配置成less全局变量
font-size:(24/@rem)
特点
- 适配原理稍复杂
- 需要使用JS
- 设计稿标注的px换算到rem
- 方案灵活,既能实现整体缩放,又能实现局部不缩放
vw、vh适配
rem.less
@device-width:375; @vw:(100vm/@device-width)
font-size: 16*@vw
特点
- 适配原理简单
- 不需要JS即可适配
- 设计稿标注的px换算到vw
- 方案灵活,既然实现整体缩放,又能实现局部不缩放
px
export function initViewport() { const width = 375; // 设计稿宽度 const scale = window.innerWidth / width // console.log('scale', scale) let meta = document.querySelector('meta[name=viewport]') let content = `width=${width}, init-scale=${scale}, user-scalable=no` if(!meta) { meta = document.createElement('meta') meta.setAttribute('name', 'viewport') document.head.appendChild(meta) } meta.setAttribute('content', content) }
- 适配原理简单
- 需要JS
- 无需转换
- 方案死板,只能实现页面级别肢体缩放
CSS3动画
CSS3动画分为transition、animation、transform
transition(过度)
transition: transition-property transition-duration transitino-timing-function transition-delay
包含四个属性 transition-property:执行变换的属性 transition-duration:变换延续的时间 transitino-timing-function:在延续的时间段变换的速率变化 transition-delay:变换延迟时间
transitino-timing-function具体值
- linear 缺点:
- 不能重复
- height:auto不会产生动画效果
- 不支持所有的属性
支持的属性
- background-color
- background-position
- border-color
- border-width
- border-spacing
- bottom
- clip
- color
- font-size
- font-weight
- height
- left
- letter-spacing
- line-height
- margin
- max-height
- max-width
- min-height
- min-width
animation
keyframes规则用于定义动画的每个阶段。通过keyframe规则,可以指定动画的每个关键帧。
@keyframes example{ 0% {left: 0; top:0px;} 50% {left:200px; top:200px;} 100% {left: 0px; top:0px;} } div { animation-name: example; animation-duration: 5s; animation-iteration-count: infinite; animation-direction:alternate; animation-play-state:running; }
详细属性
- animation-name:指定应用的动画名称
- animation-duration:指定动画的持续时间
- animation-timing-function:指定动画的速度曲线
- animation-delay: 指定动画开始之前的延长时间
- animation-interation-count: 指定动画应该重复的速度
- animation-direction: 指定动画的方向
- animation-fill-mode: 指定动画在执行之前和之后如何应用样式
- animation-play-state:指定动画运行或暂停
transform(变换)
旋转
2D transform:rotate(angle)顺时针 3D
transform:
- rotate(x,y,z,angle) x轴y轴z轴 angle:旋转角度
- rotateX(angle)
- rotateY(angle)
- rotateZ(angle)
缩放
2D transform:scale(x,y) 3D transform:scale3D(x,y,z) scaleX() scaleY() scaleZ()
倾斜
stransform:skew(x) stransform:skew(x,y)
移动
transform:translate(x) transform:translate(x,y) transform:translate(x,y,z) transform:translateX() transform:translateY() transform:translateZ()
给大家推荐一个实用面试题库
1、前端面试题库 (面试必备) 推荐:★★★★★
地址:web前端面试题库