CSS JS 常见总集篇
掌握html语义化,避免通篇div
扎实css基础
1. 提升可访问性;
2. SEO;
3. 结构清晰,利于维护;
1. css页面布局
题目一:高度已知,三栏布局,左右栏固定宽度,中间自适应
1. float浮动布局
2. absolute绝对定位布局,左右固定好width,左侧设置left:0,中间设置left与right为左右width宽度,右侧设置right:0
3. flex布局,左右宽度固定,中间设置flex:1
4. table表格布局,左右设置宽度固定
5. grid网格布局
---- 课题延伸 ----
优缺点 / 比较
1. 缺点:float脱离文档流,需要处理清除浮动
优点:兼容性好
2. 缺点:子元素都将脱离文档流,使用性比较差
优点:快捷,不容易出问题
3. 缺点:存在兼容性问题
优点:较新型解决方案,解决以上两种布局的不足
4. 缺点:存在历史诟病问题
优点:使用简单,兼容性好
5. 缺点:可能存在兼容问题
优点:较新型解决方案,可实现多种复杂布局,起源是栅格布局
高度改变(某栏内容撑开容器)时哪个布局将不适用:
float溢出部分样式出错;
absolute依据内容撑开所在栏,其他栏不会变
flex布局自适应改变(可用)
table布局自适应改变(可用)
grid布局不随内容改变,内容直接溢出
真实开发中哪个最实用?
2. css盒模型
标准模型+IE模型,两种模型区别
margin
border
padding
content
padding
border
margin
标准模型:
height * width = content
IE模型:
height * width = content + padding + border
css如何设置两种模型:
box-sizing: content-box (浏览器默认)
box-sizing: border-box
js获取模型宽高:
dom.style.width / height (只能取元素内联的样式)
dom.currentStyle.width / height (获取渲染后的值,但只有IE支持)
dom.getComputedStyle(dom).width / height (兼容性好,获取实际宽高)
dom.getBoundingClientRect().width / height (获取实际宽高,以及相对位置)
边距重叠问题(父子元素 / 相邻元素):
BFC 块级格式化上下文
overflow: hidden / auto;
3. DOM事件类
Dom事件级别(不同时期的标准):
DOM0 : element.onclick=function(){}
DOM1 : 没有制定过跟事件相关的标准
DOM2 : element.addEventListener('click',function(){},false)
DOM3 : element.addEventListener('keyup',function(){},false) 相比DOM2多出一些键盘鼠标事件等类型
Dom事件模型(捕获 / 冒泡):
事件流(浏览器与用户交互响应):
捕获 ↓ 目标元素 冒泡 ↑
描述DOM事件捕获具体流程:
window -> document -> html(document.documentElement) -> body(document.body) -> HTML结构 目标元素
Event对象的常见应用:
event.preventDefault()
阻止默认事件(比如阻止点击a标签会触发页面跳转)
event.stopPropagation()
阻止冒泡事件(点击子元素时阻止触发父级元素冒泡)
event.stoplmmediatePropagation()
事件响应优先级(同时注册两个事件时阻止另一个事件触发)
event.currentTarget
事件代理 当前触发事件的对象
event.target
事件代理 获取点击的元素对象
自定义事件:
var eve = new Event('custome') // 只定义了事件名
var eve2 = new CustomeEvent('custome', obj) // 可传参
// 注册事件
document.addEventListener('custome', function(){
....
})
// 触发事件
document.dispatchEvent(eve)
自定义事件 :
true表示捕获阶段触发 false表示冒泡阶段触发
4. 原型链类
创建对象有几种方法
1. 字面量
var o1 = {xx:''}
var o11 = new Object({xx:''})
2. 构造函数
var M = function(xx){this.xx=xx}
var o2 = new M('')
3. Object.create
var P = {xx:''}
var o3 = Object.create(P)
原型、构造函数、实例、原型链
构造函数 -- new >> 实例对象 -- _proto_ >> 原型对象<br> | prototype (系统自动加上的属性)<br> 原型对象.constructor
原理:共享原型对象,实例通过原型链找到方法
instanceof的原理
instanceof
实例对象.__proto__ ---> 构造函数.prototype
实例对象.__proto__ --constructor--> 构造函数
new运算符
一个新对象被创建,继承foo.prototype
var new2 = function (func) {
var o = Object.cteate(func.prototype)
var result = func.call(o)
if (typeof result === 'object') {
return result
} else return o
}
5. 面向对象
类的声明
ES5:
function Animal() {
this.name = 'name'
}
ES6:
class Animal2 {
constructor () {
this.name = name
}
}
实例化
new Animal() ......
借助构造函数实现部分继承
function Parent(params) {
this.name = 'parent'
}
function Child(params) {
Parent.call(this) // /apply
this.type = 'child'
}
// 存在问题:无法继承原型对象上的方法
借助原型链实现继承
function Child2(params) {
this.type = 'child2'
}
Child2.prototype = new Parent()
// 存在问题:操作实例对象改变的是同一个原型对象,会导致其他实例对象也发生改变
组合后解决以上问题
function Child3() {
Parent.call(this)
this.type = 'child3'
}
Child3.prototype = new Parent()
// 存在问题:构造函数被多余执行
组合优化写法
function Child4() {
Parent.call(this)
this.type = 'child4'
}
Child4.prototype = Parent.prototype // 引用类型
// 存在问题:共用了父类的原型对象
组合优化写法2
function Child5() {
Parent.call(this)
this.type = 'child5'
}
Child5.prototype = Object.create(Parent.prototype)
Child5.prototype.constructor = Child5
6. 通信类
同源策略
限制从一个源加载的文档或脚本与来自另一个源的资源进行交互
隔离潜在恶意脚本
前后端如何通信
Ajax
WebSocket
CORS
如何创建Ajax
- XMLHttpRequest对象的工作流程
- 兼容性的处理
- 事件的触发条件和顺序
7. 安全类
CSRF 跨站请求伪造
攻击原理
网站B中引诱用户点击链接,向网站A发起请求
网站A中某一接口存在漏洞
用户登录过该网站A,本地存在着cookie
防御措施
token验证
referer验证(页面来源)
隐藏令牌
XSS 跨域脚本攻击
往页面注入脚本
插入js不执行
8. 算法类
0. 排序
- 快速排序
- 选择排序
- 希尔排序
- 冒泡排序
1. 堆栈、队列、链表
2. 递归
3. 波兰式和逆波兰式
9. 渲染机制
DOCTYPE
告诉浏览器当前什么文档类型,浏览器根据此选择解析方式
HTML5
<!DOCTYPE html>
HTML4.01
严格模式:不解析已废弃的元素
传统模式
- 浏览器渲染过程
- 重排
- 重绘
- 布局
10. JS运行机制
单线程
任务队列
同步任务 while for ..
异步任务 setTimeOut setinterval promise ..
异步任务被挂起,同步任务执行完后异步任务进入队列
for(i=0;i<4;i++){
setTimeOut(function(){
console.log(i)
},1000)
} // 结果为间隔一秒后输出4次4
11. 页面性能
资源压缩合并,减少HTTP请求
非核心代码的异步加载
异步加载方式:
1. 动态脚本加载
2. defer (script标签属性)
3. async (同上)
区别:
defer在HTML解析完之后执行,会按顺序执行
async在加载完成后立即执行,不一定会按顺序
浏览器缓存
强缓存 Expires Cache-Control
协商缓存 Last-Modified Etag If-None-Match
CDN加速
预解析DNS (https默认关闭了预解析,需要添加meta开启)
<link rel="dns-prefetch" herf="">
12. 错误监控
即时运行错误的捕获方式
try..catch
window.onerror
资源加载错误
object.onerror
performance.getEntries()
Error事件捕获 widow.addEventListener('error',func..)
上报错误
(new Image()).src = 'http://xx.com/?a=1'
题外
业务能力
做过什么业务
负责的业务有什么业绩
使用了什么技术方案
突破了什么技术难点
遇到了什么问题
最大的收获
团队协作能力
其他
乐观积极 主动沟通 逻辑顺畅 上进有责任心 有主张 做事果断
职业竞争力
业务能力 行业前列
思考能力 同一事物多思考最优解
学习能力 不断学习新技术,沉淀总结
职业规划
目标是什么:业务上成为专家,技术上成为行业大牛
近阶段目标:不断学习积累各方面经验
长期目标:做几件有价值的事情,如开源作品,技术框架
方式方法:先完成业务,做到极致,逐步向目标靠拢
希望公司能提供什么:技术分享会;对于开发可以给到相关平台工具权限等资源