@tsingwong
2016-02-26T05:40:47.000000Z
字数 6524
阅读 790
DOM
JavaScript
假设先需要为一个乐队设计网站,网站必须有一些交互特性,还要对残疾用户以及搜索引擎保持良好。网站主要目的是发布有关乐队的信息。
客户提交构建网站的东西:有关乐队的介绍资料、巡演日程,还有一些照片。核心用户体验就是把这个网站看称一个宣传手册。
根据客户提供的资料,可画出一张简单的站点图。站点结构不算复杂,至少把所有页面都放到一个页面。
为准备站点的制作,创建三个文件夹:
/images:保存要用的图片
/styles:保存Css文件
/scripts:保存JavaScript文件
页面,首先有一个详细介绍乐队北京信息的页面,其次是一个类似相册的放照片的页面。巡回日程安排单独一个页面。还必须有一个联系页面。最后是要有一个主页,放上乐队简介和站点导航信息。:
Home
About
Photos
Live
Contact
分别对应如下文件:
index.html
about.html
photos.html
live.html
contact.html
每个页面内容不同,但他们都要使用相同的基本结构。
站点每个页面大抵分成下面这样几个区域:
1. 头部区域,包含站点的品牌性信息,即放logo的地方。这个区域要使用<header>
元素。
2. 导航区域,包含一组链接,指向各个页面。这个区域使用<nav>
元素。
3. 内容区域,包含每一页的实质性内容,这个区域使用<article>
元素。
模版代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Jay Skripts and the Domsters</title>
<script type="text/javascript" src="scripts/modernizr-1.6.min.js"></script>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="about.html">About</a></li>
<li><a href="photos.html">Photos</a></li>
<li><a href="live.html">Live</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</nav>
</header>
</body>
</html>
知道了每个页面中包含的结构化元素,且已经有了客户提供的资料,使用图形设计工具(PhotoShop等),做出合适的任何风格的设计方案。
视觉设计之后,可以把平面设计切分成多个图片。把北京图片保存为background.gif。而品牌图像保存为 logo.gif。带有一点渐变的导航条命名为 navbar.gif。最后把人物剪影保存为guitarist.gif。把这些图片都放置到images文件夹中。
这里使用的是随书提供的图片。
现在有了基本的HTML模版,也知道自己的站点长什么样。通过为模版应用CSS,可以在Web上再现你的设计方案。
如果把所有CSS都放到一个文件,可能会为后期维护带来一些麻烦。故所有CSS分别放在几个文件中,建议如下设计:
layout.css:保存与整体布局有关的样式。
color.css:保存专门的颜色样式表。
typography.css:保存与办事有关的样式。
这些样式表都可以导入到一个基本的样式表中:
@import url(layout.css);
@import url(color.css);
@import url(typography.css);
保存为basic.css,存放在styles文件夹中,如果想添加一个新样式表或者删除一个样式时,只要编辑basic.css文件即可。
可以在模版的<head>
元素中通过<link>
元素引人这个基本样式表。然后,在页面<header>
中添加一个<img>
标签,指向logo图片。此时也可以向<artcle>
中添加一些临时性填充文本。
样式表color.css是最直观的。记住,不管为哪个元素应用什么颜色,都要同时给它一个背景色。否则,就有可能导致意外,看不到某些文本。
body{
color: #fb5;
background-color: #334;
}
a:link{
/*未访问过的链接*/
color: #445;
background-color: #eb6;
}
a:visited{
/*已访问过的链接*/
color: #345;
background-color: #eb6;
}
a:hover{
/*鼠标指针悬浮在链接上*/
color: #667;
background-color: #fb5;
}
a:active{
/*活动链接,即点击链接*/
color: #778;
background-color: #ec8;
}
header{
color: #ec8;
background-color: #334;
border-color: #667;
}
header nav{
color: #445;
background-color: #789;
border-color: #667;
}
article{
color: #223;
background-color: #edc;
border-color: #667;
}
header nav ul{
border-color: #99a;
}
header nav a:link,header nav a:visited{
color:#eef;
background-color: transparent;
border-color: #99a;
}
header nav a:hover{
color: #445;
background-color: #eb6;
}
header nav a:active{
color: #667;
background-color: #ec8;
}
article img{
border-color: #ba9;
outline-color: #dcb;
}
#imagegallery a{
background-color: transparent;
}
模版有了色彩。
基本布局还是比较简单,所有内容都在一栏中。为让导航中的链接水平排列,需要应用一些浮动效果。
首先,为HTML5块元素定义默认的样式。主要真对那些不支持它们的浏览器,好让这些元素都能够具有适当的块布局。
其次,使用通配选择器把所有元素的内外边距设置为零。这样就把不同浏览器为元素设置的不同内外边距全部删除。重设这些值之后,所有样式就可以一视同仁了。
section,header,article,nav{
/*设置该元素为块级元素,此元素前后会有换行符*/
display: block;
}
*{
padding: 0;
margin: 0;
}
body{
margin: 1em 10%;
/*规定要使用的背景图像*/
background-image: url(../images/background.gif);
/*规定背景图像是否固定或者随着页面的其余部分滚动,默认scroll,滚动;当前不滚动*/
background-attachment: fixed;
/*规定背景图像的位置*/
background-position: top left;
/*规定如何重复背景图像,当前为沿着水平方向重复*/
background-repeat: repeat-x;
/*段落最大宽度*/
max-width: 80em;
}
header{
background-image: url(../images/guitarist.gif);
background-repeat: no-repeat;
background-position: bottom right;
/*规定边框的宽度、样式*/
border-width: .1em;
border-style: solid;
/*设置下边框的宽度*/
border-bottom-width: 0;
}
header nav{
background-image: url(../images/header navbar.gif);
background-position: bottom left;
background-repeat: repeat-x;
border-width: .1em;
border-style: solid;
border-bottom-width: 0;
border-top-width: 0;
padding-left: 10%;
}
header nav ul{
width:100%;
overflow: hidden;
border-left-width: .1em;
border-left-style: solid;
}
header nav li{
display: inline;
}
header nav li a{
display: block;
float: left;
padding: .5em 2em;
border-right: .1em solid;
}
article{
border-width: .1em;
border-style: solid;
border-top-width: 0;
padding: 2em 10%;
line-height: 1.8em;
}
article img{
border-width: .1em;
border-style: solid;
border-width: .1em;
outline-style: solid;
}
这样已经通过CSS定义了颜色和布局。
字体、大小都应该放在板式这个css中,但内外边距应该如何放呢?
我们这里把内边距放在了布局中,外边距信息放在了板式中。
body{
/*设置元素的字体尺寸,此处是基于父元素的百分值*/
font-size: 76%;
/*设置元素的字体类型,多个字体是为了浏览器不支持第一个字体会尝试下一个,以此类推*/
font-family: "Helvetica","Arial",sans-serif;
}
body * {
font-size: 1em;
}
a{
font-weight: bold;
/*规定添加到文本的修饰,上下划线等*/
text-decoration: none;
}
header nav{
font-family: "Lucida Grande","Helvetica","Arial",sans-serif;
}
header nav a{
text-decoration: none;
/*规定字体粗细*/
font-weight: bold;
}
article{
line-height: 1.8em;
}
article p{
margin: 1em 0;
}
h1{
font-family: "Georgia","Times New Roman",sans-serif;
font:2.4em normal;
}
h2{
font-family: "Georgia","Times New Roman",sans-serif;
font:1.8em normal;
margin-top: 1em;
}
h3{
font-family: "Georgia","Times New Roman",sans-serif;
font:1.4em normal;
margin-top: 1em;
}
#imagegallery li{
list-style-type: none;
}
textarea{
font-family: "Helvetica","Arial",sans-serif;
}
至此,CSS文件已经基本完成。
模版做完,样式也基本完成,接下来考虑站点中的每个页面。
首先从主页index.html开始,该页面包含一段介绍性文字,放在<article>
元素中。
在编写DOM脚本前,必须先确定怎么样组织JavaScript文件。如果站点需要很长的脚本,那最好是分割成几个小文件;如果所需JavaScript代码不长,为了减少请求的数量,把所有脚本都放在一个文件里,有助于最后缩减代码。
每当基于模版页面创建一个新页面时,都要向<article>
元素中插入标记。
理想状况下,应该更新每个页面<nav>
元素中的链接。比如,当前页面是index.html,那么导航里面就没必要添加指向当前index.html页面的链接。
但实际开发中,不可能一页一页地编辑导航链接。常见做法是通过服务器端包含技术,把包含导航标记的片段插入到每一个页面。这里假设服务器端包含下列代码:
<header>
<img src="images/logo.gif" alt="Jay Skript and the Domsters" />
<nav>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="about.html">About</a></li>
<li><a href="photos.html">Photos</a></li>
<li><a href="live.html">Live</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</nav>
</header>
服务器端包含可以使用Apache Server Side Includes(SSIs)、PHP、ASP等,或者其他语言。
服务器端包含的优点是可以把重用标记块集中保存。这样以后更新页面头部或者导航链接时,就只需要修改一个文件即可。缺点是不能在每个页面中自定义这个块。
获取当前页面的URL:window.location.href
获取链接的URL:getAttribute("href")
JavaScript中比较字符串提供了很多方法。其中indexOf方法用于在字符串中寻找子字符串的位置:
string.indexOf(substring)
这个方法返回子字符串第一次出现的位置。这里只想知道某个字符串是否被包含在另一个字符串中,是否是当前URL里的链接URL。
currenturl.indexOf(linkurl)
如果没有匹配到,方法返回-1.如果返回其他值,即有匹配。
JavaScript中toLowerCase方法可以把文本转换成小写形式
提取部分值,使用split方法,这是根据分隔符把一个字符串分成两或多个部分的一种便捷方式:
array = string.split(character)
form对象:
HTML文档中的每个元素都是一个对象。每个元素都有nodeName、nodeType之类的DOM属性。
同样,文档中的每个表单元素都是一个form对象,每个form对象都有一个elements.length属性。这个属性返回表单中的包含的表单元素的个数:
from.elements.length
该返回值与childNodes.length 不一样,后者返回的是元素中所包含的所有节点的个数。而form对象的elements.length属性只关注那些属于表单元素的元素,如input、textarea等。
同理,包含所有表单元素的数组:
form.elements
与childNodes属性也不一样,后者数组返回的是所有节点,前者数组只返回inout、select、textarea及其他表单字段。
element.value 等同于
element.getAttribute("value")
编写验证表单脚本时要记住三件事:
1. 验证脚本写得不好,不如没有验证;
2. 千万不要完全依赖JavaScript。客户端验证并不能取代服务器端的验证。即使有了JavaScript验证,服务器端照样还应该对接收到的数据再次验证。
3. 客户端验证的目的在于帮助用户填写好表单,避免提交未完成的表单,从而节省他们的时间。服务器端验证的目的在于保护数据库和后台系统的安全。