首页 > 网站 > WEB开发 > 正文

【答阿里寒冬面试题】呵呵,大神的面试题就是好!

2024-04-27 14:33:30
字体:
来源:转载
供稿:网友
【答阿里寒冬面试题】呵呵,大神的面试题就是好!

前言

今天微博看到了寒冬大神的面试题,觉得挺有意思的,这里就做一点解答

http://weibo.com/1196343093/Bhj510t50

谈谈你对CSS布局的理解

讲讲输入完网址按下回车,到看到网页这个过程中发生了什么。

谈谈你对Web前端组件化的理解,Web Component会带来怎样的影响

谈谈你对前端资源下载性能优化的经验和思考

现在有很多的MV*框架,你对它们有什么看法

iOS体验好在哪里,Web能赶上么?

网页游戏怎么做?

Hybrid技术应当如何应用?

你最爱的前端框架是什么,为什么?

首先老师的题目都很大,不好答,我这里技术有缺陷,答得不好大家不要喷我,可以好好教育我嘛

浅谈CSS布局

概述

从网页表现来看,HTML是实体本身,要实现各种优雅的布局的需要依赖CSSHTML元素两大类型为块级元素与行内元素,网页的布局一般由块级元素组织,元素不同便有不一样的表现要实现布局就要用到与布局有关的CSS属性为position,常用属性为static、absoulute、fixed、relativeposition的作用是改变元素的状态,由文档流转为相对文档流或者脱离文档流元素(定位元素)当然float也能引发块级元素脱离文档流,但是其表现与原理与上面不一致,而且要慎用float布局于是这里便已经有三种“流”了,不同的布局元素会处于不同的“执行环境”,在“执行环境”中才能方便的对其进行管理这个管理的依据便是BFC(块级作用域上下文),根据我粗浅的理解是,BFC也就是浏览器提供的一块渲染区文档流的元素处于一个渲染区,而定位元素处于另一层渲染区,float元素又会与之不同各个渲染区中的元素具有其定位规则,最简单的便是文档流中的元素,遵循其块级元素独占一行+盒模型的规则:① 块级元素独占一行,并且具有框(经典盒模型)② 块级元素间由margin属性分割,并且垂直方向的margin会取其大者③ 块级元素必定左靠这父级块级元素左边框(包含块,布局上下文)④ float元素不能影响块级元素的BFC区域,但是其高度会参与计算创建BFC的方式有:① float② overflow③ display(使行内元素具有BFC)④ position基于此,我们便可以实现我们的布局了,这里以最简单的两列布局为例(左边导航,右边内容主体)由于先出现的DOM先展示,所以内容优先原则,我们会将主体dom先展示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>  <title></title>  <style>    * { margin: 0; padding: 0; }    div { border: 1px solid black; }    #sidebar { position: absolute; left: 0; top: 0; width: 95px; }    #content { margin-left: 100px; }  </style>  <script src="../jquery-1.7.1.js" type="text/javascript"></script></head><body>  <div id="content">    主体  </div>  <div id="sidebar">    导航  </div></body></html>
这里从理论上说,便是触发了siderbar元素的定位特性,其BFC与文档流不相关了当然,这里siderbar可以使用float实现,但是float本身应该用于处理文字与图片包裹的需求,我们本着职责分离的想法就别那样干了而且使用float还会引起元素坍塌,这里还要费劲去处理清除浮动

行内元素

行内元素的处理比较复杂,首先行内元素的高度由其line-height决定,所以不要妄想其设置一个行内元素的高度,这会引起意想不到的问题举一个例子来说,很多大型网站都会具有统计代码,而此类统计代码一般是以img做请求发出,这个时候可能会导致10px左右的白屏问题这个就是妄想设置行内元素高度的结果,独立的inline元素出现时,会为其创建一个line boxes作为容器(文字框)一行文字一个line Boxes,一行高度由其中最高的行内元素确定,上例中有一个height为0的img,却为其生成了一个高度为10的行高下面的代码中,div会被行内元素撑开,其高度会由span中line-height高者决定
<div>  <span id="span1">主体 </span><span id="span2">导航 </span></div>

