小言_互联网的博客

《JavaScript_DOM编程艺术》Chapter09 CSS-DOM --20210506

200人阅读  评论(0)

9.1 三位一体的网页:

三位一体的网页:结构层(HTML)、表示层(CSS)、行为层(JavaScript)。
CSS可以使用伪类实现一些动态效果,DOM也可以给元素设定样式。

9.2 style属性

每个元素的style属性都是对象。

读取style属性

当需要引用一个中间带减号的CSS属性时。DOM要求你用驼峰命名法。例:CSS属性font-family变为DOM属性fontFamily。
style属性只能返回内嵌样式。
#JavaScript读取style属性的例子

alert(element.style.color)

alert(element.style.fontFamily)

alert(element.style.fontSize)

设置style属性

style的各个属性都是可读写的,element.style.property = value用于更新样式,style对象的属性值必须放在引号里。
#JavaScript设置style属性的例子

window.onload = function(){
   
	var para = document.getElementById("example");
	para.style.color = "black";
}

9.3 何时该用DOM脚本设置样式(3个综合练习)

绝大数情况下还是应该使用CSS去声明样式,在使用CSS不方便的情况下,可以利用DOM对文档的样式做一些小的增强。

9.3.1 根据元素在节点树里的位置来设置样式

CSS还无法根据元素之间的相对位置关系找出某个特定的元素,但对DOM来说是可以的。以下是我们利用DOM来找出所有< h1 >元素后面的那个元素节点,并把样式给它。


#story.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <title>
            Man bites dog
        </title>
    </head>
    <body>
        <h1>Hold the front page</h1>
        <p>This first paragraph leads you in.</p>
        <p>Now you get the nitty-gritty of the story.</p>
        <p>The most important information is delivered first.</p>
        <h1>Extra! Extra!</h1>
        <p>Further developemnt are unfoldings.</p>
        <p>You can read all about it here.</p>
        <script src="scripts/addLoadEvent.js"></script>
        <script src="scripts/styleHeaderSiblings.js"></script>
    </body>
</html>

#styleHeaderSiblings.js

function getNextElement(node){
   
    if (node.nodeType==1){
   
        return node;
    }
    if (node.nextSibling){
   
        return getNextElement(node.nextSibling);

    }
    return null;
}


function styleHeaderSiblings(){
   
    if (!document.getElementsByTagName) return false;
    var headers = document.getElementsByTagName("h1");
    var elem;
    for (var i=0; i<headers.length; i++){
   
        elem = getNextElement(headers[i].nextSibling);
        elem.style.fontWeight = "bold";
        elem.style.fontSize = "1.2em";
    }
}


/*执行加载函数*/
addLoadEvent(styleHeaderSiblings);

9.3.2 根据某种条件反复设置某种样式

利用DOM设置奇偶行的不同样式。

方法1:利用CSS的nth-child()

#itinerary.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <title>
            Cities
        </title>
        <link rel="stylesheet" media="screen"  href="styles/format.css"/>
    </head>
    <body>
        <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>
    </body>
</html>

#styles/format.css

body{
   
    font-family: "Helvetica","Arial",sans-serif;
    background-color: #fff;
    color: #000;
}
table{
   
    margin: auto;
    border: 1px solid #699;
}
caption{
   
    margin: auto;
    padding: .2em;
    font-size: 1.2em;
    font-weight: bold;
}
th{
   
    font-weight: normal;
    font-style: italic;
    text-align: left;
    border: 1px dotted #699;
    background-color: #9cc;
    color: #000;
}
th,td{
   
    width: 10em;
    padding: .5em;
}
tr:nth-child(odd){
   
    background-color: #ffc;
}
tr:nth-child(even){
   
    background-color: #fff;
}

方法2:利用CSS的nth-child()

#styles/format.css基本不变,需去除以下nth-child。

tr:nth-child(odd){
   background-color: #ffc;}
tr:nth-child(even){
   background-color: #fff;}

##story.html基本不变,添加调用JavaScript的标签即可。

        <script src="scripts/addLoadEvent.js"></script>
        <script src="scripts/stripeTables.js"></script>

#stripeTables.js


function stripeTables(){
   
    if (!document.getElementsByTagName) return false;
    var tables = document.getElementsByTagName("table");
    var odd,rows;
    for (var i=0; i<tables.length; i++){
   
        odd = false;
        rows = tables[i].getElementsByTagName("tr");
        for (var j=0; j<rows.length; j++){
   
            if (odd == true){
   
                rows[j].style.backgroundColor = "#ffc";
                odd = false;
            }else{
   
                odd = true;
            }
        }
    }
}


/*执行加载函数*/
addLoadEvent(stripeTables);

9.3.3 响应事件

CSS hover:鼠标放在元素上方,就会启动。

#format.css

tr:hover{
   
    color:#c60;
    font-weight: bold;
}

DOM onmouseover:鼠标放在元素上方,就会启动。

#highlightRows.js

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);

#itinerary.html

<script src="scripts/highlightRows.js"></script>

9.4 className属性

与其使用DOM直接改变某个元素的样式,不如通过JavaScript代码去更新这个元素的class属性。

element.className = value
.info{
	font-weight:bold;
	font-size:1.4em;
}

但这个技巧有一个不足:className被替换了,但实际需要的是“追加”效果。
#更新styleHeaderSiblings.js

function styleHeaderSiblings(){
   
    if (!document.getElementsByTagName) return false;
    var headers = document.getElementsByTagName("h1");
    var elem;
    for (var i=0; i<headers.length; i++){
   
        elem = getNextElement(headers[i].nextSibling);
		addClass(elem,"intro");
    }
}
.info{
	font-weight:bold;
	font-size:1.4em;
}

#更新stripeTables.js

function stripeTables(){
   
    if (!document.getElementsByTagName) return false;
    var tables = document.getElementsByTagName("table");
    var odd,rows;
    for (var i=0; i<tables.length; i++){
   
        odd = false;
        rows = tables[i].getElementsByTagName("tr");
        for (var j=0; j<rows.length; j++){
   
            if (odd == true){
   
                addClass(row[j],"odd");
                odd = false;
            }else{
   
                odd = true;
            }
        }
    }
}
.odd{
	background-color:#ffc;
}

对函数进行抽象

对函数进一步抽象

function styleHeaderSiblings(tag,theclass){
   
    if (!document.getElementsByTagName) return false;
    var headers = document.getElementsByTagName(tag);
    var elem;
    for (var i=0; i<headers.length; i++){
   
        elem = getNextElement(headers[i].nextSibling);
		addClass(elem,theclass);
    }
}

转载:https://blog.csdn.net/m0_46629123/article/details/116419676
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场