web前端面试题
HTML • HTML5新增了哪些内容或API,使用过哪些 Html5 的目的是将互联网内容语义化,更好的为人类和机器阅读,同时更好的支持各种媒体的嵌入。 新的API: • HTML Geolocation //获取用户的地理位置 • HTML Drag and Drop • HTML Local Storage • HTML Application Cache • HTML Web Workers • HTML SSE // server-send events (单向的服务器向客户端推送信息) • HTML Canvas/WebGL • HTML Audio/Video 新的语义元素: section, video, progress, nav, meter, time, aside, canvas, command, datalist, details, embed, figcaption, figure, footer, header, hgroup, keygen, mark, output, rp, rt, ruby, source, summary, wbr。 • input和textarea的区别 一个单行文本输入,一个多行文本输入。 • 用一个div模拟textarea的实现 #textarea { width:300px; border:1px solid #ccc; min-height:150px; max-height:300px; overflow: auto; font-size: 14px; outline: none; }
• 移动设备忽略将页面中的数字识别为电话号码的方法 ------------------------------------------------------------------- CSS • 左右布局:左边定宽、右边自适应,不少于3种方法 .left{float:left}.right{width:100%} .wapper{display:flex}.right{flex:1} .left{float:left}.right{float:left;width”calu(100vw-200px)} .right{margin-left:-100%} • CSS3用过哪些新特性 CSS3 是CSS的升级版本,提供更加丰富且使用的规范:盒子模型,列表模块,超链接方式,语言模块,背景和边框,文字特效,多栏布局等等。 1.新的选择器 tbody:nth-child(even),tbody:nth-child(odd) //偶数行,奇数行。 :not(.textiput) //不是class为textinput的节点 div:first-child || last-child //div的第一个节点 2.新的特性 @font-face 用来加载字体样式,而且还能加载服务器的字体样式,让客户端显示没有安装的字体。 Word-wrap:break-down 设置文字到大容器边缘是否换行。 Text-overflow:clip | ellipsis (省略号) 设置当前行到达容器边缘时如何显示。 Text-decoration { Text-fill-color:文字内部填充颜色 Text-stroke-color:文字边界填充颜色 Text-stroke-width:文字边界宽度 } 3.CSS3多栏布局 column-count:表示布局几列 column-rule:表示列与列之间的间隔条样式 column-gap:表示列与列之间的间隔 4.边框和颜色 关于颜色css3已经提供了透明度的支持 color:rgba(255,0,0,0.75); background:rgba(0,0,255,0.75); 其中a代表透明度。 还支持hsla(112,72%,33%,0.68)颜色申明方式及其透明度。 对于border,提供了圆角支持 border-radius:15px; 5.css3的渐变效果 -webkit-gradient();linear,radial 6.css3的阴影(shadow)和反射(reflect)效果 text-shadow: box-shadow: -webkit-box-reflect:below 10px; 7.背景(background) 背景的覆盖面 多图片背景:background:url() 10px center no-repeat,url() 10px center repeat-x; 8.css3的盒子模型 display:-webkit-box; display:-moz-box; -webkit-box-orient:horizontal; -moz-box-orient:horizontal;// 实现div的水平排列 -webkit-box-flex:2 //设置div如何填充剩下的位置 -moz-box-flex:2 9.css3的transition,transforms和animation transition transitopn-property:用于指定过度的性质 transition-duration:用于指定这个过度持续的时间 transition-delay:用于指定延迟过度时间 transition-timing-function:用于指定过度类型 transforms 其实就是指拉伸、压缩、旋转、偏移等等一些图形学里的基本变换。 animation 让CSS脱离静止的前提。 • BFC、IFC FC 定义的是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位以及和其他元素的关系和相互作用。 IFC(行内格式上下文) inline box 水平排列,水平方向上的margin,border和padding在框之间得到保留。 display:inline | inline-table | inline-block会形成IFC BFC(块级格式上下文) 1.消除浮动 2.消除文字环绕,实现两栏布局 3.消除margin合并 满足以下条件形成BFC float不为none,float:left | right 绝对定位元素,position:absolute | fixed; 非块级元素具有display:inline-block,table-caption,flex,inline-flex 块级元素具有overflow,且值 != visible • 对栅格的理解 bootsrap通过CSS3的媒体查询语句来实现响应式的栅格布局。 1.布局容器 .container会利用媒体查询改变页面的宽度。 .container-fluid没有媒体查询,始终是100%的width,没有左右margin. 两类容器都有15px的内边距。 2.栅格系统 一行最多分为12列,利用float实现流动布局。 使用%宽度,让内容宽度平滑渐变。 使用媒体查询 • (水平)居中有哪些实现方式 行内元素,text-align:center; 块级元素,margin:0 auto; • 1像素边框问题 设备物理像素可以理解为分辨率;设备独立像素为程序可以处理的像素(1:px) 如iphone6 的设备独立像素为(375*667)即显示屏的width*height,但是iphone6 的分辨率为 750*1334,即两个物理像素显示一个独立像素。 由于retina视网膜屏的设备物理像素/设备独立像素 = 2 或者更大,就会出现 边框为2的情况。 只有ios8+才支持0.5px,其余移动系统会显示为0px. var dpr, rem, scale; var docEl = document.documentElement; var fontEl = document.createElement('style'); var metaEl = document.querySelector('meta[name="viewport"]'); dpr = window.devicePixelRatio || 1; rem = docEl.clientWidth * dpr / 10; scale = 1 / dpr; // 设置viewport,进行缩放,达到高清效果 metaEl.setAttribute('content', 'width=' + dpr * docEl.clientWidth + ',initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale + ',user-scalable=no'); // 设置data-dpr属性,留作的css hack之用 docEl.setAttribute('data-dpr', dpr); // 动态写入样式 docEl.firstElementChild.appendChild(fontEl); fontEl.innerHTML = 'html{font-size:' + rem + 'px!important;}'; // 给js调用的,某一dpr下rem和px之间的转换函数 window.rem2px = function(v) { v = parseFloat(v); return v * rem; }; window.px2rem = function(v) { v = parseFloat(v); return v / rem; }; window.dpr = dpr; window.rem = rem; ------------------------------------------------------------- Javascript 1.图片懒加载 图片的延迟加载的原理就是先不设置img的src属性,等合适的时机(比如滚动、 滑动)再把图片真实的url放到img的src属性上。 过多的图片会严重影响网页的加载速度,移动网络下的消耗巨大,而且新图片的 载入会导致页面重绘,延迟加载几乎是标配。 <1>移动还会涉及到图片元素的宽高比自适应的问题 .lazyload{width:100%;height:0;padding-top:75%;background-size:100%} 当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom 都是以父元素的width为参照物。 <2> 标签并不会在网页中插入图像,而是从网页中链接图像。 创建的是被引用图像的占位空间。 lazysizes script src="lazysizes.min.js" async=""> // 非响应式 例子 // 响应式 例子,自动计算合适的图片data-srcset相应加载最适应的图片 data-sizes="auto" data-src="image2.jpg" data-srcset="image1.jpg 300w, image2.jpg 600w, image3.jpg 900w" class="lazyload" /> 2.实现页面加载进度条 目前没有任何浏览器可以直接获取正在加载对象的大小,所以无法通过数据的小大 来实现0-100%的显示加载过程。 解决方案是在页面中设置节点,当加载到设置的节点时显示相应的加载进度。
左侧内容
右边侧栏
.loading{ background:#FF6100; //设置进度条的颜色 height:5px; //设置进度条的高度 position:fixed; //设定进度条跟随屏幕滚动 top:0; //将进度条固定在页面顶部 z-index:99999 //提高进度条的优先层级,避免被其他层遮挡 } 3.事件委托 事件捕获,与事件冒泡。在父元素响应事件。 4.实现extend函数 var isObj = function (o) { return Object.prototype.toString.call(o) === "[object Object]"; } _$.fn.extend = function (obj) { if (isObj(obj)) { for (var i in obj) { this[i] = obj[i]; } } } 5.为什么会有跨域的问题以及解决方式 同源策略:允许浏览器某个网页上的js 请求来自另外一个网页的数据,当且仅 当两个网页来自相同的域。它是出于安全性考虑,为避免XSS跨站点 脚本攻击和CSRF跨站点请求伪造。 当一个网页的ajax请求一个不在自身域的数据时,即为跨域请求。 域:由协议内型,域名,端口号组成,任何一个不同都会形成跨域。 解决方案: 1.jsonp parseResponse({"Name": "Foo", "Id": 1234, "Rank": 7}); 2.跨域资源共享(CORS) 1.简单请求 浏览器发现ajax是简单的跨域请求,就会自动在头信息之中添加一个Origin 字段,用来说明本次请求来自哪个域,服务器根据这个值,决定是否同意这次 请求。如果他服务器同意,则会响应头部添加Access-Control-Allow-Origin 字段,表示同意跨域请求。 2.复杂请求 比简单请求多一个预检查请求。 6.jsonp原理、postMessage原理 postMessage 用作跨域通信。postMessage实现跨域的话原理就类似于jsonp,动态插入iframe标签,再从iframe里面拿回数据。 iframe是HTML内联的框架元素,表示嵌套的浏览上下文,有效地将另一个HTML页面 嵌入到当前页面中。 7.实现拖拽功能,比如把5个兄弟节点中的最后一个节点拖拽到节点1和节点2之间 8.动画:setTimeout何时执行,requestAnimationFrame的优点 实际上浏览器负责进行排序,指派某段程序在某个时间点运行的优先级。单线程 强制资源不共享,所以到了某个时间点,还得等当前的程序执行完,所以设置的时间并不精确。 1)requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。2)在隐藏或不可见的元素中requestAnimationFrame不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量。 9.手写parseInt的实现:要求简单一些,把字符串型的数字转化为真正的数字即可,但不能使用JS原生的字符串转数字的API,比如Number() 10.编写分页器组件的时候,为了减少服务端查询次数,点击“下一页”怎样能确保还有数据可以加载(请求数据不会为空)? 11.ES6新增了哪些特性,使用过哪些,也有当场看代码说输出结果的 (1)指定参数的默认值 (2)模板表达式,在字符串中嵌入变量 (3)多行字符串 (4)拆包表达式 (5)对象表达式 (6)箭头函数 (7)promise对象 (8)块级作用域的let和const (9) ES6中的类class (10)ES6中的模块化 export,import ES6新特性使javascript 更加简洁优雅。 12.JS模块化的实践 js按