@(JavaScript)[学习笔记]javascript
[TOC]css
网页由如下三层信息构成一个共同体html
每一个元素节点都有一个属性stytle。stytle属性包含着元素的样式,查询这个对象将返回一个对象而不是一个字符串。java
element.stytle.property
element.stytle.color
获取对象的color属性 font-family不能这样获取,由于链接字符与减法操做符相同,javascript会解释为减法 DOM要求使用驼峰命名法来命名中间带有减号的CSS属性 例如:element.stytle.fontFamily
DOM表示样式属性采用的单位并不老是和CSS样表设置的相同 例如:把color的属性值改成#999999,在某些浏览器中会以rgb的方式返回 CSS速记属性能够把多个样式组合一块儿写成一行font: 12px 'Arial' , sans-serif;
DOM能解析这样的速记 stytle属性只能返回内嵌样式不符合平稳退化原则 有另外一种状况可让stytle属性正确反射咱们设置的样式node
许多属性是只读的,stytle对象的各个属性就是读写的 能够给属性赋值para.stytle.font = "2em 'Tiems' ,serif"
编程
CSS没法根据元素的相对位置关系找出某个特定的元素,DOM能够作到浏览器
function styleHeaderSiblings() { if (!document.getElementsByTagName) return false; var headers = document.getElementsByTagName("h1"); for (var i=0; i<headers.length; i++) { var elem = getNextElement(headers[i].nextSibling); addClass(elem,"intro"); } function getNextElement(node) { if(node.nodeType == 1) { return node; } if (node.nextSibling) { return getNextElement(node.nextSibling); } return null; } addLoadEvent(styleHeaderSiblings);
理论上讲应该用类样式来设置。若是内容须要按期编辑和刷新,添加class就成为一种负担dom
标记语言函数
<table> <caption>Itinerary</caption> <thead> <tr> <th>When</th> <th>Where</th> </tr> </thead> <tbody> <tr> <td>June 9th</td> <td>Portland, <abbr title="Oregon">OR</abbr></td> </tr> <tr> <td>June 10th</td> <td>Seattle, <abbr title="Washington">WA</abbr></td> </tr> <tr> <td>June 12th</td> <td>Sacramento, <abbr title="California">CA</abbr></td> </tr> </tbody> </table>
若支持CSS3,很简单两行就能够设置成功 能够用javascript编写函数设置斑马线效果,只须要隔行设置样式就ok学习
function stripeTables() { if (!document.getElementsByTagName) return false; var tables = document.getElementsByTagName("table"); for (var i=0; i<tables.length; i++) { var odd = false; var rows = tables[i].getElementsByTagName("tr"); for (var j=0; j<rows.length; j++) { if (odd == true) { rows[j].stytle.backgroundColor = '#ffc'; odd = false; } else { odd = true; } } } }
有一个问题,table每一行都被设置为false,如何交替?
CSS提供伪类根据元素状态改变样式,DOM也能够经过onmouseover等事件对html响应。 很难判断使用那个 若是只是想让连接在鼠标指针悬停改变颜色,能够用CSS 若是鼠标悬停加粗,部分浏览器能够用CSS加粗,DOM却均可以获得公平对待
function highlightRows() { if(!document.getElementsByTagName) return false; var rows = document.getElementsByTagName("tr"); for (var i=0; i<rows.length; i++) { rows[i].onmouseover = function() { this.style.fontWeight = "bold"; } rows[i].onmouseout = function() { this.style.fontWeight = "normal"; } } } addLoadEvent(highlightRows);
考虑使用CSS仍是DOM
与其使用DOM更改样式,不如使用javascript更新元素的属性
function styleHeaderSiblings() { if (!document.getElementsByTagName) return false; var headers = document.getElementsByTagName("h1"); for (var i=0; i<headers.length; i++) { var elem = getNextElement(headers[i].nextSibling); elem.stytle.fontWeight = "bold"; elem.stytle.fontSize = "1.2em"; } }
若是修改CSS的字号,就不得不去改这个函数 若是引用一个外部样式表,针对.intro类样式声明 你只须要把紧跟一级标题后的元素设置为intro就能够达到目的。 能够用setAttribute方法来作这件事
elem.setAttribute("class", "intro");
更简单的方法是更新className属性
function styleHeaderSiblings() { if (!document.getElementsByTagName) return false; var headers = document.getElementsByTagName("h1"); for (var i=0; i<headers.length; i++) { var elem = getNextElement(headers[i].nextSibling); **elem.className = "intro";** } }
这个技巧有个不足,className会把原来的属性替换掉,而不是追加原有的class设置 咱们须要追加效果elem.className += " intro";
操做步骤以下:
function addClass(element,value) { if (!element.className) { element.className = value; } else { element.className+= " "; element.className+= value; } }
把一个很是具体的东西改进为一个较为通用的东西叫抽象 stytleHeaderSiblings函数中,能够传递给两个形参,tag和theClass 这样会很通用