搬出来以前的学习笔记,我以为还算能够的一本基础书籍。css
先弄个这本书的logo——前端
目录结构——node
第一章:从网站重构提及
第二章:团队合做
第三章:高质量的HTML
第四章:高质量的CSS
第五章:高质量的JavaScript
其核心内容以下——编程
第一章:从网站重构提及设计模式
/** * 1.分离结构、样式、行为 * 2.打造高品质的前端代码,提升代码的可维护性—— * 1>精简:可让文件变小,有利于客户端快速下载; * 2>重用:可让代码更易于精简,同时有助于提高开发速度; * 3>有序:可让咱们更清晰地组织代码,使代码更易于维护,有效应对变化。 */
第二章:团队合做浏览器
/** * 1.一专多能:欲精一行,必先通十行 * 2.增长代码可读性——注释 * 3.公共组件和私有组件的维护 * 1>公共组件须要专人来维护,要注意限制“写”的权限,提供API和演示DEMO; * 2>私有组件对于修改操做会自由得多,可是必要的注释仍是须要的 * 3>在组织公共组件时,组织的粒度越大,文件越集中,加载和管理越方便,但无用代码越多。(如jQuery框架) * 4>在组织公共组件时,组织的粒度越小,文件越分散,加载和管理越麻烦,但无用代码越少。(如YUI框架) * 5>所以,在“集中”与“分散”上,咱们须要找到不错的平衡点。 * 4.磨刀不误砍柴工——前期构思很重要 * 1>先根据用户需求进行分析,先考虑好框架,会让整个开发过程更有规划、更流畅,是一个先慢后快的过程。 * 2>构思内容: * (1)规范的制定 * (2)公共组件的设计 * (3)复杂功能技术实现方案 * 5.制定规范 * 有效指导团队成员按照一个统一的标准进行开发,尽可能让开发过程平滑,减小没必要要的冲突,提升开发率并保证软件的质量。 */
第三章:高质量的HTML框架
/** * 1.如何肯定标签语义是否良好 * 去掉样式,看网页结构是否组织良好有序,是否仍然有很好的可读性 * 2.常见模块 * 1>标题内容模块 * 2>表单模块 * 3>表格模块 * 3.其余 * 1>尽量少地使用无语义标签div和span * 2>不使用纯样式标签(如b/font/u等) */
第四章:高质量的CSS模块化
/** * 1.怪异模式和DTD * 1>为了确保向后兼容,浏览器厂商发明了标准模式和怪异模式这两种方法来解析网页 * 标准模式:浏览器根据规范表现页面 * 怪异模式:一般模拟老式浏览器(好比IE4和Netscape Navigator 4)的行为以防止老站点没法工做,在该模式下 * (1)width包含border和padding * (2)margin: 0 auto;没法达到居中效果 * 可用这两点来判断浏览器是不是处于怪异模式(尤为是针对IE) * 2>DTD:Document Type Definition,即文档类型定义。DTD是一种保证HTML文档格式正确的有效方法, * 能够经过比较HTML文档和DTD文件来看文档是否符合规范,以及元素和标签使用是否正确。 * 一个DTD文档包含元素的定义规则、元素间关系的定义规则、元素可以使用的属性、可以使用的实体或符号规则。 * 若是漏写DTD声明,Chrome/Firfox/Safari/Opera仍然会按照标准模式来解析网页,但在IE中(IE6/7/8)就会触发怪异模式。 */
/** * 2.如何组织CSS * 将网站内的全部样式,按照职能分红3大类:base、common、page * 1>这三者是层叠结构 * 2>base层:提供CSS reset功能和力度最小的通用原子类。 * 这一层与具体UI无关,不管何种风格的设计均可以引用它,因此base层要力求精简和通用。 * 3>common层:位于中间,提供组件级的CSS类。 * 将页面内的元素拆分红一小块一小块功能和样式相对独立的小“模块”; * common是网站级的,不一样的网站有不一样的common层 * 4>page层:非高度重用的模块 * page层位于最高层,提供页面级的样式。 */
/** * 3.模块化CSS * 1>单一职责 * (1)模块与模块之间尽可能不要包含相同的部分,若是有相同部分,应将它们提取出来,拆分红一个独立的模块; * (2)模块应在保证数量尽量少的原则下,作到尽量简单,以提升重用性。 * 2>命名空间 * css命名空间的概念 * <div class="box"> * <div class="box-hd"></div> * <div class="box-bd"></div> * <div class="box-ft"></div> * </div> * 能够将这里的box命名理解为一个类的类名称(也就是模块名称),而这里的hd/bd/ft正是box里面的(私有)变量, * box内部样式的修改并不会影响box模块外的样式,能够理解为这里的box起到了命名空间的做用。 * 3>多用组合、少用继承 * (1)可以大大减小类的数量,提升了可维护性; * (2)使类的职责更单一,弹性更强,增长了类的重用性,提升了开发效率。 * 固然,这种方式会让HTML标签看起来过于臃肿,可是它带来的好处确实不容忽视的,推荐挂多了class的方式 * 4>处理上下margin * 若是不肯定模块的上下margin特别稳定,最好不要将它写到模块的类里,而是使用类的组合, * 单独为上下margin挂用于边距的原子类。模块最好不要混用margin-top和margin-bottom, * 统一使用margin-top或margin-bottom。 */
/** * 4.常见问题 * 1>为了保证样式容易被覆盖,提升可维护性,CSS选择符需保证权重尽量低。 * 2>CSS sprite * 在网站流量限制及维护性上找到一个平衡点 * 3>CSS编码风格(一行式、多行式) * 笔者倾向于一行式,我的倾向于多行式 * 4>class和id * 尽可能使用class,少用id * 5>CSS hack(IE条件注释法、选择符前缀法、样式属性前缀法) * 我的倾向于样式属性前缀法 * 6>display: inline-block和haslayout * 可以触发IE6/IE7(其自己并不支持display: inline-block)行内元素的haslayout. * 7>relative、absolute、float * (1)position: relative;会保留本身在z-index:0层的占位, * 其left/right/top/bottom值是相对于本身在z-index:0层的位置 * (2)position: absolute;会彻底脱离文档流,再也不在z-index:0层保留占位符, * 其left/right/top/bottom值是相对于本身最近的一个设置了position: relative;或 * postion: absolute;的祖先元素,若是发现没有,那么就相对于body元素了。 * (3)float: left/right;属性不会让元素“上浮”到另外一个z-index层,它仍然让元素在z-index层排列, * float会改变正常的文档流排列,影响到周围元素。 * 8>水平居中和垂直居中 * 9>网格布局(grid-xxx-xx、layout-xxx-xx、content-xxx-xx) * 10>z-index和IE6下的select元素 * */
第五章:高质量的JavaScript函数
/** * 1.防止JS冲突 * 1>用匿名函数(自执行)将脚本抱起来,能够有效控制全局变量,避免冲突隐患。 * 2>让JS不产生冲突,须要避免全局变量的泛滥,合理使用命名空间以及为代码添加必要的注释。 * * 2.JS分层思想 * 1>base层 * 位于三层中的最底端,具备两个职责。其一,封装不一样浏览器下JavaScript的差别,提供统一的接口。 * 其二,扩展JavaScript语言底层提供的接口,让它提供更多更为易用的接口。 * 2>common层 * 位于三层的中间,依赖于base层提供的接口。common层提供可供复用的组件,它是典型的MVC模式中的M, * 和页面内的具体功能没有直接关系。common层的功能是给page层提供组件。 * 3>page层 * 位于三层的顶端。这一层和页面里的具体功能需求直接相关,是MVC模式中的C。 * page层依赖于base层和common层。page层的功能是完成页面内的功能需求。 * 拿YUI2和jQuery组件库举例子: * YUI2自己分红三大部分:Core、Utilities、Widget,其对应分层以下 * Core --> base层 * Utilities --> common层 * Widget --> common层 * jQuery自己分红两大部分:jQuery核心文件和jQuery UI文件,后者依赖于前者,其对应分层以下 * jQuery核心 --> base层 * jQuery UI --> common层 * * 3.编程实用技巧 * 1>弹性 * 思考如何让本身的代码具有很高的扩展弹性,思考让本身的代码更具应对需求变化。 * 2>多用className进行功能类似点的程序挂钩而不是标签名 * 3>用hash对象来替代相似于test(3, null, null, 5)传递参数的方式,就不用过于遵循参数传递的顺序及个数问题 * 一概用hash映射方式进行传参,应用接收参数的时候可读性也增长了一些。总体而言更加灵活。 */
/** * 4.面向过程编程 * 1>这种编程方式将程序分红了“数据”和“处理函数”两个部分,程序以“处理函数”为核心, * 若是要执行什么操做,就将“数据”传给相应的“处理函数”,返回咱们须要的结果。这种编程方式就是面向过程编程。 * 2>这种编程方式存在的问题以下: * (1) 数据和处理函数之间没有直接的关联,在执行操做的时候,咱们不但要选择相应的处理函数, * 还要本身准备处理函数须要的数据,也就是说,在执行操做的时候,咱们须要同时关注处理函数和数据。 * (2) 数据和处理函数都暴露在同一个做用域内,没有私有和公有的概念,整个程序中全部的数据和处理函数均可以相互访问, * 在开发阶段初期也许开发速度很快,但到了开发后期和维护阶段,因为整个程序耦合得很是紧, * 任何一个处理函数和数据都有可能关联到其余地方,容易牵一发而动全身,从而加大了修改难度。 * (3) 面向过程的思惟方式是典型的计算机思惟方式——输入数据给处理器,处理器内部执行运算,处理器返回结果。 * 也就是说面向过程的思惟方式是在描述一个个“动做”。 * 而现实生活中的一个个“物件”(如人{姓名,状态})很难用面向过程的思惟方式进行描述。 * (4) 当代码量很大的时候,“数据”和“处理函数”之间的耦合度大大增长,不利于维护。 */ //面向过程编程的典型例子 //定义电话本 var phonebook = [ {name: 'adang', tel: '1111'}, {name: 'king', tel: '2222'} ]; //查询电话 function getTel(phoneBook, name) { var tel = ''; for (var i = 0; i < phoneBook.length; i++) { if (phoneBook[i].name === name) { tel = phoneBook[i].tel; break; } } return tel; } //调用函数 getTel(phonebook, 'king'); /** * 面向对象编程 * 这种编程就是抛开计算机思惟,使用生活中的思惟进行编程的编程方式。面向过程的思惟就是描述一个个“动做”, * 而面向对象的思惟就是描述一个个“物件”,客观生活中的物件,在程序中咱们管“物件”叫作“对象”, * 对象由两部分组成:“属性”和“行为”,对应客观世界中物件的“状态”和“动做”。 */ //下面看看面向过程编程和面向对象编程的区别 //面向过程 var name = 'king', state = 'awake'; say = function (oname) { alert('I am ' + oname); }, sleep = function (ostate) { ostate = 'asleep'; }; say(name); sleep(state); //面向对象 var king = { name: 'king', state: 'awake', say: function () { //在对象内部,对象的属性和行为经过this关键字关联起来 alert('I am ' + this.name); }, sleep: function () { this.state = 'asleep'; } } //在对象外部,属性和行为能够用对象的属性和对象的行为来调用,从而让程序有了按真实世界的思惟方式进行描述的能力。 king.say(); king.sleep(); /** * 一个典型的OO编程过程应该是先整理需求,根据需求进行OOA(面向对象分析),将真实世界的客观物件抽象成程序中的类或对象, * 这个过程常常会用到的是UML语言,也称UML建模,OOA的输出结果是一个个类或对象的模型图。接下来要进行OOD(面向对象设计), * 这一步的关键是处理类之间的耦合关系,设计类或对象的接口,此时会用到各类设计模式。OOA和OOD是反复迭代的过程, * 他们自己也没有很是清晰的边界,是相互影响、制约的。OOA和OOD是面向对象编程的思想和具体语言无关,而OOP(面向对象的程序设计) * 是面向对象编程的工具,和选用的语言相关。 */
/** * 5.其余问题 * 1.prototype和内置类 * 1> 咱们能够经过扩展prototype原型可以扩展内置类的方法,要记住扩展方法中的this表明的是实例化的对象。 * 2> 咱们不但能够扩展内置类的方法,还能够重写内置类的方法。 * 3> 修改内置类的原型在多人合做时可能对别人的代码形成影响,存在冲突隐患 * 2.标签的自定义属性 * 1> 从兼容性考虑,对于常规属性,统一使用node.xxx的方式读取,对于自定义属性,统一使用node.getAttribute('xxx')读取 * 2> 自定义属性的反序列化 * <a id="a" href="http://www.cnblogs.com/jinguangguo/" bloginfo="{name:'king', type:'WEB前端开发'}">my blog<\/a> * <script> * var node = document.getElementById(a); * var info = node.getAttribute('bloginfo'); * info = eval('(' + info + ')'); * alert(info.name); //king * alert(info.type); //WEB前端开发 * <\/script> * 3> 标签的内联事件和event对象 * (1)在IE下,event是window对象的一个属性,是在全局做用于下的,而在Firefox里,event对象做为事件的参数存在 * (2)代码段一以下 * <a href="#" id="a">连接<\/a> * <script> * document.getElementById('a').onclick = function () { * alert(arguments.length); //IE:0;非IE:1 * }; * <\/script> * (3)代码段二以下 * <a href="#" id="a" onclick="handle()">连接<\/a> * <script> * function handle() { * alert(arguments.length); //all browser:0 * } * <\/script> * (4)代码段三以下 * <a href="#" id="a" onclick="alert(event.type);">连接</a> //all browser:click * 4> 利用事件冒泡机制 * 冒泡的思路是在祖先节点上监听事件,有效减少内存开销 * 5> 改变DOM样式的三种方式 * (1)直接设置style * (2)添加预先设定的类 * (3)添加预先设定的css文件(一般用于全站皮肤设定的相似功能) */