DOM

概念

DOM:文档对象模型,是一套标准的编程接口,可以通过DOM来操作html元素

js操作DOM元素

浏览器加载html的时候,会根据html的结构体形成一颗DOM树,dom树上有元素节点、属性节点。

对应的DOM树

document对象

DOM通过document对象为开发者提供大量的接口来操作DOM树

获取节点

getElementById

    <h1 id="title">hello h1</h1>

    <script>
        let h=document.getElementById("title");//返回值是一个dom节点
        console.log(h);//<h1 id="title">hello h1</h1>
    </script>

getElementByClassName

<body>
    <button class="btn">1</button>
    <button class="btn">2</button>
    <button class="btn">3</button>

    <script>
        let btns = document.getElementsByClassName("btn");//返回值是dom节点的一个集合
        console.log(btns);//HTMLCollection(3) [button.btn, button.btn, button.btn]
    </script>
</body>

element.innerHTML/innerText

innerHTML和innerText都能获取和设置document对象的文本内容
innerHTML指的是从对象的起始位置到终止位置的全部内容,包括Html标签。
innerText指的是从起始位置到终止位置的内容,但它去除Html标签。
同时,innerHTML是所有浏览器都支持的,innerText是IE浏览器和chrome 浏览器支持的,Firefox浏览器不支持。
其实,innerHTML是W3C 组织规定的属性;而innerText属性是IE浏览器自己的属性,不过后来的浏览器部分实现这个属性罢了。
innerHTML是符合W3C标准的属性,而innerText只适用于IE浏览器(现在也适应chrome浏览器)
因此尽可能地去使用innerHTML,而少用innerText
如果要输出不含HTML标签的内容,可以使用innerHTML取得包含HTML标签的内容后,再用正则表达式去除HTML标签

  • 获取内容
    <h1 id="title">
        hello h1
        <p>hello p</p>
    </h1>

    <script>
        let h=document.getElementById("title");
        console.log(h.innerHTML);//带标签,如<p>
        console.log(h.innerText);//不带标签
    </script>

  • 设置内容
    <h1 id="title">
        hello h1
        <p>hello p</p>
    </h1>

    <script>
        let h=document.getElementById("title");
        console.log(h.innerHTML);
        console.log(h.innerText);
        h.innerHTML="hello hh1";
        h.innerText="hello hhh1";//两者效果上一致,所以后面的会替换前者的效果
    </script>

document.querySelector&querySelectorAll

getID和getClassName都是旧的方法,现在多采用效率更高的querySelector和querySelectorAll
通过选择器来获取节点

    <h1 id="title">hello h1</h1>
    <button class="btn">1</button>
    <button class="btn">2</button>
    <button class="btn">3</button>

    <script>
        let g1 = document.querySelector("#title");
        let g2 = document.querySelector(".btn");//如果有多个相同的类名,只会选择第一个
        console.log(g1);//<h1 id="title">hello h1</h1>
        console.log(g2);//<button class="btn">1</button>

        let g3 = document.querySelectorAll(".btn");//获取所有符合的节点
        console.log(g3);//NodeList(3) [button.btn, button.btn, button.btn]
    </script>

事件类型

触发某些事件,产生某些效果

点击事件:onclick

点击按钮,弹出弹窗

    <button class="btn">按钮</button>

    <script>
        let g = document.querySelector("button");
        //事件监听函数
        g.onclick = function(){
            alert("hello btn");
        }
    </script>

鼠标移入元素:onmouseenter

    <button class="btn">按钮</button>

    <script>
        let g = document.querySelector("button");
        g.onmouseenter = function(){
            console.log("enter");
        }
    </script>

移入鼠标打印enter

鼠标移出元素:onmouseleave

    <button class="btn">按钮</button>

    <script>
        let g = document.querySelector("button");
        g.onmouseleave = function(){
            console.log("out");
        }
    </script>

移开鼠标打印out

