Web前端最新ie兼容响应式布局的实现总结(1),2024最新字节跳动内部面试题

算法

  1. 冒泡排序

  2. 选择排序

  3. 快速排序

  4. 二叉树查找: 最大值、最小值、固定值

  5. 二叉树遍历

  6. 二叉树的最大深度

  7. 给予链表中的任一节点,把它删除掉

  8. 链表倒叙

  9. 如何判断一个单链表有环

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

如果你觉得对你有帮助,可以戳这里获取:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

respond.js源码分析


使用方式

官方demo地址:http://scottjehl.github.com/Respond/test/test.html

  1. 在css中正常用 min/max-width media queries

@media screen and (min-width: 480px) {

…styles for 480px and up go here

}

  1. 引入respond.min.js,但要在css的后面(越早引入越好,在ie下面看到页面闪屏的概率就越低,因为最初css会先渲染出来,如果 respond.js加载得很后面,这时重新根据media query解析出来的css会再改变一次页面的布局等,所以看起来有闪屏的现象)

实现思路

  • 1.把head中所有的css路径取出来放入数组

  • 2.然后遍历数组一个个发ajax请求

  • 3.ajax回调后仅分析response中的media query的min-width和max-width语法,分析出viewport变化区间对应相应的css块

  • 4.页面初始化时和window.resize时,根据当前viewport使用相应的css块。

window.matchMedia = window.matchMedia || (function(doc, undefined){

var bool,

docElem = doc.documentElement,

refNode = docElem.firstElementChild || docElem.firstChild,

// fakeBody required for

fakeBody = doc.createElement_x(‘body’),

div = doc.createElement_x(‘div’);

div.id = ‘mq-test-1’;

div.style.cssText = “position:absolute;top:-100em”;

fakeBody.style.background = “none”;

fakeBody.appendChild(div);

return function(q){

div.innerHTML = ‘­’;

docElem.insertBefore(fakeBody, refNode);

bool = div.offsetWidth == 42;

docElem.removeChild(fakeBody);

return { matches: bool, media: q };

};

})(document);

//检测是否支持media query,检测css是否有效的方法都差不多,创建一个元素应用该css后检测元素宽度,然后清除该元素。