移动端的建议

① 移动端的文档流渲染效率最高,应该避免大范围使用定位元素,在小米,三星等低端下定位元素可能渲染不出来(解决方案是引起回流)② img元素加载失败时候会有边框,需要搞掉③ 慎用fixed属性,fixed对于移动端来说有点头疼,首先会有文本聚焦fixed定位错乱问题,其次在ios4的屏幕中,如果加上浏览器上下工具条,再用fixed可视区域会变得很小④ ios是按块渲染的,布局时候可以分块,不会渲染可视区域外的内容⑤ 动画或者border-radius、box-shadow等属性皆会使手机耗电加剧(但是这个好像与我们没关系)⑥ fixed元素为其设置html可能不响应或者说渲染看不见,常见于ipod或者低端android⑦ 当然能在布局上用上一些语义化标签自然是好事,这样对SEO或者特殊人事有一定帮助,比如strong、article之类的

总结

因为我本身专注点在js对css了解较少只能做此解析,请尽量拍砖指正

一次请求的完整流程我们一次网址输入会发起一连串连锁效应,但是因为我这边对HTTP一块不是十分熟悉,只能解释自己了解的一次URl输入后,其流程如下,首先是请求响应的流程:1 解析URL,解析域名生成唯一IP地址,开始搜索服务器2 找到服务器后,服务器接收请求被服务器进程拦截;一般而言,.net的程序会被IIS处理,java会被jBoss或者tomcat处理3 服务器处理请求,如果静态文件的话直接返回,若是.net或者java等动态脚本会经过服务器编译,执行其中的服务器端代码4 若是服务器端具有数据库操作的话,这里还需要与DB建立连接,操作数据库5 服务器处理结束后,生成最终的静态HTML字符串返回,开始向请求者(客户端)返回请求字符串,一次返回量过大就会分批次,这是一个优化点6 服务器响应到达浏览器,浏览器开始处理请求,进入浏览器解析流程

请求返回后,便进入了我们关注的前端模块

简单来说,浏览器会解析HTML生成DOM Tree,其次会根据CSS生成CSS Rule Tree,而Javascript又可以根据DOM API操作DOM上面的文字描述的很简单,事实上发生的事情,却很复杂,这里与代码实现也很有关联,但是有几个关键点:页面一定会等所有的HTML结构与CSS加载下来才渲染(webkit内核)比如我们这里使用fiddler限制其外链加载,我们为其限速为10s
<html xmlns="http://www.w3.org/1999/xhtml"><head>  <title></title>  <style>    div { border: 1px solid black; }    a { color: Red; }  </style></head><body>  <div>    <a id="span1" href="http://www.baidu.com">主体 </a><span id="span2">导航 </span>  </div>  <link href=" http://kb.cnblogs.com/style/common.css" rel="stylesheet" /></body></html>

我们看到事实上62ms后页面整体dom结构就加载好了,这个时候我们是可以使用js操作dom结构的,但这里一个重点是:CSS外链加载会阻塞js的执行,并且重置CSS会引起浏览器的回流或者重绘,也就是:css外链会阻塞整个页面的渲染(显示),但是其DOM结构是可操作的,中间如果有阻塞性的操作,比如alert的话会强制浏览器绘制页面上面的特性与css外链的顺序无关,并且有几个样式相关的操作,便会执行几次,最终采用最近或者优先级最高的样式
<html xmlns="http://www.w3.org/1999/xhtml"><head>  <title></title>  <style>    div { border: 1px solid black; }    a { color: Red; }  </style></head><body>  <div>    <a id="span1" href="http://www.baidu.com">主体 </a><span id="span2">导航 </span>  </div>  <script>    document.getElementById('span2').innerHTML = '测试';    alert(1)   </script>  <script>    alert(2)   </script>  <link href=" http://kb.cnblogs.com/style/common.css" rel="stylesheet" /></body></html>

