JavaScript DOM 元素操作 window窗口操作
前端 JavaScript DOM 和 BOM 学习目录
4. DOM attribute property style属性 className属性 classList属性 Data
DOM 获取元素大小 位置
注意接下来的知识点的话,和我们的盒子模型的掌握是很重要的,掌握得好,那么理解记忆即可,否则就会十分混乱的
offset —— 偏离量:在编程、测绘、机械等领域,表示物体或数据偏离标准位置或值的程度
client —— 计算机客户端:在计算机科学中,client 可以指与服务器进行通信的软件程序或设备
scroll —— 滚动:scroll作为动词时,可以指屏幕上的文本或图形进行滚动,以便查看屏幕外的部分
额外拓展,知道了这些英文单词的中文意思的话,应该好记忆一点
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> :root { --page-use-color: red; --page-color: skyblue; body { padding: 0; margin: 0; } .box { width: 100px; height: 100px; background-color: var(--page-use-color); border: 5px solid var(--page-color); overflow: auto; box-sizing: border-box; } } </style> </head> <body> <div class="box"> </div> <script> // 实现获取元素 var boxEl = document.querySelector('.box') // 实现获取元素的样式 var boxStyle = getComputedStyle(boxEl) console.log(boxStyle.width, boxStyle.height) console.log(boxEl.offsetLeft, boxEl.offsetTop) console.log(boxEl.offsetWidth, boxEl.offsetHeight) console.log(boxEl.clientLeft, boxEl.clientTop) console.log(boxEl.clientWidth, boxEl.clientHeight) /** * clientWidth: 当我们的 box-sizing 的模式是我们的 content-box 的时候,就是 content + padding = width - scroll * 当我们的 box-sizing 的模式是我们的 border-box 的时候,就是我们的 width - scroll - border * offsetWidth: 当我们的 box-sizing 的模式是我们的 content-box 的时候,就是 width + border * 当我们的额 box-sizing 的模式是我们的 border-box 的时候, 就是实现获取是 width * clientLeft: 管他是什么显示模式,都是获取的是我们的内容区域距离边缘的大小: border * offsetLeft: 就是实现的是获取我们元素 border 距离父盒子的间距 */ </script> </body> </html>
属性 描述 具体用法 clientWidth 和 clientHeight 当我们的 box-sizing 的设置为默认的 content-box 的时候,就是实现的是获取块级盒子的 content + padding 的大小 boxEl.clientWidth, boxEl.clientHeight offsetWidth 和 offsetHeight 当我们的 box-sizing 的设置为默认的 content-box 的时候,就是实现的是获取块级盒子的 width + border 的大小 boxEl.offsetWidth, boxEl.offsetHeight clientTop 和 clientLeft 不管我们的块级盒子的显示模式是什么,都是实现获取的是边框的宽度,但是准确来说的话,应该是 content + padding 距离我们的元素的边缘的距离大小 boxEl.clientLeft, boxEl.clientTop offsetLeft 和 offsetTop 不管盒子的显示模式是怎样的,都是实现的是获取我们的整个盒子的边缘距离父盒子的距离大小 boxEl.offsetLeft, boxEl.offsetTop scrollHeight 和 scrollTop scrollHeight 是实现的是获取我们的元素具有的滚动区域的大小, scrollTop 就是实现的是获取我们的滚动偏移量的 boxEl.scrollHeight, boxEl.scrollTop 应该还是记得的吧,就是我们的 box-sizing 是具有两种属性值的,一种就是 content-box 一种就是我们的 border-box
content-box 是我们的默认值
同时真真的想要了解这个的使用的话,我们尽量回去温故一哈盒子模型哟
DOM window窗口大小以及滚动
方法 描述 使用 innerWidth 和 innerHeight 实现获取的是我们的 windows 窗口的宽度以及高度(含有滚动条) window.innerHeight, window.innerWidth outerWidth 和 outerHeight 获取window 窗口的整个宽度以及高度(包含调试工具以及工具栏) window.outerHeight, window.outerWidth documentElement.clientHeight 和 document.Element.clientWidth 获取的是 html 的宽度以及高度(不包含滚动条) document.querySelector('html').clientHeight, document.body.parentElement.clientWidth scrollX 和 scrollY 就是实现的是获取 window 窗口的滚动,scrollX 就是实现的是获取相对于X轴的偏移量 window.scrollX , window.scrollY scrollBy(x, y) 和 scrollTo(pageX, pageY) scrollBy 就是实现的是我们的将页面实现滚动到相对于的位置, scrollTo 就是实现的是指定滚动到页面中的某个位置 window.scrollBy() , window.scrollTo() <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script> // 实现获取元素 var boxEl = document.querySelector('.box') console.log(document.querySelector('html').clientHeight, document.body.parentElement.clientWidth); // 还是可以实现我们的通过 DOM 的导航树来实现获取的 console.log(window.innerHeight, window.innerWidth); console.log(window.outerHeight, window.outerWidth); </script> </body> </html> 后面的时候,我们是可以对这些进行一些监听,来实现给我们的网页添加一些效果出来
就是当我们的网页实现滚动到了特定的位置,页面的样式就实现某种改变,这个时候就可以通过监听这些属性来实现对应的效果
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <!-- 开始实现我们的样式的设计 --> <style> :root { --box-color: skyblue; body { padding: 0; margin: 0; .box01 { width: 200px; height: 200px; background-color: var(--box-color); } .btn { position: fixed; opacity: 0; right: 30px; bottom: 30px; } } } </style> </head> <body> <div class="box01"></div> <button class="btn">回到顶部</button> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <script> // 开始实现书写我们的 js 部分 // 首先先实现获取元素 var btnEl = document.querySelector('.btn'); // 开始对window 添加事件监听 // 控制一个元素是否显示的方法含有: opacity hidden display 来实现控制 // 同时可以思考一下这三个有何不同 window.onscroll = function() { var scrollY = window.scrollY scrollY > 300 ? btnEl.style.opacity = '1' : btnEl.style.opacity = '0'; } // 实现对我们的按钮添加点击事件 btnEl.onclick = function(){ window.scrollTo(0,0); } </script> </body> </html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
:root {
--a-root-color: red;
--a-hover-color: skyblue;
}
body {
padding: 0;
margin: 0;
ul, li, ol {
list-style: none;
}
span {
text-decoration: none;
color: var(--a-root-color);
cursor: pointer;
}
span:hover {
color: var(--a-hover-color);
}
}
</style>
</head>
<body>
<label for="text">请输入内容</label><input type="text" id="text" value="" placeholder="请输入内容">
<button class="btn">添加内容</button>
<ul class="ul">
</ul>
<script>
// 首先先实现获取我们的元素
var inputEl = document.querySelector('#text');
var btnEl = document.querySelector('.btn');
var ulEl = document.querySelector('.ul');
var index = 1
inputEl.focus()
function createUl(LiEl, index) {
var _ulEL = LiEl.querySelector('ul');
if (!_ulEL) {
var _ulEl = document.createElement('ul');
LiEl.append(_ulEL)
}
var contentValue = prompt("请输入内容")
if (contentValue) {
createLi(_ulEl, contentValue, index);
}
}
// 开始实实现抽离一个函数出来实现专门创建我们的元素
function createLi(containerEl, contentValue, index) {
var LiEl = document.createElement('li');
var delSpan = document.createElement('span');
var addSpan = document.createElement('span');
// 然后实现插入元素
delSpan.append("删除评论")
addSpan.append("评论")
delSpan.onclick = function () {
LiEl.remove()
}
addSpan.onclick = function () {
createUl(LiEl, index);
}
LiEl.classList.add(`li-${index}`);
LiEl.append(contentValue, " ", delSpan, " ", addSpan);
ulEl.append(LiEl);
}
// 添加事件监听
btnEl.addEventListener('click', function () {
var content = inputEl.value;
if (content === '') {
alert("没有内容,请输入内容后重试")
inputEl.focus()
} else {
createLi(ulEl, content, index);
inputEl.value = ""
inputEl.focus()
index++
}
})
</script>
</body>
</html>
上面的小案例的话是有一点小的 bug 的,书写的时候忘记了元素的语义化,把通过列表展示评论内容的方式可以改为 div 来实现,主要看 js 的思路,可以优化的地方,欢迎提出问题