web前端开发修炼之道--编写高质量代码

想想自己的页面实现是否糟糕

 

Web标准--结构、样式和行为的分离

Web标准可分为三个部分:结构标准、样式标准、行为标准。

结构标准包括XML标准、XHTML标准、HTML标准

样式标准主要是指的CSS标准

行为标准主要包括DOM标准和ECS、ECMAScript标准。

所谓的高质量的代码,在WEB标准的思想指导下,在实现结构、样式、和行为分离的基础上,还要做到:精简、重用、有序。

注释可增加代码可读性。

公用组件和私有组件的维护可提高重用性

高质量的HTML

每个标签都有语义,所以我们应该使用有语义的标签,而且搜索引擎看不到视觉效果,看到的只有代码,只能通过标签来判断内容的语义。

先确定HTML,确定语义的标签,再来选用使用的CSS。

如何判断网页标签语义是否良好:去掉样式,看网页结构是否组织良好有序,是否仍然有很好的可读性。

语义化标签应该注意的问题:

高质量的CSS

模拟化css,也就是说将面向对象编程思想引用到组织css中,使用单一职责原理来划分模块。

1、模块与模块之间尽量不要包含相同的部分,如果有相同部分,应将它们提取出来,拆分成一个独立的模块。

2、模块应在保证数量尽可能少的原则下,做到尽可能简单,以提高重用性。

css命名建议:骆驼命名法用于区分不同单词,划线用于表示从属关系

在使用样式的时候,是挂多个class还是新建class,建议多用组合,少用继承。因为这样一方面减少了代码量,提高了可维护性,另一方面使类的职责更单一,增加了类的重用性,提高了开发效率。

(相邻的margin-left和margin-right是不会重合的,但相邻的margin-top和margin-bottom会产生重合)

HTML标签的权重是1,class的权重是10,id的权重是100。当不同选择符的样式设置有冲突时,会采用权重高的选择符设置的样式,如果CSS选择符权重相同,那么样式会遵循就近原则,哪个选择符最近定义(这里说的是最后定义而非挂在class名的选择顺序),就采用哪个选择符的样式。

为了保证样式容易被覆盖,提高可维护性,CSS选择符需保证权重尽可能低,而低权重原则就是避免滥用子选择器。下面举个例子:

CSS sprite技术,在如下所说的情况下不能使用:

CSS Hack

IE条件注释法

只在IE下生效

只在IE6下生效

只在IE6以上版本生效

只在IE7上不生效

条件注释和style标签

条件注释和script标签

选择符前缀法:在css选择符前加一些只有特定浏览器才能识别的前缀,从而让某些样式只能对特定浏览器生效

样式属性前缀法:在样式属性名前加前缀

CSS的那些事儿

IE6与IE7是不支持display:inline-block,了为兼容其它浏览器,就必须得触发行内元素的hasLayout。虽然这是一个hack,但是只能对行内元素实现display:inline-block,如果是块级元素就不行。

position:relative和position:absolute都可以改变元素在文档流(所谓的文档流就是z-index:0这一层)中的位置,设置了这俩属性之后就可以让元素激活left、top、right、bottom和z-index属性(默认情况下,这些属性未激活,设置了也无效),设置position:relative和position:absolute会让元素浮起来,也就是z-index值大于0, 但positon:relative会保留自己在z-index:0层的占位,而position:absolute会完全脱离文档流,它设置的left、right等属性的值会相对于自己最近的一个设置了position:relative或position:absolute的祖先元素,如果祖先元素全都没有设置position:relative或position:absolute,那么就是相对于body元素。

float也能改变文档流,float属性不会让元素上浮到另一个z-index层,它不能通过left、top、right、bottom属性精确的控制元素的坐标,只能通过float:left和float:right来控制元素在同层里的左浮和右浮,因为float会改变 正常的文档流排列,影响到周围元素。

position:absolute和float会隐式改变display类型,无论是什么类型的元素,只要设置了position:absolute、float:left、float:right中的任意一个,就会让元素以display:inline-block的方式显示。

水平居中:

1、文本、图片等行内元素的水平居中可以给给父元素设置text-align:center

2、确定宽度的块级元素的水平居中:通过设置自身的margin-left:auto和margin-right:auto来实现