一个需要注意的地方是,ChromeFirefox或者IE表现不一致,firefox与IE都是先渲染页面最后等段CSS下来后再次渲染所以我们很多同学面试时说将css外链放到header中,而不是body中的理解都是一知半解,这里真实的处理办法是异步插入css外链才行至少对于chrome需要做这个处理,否则页面就是出不来,因为多数手机是webkit内核,保不齐这里出多少事情根据以上流程后,页面也基本出来了,这里简述其流程① 生成DOM树② 计算CSS样式③ 构建render Tree④ reflow,定位元素位置与大小⑤ 绘制页面上面过程如果js操作dom或者终结有一段style都会引起reflow,由于img会在文档加载结束后加载,可能会撑开页面,导致回流,所以一般需要对img设置尺寸对于这块的优化各位自己来吧,我这里便只能理解到这个程度了PS:事实上chrome获得请求时本身也有几个事件点,这里可以用其开发性能插件,但对前端基本透明,我们这里不关注了

MVC与组件化这里我将2块题目合到一起了,我觉得这里可以连到一起做说明

View分离

很多程序的变革集中积累在VIEW一块的处理,原因是这里的需求是最复杂的,就View分离来说,最成功的我觉得是aspasp.net的变革最初的ASP程序,会将C#代码写在asp代码中,这样的结果便是页面里面既有html又有C#代码,甚至一个js循环中会嵌套出C#的循环PS:你一定要相信,那个时候不会有js分成的概念,因为需求达不到所谓的View分离便是,程序员确实受不了维护显示与逻辑同时处于一个页面的程序了,于是他选择了改变,改变的结果便是拆分View分离一大核心思维便是,分得开,合得拢,他们这里引入一个codebehind方案将一个页面文件分成两个(事实上是三个)

① index.apsx

② index.aspx.cs

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="_00综合_11mvc_index" %>
public partial class _00综合_10doc_write_index : System.Web.UI.Page{    PRotected void Page_Load(object sender, EventArgs e)    {    }}

最终这两个文件会和到一起,两个文件之间也可通信,而通信的桥梁是.net一个个被人诟病的组件,比如:

① button组件

② datalist

③ label组件

④ 伟大的gridview

各个组件在C#层面上会拥有一个ID进行约束,.cs文件便可以根据该ID为其注册各个事件,这个与javascript的模型便非常类似了

View分离的第一个优点便是,用户的界面变得干净了,不会有代码混杂的现象,第二个优点便是业务端的代码可以再分离,从而多了数据层、业务层等各个概念

而组件的出现让.net变成了世界上开发最快的语言,这点谁也不可否认,而这些都是前端MVC出现或者组件出现的意义

前端View分离

与asp当初的情况一致,js进行dom操作或者字符串拼接的目的事实上就是想形成一个可供展示的View,前端jser已经再也不能忍受这种代码了:

很多时候,我们想将对应的模板单独的放到一个地方,每次样式若是有更改,只需要更改那个文件即可,只要与之呼应的“ID”不丢失即可,比如这样的结构和代码:

View Code
<div class="cui-pop-box">  <div class="cui-hd">      <%=title%>  </div>  <div class="cui-bd">    <div class="cui-error-tips">      <%=content%></div>    <div class="cui-roller-btns">      <% for(var i = 0, len = btns.length; i < len; i++ ) {%>      <div class="cui-flexbd <%=btns[i].className%>">        <%=btns[i].name%></div>      <% } %>    </div>  </div></div>

这样做的道理是,这个样子做到了表现与行为分离,我们分得开,然后回根据基类的一个机制,让他们最终合到一块,以完成功能

这里我们依旧需要强调一个前提:“ID”关联不可丢失,否则“行为”将不可表现,只要两者间关联不丢,这里便可轻松满足以下逻辑:

① CSS名修改(非标识性CSS名)

② 标签改变

③ 描述性文字改变

......

MVC在前端

重构一书有说,重复性或者类似重复性的代码应该抽象为一个方法,程序员也不傻,在重复使用需要提示框需求后便会学会形成alert组件

组件的出现是代码抽象,代码重用的标识,这个样子既可以减少工作量也可以减少代码容量,而组件的实现与MVC思维的很好诠释

比如以下代码:

View Code

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表