- 一、css
- 盒模型
- 如何实现一个最大的正方形?
- 水平垂直居中
- 二、JS
一、css
1、盒模型
.box{
width:200px;
height:200px;
padding:20px;
border:20px solid black;
margin:20px;
background:red;
}
标准模式下:box-sizing:content-box; 红色区域:width 200px + padding 20px * 2
ie模式下:box-sizing: border-box;
红色区域: width:200px - padding 20px * 2 - border 20px * 2
2、如何实现一个最大的正方形?
.box {
width:100%;
padding-bottom: 100%;
height:0;
background:red;
}
用padding-bottom撑开边距。
3、水平垂直居中
水平居中:
(1) 行内元素:text-align: center;
(2) 块级元素: margin: 0 auto;
(3) flex弹性布局
.item{
display: flex;
justify-content: center;
}
(4) transform属性
.son{
position: absolute;
left:50%;
transform: translate(-50% , 0);
}
(5) 绝对定位和负的margin / 绝对定位
.son{
position: absolute;
left: 50%;
width: 固定;
margin-left: -50% * 固定;
}
.son{
position:absolute;
left: 0;
right: 0;
margin: 0 auto;
width: 固定;
}
垂直居中 (1)单行文本: line-height = 父元素height (2) 行内块元素
.parent::after .son{
display: inline-block;
vertical-align: center;
}
.parent::after{
content: '';
height:100%;
}
(3) flex弹性布局
缺点:IE8、9 不支持,需要浏览器厂商前缀,渲染上可能有问题
.parent{
display: flex;
align-items: center;
}
(4)元素高度不定---- transform
缺点:IE8不支持,需要浏览器厂商前缀,渲染上可能有问题
.son {
position: absolute;
top: 50%;
transfrom: translate(-50%, -50%);
}
(5) 元素高度固定---适用于所有浏览器
.son {
position:absolute;
top:50%;
height: 固定;
margin-top: - 50% * 固定;
}
.son{
position: absolute;
top: 0;
bottom: 0;
margin: auto 0;
}
4、常见布局 (1)两列布局,左边固定宽度,右边自适应
.left{
width: 200px;
float: left;
margin-right: 10px;
}
.right{
overflow: hidden; // 创建 bfc
}
(2) 左右等高布局
<div class="layout">
<div class="left">left</div>
<div class="right">center</div>
</div>
<style>
.layout{
display: table;
width: 100%;
}
.layout div{
display: table-cell;
}
.layout .left{
width: 50%;
height: 200px;
}
.layout .right{
width: 50%;
}
</style>
5、三角形