3、不确定宽度的块级元素的水平居中方式:

  1种方式:改变块级元素的display:inline然后使用text-align:center

  2种方式:通过给父元素设置float,然后父元素设置position:relative和left:50%,子元素设置position:relative和left:-50%来实现

竖直居中:

1、父元素高度不确定竖直居中:通过给父元素设置相同的上下边距来实现

2、父元素高度确定的单行文本的竖直居中:通过给父元素设置line-height来实现,然后子元素的line-height和父元素的高度值相同

3、父元素高度确定的多行文本、图片、块级元素的竖直居中:

  1、只有父元素为td和th时(td标签默认情况下隐式设置了vertical-align:middle),vertical-align属性才会生效,对于其它块级元素,默认情况下是不支持vertical-align属性,firefox和ie8下,可以设置块级元素的dispaly:table-cell,激活vertical-align,但是这种方法无法跨浏览器兼容

  2、对支持display:table-cell的ie8和firefox用display:table-cell和vertical-align:middle,对不支持display:table-cell的ie6和ie7,使用特定hack

z-index设置为负值的时候,因为它位于z-index为0的body之下,被透明的body挡住了,所了绑定到z-index的负值的元素的事件可能就执行不了。

如果不设置z-index值 ,那么默认z-index的值为0,如果多个元素的z-index的值相同 ,那么后出现的元素会浮在先出现的元素之上

 

对于常规属性,统一使用node.xxx的方式读取,对于自定义属性,统一使用node.getAttribute("xxx")读取

动态加载css样式

        function addStyleNode(str) {
            var styleNode = document.createElement('style');
            styleNode.type = 'text/css';
            if (styleNode.styleSheet) {
                styleNode.styleSheet.cssText = str;
            } else {
                styleNode.innerHTML = str;
            }
            document.getElementsByTagName('head')[0].appendChild(styleNode);
        }

 

注释规则

公共组件和各栏目的维护者都需要在文件头部加上注释说明

       /**
        *文件用途说明
        *作者姓名
        *联系方式
        *制作日期
        **/

大的模块注释方法

        //===================================
        //代码用途
        //===================================

小的注释:

        //代码说明 

零碎点点

如果一个函数内某个因素很不稳定,我们可以将它从函数内部分离出来,以参数的形式传入,从而将不稳定因素和函数解耦

