什么是DOM操作
DOM:是当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
把文档中的代码翻译成一个对象模型
在这个模型中 所有相关的标签属性注释文本等等12种数据 都翻译为一种类型的对象 统称节点对象
这些对象之间在文档模型数据结构中存在某种关系: 根节点 父子节点 同胞节点等等
1.只有一个根节点document
2.除了根节点外所有节点都有唯一的一个父节点
3.document是window对象的属性
4.全局对象模型属于BOM操作 Browser Object Model 把浏览器对外提供的接口翻译为一个对象
BOM操作会在接下来的知识点讲到 它不属于标准的接口 但是浏览器厂商都提供了几乎一样的功能
5.元素的属性也是独立节点 叫属性节点 但是不是元素节点的子节点
本图来自(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>
效果,没做好