DOM操作

什么是DOM操作

DOM:是当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
把文档中的代码翻译成一个对象模型
在这个模型中 所有相关的标签属性注释文本等等12种数据 都翻译为一种类型的对象 统称节点对象
这些对象之间在文档模型数据结构中存在某种关系: 根节点 父子节点 同胞节点等等
1.只有一个根节点document
2.除了根节点外所有节点都有唯一的一个父节点
3.document是window对象的属性
4.全局对象模型属于BOM操作 Browser Object Model 把浏览器对外提供的接口翻译为一个对象
BOM操作会在接下来的知识点讲到 它不属于标准的接口 但是浏览器厂商都提供了几乎一样的功能
5.元素的属性也是独立节点 叫属性节点 但是不是元素节点的子节点
来源是w3schoo
本图来自(w3school)
DOM操作详细介绍请访问:https://www.w3school.com.cn/js/js_htmldom_elements.asp

通过方法获取节点

在 DOM 中,所有 HTML 元素都被定义为对象。
编程界面是每个对象的属性和方法。
属性是您能够获取或设置的值(就比如改变 HTML 元素的内容)。
方法是您能够完成的动作(比如添加或删除 HTML 元素)。
访问 HTML 元素最常用的方法是使用元素的 id。

var div1=document.getElementById("m1") 依靠id来获取元素节点/如果没有就返回null(不是id选择器)
var arr=document.getElementsByClassName("m2")  依靠calss来获取元素节点(不是class选择器)
var inps=document.getElementsByTagName("i")   依靠标签的名字来获取元素节点(不是标签名选择器)
var arr=document.getElementsByName("food1") 依靠name属性的值
H5自带的
var el=document.querySelector(".m2")  若符合选择器的第一个元素/null
var arr=document.querySelectorAll(".box2")  符合选择器的所有元素/[]

document.body  body标签
document.forms  form表单们
document.anchors a标签们
document.images 图片们
document.links 连接们
document.URL 当前文档的网址

通过关系获取节点

<div id="box1">hello
    <div class="box2" id="box4">2</div>
    <div class="box2">
        <div class="box5" id="box3">box3</div>
    </div>
    <div class="box2" id="box6">4</div>
</div>
1.父级 父元素和父节点是同一个
var re=document.getElementById("box4").parentElement//父元素
var re=document.getElementById("box4").parentNode//父节点
console.log(re)

2.子级 子元素和子节点不一定是同一个
var son1=document.getElementById("box1").children//返回值是子元素们 没有返回空数组
console.log(son1)
var son1=document.getElementById("box1").childNodes //返回值是子节点们 没有返回空数组
console.log(son1)

3.兄弟
var re = document.getElementById("box4").nextSibling//下一个兄弟节点 没有返回null
console.log(re)
var re = document.getElementById("box2").nextElementSibling//下一个兄弟元素 没有返回null
console.log(re)
var re=document.getElementById("box3").previousSibling//上一个兄弟节点 没有返回null
console.log(re)
var re=document.getElementById("box3").previousElementSibling //上一个兄弟元素 没有返回null
console.log(re)			


            
4.1个子节点
var son1=document.getElementById("box1").firstChild
var son2=document.getElementById("box1").firstElementChild
console.log(son1,son2)
			
			
5.最后一个子节点
var son1=document.getElementById("box1").lastChild
var son2=document.getElementById("box1").lastElementChild
console.log(son1,son2)

			
6.获取自己是父元素中的第几个子元素/节点
自己实现这个方法:调用者是父元素中的第几个元素 .index()						
 Object.prototype.index2=function() {
 	console.log(this)
 	var arr=this.parentElement.childNodes
 	for (let i = 0;i<arr.length;i++) {
 		if(this==arr[i]){
 			return i
			}
 	}
 }
 var index=document.getElementById("box4").index2()
console.log(index)
												
7.父元素中的第几个子元素/节点					
var son1=document.getElementById("box1").children[1]//第二个子元素
var son2=document.getElementById("box1").childNodes[1]//第二个子节点

			

元素无text,没有返回null。节点有text,没有返回null。
1.父节点
在这里插入图片描述

2.子节点
在这里插入图片描述

返回值是子元素们 没有返回空数组(上面个图)
在这里插入图片描述返回值是子节点们 没有返回空数组(上面个图)
总的图
在这里插入图片描述
3.兄弟节点
在这里插入图片描述
4.第一个子节点
在这里插入图片描述

5.最后一个子节点
在这里插入图片描述
6.1当为childNodes时(子节点)
从0开始数

        Object.prototype.index2 = function () {
            console.log(this)
            var arr = this.parentElement.childNodes
            for (let i = 0; i < arr.length; i++) {
                if (this == arr[i]) {
                    return i
                }
            }
        }
        	var box = document.querySelector("#box6")
			console.log(box.index2())

结果
在这里插入图片描述
6.2当为children时(子元素)

			Object.prototype.index1=function(){
			 console.log(this)
				var arr=this.parentElement.children
				for(let i=0;i<arr.length;i++){
					if(arr[i]===this){
						return i
					}
				}				 
			}
			var box = document.querySelector("#box6")
			console.log(box.index1())

结果
在这里插入图片描述
7.父元素中的第几个子元素/节点
在这里插入图片描述

表格的隔行变色

html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        td{
            width: 380px;
            height: 50px;
        }
    </style>
</head>

