JavaScript和CSS的交互是现代JavaScript程序设计的支柱。事实上对于所有的现代web应用程序来说,至少使用某些形式的动态交互是必须的。那么做过之后,用户可以更快地操作而更少地把时间浪费在等待页面加载上。将动态技术与第六章提出的事件方面的观念相结合,对于实现无缝而强大的用户体验是非常重要的。
层叠式样式表是用来对易用的、有吸引力的网页进行修饰和布局的事实标准,它在给用户提供最少的困难的同时为开发者提供最多的能力。当你将那一能力与JavaScript相结合时,你将能够构造强健的用户界面,包括动画、窗口部件(widgets),或动态显示等。
访问样式信息
JavaScript与CSS的结合全部是以表现作为结果的交互。理解什么对你是可用的,对于精确地达到你想要的交互非常重要。
用来设置和获取元素的CSS属性的主要工具是其style属性。比如说,如果想要取得一个元素的高度,你可以编写如下代码:elem.style.height。如果你想要设置元素的高度为某个特定值,你可以执行如下代码:ele.style.height="100px"。
当处理DOM元素的CSS属性时,有两个会碰到的问题,它们并不像一般人所期望的那样运作。首先,JavaScript要求你在设置任何空间尺度时指明单位(就像前面设置高度时所做的那样)。同时,任何空间属性也将返回一个代表元素属性的字符串而非数字(如"100px"而非100)。第二,如果一个元素高为100像素,而你试图获取它的当前高度,你期望从style属性里取得那个"100px",情况却未必会如你所愿。这是因为任何样式表文件或内联CSS预设的样式信息并不能可靠地反映到style属性上。
这一状况将我们引向JavaScript中处理CSS的一个重要函数:获取一个元素真正的当前样式属性的方法,给你一个预期的精确值。存在一组(来源于W3C和IE特有的变种)相当可靠的方法可以用来得到DOM元素的真正的计算后的样式属性。它们能顾及所有相关的样式表、元素特定属性以及JavaScript所作的修改。当需要得到你正操作的元素的精确视图信息时这些方法将会是极其有用的。
获取元素的计算后样式值时应该考虑到存在于不同的浏览器间的大量的差异。跟在大多数的情形一样,IE有它自己的方法,而其它所有的浏览器都使用W3C定义的方式来实现。
程序7-1给出了一个用来找出元素的计算后样式属性值的一个函数,7-2则给出了使用此函数的一个示例。
程序7-1. 用来得到元素的计算后的实际CSS样式值的一个函数
CODE:
I should be 100 pixels tall.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam …p>
Phasellus dictum dignissim justo. Duis nec risus id nunc…p>
Sed vel leo. Nulla iaculis, tortor non laoreet dictum, turpis diam …
设置元素位置
不同于取得元素的的位置,设置位置要少许多变数。但是联合使用各种方式的布局(absolut,relative,fixed)时,你将能得到相当的、可用的结果。 目前,调整元素位置的唯一的办法是通过修改它的CSS属性。为了保持方法上的一致性,你应该仅修改left和top属性,尽管存在着其它的属性(如bottom和top)。作为开端,你可以轻松地创建一对函数,如程序7-7所示,用来设置一个元素的位置,而不考虑其当前位置。 程序7-7. 不考虑其当前位置,设置元素的x和y位置的一对函数
[Copy to clipboard] [
- ]
CODE:
//设置元素垂直位置的一个函数
function setX(elem, pos) { //使用像素为单位,设置CSS属性'left' elem.style.left = pos + "px"; } //设置元素水平位置的一个函数 function setY(elem, pos) { //使用像素为单位,设置CSS属性'top' elem.style.top = pos + "px"; } 最终,你需要开发第二套函数,如程序7-8所示,你可以用它们来设置一个元素相对于其原来的位置的位置——比如,调整一个元素使其水平位置比当前值小5个像素。这一方法的使用直接与许多作为DHTML开发的支柱的动画效果相关。 程序7-8. 用来调整元素相对于基原来的位置的一对函数
[Copy to clipboard] [
- ]
CODE:
//用来把元素的水平位置增加几个像素的一个函数
function addX(elem,pos) { //取得当前的水平位置并向其加入偏移 setX( posX(elem) + pos ); } //用来把元素的垂直位置增加几个像素的一个函数 function addY(elem,pos) { //取得当前的垂直位置并向其加入偏移 setY( posY(elem) + pos ); } 现在我已经将处理元素位置的问题完全贯串了一遍。理解元素定位怎样工作和怎么设置及获取元素的精确位置是处理动态元素的一个基本的方面。你将看到的下一个侧面是元素的确切尺寸。 元素的尺寸 计算元素的高度和宽度可能是既无比简单又痛苦的一件事,这取决于具体的情况和你需要它做什么。许多情况下,你只需要使用getStyle函数的一个修改版本来得到元素的当前宽度和高度,如程序7-9所示。 程序7-9. 检索DOM元素的当前高度和宽度的两个函数
[Copy to clipboard] [
- ]
CODE:
//获取元素的实际高度(使用计算后的CSS)
function getHeight( elem ) { //取得计算后的CSS值并解析出一个可用的数字 return parseInt( getStyle( elem, 'height' ) ); } //获取元素的实际宽度(使用计算后的CSS) function getWidth( elem ) { //取得计算后的CSS值并解析出一个可用的数字 return parseInt( getStyle( elem, 'width' ) ); } 当你试图做这两件事的时候麻烦就来了:第一,当你想要得到元素预定义的完整高度(比如说,你将一个动画从0px开始,但你需要知道该元素应该到达多高多宽),第二,当一个元素的display设为"none"时,你将取不到值。 程序7-10里给出的两个函数说明了怎样找出元素潜在的完整高度和宽度,不论它当前的高度是多少。这是通过访问clientWidth和clientHeight属性实现的,它们提供元素能够展开到的可能的总的区域。 程序7-10. 用来找出元素的潜在高度和宽度的两个函数,即使元素是隐藏的
[Copy to clipboard] [
- ]
CODE:
//找出元素完整的、可能的高度(不是实际的、当前的高度)
function fullHeight( elem ) { //如果元素当前是显示的,那么offsetHeight应该可以成功,即使失败,getHeight也可以生效 if ( getStyle( elem, 'display' ) != 'none' ) return elem.offsetHeight || getHeight( elem ); //否则,我们必须处理display为'none'的元素, //这时我们需要重置它的CSS属性以得到更精确的读数 var old = resetCSS( elem, { display: '', visibility: 'hidden', position: 'absolute' }); //计算元素的完整高度,如果clientHeight无效,则用getHeight() var h = elem.clientHeight || getHeight( elem ); //最后,我来来恢复元素本来的CSS属性 restoreCSS( elem, old ); //并返回元素的完整高度 return h; } //找出元素完整的、可能的宽度(不是实际的、当前的宽度) function fullWidth( elem ) { //如果元素当前是显示的,那么offsetWidth应该可以成功,即使失败,getWidth也可以生效 if ( getStyle( elem, 'display' ) != 'none' ) return elem.offsetWidth || getWidth( elem ); //否则,我们必须处理display为'none'的元素, //这时我们需要重置它的CSS属性以得到更精确的读数 var old = resetCSS( elem, { display: '', visibility: 'hidden', position: 'absolute' }); //计算元素的完整宽度,如果clientWidth无效,则用getWidth() var w = elem.clientWidth || getWidth( elem ); //最后,我来来恢复元素本来的CSS属性 restoreCSS( elem, old ); //并返回元素的完整宽度 return w; } //用来设置一系列的CSS属性的一个函数,这些属性稍后可以恢复 function resetCSS( elem, prop ) { var old = {}; //遍历每一个属性 for ( var i in prop ) { //记录原来的属性 old[ i ] = elem.style[ i ]; //并设置新的值 elem.style[ i ] = prop[i]; } //返回改变的值的集合,以备restoreCSS使用 return old; } //恢复resetCSS函数引用的副作用的函数 function restoreCSS( elem, prop ) { //将所有的属性重新设置为它们原来的值 for ( var i in prop ) elem.style[ i ] = prop[ i ]; } 同时拥有了取得元素当前的和潜在的宽度与高度的能力,你可以使用这些值来开发出一些你能够达到的动画。但是,在我进入动画的细节之前,你还需要看看怎样修改元素的可见性。 元素的可见性 元素的可见性是可在JavaScript中用来创建从动画到快速模板效果的每一样东西的强大工具。然而,更重要的是,它也能用来从视图中快速地隐藏元素,提供一些基本的用户界面功能。 在CSS里有两种不同的方式来有效地从视图中隐藏元素;它们各自有其益处但也能产生无意的后果,这取决于你怎样使用它们: ◇ visibility属性决定一个元素是否可见,同时仍保持它在布局流中的正常占位。visibility属性有两个值:visible(缺省值)和hidden(使一个元素完全不可见)。比如说,如果你有一些标签中换行的visibility属性设为hidden的文本,结果将简单地显示为文本中的一个空白块,尺寸与原始文本完全相同。例如,比较以下两行文本: //正常文本: Hello John, how are you today? //对"John"应用了"visibility:hidden"的文本 Hello , how are you today? ◇ display属性为开发者提供了更多的选项来控制元素的而局。这些选项是inline(类似于和的标签是行内的,也就是说他们遵循正常的文本流布局),block(类似于 和 的标签是块级的,他们打破正常的文本流),和none(从文档中彻底隐藏元素)。将display属性设为none的结果表面上跟你把它从文档中删除完全一致;然而,实情并非那样,因为它可以在迟些时候快速地被切换回视图里。下面的两说明了display属性是怎样工作的:
//正常文本: Hello John, how are you today? //对"John"应用了"display:none"的文本 Hello , how are you today? 尽管visibility属性有它的特定的用途,display属性的重要性不容忽视。元素的visibility属性被设为hidden时它仍存在于正常的文本流中,这使用得在许多应用中visibility的可行性打了折扣。程序7-11中展示了使用display属性来切换元素可见性的两种方法。 程序7-11. 使用CSS Display属性来切换元素的可见性的一组函数
[Copy to clipboard] [
- ]
CODE:
//用来(使用display)隐藏元素的一个函数
function hide( elem ) { //找到元素的当前显示状态是什么 var curDisplay = getStyle( elem, 'display' ); //记录它的显示状态 if ( curDisplay != 'none' ) elem.$oldDisplay = curDisplay; //将display设为none(隐藏元素) elem.style.display = 'none'; } //用来(使用display)显示元素的函数 function show( elem ) { //将display属性设为它曾经的值,或者使用'',如果没有保存过先前的display的话 elem.style.display = elem.$oldDisplay || ''; } 可见性的另一面是元素的透明度。调整元素透明度产生的结果与设置元素的visibility非常相似,但是了对元素有多可见的更好的控制。这意味着你可以使一个元素50%可见,使得你可以看到在它下面的元素。所有的现代浏览器都在一定程度上支持透明度,IE和W3C兼容的浏览器再一次在实现方式上有着不同。为了解决这一问题,你可以建创一个标准的函数用来维护元素的透明度,如7-12所示。level为0表示着元素是完全透明的,而level为100表示完全不透明。 程序7-12. 调整元素的透明度级别的一个函数
[Copy to clipboard] [
- ]
CODE:
//设置元素的透明度级别(level是0-100的数字)
function setOpacity( elem, level ) { //如果滤镜存在,这是IE,于是设置Alpha滤镜 if ( elem.filters ) elem.style.filter = 'alpha(opacity=' + level + ')'; //译注:此处原文为ele.style.filters='alpha(opacity=' + level + ')',有误 //多谢02062007同学的热心验证 //否则,使用W3C的opacity属性 else elem.style.opacity = level / 100; } 掌握了调整元素的位置、大小、及可见性的方法,是时候开始探索你联合使用这些能力做一些有意思的事情了。 [ 本帖最后由 mozart0 于 2007-5-25 15:42 编辑 ] 附件: 您所在的用户组无法下载或查看附件,您需要注册/登陆后才能查看! |
one by one
|
[广告] 网站博客卖广告推荐:阿里妈妈 |
mozart0 [楼主] 匪徒田老大
版主
帖子 2326 体力 6628 威望 177 注册 2003-6-18 |
|
mozart0 [楼主] 匪徒田老大
版主
帖子 2326 体力 6628 威望 177 注册 2003-6-18 |
|
mozart0 [楼主] 匪徒田老大
版主
帖子 2326 体力 6628 威望 177 注册 2003-6-18 |
|
mozart0 [楼主] 匪徒田老大
版主
帖子 2326 体力 6628 威望 177 注册 2003-6-18 |
|
mozart0 [楼主] 匪徒田老大
版主
帖子 2326 体力 6628 威望 177 注册 2003-6-18 |
|
csf178
初级会员
帖子 86 体力 178 威望 0 离线 2 天 注册 2007-3-21 |
|