.sqre{
width:0;
height:0;
border-top: 20px solid blue;
border-bottom: 20px solid yellow;
border-left: 20px solid transparent;
border-right: 20px solid red;
}
6、link 和@important的区别?
<style type="text/css">@import url(路径地址/test.css);</style>
<link href="路径地址/test.css" rel="stylesheet" type="text/css" />
- 加载顺序:引入css时,link页面载入时同步加载 ---页面完全载入加载;
- 属性:link是xhtml标签,除了引入css还可以定义rss其他事务。 ---- 只能加载css.
- link 无兼容问题--- @important 是css2.1提出的,有低版本兼容问题;
- link支持js方式改变dom样式---@important不支持;
7、bfc---块格式化上下文 (block formatting context)定义?
触发条件:
- 根元素 html;
- 浮动元素(float不为none);
- 绝对定位元素(postion等于fixed或者absolute);
- 内联块(display: inline-block);
- 表格单元格和表格标题;
- 具有overflow 且 不为none的块元素; 特性(功能):
- 使bfc内部浮动元素不会乱跑;
- 和浮动元素产生边界。
二、JS 1、js的基本数据类型? 判断方法?
基本类型: number、string、 boolean、 undefined、 null
引用类型: object、 function、 array
判断方法:
(1) typeof
可以判断出 number,string,boolean,undefined; typeof null = undefined;
typeof object/arrry = object;
(2) Object.prototype.toString.call() 所有类型都可以使用。常用于判断浏览器内置对象;
if(Object.prototype.toString.call(data) === '[object Object]') {
return 'object'
} else if(Array.isArray(data)) {
return 'array'
} else {
return 'base'
}
调用该方法输出的结果:[objec XXX]
(3) Array.isArray(XXX) 判断是否为数组
2、es5和es6声明变量的方法? es5: 有var/function es6: 有 let\const\class\important
3、闭包的概念?优缺点?
function makeFunc() {
var name = "Mozilla"; // name 是一个被 makeFunc 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
概念:内部函数总是可以访问其所在的外部函数中声明的变量和参数;
特点:
- 让外部函数访问内部函数的变量;
- 外部函数声明的局部变量会常驻内存中,缓存变量;
- 可以避免使用全局变量,造成全局污染;
- 内存空间无法得到释放,造成内存泄漏;
4、赋值、浅拷贝、深拷贝
(1) 赋值:将某一个数值或者对象赋给另一个变量;
基本数据类型:赋值,两个变量之间不互相影响;
引用数据类型:赋址,两个变量实际上是指向同一地址,相互影响;
(2) 浅拷贝 :创建一个新的对象,该对象是对原始对象属性值的精确拷贝;(基本类型将拷贝基本类型的值,引用类型则是拷贝引用类型的内存地址)
使用场景:
* 方法一:Object.assign()
* 方法二: 展开语法spread {...XX }
* 方法三:Array.prototype.slice(start, end);--不包含end元素的新数组;
```
let a = {
name: "tom",
msg: {
num: "1"
}
}
let b = Object.assign({}, a);
或 let b = { ...a};
或 let b = a.slice(0);
a.name = "jon";
a.msg.num = "2";
console.log(a);
// {
// name: "jon",
// msg: {num: '2'}
// }
console.log(b);
// {
// name: "tom",
// msg: {num: '2'}
// }
```
(3) 深拷贝
将拷贝所有的属性,包含属性所指向的动态分配的内存;
使用场景:
* 方法一:JSON.parse(JSON.stringify(object))
* 方法二: 使用递归的方法
缺点:
会忽略 undefined\symbol\ 函数;
不能序列化-函数;
不能解决循环引用的对象, 会报错;
不能处理正则;
不能正确处理new Data(),转换结果会不对应;
例子一:
let obj = {
name: 'muyiy',
a: undefined,
b: Symbol('muyiy'),
c: function() {}
}
let b = JSON.parse(JSON.stringify(obj));
console.log(b);
// {name: "muyiy"}
例子二:
// 木易杨
let obj = {
a: 1,
b: {
c: 2,
d: 3
}
}
obj.a = obj.b;
obj.b.c = obj.a;
let b = JSON.parse(JSON.stringify(obj));
// Uncaught TypeError: Converting circular structure to JSON
例子三:
new Date();
// Mon Dec 24 2018 10:59:14 GMT+0800 (China Standard Time)
JSON.stringify(new Date());
// ""2018-12-24T02:59:25.776Z""
解决办法:转为字符串或时间戳
new Date().valueOf();
// 1545620645915
例子四:
正则表达式无法字符串转换~
let obj = {
name: "muyiy",
a: /'123'/
}
5、数组去重的方法 (1)原始方法:定义一个新数组,将数组中的元素与新数组中的元素一一对比,不相同则放入新数组中。 (2) 先将数组排序,再与相邻位置对比,不同的放入新数组中; (3) 利用数组的indexOf下标属性来查询; (4) 利用es6的set方法; (5) 用数组原型对象上的方法
* includes方法
* filter和includes方法
* forEach和includes方法
方法一:
function deal(list) {
let now = [list[0]], old = list;
for(var i= 1; i<old.length;i++) {
var repeat = false;
for(var y = 0; y < now.length; y++) {
console.log(old[i],now[y]);
if(old[i]=== now[y]){
repeat = true;
break;
}
}
if(!repeat) {
now.push(old[i]);
}
}
return now;
}
方法二:
function deal(list) {
let now = [], old = list.sort();
for(var i= 0; i<old.length;i++) {
if(old[i]!== old[i-1]){
now.push(old[i]);
}
}
return now;
}
方法三:
function deal(arr) {
//Set数据结构,它类似于数组,其成员的值都是唯一的
return Array.from(new Set(arr)); // 利用Array.from将Set结构转换成数组
}
方法四:
function deal(list) {
let now = [], old = list;
for(var i= 0; i<old.length;i++) {
// indexof方法
if(now.indexOf(old[i] === -1)){
now.push(old[i]);
}
// includes
if(!now.includes(old[i])){
now.push(old[i]);
}
}
return now;
}
方法五:
function deal(list) {
var now = [];
//
now = list.filter((item) => {
return now.includes(item) ? '' : now.push(item)
})
// list.forEach((item) => {
return now.includes(item) ? '' : now.push(item);
}
return now;
}
6、dom事件有哪些阶段,谈谈对事件代理的理解?
三大阶段:捕获-目标-冒泡
事件代理:事件不直接绑定在某元素上,而是绑定了该元素的父元素上,进行触发事件后,通过条件判断执行相关操作;
7、前端性能优化 (1) 减少请求数量 (2) 减小资源大小 (3) 优化网络连接 (4) 优化资源加载 (5) 减少重绘回流 (6) 性能更好的api (7) webpack优化
- 减少请求数量:合并,图片处理(雪碧图、base64编码),减少重定向,使用缓存,不使用css@import
- 减小资源大小: html\js\css\图片压缩,wep格式图片,
- 优化网络连接:使用CDN,使用dns预解析,并行连接,持久连接
- 优化资源加载:资源加载位置(css放在head中,js放在body的底部),资源加载时机(模块按需加载,资源懒加载,资源预加载)
- 减少重绘回流