<body>
    <table border="1px"cellspacing='0'>

        <tr class="m1">
            <td>xxx</td>
            <td>xxx</td>
            <td>xxx</td>
            <td>xxx</td>
        </tr>
        <tr class="m1">
            <td>xxx</td>
            <td>xxx</td>
            <td>xxx</td>
            <td>xxx</td>
        </tr>
        <tr class="m1">
            <td>xxx</td>
            <td>xxx</td>
            <td>xxx</td>
            <td>xxx</td>
        </tr>
        <tr class="m1">
            <td>xxx</td>
            <td>xxx</td>
            <td>xxx</td>
            <td>xxx</td>
        </tr>
        
    </table>

script

    <script>
        var m=document.getElementsByClassName('m1')   
        for(let i=0;i<m.length;i++){
            console.log(i%2,1111)
            if(i%2){
                m[i].style.backgroundColor='red'
            }else{
                m[i].style.backgroundColor='blue'
            }
        }
    </script>

结果
在这里插入图片描述

百度换肤

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<style>
			body{
				background-image: url(./src/7.jpg);
				background-size: 100% 800px;
			}
			img{
				width: 120px;
				height: 60px;
			}
		</style>
		<img src="填你自己的地址">
		<img src="填你自己的地址">
		<img src="填你自己的地址">

第一种

		</script>
			var imgs=document.getElementsByTagName("img")
			var srcarr=["填你自己的地址","填你自己的地址","填你自己的地址"]
			for(let i=0;i<imgs.length;i++){
				imgs[i].onclick=function(){
					document.body.style.backgroundImage=`url("${srcarr[i]}")`
				}
			}			
		</script>

第二种

		document.body.style.backgroundImage=`url("填你自己的地址")`
		var imgs=document.getElementsByTagName("img")
		imgs[0].onclick=function(){
		document.body.style.backgroundImage=`url("${imgs[0].src}")`或者你自己的地址
		}
		imgs[1].onclick=function(){
		document.body.style.backgroundImage=`url("${imgs[1].src}")`或者你自己的地址
		}
		imgs[2].onclick=function(){
		document.body.style.backgroundImage=`url("${imgs[2].src}")`或者你自己的地址
		}

效果

Document - Google Chrome

下拉菜单

    <style>
        .dropbtn{
            width: 200px;
            height: 40px;
            background-color: red;
            border-radius: 5px;
            line-height: 40px;
            padding-left: 20px;
            cursor: pointer;
        }
        .dropmenu{
            width: 300px;
            height: 0px;
            border-radius: 5px;
            background-color: chartreuse;
            padding-left: 20px;
            overflow: hidden;
        }
    </style>

    <div class="dropbtn">
        btn
    </div>
    <div class="dropmenu">
        <div class="box">hello</div>
        <div class="box">hello</div>
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
    </div>
        // 设定值=当前+(差量)*百分比  差量就是目标值减去当前值
        window.onload=function(){
            var dropbtn=document.querySelector('.dropbtn')
            var flag=true;
            var timer=null;
            var dropmenu=document.querySelector('.dropmenu')
            dropbtn.addEventListener('click',function(e){
               if( flag=!flag){
                clearInterval(timer)
                dropmenu.style.height='0px'
               }else{
                timer=setInterval(()=>{
                let h=window.getComputedStyle(dropmenu).height
                dropmenu.style.height=parseInt(h)+(500-parseInt(h))*0.5+'px'

              },30)
               }
            })
        }

效果

下拉菜单效果

信息滑入

    <style>
        .goods{
            position: relative;
            width: 275px;
            height: 183px;
            overflow: hidden;
        }
        .introduce{
            position: absolute;
            width: 275px;
            height: 60px;
            top:183px;
            text-align: center;
            line-height: 60px;
            background-color:rgba(129, 148, 170, 0.5);
        }
    </style>
    <div class="goods">
        <img src="./images.jfif" alt="">
        <div class="introduce">太空的蝴蝶</div>
    </div>
    <script>
        var goods=document.querySelector('.goods')
        var timer=null;
        var result=123;
        goods.addEventListener('mouseenter',()=>{
            clearInterval(timer)
            result=123;
            var introduce=document.querySelector('.introduce')
            timer=setInterval(()=>{
                introduce.style.top=introduce.offsetTop+(result-introduce.offsetTop)*0.7+'px'
            },20)
        })
        goods.addEventListener('mouseleave',()=>{
            result=183
        })
    </script>

效果

信息滑入

模态窗口拖拽效果

    <style>
        .modelbox{
            width: 100%;
            height: 800px;
            background-color: rgba(129, 148, 170, 0.7);
            position: fixed;
            left: 0px;
            top: 0px;
            z-index: 10000;
        }
        .loginbox{
            width: 400px;
            height: 240px;
            border-radius: 10px;
            background-color: white;
            position: absolute;
            left: 400px;
            top: 200px;
            cursor: move;
        }
    </style>
    <button id="btn">登录</button>
   <script>
        document.querySelector('#btn').onclick=function(){
            var modelbox=document.createElement('div')
            modelbox.classList.add('modelbox')
            document.body.appendChild(modelbox)

            var loginbox=document.createElement('div')
            loginbox.classList.add('loginbox')
            modelbox.appendChild(loginbox)
            loginbox.addEventListener('mousedown',(e)=>{
                document.onmousemove=null
            })
            
            loginbox.addEventListener('mousedown',(e)=>{
                // 获取鼠标按下时的xy:相对于视口
                let x=e.screenX
                let y=e.screenY
                let divtop=loginbox.offsetTop
                let divleft=loginbox.offsetleft
                document.onmousemove=(e2)=>{
                    // 获取鼠标滑动过程中的xy:相对于视口
                let x2=e2.screenX
                let y2=e2.screenY
                loginbox.style.top=divtop+(y2-y)+'px'
                loginbox.style.left=divleft+(x2-x)+'px'
                }

            })
        }
    </script>

效果,没做好
在这里插入图片描述
在这里插入图片描述

放大镜

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值