-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.json
1 lines (1 loc) · 129 KB
/
search.json
1
[{"title":"简历","url":"/resume.html","content":"\n# 联系方式\n\n* 手机/微信号:17603007311\n* Email:[email protected] \n* QQ:1013334587\n\n\n# 个人信息\n\n * 刘金荣/男/23\n * 南昌大学/软件学院/软件技术\n * 工作年限:2年\n * 技术博客:[rongmo.github.io](loeuy.cn)\n * 期望职位:前端工程师\n * 期望城市:广州、深圳\n\n<!--more-->\n\n# 技能清单\n\n* 熟练运用 HTML、CSS 等网页重构技术进行页面开发,对页面布局、文档流、盒模型等有自己的理解,熟悉 CSS3、HTML5 新特性。\n* 熟悉 PS,psd切图构建页面框架,背景小图合成雪碧图;了解AI,使用ai制作字体图标,优化页面加载。\n* 熟悉客户端 JavaScript 及浏览器 DOM技术,但不仅限于 JavaScript 及浏览器 DOM,对于常用 JavaScript 框架和类库(如 jQuery、Bootstrap、swiper、zepto、lazyload)也熟练掌握;了解服务端 JavaScript 技术(如 Node.js)。\n* 熟悉响应式布局,弹性盒布局,移动端适配,less 的用法。\n* 熟悉Vue.js 并有相关项目开发经验,掌握vue-cli,vue-router,axios,vuex等的使用,熟练使用模块组件化,了解部分指令的实现机制。\n* 熟悉微信小程序并有相关项目开发经验,了解小程序的开发原理。\n* 熟悉 ECMAScript6 及基于 webpack 的前端模块化构建工作流。\n* 熟悉 git 工作流及常用的 Linux 命令,对服务器配置与环境搭建等也有所了解。习惯使用 Visual Studio Code/WebStorm + Google Chrome 的开发环境。\n* 了解react 技术栈、Angular 技术栈。\n\n\n\n# 工作经历\n\n>## 东莞市易得网络 (2017年5月 ~ 至今 ) web前端工程师\n\n* 负责公司网站开发,性能优化,维护\n* 配合后台工程师,完成产品前台页面制作,致力于改善用户体验\n* 前后端分离,与后台进行沟通共同完成数据格式,数据接口制定,实现前后台数据交互 \n* 与客户对接,修改客户提出的需求,帮助客户发布小程序与后期的优化、维护\n\n#### 美业易后台管理系统(2018.05~2018.08) \n\n\t待更新\n\n\n#### 美业易微信小程序(2018.02~2018.05) \n\t待更新\n\n#### 聚超微商城 (2017.10~2018.01) \n\n\t待更新\n\n\n#### 红蜻蜓微商城/PC商城(2017.05~2017.10)\n\n\t待更新\n\n\n>## 南昌百恒网络 ( 2015年12月 ~ 2017年4月 ) web开发\n\n * 主要负责公司前端页面的开发和维护\n * 根据文档需求,与后端开发人员合作完成页面的交互功能\n * 高质量的完成上级交代的任务\n\n#### 中国婚庆糖果网(PC 端)(2016.03-2016.06)\n * 项目简介:中国婚庆糖果网致力于打造全国最大的喜糖订包中心,与全国各地的婚纱摄影店合作,为每一对新人提供周到完善的喜糖预定,及包装解决方案。\n * 责任描述:团队合作,本人负责部分页面的编写,和后台人员沟通实现页面数据的交互。\n * 项目技术:\n * 运用 DIV+CSS 完成布局排版;\n * 配合后台人员,使用 ajax 来完成数据渲染;\n * 使用 JQuery 完成页面的动画效果,增加用户的体验\n * 使用百度分享插件。\n\n#### 中国婚庆糖果网(微商城)(2016.07-2016.10)\n * 责任描述:团队合作项目,负责部分页面编写,和一些逻辑代码的编写。\n * 项目技术:\n * 使用 require.js\n * 使用 swiper 实现轮播\n * 使用 JavaScript/jQuery 完成相关逻辑\n * 使用 rem、flex 适应不同分辨率、不同终端设备\n\n#### 里鲜生(微商城) (2016.10~2017.02)\n * 项目简介:该项目是电商交易平台,专注于农副生鲜产品的配送,OTO 电商运营。责任描述:团队合作项目,主要负责搭建框架,并编写部分页面以及数据的渲染。\n * 责任描述:团队合作项目,主要负责搭建框架,并编写部分页面以及数据的渲染。\n * 项目技术:\n * 运用sass进行代码编译实现手机端适配,运用gulp进行代码的整理和压缩\n * 使用 angular.js ,运用 angular-ui-route 实现路由之间的切换\n * 使用 angular.js 中$http 请求数据并完成渲染\n\n---\n# 致谢\n感谢您花时间阅读我的简历,期待能有机会和您共事。\n ","tags":["简历"]},{"title":"ClassName命名","url":"/ClassName.html","content":"\n\nClassName的命名应该尽量精短、明确,必须以**字母开头命名**,且**全部字母为小写**,单词之间**统一使用下划线** “_” 连接\n\n<!--more-->\n\n## 命名原则 \n\n基于姓氏命名法(继承 + 外来),如下图:\n\n![enter image description here](http://labs.qiang.it/ppguide/img/standard_jiapu.png)\n\n祖先模块不能出现下划线,除了是全站公用模块,如 `mod_` 系列的命名:\n\n**推荐:**\n\n```html\n<div class=\"modulename\">\n\t<div class=\"modulename_info\">\n\t\t<div class=\"modulename_son\"></div>\n\t\t<div class=\"modulename_son\"></div>\n\t\t...\n\t</div>\n</div>\n\t\n<!-- 这个是全站公用模块,祖先模块允许直接出现下划线 -->\n<div class=\"mod_info\">\n\t<div class=\"mod_info_son\"></div>\n\t<div class=\"mod_info_son\"></div>\n\t...\t\t\n</div>\n```\n\n**不推荐:**\n\n```html\n<div class=\"modulename_info\">\n\t<div class=\"modulename_info_son\"></div>\n\t<div class=\"modulename_info_son\"></div>\n\t...\t\t\n</div>\t\n```\n\n在子孙模块数量可预测的情况下,严格继承祖先模块的命名前缀\n\n```html\n<div class=\"modulename\">\n\t<div class=\"modulename_cover\"></div>\n\t<div class=\"modulename_info\"></div>\n</div>\n```\n\n当子孙模块超过4级或以上的时候,可以考虑在祖先模块内具有识辨性的独立缩写作为新的子孙模块\n\n**推荐:**\n\n```html\n<div class=\"modulename\">\n\t<div class=\"modulename_cover\"></div>\n\t<div class=\"modulename_info\">\n \t<div class=\"modulename_info_user\">\n \t\t<div class=\"modulename_info_user_img\">\n \t\t\t<img src=\"\" alt=\"\">\n \t\t\t<!-- 这个时候 miui 为 modulename_info_user_img 首字母缩写-->\n \t\t\t<div class=\"miui_tit\"></div>\n \t\t\t<div class=\"miui_txt\"></div>\n \t\t\t...\n \t\t</div>\n \t</div>\n \t<div class=\"modulename_info_list\"></div>\n\t</div>\n</div>\n```\n\n**不推荐:**\n\n```html\n<div class=\"modulename\">\n\t<div class=\"modulename_cover\"></div>\n\t<div class=\"modulename_info\">\n \t<div class=\"modulename_info_user\">\n \t\t<div class=\"modulename_info_user_img\">\n \t\t\t<img src=\"\" alt=\"\">\n \t\t\t<div class=\"modulename_info_user_img_tit\"></div>\n \t\t\t<div class=\"modulename_info_user_img_txt\"></div>\n \t\t\t...\n \t\t</div>\n \t</div>\n \t<div class=\"modulename_info_list\"></div>\n\t</div>\n</div>\n```\n\n## 模块命名\n\n全站公共模块:以 `mod_` 开头\n\n```html\n<div class=\"mod_yours\"></div>\n```\n\n业务公共模块:以 `业务名_mod_` 开头\n\n```html\n<div class=\"paipai_mod_yours\"></div>\n```\n\n## 常用命名推荐\n\n**注意**:ad、banner、gg、guanggao 等有机会和广告挂勾的字眠不建议直接用来做ClassName,因为有些浏览器插件(Chrome的广告拦截插件等)会直接过滤这些类名,因此 \n\n```html\n<div class=\"ad\"></div>\n```\n\n这种广告的英文或拼音类名不应该出现\n\n另外,**敏感不和谐字眼**也不应该出现,如:\n\n```html\n<div class=\"fuck\"></div>\n<div class=\"jer\"></div>\n<div class=\"sm\"></div>\n<div class=\"gcd\"></div> \n<div class=\"ass\"></div> \n<div class=\"KMT\"></div> \n...\n```\n\n| ClassName | 含义 |\n| ---------------------- | -------------------- |\n| about | 关于 |\n| account | 账户 |\n| arrow | 箭头图标 |\n| article | 文章 |\n| aside | 边栏 |\n| audio | 音频 |\n| avatar | 头像 |\n| bg,background | 背景 |\n| bar | 栏(工具类) |\n| branding | 品牌化 |\n| crumb,breadcrumbs | 面包屑 |\n| btn,button | 按钮 |\n| caption | 标题,说明 |\n| category | 分类 |\n| chart | 图表 |\n| clearfix | 清除浮动 |\n| close | 关闭 |\n| col,column | 列 |\n| comment | 评论 |\n| community | 社区 |\n| container | 容器 |\n| content | 内容 |\n| copyright | 版权 |\n| current | 当前态,选中态 |\n| default | 默认 |\n| description | 描述 |\n| details | 细节 |\n| disabled | 不可用 |\n| entry | 文章,博文 |\n| error | 错误 |\n| even | 偶数,常用于多行列表或表格中 |\n| fail | 失败(提示) |\n| feature | 专题 |\n| fewer | 收起 |\n| field | 用于表单的输入区域 |\n| figure | 图 |\n| filter | 筛选 |\n| first | 第一个,常用于列表中 |\n| footer | 页脚 |\n| forum | 论坛 |\n| gallery | 画廊 |\n| group | 模块,清除浮动 |\n| header | 页头 |\n| help | 帮助 |\n| hide | 隐藏 |\n| hightlight | 高亮 |\n| home | 主页 |\n| icon | 图标 |\n| info,information | 信息 |\n| last | 最后一个,常用于列表中 |\n| links | 链接 |\n| login | 登录 |\n| logout | 退出 |\n| logo | 标志 |\n| main | 主体 |\n| menu | 菜单 |\n| meta | 作者、更新时间等信息栏,一般位于标题之下 |\n| module | 模块 |\n| more | 更多(展开) |\n| msg,message | 消息 |\n| nav,navigation | 导航 |\n| next | 下一页 |\n| nub | 小块 |\n| odd | 奇数,常用于多行列表或表格中 |\n| off | 鼠标离开 |\n| on | 鼠标移过 |\n| output | 输出 |\n| pagination | 分页 |\n| pop,popup | 弹窗 |\n| preview | 预览 |\n| previous | 上一页 |\n| primary | 主要 |\n| progress | 进度条 |\n| promotion | 促销 |\n| rcommd,recommendations | 推荐 |\n| reg,register | 注册 |\n| save | 保存 |\n| search | 搜索 |\n| secondary | 次要 |\n| section | 区块 |\n| selected | 已选 |\n| share | 分享 |\n| show | 显示 |\n| sidebar | 边栏,侧栏 |\n| slide | 幻灯片,图片切换 |\n| sort | 排序 |\n| sub | 次级的,子级的 |\n| submit | 提交 |\n| subscribe | 订阅 |\n| subtitle | 副标题 |\n| success | 成功(提示) |\n| summary | 摘要 |\n| tab | 标签页 |\n| table | 表格 |\n| txt,text | 文本 |\n| thumbnail | 缩略图 |\n| time | 时间 |\n| tips | 提示 |\n| title | 标题 |\n| video | 视频 |\n| wrap | 容器,包,一般用于最外层 |\n| wrapper | 容器,包,一般用于最外层 |\n\n"},{"title":"移动端常见的一些兼容性问题","url":"/mob_com.html","content":"\n随着手机的普及,移动端的开发也成了一个重要的方向,但由于设备的不统一会造成一些兼容性问题,\n\n##### 1、安卓浏览器看背景图片,有些设备会模糊。\n\n用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢?\n\n经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页,这样字会非常小,所以苹果当初就把iPhone 4的960 * 640分辨率,在网页里只显示了480 * 320,这样devicePixelRatio=2。现在android比较乱,有1.5的,有2的也有3的。\n\n<!--more-->\n\n想让图片在手机里显示更为清晰,必须使用2x的背景图来代替img标签(一般情况都是用2倍)。例如一个div的宽高是100 * 100,背景图必须得200 * 200,然后background-size:contain;,这样显示出来的图片就比较清晰了。\n\n代码可以如下:\n\n```css\nbackground:url(../images/icon/all.png) no-repeat center center;\n-webkit-background-size:50px 50px;\nbackground-size: 50px 50px;display:inline-block; width:100%; height:50px; \n```\n\n\n\n或者指定 background-size:contain;都可以,大家试试!\n\n##### 2、图片加载\n\n若您遇到图片加载很慢的问题,对这种情况,手机开发一般用canvas方法加载:\n\n具体的canvas API 参见:http://javascript.ruanyifeng.com/htmlapi/canvas.html\n\n下面举例说明一个canvas的例子:\n\n```html\n<li><canvas></canvas></li>\n//js动态加载图片和li 总共举例17张图片!\n<script>\nvar total=17; \nvar zWin=$(window); \nvarrender=function(){\n var padding=2; \n var winWidth=zWin.width(); \n var picWidth=Math.floor((winWidth-padding*3)/4); \n var tmpl ='';\n for(var i=1;i<=totla;i++){ \n var p=padding; \n var imgSrc='img/'+i+'.jpg';\n if(i%4==1){\n p=0;\n }\n tmpl +='<li style=\"width:'+picWidth+'px;height:'+picWidth+'px;padding-left:'+p+'px;padding-top:'+padding+'px;\"><canvas id=\"cvs_'+i+'\"></canvas></li>';\n var imageObj = newImage(); \n imageObj.index = i; \n imageObj.onload = function(){\n var cvs =$('#cvs_'+this.index)[0].getContext('2d');\n cvs.width = this.width;\n cvs.height=this.height;\n cvs.drawImage(this,0,0);\n }\n imageObj.src=imgSrc;\n }\n}\nrender();\n</script>\n```\n\n\n\n##### 3、假如手机网站不用兼容IE浏览器,一般我们会使用zeptojs\n\nzeptojs内置Touch events方法,具体可以看http://zeptojs.com/#Touch events\n\n看了一下zeptio新版的API,已经支持IE10以上浏览器,对zeptojs可以选择使用!\n\n##### 4、防止手机中网页放大和缩小。\n\n这点是最基本的,最为手机网站开发者来说应该都知道的,就是设置meta中的viewport\n\n还有就是,有些手机网站我们看到如下声明:\n\n代码如下:\n\n`<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.0//EN\" \"http://www.wapforum.org/DTD/xhtml-mobile10.dtd\">`\n\n设置了DTD的方式是XHTML的写法,假如我们页面运用的是html5,可以不用设置DTD,直接声明<!DOCTYPE html>。\n\n使用viewport使页面禁止缩放。 通常把user-scalable设置为0来关闭用户对页面视图缩放的行为。\n\n`<meta name=\"viewport\"content=\"user-scalable=0\"/>`\n\n但是为了更好的兼容,我们会使用完整的viewport设置。\n\n[复制代码]()代码如下:\n\n`<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0\" />`\n\n当然,`user-scalable=0`,有的人也写成`user-scalable=no`,都可以的。\n\n##### 5、apple-mobile-web-app-capable\n\napple-mobile-web-app-capable是设置Web应用是否以全屏模式运行。\n\n语法:\n\n`<meta name=\"apple-mobile-web-app-capable\"content=\"yes\">`\n\n说明:\n\n如果content设置为yes,Web应用会以全屏模式运行,反之,则不会。content的默认值是no,表示正常显示。你可以通过只读属性window.navigator.standalone来确定网页是否以全屏模式显示。\n\n##### 6、format-detection\n\nformat-detection 启动或禁用自动识别页面中的电话号码。\n\n语法:\n\n`<meta name=\"format-detection\"content=\"telephone=no\">`\n\n说明:\n\n默认情况下,设备会自动识别任何可能是电话号码的字符串。设置telephone=no可以禁用这项功能。\n\n##### 7、html5调用安卓或者ios的拨号功能\n\nhtml5提供了自动调用拨号的标签,只要在a标签的href中添加tel:就可以了。\n\n如下:\n\n`<a href=\"tel:4008106999,1034\">400-810-6999 转 1034</a>`\n\n拨打手机直接如下\n\n` <a href=\"tel:15677776767\">点击拨打15677776767</a>`\n##### 8、html5GPS定位功能\n\n具体请看:http://www.w3school.com.cn/html5/html_5_geolocation.asp\n\n##### 9、上下拉动滚动条时卡顿、慢\n\n`body {-webkit-overflow-scrolling: touch; overflow-scrolling: touch;}`\n\nAndroid3+和iOS5+支持CSS3的新属性为overflow-scrolling\n\n##### 10、禁止复制、选中文本\n\n```css\nElement {-webkit-user-select:none;\n -moz-user-select:none;\n -khtml-user-select:none;\n user-select:none;\n}\n\n```\n\n\n\n解决移动设备可选中页面文本(视产品需要而定)\n\n##### 11、长时间按住页面出现闪退\n\n```css\nelement {\n -webkit-touch-callout:none;\n}\n```\n\n\n\n##### 12、iphone及ipad下输入框默认内阴影\n\n```css\nElement{\n -webkit-appearance:none;\n}\n```\n\n\n\n##### 13、ios和android下触摸元素时出现半透明灰色遮罩\n\n```css\nElement {\n -webkit-tap-highlight-color:rgba(255,255,255,0)\n}\n\n```\n\n\n\n设置alpha值为0就可以去除半透明灰色遮罩,备注:transparent的属性值在android下无效。\n\n后面一篇文章有详细介绍,地址:http://www.jb51.net/post/phone_web_ysk\n\n##### 14、active兼容处理 即 伪类 :active 失效\n\n方法一:body添加ontouchstart\n\n`<body ontouchstart=\"\">`\n\n方法二:js给 document 绑定 touchstart 或 touchend 事件\n```css\n<style>\n a {\n color:#000;\n }\n a:active {\n color:#fff;\n }\n </style>\n <a herf=foo >bar</a>\n <script>\n document.addEventListener('touchstart',function(){},false);\n</script>\n```\n##### 15、动画定义3D启用硬件加速\n\n```css\nElement {\n -webkit-transform:translate3d(0,0,0)\n transform: translate3d(0,0,0);\n}\n\n```\n\n注意:3D变形会消耗更多的内存与功耗\n\n##### 16、Retina屏的1px边框\n\n```css\nElement{\n border-width:thin;\n}\n```\n\n\n\n##### 17、webkit mask 兼容处理\n\n某些低端手机不支持css3 mask,可以选择性的降级处理。\n\n比如可以使用js判断来引用不同class:\n\n```javascript\nif('WebkitMask'indocument.documentElement.style){\n alert('支持mask');\n}else{\n alert('不支持mask');\n}\n```\n\n\n\n##### 18、旋转屏幕时,字体大小调整的问题\n\n```css\nhtml, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6{\n -webkit-text-size-adjust:100%;\n}\n```\n\n\n\n##### 19、transition闪屏\n\n设置内嵌的元素在3D 空间如何呈现:保留3D \n`-webkit-transform-style: preserve-3d;`\n设置进行转换的元素的背面在面对用户时是否可见:隐藏 /\n`-webkit-backface-visibility:hidden;`\n\n##### 20、圆角bug\n\n某些Android手机圆角失效\n\n`background-clip: padding-box;`\n\n##### 21、顶部状态栏背景色\n\n`meta name=\"apple-mobile-web-app-status-bar-style\"content=\"black\"/>`\n\n说明:\n\n除非你先使用apple-mobile-web-app-capable指定全屏模式,否则这个meta标签不会起任何作用。\n\n如果content设置为default,则状态栏正常显示。如果设置为blank,则状态栏会有一个黑色的背景。如果设置为blank-translucent,则状态栏显示为黑色半透明。如果设置为default或blank,则页面显示在状态栏的下方,即状态栏占据上方部分,页面占据下方部分,二者没有遮挡对方或被遮挡。如果设置为blank-translucent,则页面会充满屏幕,其中页面顶部会被状态栏遮盖住(会覆盖页面20px高度,而iphone4和itouch4的Retina屏幕为40px)。默认值是default。\n\n##### 22、设置缓存\n\n`<meta http-equiv=\"Cache-Control\"content=\"no-cache\"/>`\n\n手机页面通常在第一次加载后会进行缓存,然后每次刷新会使用缓存而不是去重新向服务器发送请求。如果不希望使用缓存可以设置no-cache。\n\n##### 23、桌面图标\n\n```html\n<link rel=\"apple-touch-icon\"href=\"touch-icon-iphone.png\"/>\n<link rel=\"apple-touch-icon\"sizes=\"76x76\"href=\"touch-icon-ipad.png\"/>\n<link rel=\"apple-touch-icon\"sizes=\"120x120\"href=\"touch-icon-iphone-retina.png\"/>\n<link rel=\"apple-touch-icon\"sizes=\"152x152\"href=\"touch-icon-ipad-retina.png\"/>\n```\n\niOS下针对不同设备定义不同的桌面图标。如果不定义则以当前屏幕截图作为图标。\n\n上面的写法可能大家会觉得会有默认光泽,下面这种设置方法可以去掉光泽效果,还原设计图的效果!\n\n ` <link rel=\"apple-touch-icon-precomposed\"href=\"touch-icon-iphone.png\"/>`\n\n图片尺寸可以设定为5757(px)或者Retina可以定为114114(px),ipad尺寸为72*72(px)\n\n##### 24、启动画面\n\n`<link rel=\"apple-touch-startup-image\"href=\"start.png\"/>`\n\niOS下页面启动加载时显示的画面图片,避免加载时的白屏。\n\n可以通过madia来指定不同的大小:\n\n```html\n<!--iPhone-->\n<link href=\"apple-touch-startup-image-320x460.png\"media=\"(device-width: 320px)\" rel=\"apple-touch-startup-image\"/>\n<!-- iPhone Retina -->\n<link href=\"apple-touch-startup-image-640x920.png\"media=\"(device-width: 320px) and (-webkit-device-pixel-ratio: 2)\" rel=\"apple-touch-startup-image\"/>\n<!-- iPhone 5-->\n<link rel=\"apple-touch-startup-image\"media=\"(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)\" href=\"apple-touch-startup-image-640x1096.png\">t\n<!-- iPad portrait-->\n<link href=\"apple-touch-startup-image-768x1004.png\"media=\"(device-width: 768px) and (orientation: portrait)\" rel=\"apple-touch-startup-image\"/>t\n<!-- iPad landscape-->\n<link href=\"apple-touch-startup-image-748x1024.png\"media=\"(device-width: 768px) and (orientation: landscape)\" rel=\"apple-touch-startup-image\"/>t\n<!-- iPad Retina portrait-->\n<link href=\"apple-touch-startup-image-1536x2008.png\"media=\"(device-width: 1536px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)\" rel=\"apple-touch-startup-image\"/>t\n<!-- iPad Retina landscape-->\n<link href=\"apple-touch-startup-image-1496x2048.png\"media=\"(device-width: 1536px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)\"rel=\"apple-touch-startup-image\"/>\n```\n\n\n\n##### 25、浏览器私有及其它meta\n\n以下属性在项目中没有应用过,可以写一个demo测试以下!\n\nQQ浏览器私有\n\n全屏模式\n\n`<meta name=\"x5-fullscreen\"content=\"true\">`\n\n强制竖屏\n\n`<meta name=\"x5-orientation\"content=\"portrait\">`\n\n强制横屏\n\n`<meta name=\"x5-orientation\"content=\"landscape\">`\n\n应用模式\n\n`meta name=\"x5-page-mode\"content=\"app\">`\n\nUC浏览器私有\n\n全屏模式\n\n`<meta name=\"full-screen\"content=\"yes\">`\n\n强制竖屏\n\n`<meta name=\"screen-orientation\"content=\"portrait\">`\n\n强制横屏\n\n`<meta name=\"screen-orientation\"content=\"landscape\">`\n\n应用模式\n\n`<meta name=\"browsermode\"content=\"application\">`\n\n其它\n\n针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓\n`<meta name=\"HandheldFriendly\"content=\"true\">`\n微软的老式浏览器\n`<meta name=\"MobileOptimized\"content=\"320\">`\nwindows phone 点击无高光\n`<meta name=\"msapplication-tap-highlight\"content=\"no\">`\n\n##### 26、 IOS中input键盘事件keyup、keydown、keypress支持不是很好\n\n问题是这样的,用input search做模糊搜索的时候,在键盘里面输入关键词,会通过ajax后台查询,然后返回数据,然后再对返回的数据进行关键词标红。用input监听键盘keyup事件,在安卓手机浏览器中是可以的,但是在ios手机浏览器中变红很慢,用输入法输入之后,并未立刻相应keyup事件,只有在通过删除之后才能相应!\n\n解决办法:\n\n可以用html5的oninput事件去代替keyup\n```javascript\n<input type=\"text\"id=\"testInput\">\n<script type=\"text/javascript\">\n document.getElementById('testInput').addEventListener('input',function(e){\n var value = e.target.value;\n });\n</script>\n```\n然后就达到类似keyup的效果!\n\n##### 27、h5网站input 设置为type=number的问题\n\nh5网页input 的type设置为number一般会产生三个问题,一个问题是maxlength属性不好用了。另外一个是form提交的时候,默认给取整了。三是部分安卓手机出现样式问题。\n\n问题一解决,我目前用的是js。如下\n```javascript\n<input type=\"number\"oninput=\"checkTextLength(this ,10)\">\nfunction checkTextLength(obj, length) { \n if(obj.value.length > length) { \n obj.value = obj.value.substr(0, length); \n } \n}\n```\n问题二,是因为form提交默认做了表单验证,step默认是1,要设置step属性,假如保留2位小数,写法如下:\n\n`<input type=\"number\" step=\"0.01\"/>`\n\n关于step,我在这里做简单的介绍,input 中type=number,一般会自动生成一个上下箭头,点击上箭头默认增加一个step,点击下箭头默认会减少一个step。number中默认step是1。也就是step=0.01,可以允许输入2位小数,并且点击上下箭头分别增加0.01和减少0.01。\n\n假如step和min一起使用,那么数值必须在min和max之间。\n\n看下面的例子:\n\n`<input type=\"number\"step=\"3.1\"min=\"1\"/>`\n\n输入框可以输入哪些数字?\n\n首先,最小值是1,那么可以输入1.0,第二个是可以输入(1+3.1)那就是4.1,以此类推,每次点击上下箭头都会增加或者减少3.1,输入其他数字无效。这就是step的简单介绍。\n\n问题三,去除input默认样式\n\n```css\ninput[type=number] {\n -moz-appearance:textfield;\n}\n\ninput[type=number]::-webkit-inner-spin-button,\ninput[type=number]::-webkit-outer-spin-button {\n -webkit-appearance:none;\n margin:0;\n}\n```\n\n\n\n##### 28、ios 设置input 按钮样式会被默认样式覆盖\n\n解决方式如下:\n\n```css\ninput,textarea {\n border: 0; \n -webkit-appearance: none; \n}\n\n```\n\n设置默认样式为none\n\n##### 29、IOS键盘字母输入,默认首字母大写\n\n解决方案,设置如下属性\n\n`<input type=\"text\"autocapitalize=\"off\"/>`\n\n##### 30、select 下拉选择设置右对齐\n\n设置如下:\n\n```css\nselect option {\n direction: rtl;\n}\n\n```\n\n\n\n##### 31、通过transform进行skew变形,rotate旋转会造成出现锯齿现象\n\n可以设置如下:\n\n```css\n\t-webkit-transform: rotate(-4deg) skew(10deg) translateZ(0);\n\t transform: rotate(-4deg) skew(10deg) translateZ(0);\n\t outline: 1px solid rgba(255,255,255,0)\n\n```\n\n\n\n##### 32、移动端点击300ms延迟\n\n300ms尚可接受,不过因为300ms产生的问题,我们必须要解决。300ms导致用户体验并不是很好,解决这个问题,我们一般在移动端用tap事件来取代click事件。\n\n推荐两个js,一个是fastclick,一个是tap.js\n\n关于300ms延迟,具体请看:http://thx.github.io/mobile/300ms-click-delay/\n\n##### 33、移动端点透问题\n\n案例如下:\n```html\n<div id=\"haorooms\">点头事件测试</div>\n<a href=\"www.baidu.net\">www.baidu.com</a>\n```\ndiv是绝对定位的蒙层,并且z-index高于a。而a标签是页面中的一个链接,我们给div绑定tap事件:\n\n```javascript\n$('#haorooms').on('tap',function(){\n\t$('#haorooms').hide();\n});\n\n```\n\n\n\n我们点击蒙层时 div正常消失,但是当我们在a标签上点击蒙层时,发现a链接被触发,这就是所谓的点透事件。\n\n原因:\n\ntouchstart 早于 touchend 早于click。 亦即click的触发是有延迟的,这个时间大概在300ms左右,也就是说我们tap触发之后蒙层隐藏, 此时 click还没有触发,300ms之后由于蒙层隐藏,我们的click触发到了下面的a链接上。\n解决:\n\n(1)尽量都使用touch事件来替换click事件。例如用touchend事件(推荐)。\n(2)用fastclick,https://github.com/ftlabs/fastclick\n(3)用preventDefault阻止a标签的click\n(4)延迟一定的时间(300ms+)来处理事件 (不推荐)\n(5)以上一般都能解决,实在不行就换成click事件。\n下面介绍一下touchend事件,如下:\n\n```javascript\n$(\"#haorooms\").on(\"touchend\",function(event) {\n event.preventDefault();\n });\n\n```\n\n\n\n##### 34、消除 IE10 里面的那个叉号\n\n`input:-ms-clear{display:none;}`\n\n##### 35、关于 iOS 与 OS X 端字体的优化(横竖屏会出现字体加粗不一致等)\n\niOS 浏览器横屏时会重置字体大小,设置 text-size-adjust 为 none 可以解决 iOS 上的问题,但桌面版 Safari 的字体缩放功能会失效,因此最佳方案是将 text-size-adjust 为 100% 。\n\n```css\n-webkit-text-size-adjust:100%;\n\n-ms-text-size-adjust:100%;\n\ntext-size-adjust:100%;\n\n```\n\n\n\n##### 36、关于 iOS 系统中,中文输入法输入英文时,字母之间可能会出现一个六分之一空格\n\n可以通过正则去掉\n\n`his.value = this.value.replace(/\\u2006/g,'');`\n\n##### 37、移动端 HTML5 audio autoplay 失效问题\n\n这个不是 BUG,由于自动播放网页中的音频或视频,会给用户带来一些困扰或者不必要的流量消耗,所以苹果系统和安卓系统通常都会禁止自动播放和使用 JS 的触发播放,必须由用户来触发才可以播放。\n\n解决方法思路:先通过用户 touchstart 触碰,触发播放并暂停(音频开始加载,后面用 JS 再操作就没问题了)。\n\n解决代码:\n\n```javascript\ndocument.addEventListener('touchstart',function() {\n document.getElementsByTagName('audio')[0].play();\n document.getElementsByTagName('audio')[0].pause();\n});\n```\n\n##### 38、移动端 HTML5 input date 不支持 placeholder 问题\n\n这个我感觉没有什么好的解决方案,用如下方法\n\n[复制代码]()代码如下:\n\n`<input placeholder=\"Date\" class=\"textbox-n\" type=\"text\" onfocus=\"(this.type='date')\" id=\"date\">`\n\n有的浏览器可能要点击两遍!\n\n##### 39、部分机型存在type为search的input,自带close按钮样式修改方法\n\n有些机型的搜索input控件会自带close按钮(一个伪元素),而通常为了兼容所有浏览器,我们会自己实现一个,此时去掉原生close按钮的方法为\n\n```css\n#Search::-webkit-search-cancel-button{\n display:none; \n}\n\n```\n\n\n\n如果想使用原生close按钮,又想使其符合设计风格,可以对这个伪元素的样式进行修改。\n\n##### 40、唤起select的option展开\n\nzepto方式:\n\n`$(sltElement).trrgger(\"mousedown\");`\n\n原生js方式:\n\n```javascript\nfunctionshowDropdown(sltElement) {\n var event;\n event = document.createEvent('MouseEvents');\n event.initMouseEvent('mousedown',true,true, window);\n sltElement.dispatchEvent(event);\n};\n\n```\n\n\n文章转载:http://www.jb51.net/article/84973.html 已修改~","tags":["移动端"]},{"title":"2017年前端面试题整理汇总100题","url":"/100question.html","content":"\n#### 一些开放性题目\n\n```\n1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势。\n\n2.项目介绍\n\n3.如何看待前端开发?\n\n4.平时是如何学习前端开发的?\n\n5.未来三到五年的规划是怎样的?\n```\n\n<!-- more -->\n\n#### position的值, relative和absolute分别是相对于谁进行定位的?\n\n- `absolute` :生成绝对定位的元素, 相对于最近一级的 定位不是 static 的父元素来进行定位。\n- `fixed` (老IE不支持)生成绝对定位的元素,通常相对于浏览器窗口或 frame 进行定位。\n- `relative` 生成相对定位的元素,相对于其在普通流中的位置进行定位。\n- `static` 默认值。没有定位,元素出现在正常的流中\n- `sticky` 生成粘性定位的元素,容器的位置根据正常文档流计算得出\n\n#### 如何解决跨域问题\n\n> JSONP:\n\n原理是:动态插入`script`标签,通过`script`标签引入一个`js`文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的`json`数据作为参数传入。\n\n由于同源策略的限制,`XmlHttpRequest`只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过`script`标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。\n\n优点是兼容性好,简单易用,支持浏览器与服务器双向通信。缺点是只支持GET请求。\n\n`JSONP`:`json+padding`(内填充),顾名思义,就是把JSON填充到一个盒子里\n\n```\n<script>\n function createJs(sUrl){\n\n var oScript = document.createElement('script');\n oScript.type = 'text/javascript';\n oScript.src = sUrl;\n document.getElementsByTagName('head')[0].appendChild(oScript);\n }\n\n createJs('jsonp.js');\n\n box({\n 'name': 'test'\n });\n\n function box(json){\n alert(json.name);\n }\n</script>12345678910111213141516171819\n```\n\n> CORS\n\n服务器端对于`CORS`的支持,主要就是通过设置`Access-Control-Allow-Origin`来进行的。如果浏览器检测到相应的设置,就可以允许`Ajax`进行跨域的访问。\n\n> 通过修改document.domain来跨子域\n\n将子域和主域的`document.domain`设为同一个主域.前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用`document.domain`进行跨域\n\n主域相同的使用`document.domain`\n\n> 使用window.name来进行跨域\n\n`window`对象有个`name`属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个`window.name`的,每个页面对`window.name`都有读写的权限,`window.name`是持久存在一个窗口载入过的所有页面中的\n\n> 使用[HTML5](http://lib.csdn.net/base/html5)中新引进的`window.postMessage`方法来跨域传送数据\n\n还有flash、在服务器上设置代理页面等跨域方式。个人认为`window.name`的方法既不复杂,也能兼容到几乎所有浏览器,这真是极好的一种跨域方法。\n\n#### `XML`和`JSON`的区别?\n\n```\n(1).数据体积方面。\n\nJSON相对于XML来讲,数据的体积小,传递的速度更快些。\n\n(2).数据交互方面。\n\nJSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。\n\n(3).数据描述方面。\n\nJSON对数据的描述性比XML较差。\n\n(4).传输速度方面。\n\nJSON的速度要远远快于XML。123456789101112131415\n```\n\n#### 谈谈你对webpack的看法\n\n`WebPack` 是一个模块打包工具,你可以使用`WebPack`管理你的模块依赖,并编绎输出模块们所需的静态文件。它能够很好地管理、打包Web开发中所用到的`HTML、JavaScript、CSS`以及各种静态文件(图片、字体等),让开发过程更加高效。对于不同类型的资源,`webpack`有对应的模块加载器。`webpack`模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源。\n\n`webpack`的两大特色:\n\n```\n1.code splitting(可以自动完成)\n\n2.loader 可以处理各种类型的静态文件,并且支持串联操作\n\n```\n\n`webpack` 是以`commonJS`的形式来书写脚本滴,但对 `AMD/CMD` 的支持也很全面,方便旧项目进行代码迁移。\n\n`webpack`具有`requireJs`和`browserify`的功能,但仍有很多自己的新特性:\n\n```\n1. 对 CommonJS 、 AMD 、ES6的语法做了兼容\n\n2. 对js、css、图片等资源文件都支持打包\n\n3. 串联式模块加载器以及插件机制,让其具有更好的灵活性和扩展性,例如提供对CoffeeScript、ES6的支持\n\n4. 有独立的配置文件webpack.config.js\n\n5. 可以将代码切割成不同的chunk,实现按需加载,降低了初始化时间\n\n6. 支持 SourceUrls 和 SourceMaps,易于调试\n\n7. 具有强大的Plugin接口,大多是内部插件,使用起来比较灵活\n\n8.webpack 使用异步 IO 并具有多级缓存。这使得 webpack 很快且在增量编译上更加快123456789101112131415\n```\n\n#### 说说TCP传输的三次握手四次挥手策略\n\n为了准确无误地把数据送达目标处,`TCP`协议采用了三次握手策略。用TCP协议把数据包送出去后,`TCP`不会对传送 后的情况置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志:`SYN`和`ACK`。\n\n发送端首先发送一个带`SYN`标志的数据包给对方。接收端收到后,回传一个带有`SYN/ACK`标志的数据包以示传达确认信息。 \n最后,发送端再回传一个带`ACK`标志的数据包,代表“握手”结束。 \n若在握手过程中某个阶段莫名中断,`TCP`协议会再次以相同的顺序发送相同的数据包。\n\n> 断开一个TCP连接则需要“四次握手”:\n\n- 第一次挥手:主动关闭方发送一个`FIN`,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。\n- 第二次挥手:被动关闭方收到`FIN`包后,发送一个`ACK`给对方,确认序号为收到序号`+1`(与`SYN`相同,一个`FIN`占用一个序号)。\n- 第三次挥手:被动关闭方发送一个`FIN`,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。\n- 第四次挥手:主动关闭方收到`FIN`后,发送一个`ACK`给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。\n\n#### TCP和UDP的区别\n\n`TCP`(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个`TCP`连接必须要经过三次“对话”才能建立起来\n\n`UDP`(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! \nUDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。\n\n#### 说说你对作用域链的理解\n\n作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到`window`对象即被终止,作用域链向下访问变量是不被允许的。\n\n#### 创建ajax过程\n\n```\n(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.\n\n(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.\n\n(3)设置响应HTTP请求状态变化的函数.\n\n(4)发送HTTP请求.\n\n(5)获取异步调用返回的数据.\n\n(6)使用JavaScript和DOM实现局部刷新.1234567891011\n```\n\n#### 渐进增强和优雅降级\n\n渐进增强 :针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。\n\n优雅降级 :一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。\n\n#### 常见web安全及防护原理\n\n> sql注入原理\n\n就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。\n\n总的来说有以下几点:\n\n```\n 1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双\"-\"进行转换等。\n\n 2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。\n\n 3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。\n\n 4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。12345678\n```\n\n> XSS原理及防范\n\nXss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意 `html`标签或者`JavaScript`代码。比如:攻击者在论坛中放一个\n\n看似安全的链接,骗取用户点击后,窃取`cookie`中的用户私密信息;或者攻击者在论坛中加一个恶意表单,\n\n当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点。\n\n> XSS防范方法\n\n首先代码里对用户输入的地方和变量都需要仔细检查长度和对`”<”,”>”,”;”,”’”`等字符做过滤;其次任何内容写到页面之前都必须加以`encode`,避免不小心把`html tag` 弄出来。这一个层面做好,至少可以堵住超过一半的`XSS` 攻击。\n\n首先,避免直接在`cookie` 中泄露用户隐私,例如email、密码等等。\n\n其次,通过使`cookie` 和系统`ip` 绑定来降低`cookie` 泄露后的危险。这样攻击者得到的`cookie` 没有实际价值,不可能拿来重放。\n\n如果网站不需要再浏览器端对`cookie` 进行操作,可以在`Set-Cookie` 末尾加上`HttpOnly` 来防止`javascript` 代码直接获取`cookie` 。\n\n尽量采用`POST` 而非`GET` 提交表单\n\n> XSS与CSRF有什么区别吗?\n\n`XSS`是获取信息,不需要提前知道其他用户页面的代码和数据包。`CSRF`是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。\n\n要完成一次`CSRF`攻击,受害者必须依次完成两个步骤:\n\n```\n登录受信任网站A,并在本地生成Cookie。\n\n在不登出A的情况下,访问危险网站B。123\n```\n\n> CSRF的防御\n\n- 服务端的`CSRF`方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。\n- 通过验证码的方法\n\n#### Web Worker 和webSocket\n\n> worker主线程:\n\n```\n 1.通过 worker = new Worker( url ) 加载一个JS文件来创建一个worker,同时返回一个worker实例。\n\n 2.通过worker.postMessage( data ) 方法来向worker发送数据。\n\n 3.绑定worker.onmessage方法来接收worker发送过来的数据。\n\n 4.可以使用 worker.terminate() 来终止一个worker的执行。1234567\n```\n\n`WebSocket`是`Web`应用程序的传输协议,它提供了双向的,按序到达的数据流。他是一个`Html5`协议,`WebSocket`的连接是持久的,他通过在客户端和服务器之间保持双工连接,服务器的更新可以被及时推送给客户端,而不需要客户端以一定时间间隔去轮询。\n\n#### HTTP和HTTPS\n\n`HTTP`协议通常承载于TCP协议之上,在`HTTP`和`TCP`之间添加一个安全协议层(`SSL`或`TSL`),这个时候,就成了我们常说的HTTPS。\n\n默认HTTP的端口号为80,`HTTPS`的端口号为443。\n\n#### 为什么`HTTPS`安全\n\n因为网络请求需要中间有很多的服务器路由器的转发。中间的节点都可能篡改信息,而如果使用`HTTPS`,密钥在你和终点站才有。`https`之所以比`http`安全,是因为他利用`ssl/tls`协议传输。它包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer传递等。保障了传输过程的安全性\n\n#### 对前端模块化的认识\n\n> AMD 是 `RequireJS` 在推广过程中对模块定义的规范化产出。\n>\n> CMD 是 `SeaJS` 在推广过程中对模块定义的规范化产出。\n\n`AMD` 是提前执行,`CMD` 是延迟执行。\n\n`AMD`推荐的风格通过返回一个对象做为模块对象,`CommonJS`的风格通过对`module.exports`或`exports`的属性赋值来达到暴露模块对象的目的。\n\n> CMD模块方式\n\n```\n define(function(require, exports, module) {\n\n // 模块代码\n\n });12345\n```\n\n#### Javascript垃圾回收方法\n\n> 标记清除(mark and sweep)\n\n这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。\n\n垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了\n\n> 引用计数(reference counting)\n\n在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为0的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。\n\n在IE中虽然`JavaScript`对象通过标记清除的方式进行垃圾回收,但BOM与DOM对象却是通过引用计数回收垃圾的, \n也就是说只要涉及`BOM`及DOM就会出现循环引用问题。\n\n#### 你觉得前端工程的价值体现在哪\n\n```\n为简化用户使用提供技术支持(交互部分)\n\n为多个浏览器兼容性提供支持\n\n为提高用户浏览速度(浏览器性能)提供支持\n\n为跨平台或者其他基于webkit或其他渲染引擎的应用提供支持\n\n为展示数据提供支持(数据接口)\n\n```\n\n#### 谈谈性能优化问题\n\n代码层面:避免使用css表达式,避免使用高级选择器,通配选择器。\n\n缓存利用:缓存Ajax,使用CDN,使用外部js和css文件以便缓存,添加Expires头,服务端配置Etag,减少DNS查找等\n\n请求数量:合并样式和脚本,使用css图片精灵,初始首屏之外的图片资源按需加载,静态资源延迟加载。\n\n请求带宽:压缩文件,开启GZIP,\n\n> 代码层面的优化\n\n- 用`hash-table`来优化查找\n- 少用全局变量\n- 用`innerHTML`代替`DOM`操作,减少`DOM`操作次数,优化`javascript`性能\n- 用`setTimeout`来避免页面失去响应\n- 缓存DOM节点查找的结果\n- 避免使用CSS Expression\n- 避免全局查询\n- 避免使用with(with会创建自己的作用域,会增加作用域链长度)\n- 多个变量声明合并\n- 避免图片和iFrame等的空Src。空Src会重新加载当前页面,影响速度和效率\n- 尽量避免写在HTML标签中写Style属性\n\n#### 移动端性能优化\n\n- 尽量使用css3动画,开启硬件加速。\n- 适当使用`touch`事件代替`click`事件。\n- 避免使用`css3`渐变阴影效果。\n- 可以用`transform: translateZ(0)`来开启硬件加速。\n- 不滥用Float。Float在渲染时计算量比较大,尽量减少使用\n- 不滥用Web字体。Web字体需要下载,解析,重绘当前页面,尽量减少使用。\n- 合理使用requestAnimationFrame动画代替setTimeout\n- CSS中的属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)会触发GPU渲染,请合理使用。过渡使用会引发手机过耗电增加\n- PC端的在移动端同样适用\n\n> 相关阅读:[如何做到一秒渲染一个移动页面](https://github.com/cssmagic/blog/issues/20)\n\n#### 什么是Etag?\n\n当发送一个服务器请求时,浏览器首先会进行缓存过期判断。浏览器根据缓存过期时间判断缓存文件是否过期。\n\n情景一:若没有过期,则不向服务器发送请求,直接使用缓存中的结果,此时我们在浏览器控制台中可以看到 `200 OK`(from cache) ,此时的情况就是完全使用缓存,浏览器和服务器没有任何交互的。\n\n情景二:若已过期,则向服务器发送请求,此时请求中会带上①中设置的文件修改时间,和`Etag`\n\n然后,进行资源更新判断。服务器根据浏览器传过来的文件修改时间,判断自浏览器上一次请求之后,文件是不是没有被修改过;根据`Etag`,判断文件内容自上一次请求之后,有没有发生变化\n\n情形一:若两种判断的结论都是文件没有被修改过,则服务器就不给浏览器发`index.html`的内容了,直接告诉它,文件没有被修改过,你用你那边的缓存吧—— `304 Not Modified`,此时浏览器就会从本地缓存中获取`index.html`的内容。此时的情况叫协议缓存,浏览器和服务器之间有一次请求交互。\n\n情形二:若修改时间和文件内容判断有任意一个没有通过,则服务器会受理此次请求,之后的操作同①\n\n① 只有get请求会被缓存,post请求不会\n\n#### Expires和Cache-Control\n\n`Expires`要求客户端和服务端的时钟严格同步。`HTTP1.1`引入`Cache-Control`来克服Expires头的限制。如果max-age和Expires同时出现,则max-age有更高的优先级。\n\n```\n Cache-Control: no-cache, private, max-age=0\n\n ETag: abcde\n\n Expires: Thu, 15 Apr 2014 20:00:00 GMT\n\n Pragma: private\n\n Last-Modified: $now // RFC1123 format123456789\n```\n\n#### ETag应用:\n\n`Etag`由服务器端生成,客户端通过`If-Match`或者说`If-None-Match`这个条件判断请求来验证资源是否修改。常见的是使用`If-None-Match`。请求一个文件的流程可能如下:\n\n====第一次请求===\n\n```\n1.客户端发起 HTTP GET 请求一个文件;\n\n2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如\"2e681a-6-5d044840\")(假设服务器支持Etag生成和已经开启了Etag).状态码200\n\n```\n\n====第二次请求===\n\n```\n客户端发起 HTTP GET 请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头的内容就是第一次请求时服务器返回的Etag:2e681a-6-5d0448402.服务器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地缓存;流程很简单,问题是,如果服务器又设置了Cache-Control:max-age和Expires呢,怎么办\n\n```\n\n答案是同时使用,也就是说在完全匹配`If-Modified-Since`和`If-None-Match`即检查完修改时间和`Etag`之后,\n\n服务器才能返回304.(不要陷入到底使用谁的问题怪圈)\n\n为什么使用Etag请求头?\n\nEtag 主要为了解决 `Last-Modified` 无法解决的一些问题。\n\n#### 栈和队列的区别?\n\n```\n栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的。\n\n队列先进先出,栈先进后出。\n\n栈只允许在表尾一端进行插入和删除,而队列只允许在表尾一端进行插入,在表头一端进行删除\n\n```\n\n#### 栈和堆的区别?\n\n```\n栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。\n\n堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。\n\n堆(数据结构):堆可以被看成是一棵树,如:堆排序;\n\n栈(数据结构):一种先进后出的数据结构。\n\n```\n\n#### 快速 排序的思想并实现一个快排?\n\n“快速排序”的思想很简单,整个排序过程只需要三步:\n\n (1)在数据集之中,找一个基准点\n\n (2)建立两个数组,分别存储左边和右边的数组\n\n (3)利用递归进行下次比较\n\n```\n <script type=\"text/javascript\">\n\n function quickSort(arr){\n if(arr.length<=1){\n return arr;//如果数组只有一个数,就直接返回;\n }\n\n var num = Math.floor(arr.length/2);//找到中间数的索引值,如果是浮点数,则向下取整\n\n var numValue = arr.splice(num,1);//找到中间数的值\n var left = [];\n var right = [];\n\n for(var i=0;i<arr.length;i++){\n if(arr[i]<numValue){\n left.push(arr[i]);//基准点的左边的数传到左边数组\n }\n else{\n right.push(arr[i]);//基准点的右边的数传到右边数组\n }\n }\n\n return quickSort(left).concat([numValue],quickSort(right));//递归不断重复比较\n }\n\n alert(quickSort([32,45,37,16,2,87]));//弹出“2,16,32,37,45,87”\n\n </script>12345678910111213141516171819202122232425262728\n```\n\n#### 你觉得jQuery或zepto源码有哪些写的好的地方\n\n(答案仅供参考)\n\n`jQuery`源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,然后通过传入window对象参数,可以使window对象作为局部变量使用,好处是当`jQuery`中访问window对象的时候,就不用将作用域链退回到顶层作用域了,从而可以更快的访问`window`对象。同样,传入`undefined`参数,可以缩短查找undefined时的作用域链。\n\n```\n (function( window, undefined ) {\n\n //用一个函数域包起来,就是所谓的沙箱\n\n //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局\n\n //把当前沙箱需要的外部变量通过函数参数引入进来\n\n //只要保证参数对内提供的接口的一致性,你还可以随意替换传进来的这个参数\n\n window.jQuery = window.$ = jQuery;\n\n })( window );12345678910111213\n```\n\njquery将一些原型属性和方法封装在了`jquery.prototype`中,为了缩短名称,又赋值给了`jquery.fn`,这是很形象的写法。\n\n有一些数组或对象的方法经常能使用到,jQuery将其保存为局部变量以提高访问速度。\n\n`jquery`实现的链式调用可以节约代码,所返回的都是同一个对象,可以提高代码效率。\n\n#### ES6的了解\n\n新增模板字符串(为JavaScript提供了简单的字符串插值功能)、箭头函数(操作符左边为输入的参数,而右边则是进行的操作以及返回的值`Inputs=>outputs`。)、`for-of`(用来遍历数据—例如数组中的值。)`arguments`对象可被不定参数和默认参数完美代替。`ES6`将`promise`对象纳入规范,提供了原生的`Promise`对象。增加了`let`和`const`命令,用来声明变量。增加了块级作用域。let命令实际上就增加了块级作用域。ES6规定,`var`命令和`function`命令声明的全局变量,属于全局对象的属性;`let`命令、`const`命令、`class`命令声明的全局变量,不属于全局对象的属性。。还有就是引入`module`模块的概念\n\n#### js继承方式及其优缺点\n\n> 原型链继承的缺点\n\n```\n一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。\n\n```\n\n> 借用构造函数(类式继承)\n\n```\n借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。所以我们需要原型链+借用构造函数的模式,这种模式称为组合继承\n\n```\n\n> 组合式继承\n\n```\n组合式继承是比较常用的一种继承方法,其背后的思路是 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。\n\n```\n\n#### 关于Http 2.0 你知道多少?\n\n`HTTP/2`引入了“服务端推(server push)”的概念,它允许服务端在客户端需要数据之前就主动地将数据发送到客户端缓存中,从而提高性能。\n\n`HTTP/2`提供更多的加密支持\n\n`HTTP/2`使用多路技术,允许多个消息在一个连接上同时交差。\n\n它增加了头压缩(header compression),因此即使非常小的请求,其请求和响应的`header`都只会占用很小比例的带宽。\n\n#### defer和async\n\n> defer并行加载js文件,会按照页面上script标签的顺序执行 \n> async并行加载js文件,下载完成立即执行,不会按照页面上script标签的顺序执行\n\n#### 谈谈浮动和清除浮动\n\n浮动的框可以向左或向右移动,直到他的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流的块框表现得就像浮动框不存在一样。浮动的块框会漂浮在文档普通流的块框上。\n\n#### 如何评价AngularJS和BackboneJS\n\n`backbone`具有依赖性,依赖`underscore.js`。`Backbone + Underscore + jQuery(or Zepto)` 就比一个`AngularJS` 多出了2 次HTTP请求.\n\n`Backbone`的`Model`没有与UI视图数据绑定,而是需要在View中自行操作DOM来更新或读取UI数据。`AngularJS`与此相反,Model直接与UI视图绑定,`Model`与UI视图的关系,通过`directive`封装,`AngularJS`内置的通用`directive`,就能实现大部分操作了,也就是说,基本不必关心`Model`与UI视图的关系,直接操作Model就行了,UI视图自动更新。\n\n`AngularJS`的`directive`,你输入特定数据,他就能输出相应UI视图。是一个比较完善的前端MVW框架,包含模板,数据双向绑定,路由,模块化,服务,依赖注入等所有功能,模板功能强大丰富,并且是声明式的,自带了丰富的 Angular 指令。\n\n#### 用过哪些设计模式?\n\n> 工厂模式:\n\n```\n主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位置防止代码重复。\n\n 工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法 搞清楚他们到底是哪个对象的实例。\n\n\nfunction createObject(name,age,profession){//集中实例化的函数var obj = new Object();\n obj.name = name;\n obj.age = age;\n obj.profession = profession;\n obj.move = function () {\n return this.name + ' at ' + this.age + ' engaged in ' + this.profession;\n };\n return obj;\n}\nvar test1 = createObject('trigkit4',22,'programmer');//第一个实例var test2 = createObject('mike',25,'engineer');//第二个实例\n\n```\n\n> 构造函数模式\n\n使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于:\n\n```\n1.构造函数方法没有显示的创建对象 (new Object());\n\n2.直接将属性和方法赋值给 this 对象;\n\n3.没有 renturn 语句。\n\n```\n\n#### 说说你对闭包的理解\n\n使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念\n\n闭包有三个特性:\n\n> 1.函数嵌套函数\n>\n> 2.函数内部可以引用外部的参数和变量\n>\n> 3.参数和变量不会被垃圾回收机制回收\n\n#### 请你谈谈Cookie的弊端\n\n`cookie`虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的。\n\n第一:每个特定的域名下最多生成20个`cookie`\n\n```\n1.IE6或更低版本最多20个cookie\n\n2.IE7和之后的版本最后可以有50个cookie。\n\n3.Firefox最多50个cookie\n\n4.chrome和Safari没有做硬性限制\n\n```\n\n`IE`和`Opera` 会清理近期最少使用的`cookie`,`Firefox`会随机清理`cookie`。\n\n`cookie`的最大大约为`4096`字节,为了兼容性,一般不能超过`4095`字节。\n\nIE 提供了一种存储可以持久化用户数据,叫做`userdata`,从`IE5.0`就开始支持。每个数据最多128K,每个域名下最多1M。这个持久化数据放在缓存中,如果缓存没有清理,那么会一直存在。\n\n> 优点:极高的扩展性和可用性\n\n```\n1.通过良好的编程,控制保存在cookie中的session对象的大小。\n\n2.通过加密和安全传输技术(SSL),减少cookie被破解的可能性。\n\n3.只在cookie中存放不敏感数据,即使被盗也不会有重大损失。\n\n4.控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。\n\n```\n\n> 缺点:\n\n```\n1.`Cookie`数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉.\n\n\n2.安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。\n\n3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。\n\n```\n\n#### 浏览器本地存储\n\n在较高版本的浏览器中,`js`提供了`sessionStorage`和`globalStorage`。在`HTML5`中提供了`localStorage`来取代`globalStorage`。\n\n`Html5`中的`Web Storage`包括了两种存储方式:`sessionStorage`和`localStorage`。\n\n`sessionStorage`用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此`sessionStorage`不是一种持久化的本地存储,仅仅是会话级别的存储。\n\n而`localStorage`用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。\n\n#### web storage和cookie的区别\n\n`Web Storage`的概念和`cookie`相似,区别是它是为了更大容量存储设计的。`Cookie`的大小是受限的,并且每次你请求一个新的页面的时候`Cookie`都会被发送过去,这样无形中浪费了带宽,另外`cookie`还需要指定作用域,不可以跨域调用。\n\n除此之外,`Web Storage`拥有`setItem,getItem,removeItem,clear`等方法,不像`cookie`需要[前端开发](http://lib.csdn.net/base/javascript)者自己封装`setCookie,getCookie`。\n\n但是`cookie`也是不可以或缺的:`cookie`的作用是与服务器进行交互,作为`HTTP`规范的一部分而存在 ,而`Web Storage`仅仅是为了在本地“存储”数据而生\n\n浏览器的支持除了`IE7`及以下不支持外,其他标准浏览器都完全支持(ie及FF需在web服务器里运行),值得一提的是IE总是办好事,例如IE7、IE6中的`userData`其实就是`javascript`本地存储的解决方案。通过简单的代码封装可以统一到所有的浏览器都支持`web storage`。\n\n`localStorage`和`sessionStorage`都具有相同的操作方法,例如`setItem、getItem`和`removeItem`等\n\n#### cookie 和session 的区别:\n\n```\n 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。\n\n 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗\n\n 考虑到安全应当使用session。\n\n 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能\n\n 考虑到减轻服务器性能方面,应当使用COOKIE。\n\n 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。\n\n 5、所以个人建议:\n\n 将登陆信息等重要信息存放为SESSION\n\n 其他信息如果需要保留,可以放在COOKIE中\n\n```\n\n> `display:none`和`visibility:hidden`的区别?\n\n```\ndisplay:none 隐藏对应的元素,在文档布局中不再给它分配空间,它各边的元素会合拢,就当他从来不存在。\n\nvisibility:hidden 隐藏对应的元素,但是在文档布局中仍保留原来的空间。\n\n```\n\n> CSS中`link` 和`@import`的区别是?\n\n```\n(1) link属于HTML标签,而@import是CSS提供的;\n\n(2) 页面被加载的时,link会同时被加载,而@import被引用的CSS会等到引用它的CSS文件被加载完再加载;\n\n(3) import只在IE5以上才能识别,而link是HTML标签,无兼容问题;\n\n(4) link方式的样式的权重 高于@import的权重.\n\n```\n\n> `position:absolute`和`float`属性的异同\n\n- 共同点:对内联元素设置`float`和`absolute`属性,可以让元素脱离文档流,并且可以设置其宽高。\n- 不同点:`float`仍会占据位置,`absolute`会覆盖文档流中的其他元素。\n\n> 介绍一下box-sizing属性?\n\n`box-sizing`属性主要用来控制元素的盒模型的解析模式。默认值是`content-box`。\n\n- `content-box`:让元素维持W3C的标准盒模型。元素的宽度/高度由`border + padding + content`的宽度/高度决定,设置`width/height`属性指的是`content`部分的宽/高\n- `border-box`:让元素维持IE传统盒模型(IE6以下版本和IE6~7的怪异模式)。设置`width/height`属性指的是`border + padding + content`\n\n标准浏览器下,按照W3C规范对盒模型解析,一旦修改了元素的边框或内距,就会影响元素的盒子尺寸,就不得不重新计算元素的盒子尺寸,从而影响整个页面的布局。\n\n> CSS 选择符有哪些?哪些属性可以继承?优先级[算法](http://lib.csdn.net/base/datastructure)如何计算? [CSS3](http://lib.csdn.net/base/css3)新增伪类有那些?\n\n```\n 1.id选择器( # myid)\n\n 2.类选择器(.myclassname)\n\n 3.标签选择器(div, h1, p)\n\n 4.相邻选择器(h1 + p)\n\n 5.子选择器(ul > li)\n\n 6.后代选择器(li a)\n\n 7.通配符选择器( * )\n\n 8.属性选择器(a[rel = \"external\"])\n\n 9.伪类选择器(a: hover, li:nth-child)1234567891011121314151617\n```\n\n优先级为:\n\n`!important > id > class > tag`\n\n`important` 比 内联优先级高,但内联比 `id` 要高\n\n> [CSS3](http://lib.csdn.net/base/css3)新增伪类举例:\n\n```\n p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。\n\n p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。\n\n p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。\n\n p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。\n\n p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。\n\n :enabled :disabled 控制表单控件的禁用状态。\n\n :checked 单选框或复选框被选中。12345678910111213\n```\n\n> CSS3有哪些新特性?\n\n```\nCSS3实现圆角(border-radius),阴影(box-shadow),\n\n对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)\n\ntransform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜\n\n增加了更多的CSS选择器 多背景 rgba\n\n在CSS3中唯一引入的伪元素是::selection.\n\n媒体查询,多栏布局\n\nborder-image\n\n```\n\nCSS3中新增了一种盒模型计算方式:`box-sizing`。盒模型默认的值是`content-box`, 新增的值是`padding-box`和`border-box`,几种盒模型计算元素宽高的区别如下:\n\n#### `content-box(默认)`\n\n布局所占宽度Width:\n\n```\nWidth = width + padding-left + padding-right + border-left + border-right\n12\n```\n\n布局所占高度Height:\n\n```\nHeight = height + padding-top + padding-bottom + border-top + border-bottom\n12\n```\n\n#### `padding-box`\n\n布局所占宽度Width:\n\n```\nWidth = width(包含padding-left + padding-right) + border-top + border-bottom\n12\n```\n\n布局所占高度Height:\n\n```\nHeight = height(包含padding-top + padding-bottom) + border-top + border-bottom\n\n123\n```\n\n#### `border-box`\n\n布局所占宽度Width:\n\n```\nWidth = width(包含padding-left + padding-right + border-left + border-right)1\n```\n\n布局所占高度Height:\n\n```\nHeight = height(包含padding-top + padding-bottom + border-top + border-bottom)1\n```\n\n> 对BFC规范的理解?\n\n```\n BFC,块级格式化上下文,一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个BFC中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的margin会发生折叠。\n\n (W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行布局,以及与其他元素的关系和相互作用。\n\n```\n\n#### 说说你对语义化的理解?\n\n```\n1,去掉或者丢失样式的时候能够让页面呈现出清晰的结构\n\n2,有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来确定上下文和各个关键字的权重;\n\n3,方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;\n\n4,便于团队开发和维护,语义化更具可读性,是下一步吧网页的重要动向,遵循W3C标准的团队都遵循这个标准,可以减少差异化。\n\n```\n\n#### Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?\n\n1)、`<!DOCTYPE>` 声明位于文档中的最前面,处于 `<html>` 标签之前。告知浏览器以何种模式来渲染文档。\n\n2)、严格模式的排版和 `JS` 运作模式是 以该浏览器支持的最高标准运行。\n\n3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。\n\n4)、`DOCTYPE`不存在或格式不正确会导致文档以混杂模式呈现。\n\n#### 你知道多少种`Doctype`文档类型?\n\n```\n 该标签可声明三种 DTD 类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。\n\n HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。\n\n XHTML 1.0 规定了三种 XML 文档类型:Strict、Transitional 以及 Frameset。\n\nStandards (标准)模式(也就是严格呈现模式)用于呈现遵循最新标准的网页,而 Quirks\n\n (包容)模式(也就是松散呈现模式或者兼容模式)用于呈现为传统浏览器而设计的网页。\n\n```\n\n#### HTML与XHTML——二者有什么区别\n\n```\n区别:\n\n1.所有的标记都必须要有一个相应的结束标记\n\n2.所有标签的元素和属性的名字都必须使用小写\n\n3.所有的XML标记都必须合理嵌套\n\n4.所有的属性必须用引号\"\"括起来\n\n5.把所有<和&特殊符号用编码表示\n\n6.给所有属性赋一个值\n\n7.不要在注释内容中使“--”\n\n8.图片必须有说明文字\n\n```\n\n#### 常见兼容性问题?\n\n```\npng24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.也可以引用一段脚本处理.\n\n浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。\n\nIE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。\n\n浮动ie产生的双倍距离(IE6双边距问题:在IE6下,如果对元素设置了浮动,同时又设置了margin-left或margin-right,margin值会加倍。)\n\n#box{ float:left; width:10px; margin:0 0 0 100px;}\n\n这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入\n_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)\n\n渐进识别的方式,从总体中逐渐排除局部。\n\n\n 首先,巧妙的使用“\\9”这一标记,将IE游览器从所有情况中分离出来。\n\n 接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。\n\n css\n\n .bb{\n\n background-color:#f1ee18;/*所有识别*/\n\n .background-color:#00deff\\9; /*IE6、7、8识别*/\n\n +background-color:#a200ff;/*IE6、7识别*/\n\n _background-color:#1e0bd1;/*IE6识别*/\n\n }\n\n\n怪异模式问题:漏写DTD声明,Firefox仍然会按照标准模式来解析网页,但在IE中会触发\n怪异模式。为避免怪异模式给我们带来不必要的麻烦,最好养成书写DTD声明的好习惯。现在\n可以使用[html5](http://www.w3.org/TR/html5/single-page.html)推荐的写法:`<doctype html>`\n\n```\n\n> 上下margin重合问题\n\n```\nie和ff都存在,相邻的两个div的margin-left和margin-right不会重合,但是margin-top和margin-bottom却会发生重合。\n\n解决方法,养成良好的代码编写习惯,同时采用margin-top或者同时采用margin-bottom。\n\n```\n\n#### 解释下浮动和它的工作原理?清除浮动的技巧\n\n```\n浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。\n\n\n1.使用空标签清除浮动。\n\n 这种方法是在所有浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增加了无意义标签。\n\n2.使用overflow。\n\n 给包含浮动元素的父标签添加css属性 overflow:auto; zoom:1; zoom:1用于兼容IE6。\n\n3.使用after伪对象清除浮动。\n\n 该方法只适用于非IE浏览器。具体写法可参照以下示例。使用中需注意以下几点。一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素;\n\n```\n\n#### 浮动元素引起的问题和解决办法?\n\n```\n浮动元素引起的问题:\n\n(1)父元素的高度无法被撑开,影响与父元素同级的元素\n\n(2)与浮动元素同级的非浮动元素(内联元素)会跟随其后\n\n(3)若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构\n\n```\n\n> 解决方法:\n\n使用`CSS`中的`clear:both`;属性来清除元素的浮动可解决2、3问题,对于问题1,添加如下样式,给父元素添加`clearfix`样式:\n\n```\n .clearfix:after{content: \".\";display: block;height: 0;clear: both;visibility: hidden;}\n\n .clearfix{display: inline-block;} /* for IE/Mac */123\n```\n\n清除浮动的几种方法:\n\n```\n 1,额外标签法,<div style=\"clear:both;\"></div>(缺点:不过这个办法会增加额外的标签使HTML结构看起来不够简洁。)\n\n 2,使用after伪类\n\n #parent:after{\n\n content:\".\";\n\n height:0;\n\n visibility:hidden;\n\n display:block;\n\n clear:both;\n\n }\n\n\n 3,浮动外部元素\n\n 4,设置overflow为hidden或者auto12345678910111213141516171819202122\n```\n\n#### DOM操作——怎样添加、移除、移动、复制、创建和查找节点。\n\n> 1)创建新节点\n\n```\n createDocumentFragment() //创建一个DOM片段\n\n createElement() //创建一个具体的元素\n\n createTextNode() //创建一个文本节点\n\n```\n\n> 2)添加、移除、替换、插入\n\n```\n appendChild()\n\n removeChild()\n\n replaceChild()\n\n insertBefore() //并没有insertAfter()\n\n```\n\n> 3)查找\n\n```\n getElementsByTagName() //通过标签名称\n\n getElementsByName() //通过元素的Name属性的值(IE容错能力较强,\n 会得到一个数组,其中包括id等于name值的)\n\n getElementById() //通过元素Id,唯一性\n\n```\n\n#### html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?\n\n```\n HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。\n\n 拖拽释放(Drag and drop) API\n\n 语义化更好的内容标签(header,nav,footer,aside,article,section)\n\n 音频、视频API(audio,video)\n\n 画布(Canvas) API\n\n 地理(Geolocation) API\n\n 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;\n\n sessionStorage 的数据在浏览器关闭后自动删除\n\n\n 表单控件,calendar、date、time、email、url、search\n\n 新的技术webworker, websocket, Geolocation\n\n```\n\n> 移除的元素\n\n```\n纯表现的元素:basefont,big,center,font, s,strike,tt,u;\n\n对可用性产生负面影响的元素:frame,frameset,noframes;\n\n```\n\n> 支持HTML5新标签:\n\n```\n IE8/IE7/IE6支持通过document.createElement方法产生的标签,\n\n 可以利用这一特性让这些浏览器支持HTML5新标签,\n\n 当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架\n\n <!--[if lt IE 9]>\n\n <script> src=\"http://html5shim.googlecode.com/svn/trunk/html5.js\"</script>\n\n <![endif]-->\n\n 如何区分: DOCTYPE声明\\新增的结构元素\\功能元素1234567891011121314\n```\n\n#### 如何实现浏览器内多个标签页之间的通信?\n\n```\n 调用localstorge、cookies等本地存储方式1\n```\n\n#### 什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC?\n\n```\n FOUC - Flash Of Unstyled Content 文档样式闪烁\n\n <style type=\"text/css\" media=\"all\">@import \"../fouc.css\";</style>\n\n 而引用CSS文件的@import就是造成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM,然后再去导入外部的CSS文件,因此,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。\n\n 解决方法简单的出奇,只要在<head>之间加入一个<link>或者<script>元素就可以了。1234567\n```\n\n#### null和undefined的区别?\n\n`null`是一个表示”无”的对象,转为数值时为0;`undefined`是一个表示”无”的原始值,转为数值时为`NaN`。\n\n当声明的变量还未被初始化时,变量的默认值为`undefined`。\n\n`null`用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。\n\n`undefined`表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:\n\n```\n(1)变量被声明了,但没有赋值时,就等于undefined。\n\n\n(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。\n\n\n(3)对象没有赋值的属性,该属性的值为undefined。\n\n\n(4)函数没有返回值时,默认返回undefined。\n\n```\n\n`null`表示”没有对象”,即该处不应该有值。典型用法是:\n\n```\n(1) 作为函数的参数,表示该函数的参数不是对象。\n\n(2) 作为对象原型链的终点。\n\n```\n\n#### new操作符具体干了什么呢?\n\n```\n 1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。\n\n 2、属性和方法被加入到 this 引用的对象中。\n\n 3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。\n\n\n\nvar obj = {};\n\nobj.__proto__ = Base.prototype;\n\nBase.call(obj);\n\n```\n\n#### js延迟加载的方式有哪些?\n\n```\ndefer和async、动态创建DOM方式(创建script,插入到DOM中,加载完毕后callBack)、按需异步载入js\n\n```\n\n#### `call()` 和 `apply()` 的区别和作用?\n\n作用:动态改变某个类的某个方法的运行环境(执行上下文)。\n\n区别参见:[JavaScript学习总结(四)function函数部分][3]\n\n#### 哪些操作会造成内存泄漏?\n\n```\n内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。\n\n垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。\n\n\n\nsetTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。\n\n闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)\n\n```\n\n详见:[详解js变量、作用域及内存][4]\n\n#### 列举IE 与其他浏览器不一样的特性?\n\n- IE支持`currentStyle`,FIrefox使用`getComputStyle`\n- IE 使用`innerText`,Firefox使用`textContent`\n- 滤镜方面:IE:`filter:alpha(opacity= num)`;Firefox:`-moz-opacity:num`\n- 事件方面:IE:`attachEvent`:火狐是`addEventListener`\n- 鼠标位置:IE是`event.clientX`;火狐是`event.pageX`\n- IE使用`event.srcElement`;Firefox使用`event.target`\n- IE中消除list的原点仅需margin:0即可达到最终效果;FIrefox需要设置`margin:0;padding:0以及list-style:none`\n- CSS圆角:ie7以下不支持圆角\n\n#### WEB应用从服务器主动推送Data到客户端有那些方式?\n\nJavascript数据推送\n\n- `Commet`:基于HTTP长连接的服务器推送技术\n- 基于`WebSocket`的推送方案\n- `SSE`(Server-Send Event):服务器推送数据新方式\n\n#### 对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?\n\n```\n前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。\n\n 1、实现界面交互\n\n 2、提升用户体验\n\n 3、有了Node.js,前端可以实现服务端的一些事情\n\n\n前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,\n\n\n\n 参与项目,快速高质量完成实现效果图,精确到1px;\n\n 与团队成员,UI设计,产品经理的沟通;\n\n 做好的页面结构,页面重构和用户体验;\n\n 处理hack,兼容、写出优美的代码格式;\n\n 针对服务器的优化、拥抱最新前端技术。\n\n```\n\n#### 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?\n\n```\n 分为4个步骤:\n\n (1),当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上每个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询。这能使浏览器获得请求对应的IP地址。\n\n (2), 浏览器与远程`Web`服务器通过`TCP`三次握手协商来建立一个`TCP/IP`连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。\n\n (3),一旦`TCP/IP`连接建立,浏览器会通过该连接向远程服务器发送`HTTP`的`GET`请求。远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态表示一个正确的响应。\n\n (4),此时,`Web`服务器提供资源服务,客户端开始下载资源。\n\n\n\n请求返回后,便进入了我们关注的前端模块\n\n简单来说,浏览器会解析`HTML`生成`DOM Tree`,其次会根据CSS生成CSS Rule Tree,而`javascript`又可以根据`DOM API`操作`DOM`\n\n```\n\n详情:[从输入 URL 到浏览器接收的过程中发生了什么事情?][8]\n\n#### javascript对象的几种创建方式\n\n```\n1,工厂模式\n\n2,构造函数模式\n\n3,原型模式\n\n4,混合构造函数和原型模式\n\n5,动态原型模式\n\n6,寄生构造函数模式\n\n7,稳妥构造函数模式\n\n```\n\n#### javascript继承的6种方法\n\n```\n1,原型链继承\n\n2,借用构造函数继承\n\n3,组合继承(原型+借用构造)\n\n4,原型式继承\n\n5,寄生式继承\n\n6,寄生组合式继承\n\n```\n\n详情:[JavaScript继承方式详解][9]\n\n#### 创建ajax的过程\n\n```\n (1)创建`XMLHttpRequest`对象,也就是创建一个异步调用对象.\n\n (2)创建一个新的`HTTP`请求,并指定该`HTTP`请求的方法、`URL`及验证信息.\n\n (3)设置响应`HTTP`请求状态变化的函数.\n\n (4)发送`HTTP`请求.\n\n (5)获取异步调用返回的数据.\n\n (6)使用JavaScript和DOM实现局部刷新.\n\n\n var xmlHttp = new XMLHttpRequest();\n\n xmlHttp.open('GET','demo.php','true');\n\n xmlHttp.send()\n\n xmlHttp.onreadystatechange = function(){\n\n if(xmlHttp.readyState === 4 & xmlHttp.status === 200){\n\n }\n\n }1234567891011121314151617181920212223242526\n```\n\n详情:[JavaScript学习总结(七)Ajax和Http状态字][10]\n\n#### 异步加载和延迟加载\n\n```\n1.异步加载的方案: 动态插入script标签\n\n2.通过ajax去获取js代码,然后通过eval执行\n\n3.script标签上添加defer或者async属性\n\n4.创建并插入iframe,让它异步执行js\n\n5.延迟加载:有些 js 代码并不是页面初始化的时候就立刻需要的,而稍后的某些情况才需要的。\n\n```\n\n#### ie各版本和chrome可以并行下载多少个资源\n\n```\nIE6 两个并发,iE7升级之后的6个并发,之后版本也是6个\nFirefox,chrome也是6个\n\n```\n\n#### `Flash`、`Ajax`各自的优缺点,在使用中如何取舍?\n\n- `Flash`适合处理多媒体、矢量图形、访问机器;对`CSS`、处理文本上不足,不容易被搜索。\n\n-`Ajax`对`CSS`、文本支持很好,支持搜索;多媒体、矢量图形、机器访问不足。\n\n- 共同点:与服务器的无刷新传递消息、用户离线和在线状态、操作DOM\n\n#### 请解释一下 JavaScript 的同源策略。\n\n概念:同源策略是客户端脚本(尤其是`Javascript`)的重要的安全度量标准。它最早出自`Netscape Navigator2.0`,其目的是防止某个文档或脚本从多个不同源装载。\n\n这里的同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议。\n\n指一段脚本只能读取来自同一来源的窗口和文档的属性。\n\n#### 为什么要有同源限制?\n\n我们举例说明:比如一个黑客程序,他利用`Iframe`把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过`Javascript`读取到你的表单中`input`中的内容,这样用户名,密码就轻松到手了。\n\n缺点:\n\n现在网站的`JS` 都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 `merge` 后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节。\n\n#### GET和POST的区别,何时使用POST?\n\n```\n GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符\n\n POST:一般用于修改服务器上的资源,对所发送的信息没有限制。\n\n\n GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,\n\n 也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。\n\n\n\n然而,在以下情况中,请使用 POST 请求:\n\n无法使用缓存文件(更新服务器上的文件或数据库)\n\n向服务器发送大量数据(POST 没有数据量限制)\n\n发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠\n\n```\n\n#### 事件、IE与火狐的事件机制有什么区别? 如何阻止冒泡?\n\n```\n 1. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。\n\n 2. 事件处理机制:IE是事件冒泡、firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件。;\n\n 3. `ev.stopPropagation()`;注意旧ie的方法 `ev.cancelBubble = true`;\n\n```\n\n#### ajax的缺点和在IE下的问题?\n\n详情请见:[JavaScript学习总结(七)Ajax和Http状态字][14]\n\n> ajax的缺点\n\n```\n 1、ajax不支持浏览器back按钮。\n\n 2、安全问题 AJAX暴露了与服务器交互的细节。\n\n 3、对搜索引擎的支持比较弱。\n\n 4、破坏了程序的异常机制。\n\n 5、不容易调试。\n\n```\n\n> IE缓存问题\n\n在IE浏览器下,如果请求的方法是`GET`,并且请求的`URL`不变,那么这个请求的结果就会被缓存。解决这个问题的办法可以通过实时改变请求的`URL`,只要URL改变,就不会被缓存,可以通过在URL末尾添加上随机的时间戳参数(`'t'= + new Date().getTime()`)\n\n或者:\n\n```\nopen('GET','demo.php?rand=+Math.random()',true);//1\n```\n\n> Ajax请求的页面历史记录状态问题\n\n可以通过锚点来记录状态,`location.hash`。让浏览器记录Ajax请求时页面状态的变化。\n\n还可以通过`HTML5`的`history.pushState`,来实现浏览器地址栏的无刷新改变\n\n#### 谈谈你对重构的理解\n\n网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的情况下,对网站进行优化, \n在扩展的同时保持一致的UI。\n\n```\n对于传统的网站来说重构通常是:\n\n表格(table)布局改为DIV+CSS\n\n使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的)\n\n对于移动平台的优化\n\n针对于SEO进行优化\n\n深层次的网站重构应该考虑的方面\n\n\n减少代码间的耦合\n\n让代码保持弹性\n\n严格按规范编写代码\n\n设计可扩展的API\n\n代替旧有的框架、语言(如VB)\n\n增强用户体验\n\n通常来说对于速度的优化也包含在重构中\n\n\n\n压缩JS、CSS、image等前端资源(通常是由服务器来解决)\n\n程序的性能优化(如数据读写)\n\n采用CDN来加速资源加载\n\n对于JS DOM的优化\n\nHTTP服务器的文件缓存\n\n```\n\n#### HTTP状态码\n\n```\n 100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息\n\n 200 OK 正常返回信息\n\n 201 Created 请求成功并且服务器创建了新的资源\n\n 202 Accepted 服务器已接受请求,但尚未处理\n\n 301 Moved Permanently 请求的网页已永久移动到新位置。\n\n 302 Found 临时性重定向。\n\n 303 See Other 临时性重定向,且总是使用 GET 请求新的 URI。\n\n 304 Not Modified 自从上次请求后,请求的网页未修改过。\n\n\n 400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。\n\n 401 Unauthorized 请求未授权。\n\n 403 Forbidden 禁止访问。\n\n 404 Not Found 找不到如何与 URI 相匹配的资源。\n\n 500 Internal Server Error 最常见的服务器端错误。\n\n 503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。\n123456789101112131415161718192021222324252627282930\n```\n\n#### 说说你对Promise的理解\n\n依照 `Promise/A+` 的定义,`Promise` 有四种状态:\n\n```\npending: 初始状态, 非 fulfilled 或 rejected.\n\nfulfilled: 成功的操作.\n\nrejected: 失败的操作.\n\nsettled: Promise已被fulfilled或rejected,且不是pending\n\n```\n\n另外, `fulfilled` 与 `rejected` 一起合称 `settled`。\n\n`Promise` 对象用来进行延迟(deferred) 和异步(asynchronous ) 计算。\n\n> Promise 的构造函数\n\n构造一个 `Promise`,最基本的用法如下:\n\n```\n var promise = new Promise(function(resolve, reject) {\n\n if (...) { // succeed\n\n resolve(result);\n\n } else { // fails\n\n reject(Error(errMessage));\n\n }\n });123456789101112\n```\n\n`Promise` 实例拥有 `then` 方法(具有 `then` 方法的对象,通常被称为 `thenable`)。它的使用方法如下:\n\n```\npromise.then(onFulfilled, onRejected)1\n```\n\n接收两个函数作为参数,一个在 `fulfilled` 的时候被调用,一个在 `rejected` 的时候被调用,接收参数就是 `future,onFulfilled`对应 `resolve`, `onRejected` 对应 `reject`。\n\n#### 说说你对前端架构师的理解\n\n负责前端团队的管理及与其他团队的协调工作,提升团队成员能力和整体效率; \n带领团队完成研发工具及平台前端部分的设计、研发和维护; \n带领团队进行前端领域前沿技术研究及新技术调研,保证团队的技术领先 \n负责[前端开发](http://lib.csdn.net/base/javascript)规范制定、功能模块化设计、公共组件搭建等工作,并组织培训。\n\n#### 实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制\n\n```\n Object.prototype.clone = function(){\n\n var o = this.constructor === Array ? [] : {};\n\n for(var e in this){\n\n o[e] = typeof this[e] === \"object\" ? this[e].clone() : this[e];\n\n }\n\n return o;\n }123456789101112\n```\n\n#### 说说严格模式的限制\n\n严格模式主要有以下限制:\n\n```\n变量必须声明后再使用\n\n函数的参数不能有同名属性,否则报错\n\n不能使用with语句\n\n不能对只读属性赋值,否则报错\n\n不能使用前缀0表示八进制数,否则报错\n\n不能删除不可删除的属性,否则报错\n\n不能删除变量delete prop,会报错,只能删除属性delete global[prop]\n\neval不会在它的外层作用域引入变量\n\neval和arguments不能被重新赋值\n\narguments不会自动反映函数参数的变化\n\n不能使用arguments.callee\n\n不能使用arguments.caller\n\n禁止this指向全局对象\n\n不能使用fn.caller和fn.arguments获取函数调用的堆栈\n\n增加了保留字(比如protected、static和interface)\n\n```\n\n设立”严格模式”的目的,主要有以下几个:\n\n- 消除`Javascript`语法的一些不合理、不严谨之处,减少一些怪异行为;\n- 消除代码运行的一些不安全之处,保证代码运行的安全;\n- 提高编译器效率,增加运行速度;\n- 为未来新版本的`Javascript`做好铺垫。\n\n注:经过[测试](http://lib.csdn.net/base/softwaretest)`IE6,7,8,9`均不支持严格模式。\n\n#### 如何删除一个cookie\n\n> 1.将时间设为当前时间往前一点。\n\n```\nvar date = new Date();\n\ndate.setDate(date.getDate() - 1);//真正的删除123\n```\n\n`setDate()`方法用于设置一个月的某一天。\n\n> 2.expires的设置\n\n```\n document.cookie = 'user='+ encodeURIComponent('name') + ';expires = ' + new Date(0)1\n```\n\n#### `<strong>`,`<em>`和`<b>`,`<i>`标签\n\n```\n<strong> 标签和 <em> 标签一样,用于强调文本,但它强调的程度更强一些。\n\nem 是 斜体强调标签,更强烈强调,表示内容的强调点。相当于html元素中的 <i>...</i>;\n\n< b > < i >是视觉要素,分别表示无意义的加粗,无意义的斜体。\n\nem 和 strong 是表达要素(phrase elements)。1234567\n```\n\n#### 说说你对AMD和Commonjs的理解\n\n`CommonJS`是服务器端模块的规范,[Node.js](http://lib.csdn.net/base/nodejs)采用了这个规范。`CommonJS`规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数。\n\n`AMD`推荐的风格通过返回一个对象做为模块对象,`CommonJS`的风格通过对`module.exports`或`exports`的属性赋值来达到暴露模块对象的目的。\n\n#### document.write()的用法\n\n`document.write()`方法可以用在两个方面:页面载入过程中用实时脚本创建页面内容,以及用延时脚本创建本窗口或新窗口的内容。\n\n`document.write`只能重绘整个页面。`innerHTML`可以重绘页面的一部分\n\n#### 编写一个方法 求一个字符串的字节长度\n\n假设:一个英文字符占用一个字节,一个中文字符占用两个字节\n\n```\n function GetBytes(str){\n\n var len = str.length;\n\n var bytes = len;\n\n for(var i=0; i<len; i++){\n\n if (str.charCodeAt(i) > 255) bytes++;\n\n }\n\n return bytes;\n\n }\n\nalert(GetBytes(\"你好,as\"));1234567891011121314151617\n```\n\n#### git fetch和git pull的区别\n\n```\ngit pull:相当于是从远程获取最新版本并merge到本地\n\ngit fetch:相当于是从远程获取最新版本到本地,不会自动merge123\n```\n\n#### 说说你对MVC和MVVM的理解\n\n> `MVC`\n\n```\nView 传送指令到 Controller\n\nController 完成业务逻辑后,要求 Model 改变状态\n\nModel 将新的数据发送到 View,用户得到反馈\n\n```\n\n所有通信都是单向的。\n\n`Angular`它采用双向绑定(data-binding):`View`的变动,自动反映在 `ViewModel`,反之亦然。\n\n```\n组成部分Model、View、ViewModel\n\nView:UI界面\n\nViewModel:它是View的抽象,负责View与Model之间信息转换,将View的Command传送到Model;\n\nModel:数据访问层\n\n```\n\n#### 请解释什么是事件代理\n\n事件代理(Event Delegation),又称之为事件委托。是 `JavaScript` 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是`DOM`元素的事件冒泡。使用事件代理的好处是可以提高性能。\n\n#### attribute和property的区别是什么?\n\n`attribute`是`dom`元素在文档中作为`html`标签拥有的属性;\n\n`property`就是`dom`元素在`js`中作为对象拥有的属性。\n\n所以:\n\n对于`html`的标准属性来说,`attribute`和`property`是同步的,是会自动更新的,\n\n但是对于自定义的属性来说,他们是不同步的,\n\n#### 说说网络分层里七层模型是哪七层\n\n- 应用层:应用层、表示层、会话层(从上往下)(`HTTP、FTP、SMTP、DNS`)\n- 传输层(`TCP`和`UDP`)\n- 网络层(`IP`)\n- 物理和数据链路层(以太网)\n\n> 每一层的作用如下:\n\n```\n物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)\n数据链路层:将比特组装成帧和点到点的传递(帧Frame)\n网络层:负责数据包从源到宿的传递和网际互连(包PackeT)\n传输层:提供端到端的可靠报文传递和错误恢复(段Segment)\n会话层:建立、管理和终止会话(会话协议数据单元SPDU)\n表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)\n应用层:允许访问OSI环境的手段(应用协议数据单元APDU)12345678\n```\n\n> 各种协议\n\n`ICMP协议`: 因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。 \n`TFTP协议`: 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。 \n`HTTP协议`: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。 \n`DHCP协议`: 动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。\n\n#### 说说mongoDB和MySQL的区别\n\n`MySQL`是传统的关系型[数据库](http://lib.csdn.net/base/mysql),`MongoDB`则是非关系型[数据库](http://lib.csdn.net/base/mysql)\n\n`MongoDB`以`BSON`结构(二进制)进行存储,对海量数据存储有着很明显的优势。\n\n对比传统关系型数据库,NoSQL有着非常显著的性能和扩展性优势,与关系型数据库相比,MongoDB的优点有: \n①弱一致性(最终一致),更能保证用户的访问速度: \n②文档结构的存储方式,能够更便捷的获取数据。\n\n#### 讲讲304缓存的原理\n\n服务器首先产生`ETag`,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。\n\n304是HTTP状态码,服务器用来标识这个文件没修改,不返回内容,浏览器在接收到个状态码后,会使用浏览器已缓存的文件\n\n客户端请求一个页面(A)。 服务器返回页面A,并在给`A`加上一个`ETag`。 客户端展现该页面,并将页面连同`ETag`一起缓存。 客户再次请求页面`A`,并将上次请求时服务器返回的`ETag`一起传递给服务器。 服务器检查该`ETag`,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应`304`(未修改——`Not Modified`)和一个空的响应体。\n\n#### 什么样的前端代码是好的\n\n高复用低耦合,这样文件小,好维护,而且好扩展。","tags":["移动端"]},{"title":"ES6函数新增的特性","url":"/ES6_comfn.html","content":"\n\n\n## 带默认参数的函数\n\n> JavaScript函数的最大的一个特点就是在传递参数的时候,参数的个数不受限制的。为了健壮性考虑,一般在函数内部需要做一些默认值的处理。\n\n```javascript\nfunction makeRequest(url, timeout, callback) {\n timeout = timeout || 2000;\n callback = callback || function() {};\n}\n```\n\n<!--more-->\n\n其实上面的默认值方法有个bug:当timeout是0的时候也会当做假值来处理,从而给赋值默认值2000.\n\n> ES6从语言层面面上增加了 **默认值的** 支持。看下面的代码:\n\n```javascript\n//这个函数如果只传入第一个参数,后面两个不传入,则会使用默认值。如果后面两个也传入了参数,则不会使用默认值。\nfunction makeRequest(url, timeout = 2000, callback = function() {}) {\n\n // 其余代码\n\n}\n```\n\n## 默认参数对 arguments 对象的影响\t\n\n> 在非严格模式下,arguments总是能反映出命名参数的变化。看下面的代码:\n\n```javascript\n<script type=\"text/javascript\">\n function foo(a, b) {\n //非严格模式\n console.log(arguments[0] === a); //true\n console.log(arguments[1] === b); //true\n a = 10;\n b = 20;\n console.log(arguments[0] === a); //true\n console.log(arguments[1] === b); //true\n }\n foo(1, 2);\n</script>\n```\n\n> **在ES5的严格模式下**,arguments只反映参数的初始值,而不再反映命名参数的变化!\n\n```Javascript\n<script type=\"text/javascript\">\n\n function foo(a, b) {\n //严格模式\n \"use strict\"\n console.log(arguments[0] === a); //true\n console.log(arguments[1] === b); //true\n a = 10;\n b = 20;\n console.log(arguments[0] === a); //false。 修改a的值不会影响到arguments[0]的值\n console.log(arguments[1] === b); //false\n }\n foo(1, 2);\n</script>\n```\n\n> 当使用ES6参数默认值的时候,不管是否是在严格模式下,都和ES5的严格模式相同。看下面的代码:\n\n```Javascript\n<script type=\"text/javascript\">\n\n function foo(a, b = 30) {\n console.log(arguments[0] === a); //true\n console.log(arguments[1] === b); //true\n a = 10;\n b = 20;\n console.log(arguments[0] === a); //false。 由于b使用了默认值。虽然a没有使用默认值,但是仍然表现的和严格模式一样。\n console.log(arguments[1] === b); //false。 b使用了默认值,所以表现的和严格模式一样。\n }\n foo(1, 2);\n</script>\n```\n\n> 注意:如果这样调用foo(1),则 a == 1, b == 30, arguments[0] == 1, arguments[1] == undefined。也就是说默认值并不会赋值给arguments参数。\n\n## 默认参数表达式 (**Default Parameter Expressions**)\n\n> 参数的默认值,也可以是一个表达式或者函数调用等。看下面的代码\n\n```javascript\n<script type=\"text/javascript\">\n function getValue() {\n return 5;\n }\n\n function add(first, second = getValue()) { //表示使用getValue这个函数的返回值作为second的默认值。\n return first + second;\n }\n\n console.log(add(1, 1)); // 2. 调用add函数的时候,传入了第二个参数,则以传入的参数为准。\n console.log(add(1)); // 6。 调用add函数的时候,没有传入第二个参数,则会调用getValue函数。\n</script>\n```\n\n> 有一点需要要注意:getValue()只会在调用add且不传入第二个参数的时候才会去调用。不是在解析阶段调用的。\n\n```javascript\n<script type=\"text/javascript\">\n let value = 5;\n function getValue() {\n return value++;\n }\n\n function add(first, second = getValue()) { //\n return first + second;\n }\n\n console.log(add(1, 1)); // 2\n console.log(add(1)); // 6。 \n console.log(add(1)); // 7\n console.log(add(1)); // 8\n</script>\n```\n\n> 由于默认值可以表达式,所以我们甚至可以使用前面的参数作为后面参数的默认值。\n\n```javascript\nfunction add(first, second = first) { // 使用第一个参数作为第二个参数的默认值\n return first + second;\n }\n\n```\n\n> 注意:可以把前面的参数作为后面参数的默认值,但是不能把后面的参数作为第一个参数的默认值。这可以前面说的let和const的暂存性死区一个意思。\n\n```javascript\nfunction add(first = second, second)) { // 这种写法是错误的\n\n return first + second;\n}\n```\n\n## 未命名参数问题\n\n> Javascript并不限制传入的参数的数量。在调用函数的时候,传入的实参的个数超过形参的个数的时候,超过的部分就成为了未命名参数。在ES5之前,我们一般可以通过arguments对象来获取到未命名参数的值。但是罗显繁琐。\n\n```javascript\n<script type=\"text/javascript\">\n function foo(a) {\n console.log(a);\n console.log(arguments[1]) //取得传入的多余的参数。\n }\n foo(2, 3);\n</script>\n```\n\n> ES6,提供了一种更加优雅处理未命名参数的问题:**剩余参数**( **Rest Parameters** )\n>\n> 语法:function a(a, … b){ } \n>\n> 剩余参数使用三个点( … )和变量名来表示。\n\n```javascript\n<script type=\"text/javascript\">\n function foo(a, ...b) {\n console.log(a);\n console.log(b instanceof Array); //true .多余的参数都被放入了b中。b其实就是一个数组。\n }\n foo(2, 3, 4, 6);\n</script>\n```\n\n> 注意:\n\n1. 函数最多只能有一个剩余参数b。而且这个剩余参数必须位于参数列表的最后位置。\n2. 虽然有了剩余参数,但是arguments仍然存在,但是arguments完全无视了剩余参数的存在。\n3. 剩余参数是在函数声明的时候出现的。\n\n\n\n## 函数中的扩展运算符\n\n> 例如:Math中的max函数可以返回任意多个参数中的最大值。但是如果这些参数在一个数组中,则没有办法直接传入。以前通用的做法是使用applay方法。\n>\n> 看下面的代码:\n\n```javascript\n<script type=\"text/javascript\">\n let values = [25, 50, 75, 100]\t\n console.log(Math.max.apply(Math, values)); // 100\n</script>\n```\n\n> 上面这种方法虽然可行,但是总是不是那么直观。\n>\n> 使用ES6提供的扩展运算符可以很容易的解决这个问题。在数组前加前缀 … (三个点)。\n\n```Javascript\n<script type=\"text/javascript\">\n let values = [25, 50, 75, 100]\n console.log(Math.max(...values)); //使用扩展运算符。相当于拆解了数组了。\n\tconsole.log(Math.max(...values, 200)); //也可以使用扩展运算符和参数的混用,则这个时候就有 5 个数参与比较了。\n</script>\n```\n\n> **注意:剩余参数和扩展运算符都是 使用三个点作为前缀。但是他们使用的位置是不一样的。**\n>\n> 1. ****剩余参数是用在函数的声明的时候的参数列表中,而且必须在参数列表的后面\n> 2. 扩展运算符是用在函数调用的时候作为实参来传递的,在实参中的位置没有限制。\n\n# 全新的函数:箭头函数(=>)\n\n> ECMAScript 6 最有意思的部分之一就是箭头函数。正如其名,箭头函数由 “箭头”(=>)这种新的语法来定义。\n>\n> 其实在别的语言中早就有了这种语法结构,不过他们叫拉姆达表达式。\n\n## 箭头函数语法\n\n> 基本语法如下:\n\n```javascript\n(形参列表)=>{\n //函数体\n}\n```\n\n---\n\n> 箭头函数可以赋值给变量,也可以像匿名函数一样直接作为参数传递。\n\n- 示例1:\n\n```javascript\n<script type=\"text/javascript\">\n var sum = (num1, num2) =>{\n return num1 + num2;\n }\n console.log(sum(3, 4));\n //前面的箭头函数等同于下面的传统函数\n var add = function (num1, num2) {\n return num1 + num2;\n }\n console.log(add(2, 4))\n</script>\n```\n\n---\n\n> 如果函数体内只有一行代码,则包裹函数体的 **大括号** ({ })完全可以省略。如果有return,return关键字也可以省略。\n>\n> 如果函数体内有多条语句,则 {} 不能省略。\n\n- 示例2:\n\n```javascript\n<script type=\"text/javascript\">\n var sum = (num1, num2) => num1 + num2;\n console.log(sum(5, 4));\n //前面的箭头函数等同于下面的传统函数\n var add = function (num1, num2) {\n return num1 + num2;\n }\n console.log(add(2, 4));\n\n\t//如果这一行代码是没有返回值的,则方法的返回自也是undefined\n\tvar foo = (num1, num2) => console.log(\"aaa\");\n\tconsole.log(foo(3,4)); //这个地方的返回值就是undefined\n</script>\n```\n\n---\n\n> 如果箭头函数只有一个参数,则包裹参数的小括号可以省略。其余情况下都不可以省略。**当然如果不传入参数也不可以省略**\n\n- 示例3:\n\n```javascript\n<script type=\"text/javascript\">\n var foo = a=> a+3; //因为只有一个参数,所以()可以省略\n console.log(foo(4)); // 7\n</script>\n```\n\n---\n\n> 如果想直接返回一个js对象,而且还不想添加传统的大括号和return,则必须给整个对象添加一个**小括号 ()**\n\n- 示例4:\n\n```Javascript\n<script type=\"text/javascript\">\n var foo = ()=>({name:\"lisi\", age:30});\n console.log(foo());\n\t//等同于下面的;\n\tvar foo1 = ()=>{\n \treturn {\n \tname:\"lisi\",\n \tage : 30\n \t};\n\t}\n</script>\n```\n\n## 使用箭头函数实现函数自执行\n\n```Javascript\n<script type=\"text/javascript\">\n var person = (name => {\n return {\n name: name,\n age: 30\n }\n }\n )(\"zs\");\n console.log(person);\n</script>\n```\n\n## 箭头函数中无this绑定(No this Binding)\n\n> 在ES5之前this的绑定是个比较麻烦的问题,稍不注意就达不到自己想要的效果。因为this的绑定和定义位置无关,只和调用方式有关。\n>\n> **在箭头函数中则没有这样的问题,在箭头函数中,this和定义时的作用域相关,不用考虑调用方式**\n>\n> 箭头函数没有 this 绑定,意味着 this 只能通过查找作用域链来确定。**如果箭头函数被另一个不包含箭头函数的函数囊括,那么 this 的值和该函数中的 this 相等,否则 this 的值为 window。**\n\n```Javascript\n<script type=\"text/javascript\">\n var PageHandler = {\n id: \"123456\",\n init: function () {\n document.addEventListener(\"click\",\n event => this.doSomething(event.type), false); // 在此处this的和init函数内的this相同。\n },\n\n doSomething: function (type) {\n console.log(\"Handling \" + type + \" for \" + this.id);\n }\n };\n PageHandler.init();\n</script>\n```\n\n看下面的一段代码:\n\n```javascript\n<script type=\"text/javascript\">\n\n var p = {\n foo:()=>console.log(this) //此处this为window\n }\n p.foo(); //输出为 window对象。 并不是我想要的。所以在定义对象的方法的时候应该避免使用箭头函数。\n//箭头函数一般用在传递参数,或者在函数内部声明函数的时候使用。\n</script>\n```\n\n> 说明:\n\n1. 箭头函数作为一个使用完就扔的函数,不能作为构造函数使用。也就是不能使用new 的方式来使用箭头函数。\n2. 由于箭头函数中的this与函数的作用域相关,所以不能使用call、apply、bind来重新绑定this。但是虽然this不能重新绑定,但是还是可以使用call和apply方法去执行箭头函数的。\n\n\n\n## 无arguments绑定\n\n> 虽然箭头函数没有自己的arguments对象,但是在箭头函数内部还是可以使用它外部函数的arguments对象的。\n\n```javascript\n<script type=\"text/javascript\">\n function foo() {\n //这里的arguments是foo函数的arguments对象。箭头函数自己是没有 arguments 对象的。\n return ()=>arguments[0]; //箭头函数的返回值是foo函数的第一个参数\n }\n var arrow = foo(4, 5);\n console.log(arrow()); // 4\n</script>\n```\n","tags":["JavaScript"]},{"title":"ES6块级作用域","url":"/ES6_let.html","content":"\n## 块级作用域绑定\n\n> 在ES5之前,不存在块级作用域,在编程的时候很多时候会带来很多的不便,ES6新增了块级作用域,补足了这方面的缺陷。\n\n块级声明指的是该声明的变量无法被代码块外部访问。块作用域,又被称为词法作用域(lexical scopes),可以在如下的条件下创建:\n\n- 函数内部\n- 在代码块(即 { })内部\n\n块级作用域是很多类C语言的工作机制,ECMAScript 6 引入块级声明的目的是增强 JavaScript 的灵活性,同时又能与其它编程语言保持一致。\n\n<!--more-->\n\n## let声明\n\n> 使用let声明变量的语法和使用var声明的语法是一样的。**但是let声明的变量的作用域会限制在当前的代码块中。这是let与var的最大区别**。\n\n```javascript\n<script type=\"text/javascript\">\n let a = 10;\n if(a > 5){\n console.log(b); //用let声明的变量没有声明提前这一特性,所以此处也访问不到(报错)\n let b = 20;\n console.log(b);\n }\n console.log(b); //由于b是在if块中使用let声明的,所以此处无法访问到。(报错)\n</script>\n```\n\n> 注意:\n\n1. 用 let 声明的变量具有块级作用域,只能在声明的块中访问,在块外面无法访问\n2. 用let声明的变量也没有声明提前这一特性。\n3. 在同一个块中,let声明的变量也不能重复声明。\n4. 在声明变量的时候尽量使用let,慢慢的抛弃var\n\n\n\n## const声明(Constant Declarations)\n\n> 在 ES6 使用const来声明的变量称之为常量。这意味着它们不能再次被赋值。由于这个原因,所有的 const 声明的变量都必须在声明处初始化。const声明的常量和let变量一样也是具有块级作用域的特性。\n\n```javascript\n<script type=\"text/javascript\">\n var a = 20;\n if (true) {\n const b = 20;\n b = 30; //错误! 常量不能重新赋值\n const c; //错误! 常量声明的同时必须赋值。\n }\n</script>\n```\n\n> 注意:\n\n1. const的特性除了声明的是常量为,其他与let一样。\n2. 在let和const声明前的这段区域称之为暂存性死区(**The Temporal Dead Zone** —TDZ)。\n3. 使用let和const声明的变量和常量不再是window的属性。 也就是说通过window.a是无法访问到的。\n\n\n\n## 循环中的块级绑定\n\n> 使用var声明的循环变量在循环结束后仍然可以访问到。 使用let声明的循环变量,在循环结束之后会立即销毁。\n\n```JavaScript\n<script type=\"text/javascript\">\n for(let i = 0; i < 3; i++){ // 循环结束之后会立即销毁 i\n console.log(i);\n }\n console.log(i); //此处无法访问到 i 。\n</script>\n```\n\n## 循环中的函数\n\n> 看下面的代码,是输出10个10,而不是0,1,2,...\n\n```javascript\n<script type=\"text/javascript\">\n var funcs = [];\n for (var i = 0; i < 10; i++) {\n funcs.push(function () {\n console.log(i);\n });\n }\n funcs.forEach(function (func) {\n func(); // 输出 \"10\" 共10次\n });\n</script>\n```\n\n> 解决办法需要使用函数的自执行特性。\n\n```javascript\nvar funcs = [];\nfor (var i = 0; i < 10; i++) {\n funcs.push((function(value) {\n return function() {\n console.log(value);\n }\n }(i)));\n}\nfuncs.forEach(function(func) {\n func(); // 输出 0,1,2 ... 9\n});\n```\n\n**如果使用let声明变量,则完全可以避免前面的问题。 这是ES6规范中专门定义的特性。在for … in和for ... of循环中也适用**\n\n```Javascript\n<script type=\"text/javascript\">\n var funcs = [];\n for (let i = 0; i < 10; i++) {\n funcs.push(function () {\n console.log(i);\n });\n }\n funcs.forEach(function (func) {\n func(); // 输出 0,1,2 ... 9\n })\n</script>\n```\n\n> 说明:\n\n1. let 声明使得每次迭代都会创建一个变量 i,所以循环内部创建的函数会获得各自的变量 i 的拷贝。每份拷贝都会在每次迭代的开始被创建并被赋值。","tags":["JavaScript"]},{"title":"Flex布局","url":"/Flex_layout.html","content":"\n## Flex布局是什么?\n\nFlex 是 Flexible Box 的缩写,意为\"弹性布局\",用来为盒状模型提供最大的灵活性。\n\n任何一个容器都可以指定为 Flex 布局。\n\n<!--more-->\n\n### 定义容器的display属性\n\n```css\n.box{\n \tdisplay: -webkit-flex;\n \tdispaly: flex;\n}\n/*行内样式*/\n.box{\n \tdisplay: -webkit-inline-flex;\n \tdisplay: inline-flex;\n}\n```\n\n### 容器样式\n\n**主轴方向(flex-direction)**\n\n| 属性值 | 属性的含义 |\n| -------------- | ------- |\n| row | 左到右(默认) |\n| row-reverse | 右到左 |\n| column | 上到下 |\n| column-reverse | 下到上 |\n\n**换行(flex-wrap)**\n\n| 属性值 | 属性的含义 |\n| ------------ | --------- |\n| nowrap | 不换行(默认) |\n| wrap | 换行 |\n| wrap-reverse | 换行并第一行在下方 |\n\n**主轴方向和换行简写**\n\n```css\nflew-flow:<flex-direction>||<flex-wrap>\n```\n\n**主轴对齐方式(justify-content)**\n\n| 属性值 | 属性的含义 |\n| ------------- | ------- |\n| flex-start | 左对齐(默认) |\n| flex-end | 右对齐 |\n| center | 居中对齐 |\n| space-between | 两端对齐 |\n| space-around | 平均分布 |\n\n**交叉轴对齐方式(align-items)**\n\n| 属性值 | 属性的含义 |\n| ---------- | -------------------------------- |\n| flex-start | 顶部对齐 |\n| flex-end | 底部对齐 |\n| center | 居中对齐 |\n| baseline | 文本基线对齐 |\n| stretch | 如果项目未设置高度或设为auto,将占满整个容器的高度。(默认) |\n\n### 子元素属性\n\n**排序(order:<number>)**:排序,数值越小,越排前,默认为0\n\n**放大(flex-grow: <number>)**:放大:默认0(即如果有剩余空间也不放大,值为1则放大,2是1的双倍大小,以此类推)\n\n**缩小(flex-shrink:<number>)**:缩小:如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。负值对该属性无效。\n\n**固定大小(flex-basis:<length> | auto)**:固定大小:默认为0,可以设置px值,也可以设置百分比大小\n\n**flex:none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]**:flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。\n\n**单独对齐方式(align-self)**\n\n\n\n| 属性值 | 含义 |\n| ---------- | ------- |\n| auto | 自动(默认) |\n| flex-start | 顶部对齐 |\n| flex-end | 底部对齐 |\n| center | 居中对齐 |\n| baseline | 文本基线对齐 |\n| stretch | 上下对齐并铺满 |","tags":["css3"]},{"title":"JavaScript常用函数汇总","url":"/js_comfn.html","content":"\n> 在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,又或是作为返回值,就需要通过函数指针(function pointer)、代理(delegate)等特殊的方式周折一番。而在JavaScript世界中函数却是一等公民,它不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值、传参、返回,这样的函数也称之为第一级函数(First-class Function)。不仅如此,JavaScript中的函数还充当了类的构造函数的作用,同时又是一个Function类的实例(instance)。这样的多重身份让JavaScript的函数变得非常重要。\n\n<!-- more -->\n\n## 1.原生JavaScript实现字符串长度截取\n\n\n```JavaScript\n function cutstr(str, len) {\n \t\tvar temp;\n var icount = 0;\n var patrn = /[^\\x00-\\xff]/;\n var strre = \"\";\n for (var i = 0; i < str.length; i++) {\n if (icount < len - 1) {\n temp = str.substr(i, 1);\n if (patrn.exec(temp) == null) {\n icount = icount + 1\n } else {\n icount = icount + 2\n }\n strre += temp\n } else {\n break\n }\n }\n return strre + \"...\"\n }\n```\n\n\n## 2.原生JavaScript获取域名主机\n\n```javascript\nfunction getHost(url) {\n var host = \"null\";\n if(typeof url == \"undefined\"|| null == url) {\n url = window.location.href;\n }\n var regex = /^\\w+\\:\\/\\/([^\\/]*).*/;\n var match = url.match(regex);\n if(typeof match != \"undefined\" && null != match) {\n host = match[1];\n }\n return host;\n}\n```\n\n\n## 3.原生JavaScript元素显示的通用方法\n\n```javascript\nfunction $(id) {\n return !id ? null : document.getElementById(id);\n }\n function display(id) {\n var obj = $(id);\n if(obj.style.visibility) {\n obj.style.visibility = obj.style.visibility == 'visible' ? 'hidden' : 'visible';\n } else {\n obj.style.display = obj.style.display == '' ? 'none' : '';\n }\n }\n```\n\n\n## 4.原生JavaScript实现checkbox全选与全不选\n\n function checkAll() {\n var selectall = document.getElementById(\"selectall\");\n var allbox = document.getElementsByName(\"allbox\");\n if (selectall.checked) {\n for (var i = 0; i < allbox.length; i++) {\n allbox[i].checked = true;\n }\n } else {\n for (var i = 0; i < allbox.length; i++) {\n allbox[i].checked = false;\n }\n }\n }\n\n\n## 5.原生JavaScript完美判断是否为网址\n\n```javascript\nfunction IsURL(strUrl) {\n var regular = /^\\b(((https?|ftp):\\/\\/)?[-a-z0-9]+(\\.[-a-z0-9]+)*\\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\\d)|(1\\d\\d)|([1-9]\\d)|\\d))\\b(\\/[-a-z0-9_:\\@&?=+,.!\\/~%\\$]*)?)$/i\n if (regular.test(strUrl)) {\n return true;\n }\n else {\n return false;\n }\n}\n```\n\n\n## 6.原生JavaScript获得URL中GET参数值\n\n```javascript\n// 用法:如果地址是 test.htm?t1=1&t2=2&t3=3, 那么能取得:GET[\"t1\"], GET[\"t2\"], GET[\"t3\"]\nfunction get_get(){ \n querystr = window.location.href.split(\"?\")\n if(querystr[1]){\n GETs = querystr[1].split(\"&\")\n GET =new Array()\n for(i=0;i<GETs.length;i++){\n tmp_arr = GETs[i].split(\"=\")\n key=tmp_arr[0]\n GET[key] = tmp_arr[1]\n }\n }\n return querystr[1];\n}\n```\n\n\n## 7.原生JavaScript跨浏览器添加事件\n\n```javascript\nfunction addEvt(oTarget,sEvtType,fnHandle){\n if(!oTarget){return;}\n if(oTarget.addEventListener){\n oTarget.addEventListener(sEvtType,fnHandle,false);\n }else if(oTarget.attachEvent){\n oTarget.attachEvent(\"on\" + sEvtType,fnHandle);\n }else{\n oTarget[\"on\" + sEvtType] = fnHandle;\n }\n}\n```\n\n\n## 8.原生JavaScript实现返回顶部的通用方法\n\n```javascript\nfunction backTop(btnId) {\n var btn = document.getElementById(btnId);\n var d = document.documentElement;\n var b = document.body;\n window.onscroll = set;\n btn.style.display = \"none\";\n btn.onclick = function() {\n btn.style.display = \"none\";\n window.onscroll = null;\n this.timer = setInterval(function() {\n d.scrollTop -= Math.ceil((d.scrollTop + b.scrollTop) * 0.1);\n b.scrollTop -= Math.ceil((d.scrollTop + b.scrollTop) * 0.1);\n if ((d.scrollTop + b.scrollTop) == 0) clearInterval(btn.timer, window.onscroll = set);\n },\n 10);\n };\n function set() {\n btn.style.display = (d.scrollTop + b.scrollTop > 100) ? 'block': \"none\"\n }\n};\nbackTop('goTop');\n```\n\n\n## 9.原生JavaScript实现全选通用方法\n\n```javascript\nfunction checkall(form, prefix, checkall) {\n var checkall = checkall ? checkall : 'chkall';\n for(var i = 0; i < form.elements.length; i++) {\n var e = form.elements[i];\n if(e.type==\"checkbox\"){\n e.checked = form.elements[checkall].checked;\n }\n }\n}\n```\n\n\n## 10.原生JavaScript实现全部取消选择通用方法\n\n```javascript\nfunction uncheckAll(form) {\n for (var i=0;i<form.elements.length;i++){\n var e = form.elements[i];\n if (e.name != 'chkall')\n e.checked=!e.checked;\n }\n}\n```\n\n\n## 11.原生JavaScript获取单选按钮的值\n\n```javascript\nfunction get_radio_value(field){\n if(field&&field.length){ \n for(var i=0;i<field.length;i++){ \n if(field[i].checked){ \n return field[i].value; \n } \n } \n }else { \n return ; \n } \n}\n```\n\n\n## 12.原生JavaScript获取复选框的值\n\n```javascript\nfunction get_checkbox_value(field){ \n if(field&&field.length){ \n for(var i=0;i<field.length;i++){ \n if(field[i].checked && !field[i].disabled){\n return field[i].value;\n }\n } \n }else {\n return;\n } \n}\n```\n\n\n## 13.原生JavaScript判断变量是否空值\n\n```javascript\n/**\n * 判断变量是否空值\n * undefined, null, '', false, 0, [], {} 均返回true,否则返回false\n */\nfunction empty(v){\n switch (typeof v){\n case 'undefined' : return true;\n case 'string' : if(trim(v).length == 0) return true; break;\n case 'boolean' : if(!v) return true; break;\n case 'number' : if(0 === v) return true; break;\n case 'object' : \n if(null === v) return true;\n if(undefined !== v.length && v.length==0) return true;\n for(var k in v){return false;} return true;\n break;\n }\n return false;\n}\n```\n\n## 14.后记 \n\n本文转自[MR_LP___李鹏](http://www.jianshu.com/u/5a2fd0b8fb30)参考于 [小萧ovo](https://zhuanlan.zhihu.com/p/24205965) 的码农在线,感谢作者。\n\n","tags":["JavaScript"]}]