本文从良构,有效性,布局三个角度,结合往日项目开发经历, 整理总结重构HTML改善Web应用设计的几点规则和作法。部分参考自《重构HTML改善Web应用设计》。javascript
重构。什么是重构?为何要重构。php
重构是在不改变程序行为的基础上进行小的改动,是代码逐渐改善的过程。移除长期累积下来的烂码,以获得更清晰和更容易维护,除错以及添加新功能的代码,这作法不能单纯只出如今编码的后期,甚至是你意识到你的代码已经无从再下手非重写不可的时候,而是从开始开发起,逐渐积累,逐渐修改。之前由于平常编码的随意性,致使问题日益积累,逐步扩散,最后只能推倒重来。若是时间经受不起推倒重来,你别无选择,惟一实现的选择就是重构。css
不管作什么,都不要由于追求完美而忽略晓得改进,若是眼下时间足够作一点重构,那就作一点儿。往后有时间还能够作更多。总体的重构设计虽然惹人注目使人难忘,但没有平日的积累,何以收获庞大的成就?你的目标应该是让代码天天都有新变化。坚持几个月,我相信咱们都能拥有骄傲地,清晰代码。html
良构java
把标记转换为符合现代标准的首要任务是实现良构。良构保证了DOM可操做的文档树结构的惟一性,于是成为可靠的跨浏览器的javascript代码的基础。对于一个乱构的页面来讲,任何可靠的自动化处理或测试都是很是难以保证的,其次,浏览器页面的展现效果更是不可预估。对于乱构的页面,不一样的浏览器使用不一样的方式补充确实的片断,并纠正其中的错误。所以,对于重构HTML,最要紧的无疑是实现页面良构化。web
要达到良构,大部分的网站要至少或所有作到如下几点:编程
针对往日由于我的编程习惯和随意性容易犯的错误,从良构角度思考,整理一下往后构建HTML时,有几点须要特别注意。浏览器
更好实现良构的几个要点:缓存
有效性服务器
有效性比良构稍微严格,即不只要确保文档的语法正确,还要保证语义正确。保证元素和属性只能按自身语义出如今恰当的地方。
有效性是面向将来开发的基石。有效的网站与设备无关,有效的页面为不一样的读者传达相同的信息,就算读者使用的是界面不相同的浏览器。
良构和有效性检查是基本的语法约束保证,接下来要保证语义是恰当的。
具体实现方法:
1,加入过渡型DOCTYPE声明
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
过渡式DTD让你没必要要彻底语义标记就能让文档经过验证,而且他容许包含i,b和center等这些不推荐使用的表现性元书,所以,在进一步改善文档的语义以前,你能够找出比修复更严重的结构问题。
2,删除全部不存在的标签
3,用CSS替代center,i,font等不被推荐或弃用的标签。
4,把行内(inline)元素,放在块(block)元素中
要作到有效,文档中全部元素是有效的严格性XHTML元素还不够,还必须保证它们之间的正确关系,浏览器和其余程序处理XHTML须要依赖元素间的正确位置。
Do you like this pictrue?<br /> <img src = "file.gif" /> I think it's really <em>neat</em> <!--改写为--> <p>Do you like this pictrue?<br /></p> <div><img src = "file.gif" /></div> <p>I think it's really <em>neat</em></p>
布局
1,熟悉元素语义
每个元素都应各司其职:ul是无序列表,ol是有序列表,table是表格式数据,blockquote是应用,h1~h6是标题等。恰当的语义元素有助于屏幕阅读器呈现更容易理解的结构,也能保证不一样平台间正确显示。对于初学者,不少原本语义良好的元书,如ul,blockquote,table等,被滥用与实现某种特定布局效果。这些滥用的目的是给网页生成特定的外观,然而这些外观难以跨浏览器,几乎除了设计者本身的电脑,一般不少地方都不通用的。
失败经历: 为了实现导航效果,一开始没有考虑内容语义,无心中将导航主项和相关联的菜单分开,在利用css中的相对定位,设定top和left属性,将相关菜单移动到相关的主项下。这样会致使一个严重的问题。一旦将不一样页面放置在不一样的分辨率的屏幕上,菜单就会错位。就是说,针对不一样分辨率的屏幕,还要设计不一样的top和left属性。 <div class = "nav">
<div class="nav01">菜单一</div><div class="nav02">菜单二</div><div class="nav03">菜单三</div>
</div>
<div class = "menu">
<div class="menu01">子菜单一</div><div class="menu02">子菜单二</div><div class="menu03">子菜单三</div>
</div>
优化设计过的导航HTML结构,组合主菜单和子菜单: <nav>
<ul class="clear">
<li class="first"><a href="#">菜单一</a></li>
<li>
<span class="Darrow"></span> <a href="#">菜单二</a>
<dl>
<dt><span class="arrow"></span></dt>
<dd><a href="#">子菜单一</a></dd><dd><a href="#">子菜单二</a></dd><dd><a href="#">子菜单三子菜单三</a></dd>
</dl>
</li>
<li>
<span class="Darrow"></span> <a href="#">菜单三</a>
<dl>
<dt><span class="arrow"></span></dt>
<dd><a href="#">子菜单一</a></dd><dd><a href="#">子菜单二</a></dd><dd><a href="#">子菜单三子菜单三</a></dd>
</dl>
</li>
</ul>
</nav>
|
编写HTML的目的不是为某种结构或者页面外观,而是为了如何更好地呈现内容,所以在编写HTML以前,务必思考这种内容应该使用哪一种语义的元素。
恰当的HTML很是适合处理跨浏览器问题。拿到web设计图后,在着手构建web应用以前,你必需要中止考虑页面的外观,而应该开始思考页面表达的是什么含义。
2,替换表格布局
基于CSS的页面比基于表格的页面更小更简单。
a)编写和编辑更容易,下载更快,
b)经过转向CSS,能够节省带宽。同时外联的css文件能够缓存和重用,没必要随每次页面的下载又重下一次。
取代滥用本用于呈现表格数据的table元素而使用表格布局,能够考虑频繁使用的分栏式布局:
1)两栏,左侧固定宽度的侧栏,右边是弹性宽度的内容栏
2)三栏,左右各固定宽度的侧栏,中间是内容。
根据以往项目开发经验: 栏目的高度是由它们所包含的内容量决定。对于内容比重大的网站来讲,由于不能保证单个内容栏跟其余栏等高,栏会固定高度,保证各栏高度相同;而对于内容简单短小页面,不固定高度问题不大。另外,主体内容的div应该在侧栏,页头或页脚以前,这样屏幕阅读器能够从页面最重要的内容开始线性读取页面。搜索引擎机器人也能够对排在页面前面的内容予以更高的优先级。 就两栏布局而言,有三种可能的宽度: (1)两栏宽度固定。最广泛,固定宽度对于一部分用户来所可能过大,过大的宽度用户必须滚动水平内容来查看内容,下降文本的可读性 (2)左栏固定,内容栏是百分比宽度 (3)两栏都是百分比 从更好的用户体验考虑,主体内容应该能调整大小,以便适应不一样窗口宽度。 |
3,内容与样式分离
固然咱们的页面也须要漂亮的外观,以帮助咱们在竞争中脱颖而出。这能够经过在独立的CSS样式中放置有关表现的信息来实现。CSS用来描述网页的外观,而浏览器能够自由选择不一样的样式表或是修改过的样式表。实际上,你能够为不一样的浏览器随意发送不一样的样式表,也能够为它们独特的能力量身定制。这是响应式设计的基本实现方法。
“响应式网页不只仅是响应不一样类型的设备,并且须要响应不一样的用户需求。响应式的初衷是为了让信息更好的传递交流,让全部人无障碍的获取信息,同时这也是 Web 的初衷。”
出于方便或者是自身的编码习惯,在修改某种被更改的需求的样式代码时候,咱们很容易在html代码中直接镶嵌样式代码。这样的作法除了更快的完成你暂时的任务以外没有任何好处。
4,使用CSS定位替代框架
网站使用框架的理由实际上就两种:
(1)为全部页面引入相同的静态内容,而不用单独编辑每一个页面。例如导航,网页头部尾部。也就是说,单独的非框架页面可能比相应的框架页面更耗带宽,由于框架内容每次都要给客户端从新发送内容。
(2)显示多栏外观。例如Java API,包含包和类的列表,主体内容
然而,过多使用框架将下降可用性:
(1)难以标记数千或返回指定页面
(2)难以保存和打印页面
(3)过多的滚动条占据屏幕的宝贵空间
在每个页面上都有导航和其余相同或几乎相同的内容,对网站来讲是很是广泛的,使用CSS取代框架,关键在于设立对应每一个框架的div,每一个div内容是对应框架里的文档内容。然而,这样作的问题在于,它违反了DRY原则(Don't Repeat Youself,别重复你本身),对于相同的内同,虽然有时候只是很小的变化,但仍是须要不断在这一页那一页重复出现。重复内容一般也是代码的坏味道。框架在静态页面上避免恶劣没必要要的重复,我提倡清晰,可维护的代码,在不损害用户界面的前提下,我更愿意选择难看的代码而不是难看的用户界面。平常中原始的HTML是重复的,但不是咱们必须编辑的,不少时候咱们能够经过后台自动生成重复内容。
Apache服务器端包含: 一般,拥有服务器端包含的以.shtml结尾的文件会在发送到客户端以前,告诉服务器须要解析自身以及包含的内容 几乎全部的Web服务器都支持某些形式的服务器端包含功能,使用服务器端包含各类非静态文件,性能有所下降,但影响不大。 <!DOCTYPE html>
<html>
<meta charset = "utf-8">
<body>
<!--#include virtual = "/header.html" -->
<!---这里嵌套主内容-->
<!--#include virtual = "/footer.html"-->
<!--#include virtual = "/siderbar.html"-->
</body>
</html>
尽管Apache默认的编译会包含mod_include,但可能不会在全部目录上启用,你须要子啊Apache主配置文件或是.htacess文件中添加一下三行配置,以指向每个使用服务器包含的目录: AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
Options +Includes
PHP的include函数有相似的功能 <!DOCTYPE html>
<html>
<meta charset = "utf-8">
<body>
<!--主内容-->
<?php include("footer.html"); include("sidebar.html"); ?>
</body>
</html>
|
5,正确标记列表
正确标记列表可以提高可访问性,一般咱们在列表中实现跳转和导航。
大部分浏览器给列表以及列表中的项目都制定特定的外观,一般表现为缩进和项目符号,可能不是你所须要的外观,所以很容易在搭建html的时候忽略它们的存在,放弃使用正确列表标记,而使用语义较差的标签,实现一样的效果。根据需求,你可以经过CSS能够容易地修复这些特定的外观。下面整理了开发中经常使用的CSS样式修改规则:
/*删除项目符号*/ ul{ list-style-type:none;
}
/*载入外部图片自定义项目符号*/ ul li { list-style-image : url(images/str.gif);
}
/*去掉缩进的规则*/ ul{ margin-left : 0px; padding-left :0px;
}
/*把项目排成一行*/ ul,li{ display: inline; margin:0px; padding: 0px;
}
/*在列表项之间插入逗号*/ ul li:after{ content : ",";
}
/*制定项目的宽度,超出时显示省略号*/ div.titleholder { font-size: 8pt; width: 100px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;
}
然而,lu应用与列表上,blockquote应用在应用上。blockquote与ul相比,整理文本缩进更强大,更准确。
6,为图片添加width和height属性
width和height属性能让浏览器更快地样式化页面并展示给用户。但注意,这样作,对页面的显示速度有提高,但对下载速度并无帮助。
出于通常项目开发触觉,改变图片的尺寸意味着要修改HTML,不然图片会奇怪地变大变小。若是须要常常改变图片,好比设计页面是,最好是在最后的阶段插入肯定的宽度和高度。