DRY(don't repeat yourself)

扩展内置类的行为

        Array.prototype.each = function (func) {
            for (var i = 0,n=this.length; i < n; i++) {
                func(this[i], i);
            }
        }
        Array.prototype.clone = function () {
            var o = [];
            this.each(function (v, k) {
                o[k] = v;
            });
            return o;
        }
        Array.prototype.map = function (fun) {
            var o = [];
            this.each(function (v, k) {
                o[k] = fun(v, k);
            });
            return o;
        }
        //delete是ie下的保留字  所以我们这会用Delete
        Array.prototype.Delete = function (a) {
            var o = this.clone();
            for (var i = o.length,n=0; i > n; i--) {
                if (o[i]==a) {
                    o.splice(i, 1);
                }
            }
            return o;
        }
        var a = [1, 2, 3, 4, 5, ]
        var str = '';
        a.each(function (v, k) {
            str += k + ':' + v + ' \n';
        });
        alert(str);
        var b=a.map(function (v,k) {
            return v * 10;
        });
        alert(a);
        alert(b);
        var c = b.Delete(20);
        alert(c);

 

        HTMLElement.prototype.next = function () {
            var elem = this;
            do {
                elem = elem.nextSibling;
            } while (elem&&elem.nodeType!=1);
        }
        HTMLElement.prototype.prev = function () {
            var elem = this;
            do {
                elem = elem.previousSibling;
            } while (elem && elem.nodeType != 1)
        }
        HTMLElement.prototype.first = function () {
            var elem = this;
            elem.firstChild;
            return elem && elem.nodeType != 1 ? this.next(elem) : elem;
        }
        HTMLElement.prototype.last = function () {
            var elem = this;
            elem = elem.lastChild;
            return elem && elem.nodeType != 1 ? this.prev(elem) : elem;
        }

 

        String.prototype.stripTags = function () {
            return this.replace(/<\/?[^>]+>/gi, '');
        }
        String.prototype.toArray = function () {
            return this.split('');
        }
        String.prototype.camelize = function () {
            var oStringList=this.split('-');
            if (oStringList.length == 1) {
                return oStringList[0];
            }
            var camelizedString = this.indexOf('-') == 0
                ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
                : oStringList[0];
            for (var i = 1,len=oStringList.length; i < len; i++) {
                var s = oStringList[i];
                camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
            }
            return camelizedString;
        }
        
        alert("<b><i>Hello</i>,world!</b>".stripTags() == "Hello,world!");
        alert("abcdefg".toArray()[3] == 'd');
        alert('background-color'.camelize() == "backgroundColor");

 

kindle高清文字版,可在电脑上用clearview电子书阅读软件阅读。 第1章 从网站重构说起 1.1 糟糕的页面实现,头疼的维护工作 1.2 Web标准——结构、样式和行为的分离 1.3 前端的现状 1.4 打造高品质的前端代码,提高代码的可维护性——精简、重用、有序 第2章 团队合作 2.1 揭秘前端开发工程师 2.2 欲精一行,必先通十行 2.3 增加代码可读性——注释 2.4 提高重用性——公共组件和私有组件的维护 2.5 冗余和精简的矛盾——选择集中还是选择分散 2.6 磨刀不误砍柴工——前期的构思很重要 2.7 制订规范 2.8 团队合作的最大难度不是技术,是人 第3章 高质量的HTML 3.1 标签的语义 3.2 为什么要使用语义化标签 3.3 如何确定你的标签是否语义良好 3.4 常见模块你真的很了解吗 3.4.1 标题和内容 3.4.2 表单 3.4.3 表格 3.4.4 语义化标签应注意的一些其他问题 第4章 高质量的CSS 4.1 怪异模式和DTD 4.2 如何组织CSS 4.3 推荐的base.css 4.4 模块化CSS——在CSS中引入面向对象编程思想 4.4.1 如何划分模块——单一职责 4.4.2 CSS的命名——命名空间的概念 4.4.3 挂多个class还是新建class——多用组合,少用继承 4.4.4 如何处理上下margin 4.5 低权重原则——避免滥用子选择器 4.6 CSS sprite 4.7 CSS的常见问题 4.7.1 CSS的编码风格 4.7.2 id和class 4.7.3 CSS hack 4.7.4 解决超链接访问后hover样式不出现的问题 4.7.5 hasLayout 4.7.6 块级元素和行内元素的区别 4.7.7 display:inline-block和hasLayout 4.7.8 relative、absolute和float 4.7.9 居中 4.7.10 网格布局 4.7.11 z-index的相关问题以及Flash和IE 6下的select元素 4.7.12 插入png图片 4.7.13 多版本IE并存方案——CSS的调试利器IETester 第5章 高质量JavaScript 5.1 养成良好的编程习惯 5.1.1 团队合作——如何避免JS冲突 5.1.2 给程序一个统一的入口——window.onload和DOMReady 5.1.3 CSS放在页头,JavaScript放在页尾 5.1.4 引入编译的概念——文件压缩 5.2 JavaScript的分层概念和JavaScript库 5.2.1 JavaScript如何分层 5.2.2 base层 5.2.3 common层 5.2.4 page层 5.2.5 JavaScript库 5.3 编程实用技巧 5.3.1 弹性 5.3.2 getElementById、getElementsByTagName和getElements-ByClassName 5.3.3 可复用性 5.3.4 避免产生副作用 5.3.5 通过传参实现定制 5.3.6 控制this关键字的指向 5.3.7 预留回调接口 5.3.8 编程中的DRY规则 5.3.9 用hash对象传参 5.4 面向对象编程 5.4.1 面向过程编程和面向对象编程 5.4.2 JavaScript的面向对象编程 5.4.3 用面向对象方式重写代码 5.5 其他问题 5.5.1 prototype和内置类 5.5.2 标签的自定义属性 5.5.3 标签的内联事件和event对象 5.5.4 利用事件冒泡机制 5.5.5 改变DOM样式的三种方式 附录A 写在规则前面的话 附录B 命名规则 附录C 分工安排 附录D 注释规则 附录E HTML规范 附录F CSS规范 附录G JavaScript规范
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值