if( !!href && isCSS && !parsedSheets[ href ] ){

// selectivizr exposes css through the rawCssText expando

if (sheet.styleSheet && sheet.styleSheet.rawCssText) {

//sheet.styleSheet.rawCssText看不懂,原来是方便selectivizr和respond.js联用,http://selectivizr.com/tests/respond/

//selectivizr的作用是 CSS3 selectors for IE;约定将原csstext放在styleSheet的link上的扩展属性rawCssText上;这里如果联用selectivizr可以少次ajax请求

translate( sheet.styleSheet.rawCssText, href, media );

parsedSheets[ href ] = true;

} else {

if( (!/^([a-zA-Z:]*//)/.test( href ) && !base)

|| href.replace( RegExp.$1, “” ).split( “/” )[0] === win.location.host ){

requestQueue.push( {

href: href,

media: media

} );

}

}

}

其余的代码就是ajax实现和translate media query的max-width min-width的逻辑了;可以看出这里必须依赖ajax请求css路径才能得到css文件中的mediaquery的内容,那ajax的跨域问题就要 解决了;由于我们的静态资源都是要放cdn的,respond.js也给出了跨域方法,即引入代理页面。

//把cross-domain/respond-proxy.html 放到cdn上

//把cross-domain/respond.proxy.gif 放到当前域服务器上

“http://externalcdn.com/respond-proxy.html” id=“respond-proxy” rel=“respond-proxy” />

“/path/to/respond.proxy.gif” id=“respond-redirect” rel=“respond-redirect” />

“/path/to/respond.proxy.js”>

这里ajax跨域实现是通过代理页面将获取到的css,再通过window.name通信实现;如在respond.proxy.js中

function checkFrameName() {

var cssText;

try {

cssText = iframe.contentWindow.name;

var now = new Date().getTime(),useTime = now - initTime;

alert(‘获取css耗时:’+ useTime + ‘ms’);

}

catch (e) { }

if (cssText) {

……//销毁之前用于通信的iframe,后续回调callback

callback(cssText);

}

else{

win.setTimeout(checkFrameName, 100);

}

}

win.setTimeout(checkFrameName, 500);//500ms后确认内部iframe的name值是否传递过来,后续再更新当前viewport该用的css。

因为实现跨域代理的问题,初始化页面时应用上全部css耗时较长,以下光测试从开始执行该js文件到css取回调用之前的耗时为500ms-515ms之间(每次刷新结果不一样),ie8下测试结果如下

测试结果发现,刷新页面后会有明显的闪屏(以该测试demo为例,一开始页面背景是黑色的,这是默认css中的,跨域js执行完成后分析出 media query中的该viewport尺寸下应该应用red的背景,所以又变成红色),间隔时间为500ms以上。所以体验不是很好,而且该场景中ajax跨 域目前已经没有更好的实现方式,500ms间隔的闪屏避免不了。

同时因为是ajax请求css,所以会因为响应式而额外产生一个请求,好在之前css请求过一遍,这次ajax请求是读取浏览器缓存中的,如下图中fiddler的检测结果中的第三个请求和第六个请求:

respond.js总结

  • 优点:压缩后仅1k,不跨域时性能ok,只需引入respond.js通用易用

  • 缺点:仅支持media query的min-width和max-width(用于响应式够用);支持跨域,虽然配置有点麻烦,实现跨域代价高而且有闪屏体验欠佳。

css3-mediaqueries-js源码分析


css3-mediaqueries-js官方文档和demo都没有,相对于respond.js css3-mediaqueries-js支持几乎所有的media query的语法,访问测试demo

实现逻辑

其实现逻辑和respond.js差不多,只是更加支持的media query更加全面,同时支持内联style,支持各种宽度单位(em|ex|px|in|cm|mm|pt|pc),但是这里的初始化是在 domready后执行,为了让用户感觉不出页面有闪屏(之前应用初始化样式然后js提取media query中的样式再覆盖一遍)现象,这里的实现是先将html移出可视区域外,等解析完media query后再重置回来,但实际目测感觉稍有闪屏(当然这里的测试是测试body背景色,移出可视区域外不管用,当然绝大部分响应式场景是适用的),实现 如下:

// prevent jumping of layout by hiding everything before painting 先将html移出可视区域外

var docEl = document.documentElement;

docEl.style.marginLeft = ‘-32767px’;

// make sure it comes back after a while 异常处理,万一获取mediaquery css失败,重置回来

setTimeout(function () {

docEl.style.marginTop = ‘’;

}, 20000);

……

// return visibility after media queries are tested 生效后重新可见

cssHelper.addListener(‘cssMediaQueriesTested’, function () {

// force repaint in IE by changing width

if (ua.ie) {

docEl.style.width = ‘1px’;

}

setTimeout(function () {

docEl.style.width = ‘’; // undo width

docEl.style.marginLeft = ‘’; // undo hide

var now = new Date().getTime();

var useTime = now - initTime;

alert(‘media query生效时间:’+useTime+‘ms’);

}, 0);

// remove this listener to prevent following execution

cssHelper.removeListener(‘cssMediaQueriesTested’, arguments.callee);

});

其余实现和respond.js基本一致,也需要使用ajax,所以css3-media-queries.js本身不支持跨域,当然非要支持跨域 也可以,也可以像respond.js一样使用代理页面跨域即可,但也会出现闪屏的现象。还是先看看不跨域情况下,大多数人为什么选择 respond.js,主要原因还是完美支持的media query特性导致压缩后16K,下载和执行时间都逊于respond.js,下面是同域下在ie8的测试结果(耗时140ms而respond.js仅 15ms)

css3-mediaqueries-js总结

  • 优点:1、基本支持所有css3中的media query语法

  • 缺点:1、不支持跨域(如cdn),就算支持了跨域也存在闪屏现象;2、和respond.js对比性能较差

全局切换class


因为css/js需要放到cdn上面,需要跨域,css3-mediaqueries-js不支持跨域,respond.js支持跨域但是实现跨域 后性能较差,有闪屏体验也差,而且配置麻烦,不方便各个业务通用。对比respond.js和css3-mediaqueries-js可知,实现响应式 应用min-width和max-width足矣;同时模拟media query的效果只需要在2个关键时间点根据viewport切换css(初始化页面时和window.resize)即可。所以可以选择切换css link,可以动态切换css块,也可以切换class

  • 切换css link(优点:逻辑清晰;缺点:增加请求数,维护麻烦,如修改一个模块涉及到3个尺寸的响应,至少需要改3个文件)

“stylesheet” type=“text/css” media=“screen and (max-width: 990px)” href="respond750.css&uuot;>

“stylesheet” type=“text/css” media=“screen and (max-width: 1200px)” href=“respond990.css”>

  • 切换内联css块(respond.js和css3-mediaqueries-js就是通过js分析出media query然后自动根据当前viewport切换css块,这个理想环境下是最好的,自动分析只管写media query,但是依赖ajax获取css内容,跨域实现成本高体验也不好)

性能优化

1.webpack打包文件体积过大?(最终打包为一个js文件)

2.如何优化webpack构建的性能

3.移动端的性能优化

4.Vue的SPA 如何优化加载速度

5.移动端300ms延迟

6.页面的重构

所有的知识点都有详细的解答,我整理成了280页PDF《前端校招面试真题精编解析》。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

5ecb71ac0)**

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在2024年的Web前端面试中,面试官可能会关注一系列的技能和概念,包括但不限于HTML、CSS、JavaScript、前端框架(如React、Vue、Angular)、性能优化、响应设计、浏览器兼容性、模块化和打包工具(Webpack、Rollup)、API交互、前端测试(如Jest、Mocha)、SEO、以及最近流行的技术趋势如WebAssembly、PWA(Progressive Web App)和GraphQL等。 具体的问可能涵盖: 1. HTML5新特性的理解和使用,比如语义化的标签和表单控制。 2. CSS3样布局技巧,如Flexbox和Grid的使用。 3. JavaScript ES6+的新特性,比如箭头函数、模板字面量、Promise和Async/Await等。 4. 面向前端开发的JavaScript库和框架的最佳实践,如组件化开发和状态管理。 5. 了解并评价不同前端框架的核心思想和适用场景。 6. 浏览器渲染原理和性能优化策略,如懒加载、预渲染、缓存优化等。 7. 对跨域、同源策略和HTTPS的理解,以及处理JSONP或CORS的方法。 8. Webpack或Rollup的工作原理,以及如何配置它们来处理模块和打包。 9. 如何设计和实现可复用、可测试的前端代码结构。 10. 对现代前端测试的认识,包括单元测试、集成测试和端到端测试。 11. Web性能优化案例分享,如减少HTTP请求、压缩资源、CDN使用等。 12. 了解基本的SEO优化原则,如元标签、索引优化等。 13. 对现代前端架构,如服务端渲染、单页应用(SPA)和微前端的理解。 14. 最新前端技术动态,例如WebAssembly如何提升性能,PWA如何提供离线体验,以及GraphQL如何改进API设计。 如果你想深入了解前端面试,建议关注权威技术博客、参加在线课程和模拟面试练习,不断更新自己的知识库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值