事件设置样式

    <style>
        .box{
            width: 100px;
            height: 100px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="box"></div>

    <script>
        let g = document.querySelector(".box");

        g.onclick = function(){
            this.style.backgroundColor = "blue";//this是g
        }

        g.onmouseenter = function(){
            this.style.backgroundColor = "yellow";
        }

        g.onmouseleave = function(){
            this.style.backgroundColor = "green";
        }
    </script>
</body>

事件设置属性

  • id、className
    <button class="btn">1</button>

    <script>
        let g = document.querySelector("button");

        g.onclick = function(){
            g.id="btn1";//点击后设置id属性,有就覆盖,没有就添加
            g.className="active";
        }
    </script>

  • 利用className的变化实现样式
    <style>
        .active{
            background-color: red;
        }
    </style>
</head>
<body>
    <button>1</button>
    <button>2</button>
    <button>3</button>
    <script>
        let btnArr = document.querySelectorAll("button");
        for(let i of btnArr){
            i.onclick=function(){
                if(this.className==="active"){
                    this.className="";
                }else{
                    this.className="active";
                }
            }
        }
    </script>

点击对应按钮就会加上类名active(前提是原类名没有active)背景色也会变成红色

如果本来的类名是active,点击后类名就会变为空,背景色变回原样

  • img
    <style>
        img{
            height: 500px;
        }
    </style>
</head>
<body>
    <div>
        <img src="img/keli.jpg" alt="">
    </div>
    <button>1</button>
    <button>2</button>
    <button>3</button>

    <script>
        let img = document.querySelector("img");
        let imgArr = ["img/keli.jpg","img/yae.png","img/jay.jpg"];
        let btns = document.querySelectorAll("button");
        for(let i in btns){//i=0,1,2 遍历按钮数组
            btns[i].onclick=function(){//点击对应按钮切换相应图片
                img.src=imgArr[i];
            }
        }
    </script>



轮播图

3张图,flex布局横向排列,通过hidden隐藏掉超出的图片,通过向左平移实现图片的切换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .swiper{
            width: 640px;
            height: 320px;
            overflow: hidden;
            position: relative;
        }

        .img-container{
            width: 1920px;/*容纳3张图片以实现横向排列*/
            height: 320px;
            transition: transform 0.3s;/*切换图片*/
            display: flex;/*消除幽灵空白*/
        }

        .img-container img{
            width: 640px;
            height: 320px;
        }

        .btn-list{
            position: absolute;/*绝对定位抵消隐藏*/
            bottom: 0;
        }
    </style>
</head>
<body>
    <div class="swiper">
        <div class="img-container">
            <img src="img/keli.jpg" alt="">
            <img src="img/yae.png" alt="">
            <img src="img/jay.jpg" alt="">
        </div>
        <div class="btn-list">
            <button>1</button>
            <button>2</button>
            <button>3</button>
        </div>
    </div>
    <script>
        let btn = document.querySelectorAll(".btn-list button");
        let container = document.querySelector(".img-container");
        for(let i in btn){
            btn[i].onclick = function(){
                /*
                0 * 640 = 0
                1 * 640 = 640
                2 * 640 = 1280
                */
                container.style.transform = `translate(${-640*i}px)`;//不同按钮有相应的偏移值
            }
        }
    </script>
</body>
</html>

DOM节点分类

innerHtml

innerHtml不只能设置文本,还能设置标签、属性等内容
点击按钮显示列表

<button>按钮</button>
    <ul></ul>

    <script>
        let btn = document.querySelector("button");
        let u = document.querySelector("ul");
        btn.onclick = function(){
            u.innerHTML = `
                <li>苹果</li>
                <li>香蕉</li>
                <li>雪梨</li>
            `;
        }
    </script>


innerHtml是一个大刀阔斧的操作,一般用更细致的操作

节点操作


通过添加节点的方式

    <input type="text">
    <button>按钮</button>
    <ul></ul>

    <script>
        let inp = document.querySelector("input");
        let btn = document.querySelector("button");
        let ul1 = document.querySelector("ul");
        btn.onclick = function(){
            let li1 = document.createElement("li");//创建li标签
            let value1 = inp.value;//将文本框输入的内容赋值给value1
            let txt = document.createTextNode(value1);//创建文本,内容是value1
            ul1.appendChild(li1);//将li1即li标签添加到ul1即ul中
            li1.appendChild(txt);//将txt即文本添加到li1即li标签中
        }
    </script>

点击列表,删除列表项

    <input type="text">
    <button>按钮</button>
    <ul class="fruit">
        <li>苹果</li>
        <li>香蕉</li>
        <li>雪梨</li>
    </ul>

    <script>
        let inp = document.querySelector("input");
        let btn = document.querySelector("button");
        let ul1 = document.querySelector("ul");
        let list = document.querySelectorAll(".fruit li");
        btn.onclick = function(){
            let li1 = document.createElement("li");
            let value1 = inp.value;
            let txt = document.createTextNode(value1);
            ul1.appendChild(li1);
            li1.appendChild(txt);
        }

        for(let i in list){
            list[i].onclick = function(){//点击列表删除列表
                ul1.removeChild(this);//removeChild删除节点
                //this是list[i]调用的,指代一个li
            }//这个删不了新添加的列表,因为list选中的li是加载时就确定的,新添加的不在其中
        }
    </script>

事件对象

    <style>
        .box{
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script>
        let b = document.querySelector(".box");
        b.onclick = function(e){//e就是事件对象,可以取任何名字,就是个形参,建议e或者Event
            console.log(e);//返回值是一个对象,里面包含一些关于事件对象的信息
            console.log(e.clientX);//鼠标点击位置的x坐标
            console.log(e.clientY);//鼠标点击位置的y坐标
        }
    </script>
</body>


随鼠标移动显示大图

    <style>
        .pic-list img{
            width: 320px;
            height: 160px;
        }

        .pic-big img{
            width: 640px;
            height: 320px;
        }

        .pic-big{
            position: absolute;
        }
    </style>
</head>
<body>
    <div class="pic-list">
        <img src="img/1.jpg" alt="">
        <img src="img/2.jpg" alt="">
        <img src="img/3.jpg" alt="">
    </div>
    <div class="pic-big"></div>
    <script>
        let pics = document.querySelectorAll(".pic-list img");
        let bigPic = document.querySelector(".pic-big");
        let picList = document.querySelector(".pic-list");

        for(let i in pics){
            pics[i].onmouseenter = function(){
                bigPic.innerHTML = `<img src="${this.src}">`;//this指向pics[i]
            }
            pics[i].onmouseleave = function(){
                bigPic.innerHTML = ``;
            }
        }

        picList.onmousemove = function(e){
            let x = e.clientX;
            let y = e.clientY;
            bigPic.style.top = y + 10 + "px";//如果不加10,bigpic的图片会挡住picList,从而触发picList的移出js
            bigPic.style.left = x + 10 + "px"; 
        }
    </script>
</body>

posted @ 2022-10-27 17:31  ben10044  阅读(237)  评论(0编辑  收藏  举报