lt;!DOCTYPE HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">
function req(){
var div=document.getElementById("div1");
document.getElementById("li1").innerHTML=(div.offsetTop)+"px";//div1距离屏幕顶部的距离
document.getElementById("li2").innerHTML=(div.offsetLeft)+"px";//div1距离屏幕左部的距离
document.getElementById("li3").innerHTML=(div.scrollTop)+"px";//div1纵向滚动条滚动的距离
document.getElementById("li4").innerHTML=(div.scrollLeft)+"px";//div1横向滚动条滚动的距离
}
</script>
</head>
<body style="border:10px solid #ccc;padding:0px 0px;margin:5px 10px">
<div style="width:60%;border-right:1px dashed red;float:left;">
<div style="float:left;">
<div id="div1" style="border:5px red solid;height:300px;width:200px;overflow:auto">
<div style="height:500px;width:400px">请调整横竖滚动条后,点击按钮后查看offsetTop、offsetLeft、scrollTop、scrollLeft值。</div>
</div>
<input type="button" value="点击我!" onclick="req()" style="border: 1px solid purple;height: 25px;"/>
</div>
</div>
<div style="width:30%;float:left;">
<ul style="list-style-type: none; line-height:30px;">结果:
<li>offsetTop : <span id="li1"></span></li>
<li>offsetLeft : <span id="li2"></span></li>
<li> scrollTop : <span id="li3"></span></li>
<li>scrollLeft : <span id="li4"></span></li>
</ul>
</div>
<div style="clear:both;"></div>
</body>
</html>
、偏移量offset
offset是偏移、位移、补偿的意思(取整数值四舍五入),表示元素的偏移量。
html和css代码
<!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>
* {
margin: 0;
padding: 0;
border: 0;
list-style: none;
}
div {
width: 300px;
height: 300px;
border: 1px solid #000;
margin: 100px;
position: relative;
}
span {
width: 100px;
height: 100px;
border: 1px solid #000;
position: absolute;
left: 120px;
top: 30px;
}
</style>
</head>
<body>
<div>
<span></span>
</div>
</body>
</html>
JavaScript代码
ebApi 思维导图见文章底部
1. nodeType(节点类型)
2. nodeName(节点名字)
3. nodeValue(节点值)
元素节点就是标签节点
属性包括属性名和属性值
window.open(href); /*打开一个网页*/
window.close(); /*关闭网页*/
在计算机中 事件代表捕捉了用户进行了什么操作 再给对应的事件处理
事件源 事件类型 事件处理函数
用户操作的是什么元素 事件中的this就是事件的事件源(谁触发这个事件那this就是谁)
用户进行了什么操作
实现拖拽 要考虑元素是否有margin 移动的x和y?减去元素原有的margin 给元素添加鼠标按下事件 在按下事件里面给页面添加鼠标移动事件 给元素注册鼠标弹起事件=> 清除页面鼠标移动事件
H5拖拽 需要为拖拽的元素添加 draggable="true" 属性 拖拽元素添加
三参数
/*
事件名 不加on
事件处理函数
boolean值 是否事件捕捉
*/
el.addEventListener()
ie8 不支持 addEventListener 两参数
/*
事件名 加on
事件处理函数
*/
el.attachEvent()
元素.on事件=处理函数 (添加事件 如果是同名事件,后面的事件处理函数会覆盖前面的) 元素.addEventListener() (添加事件 不会覆盖之前的同名事件)
用什么方式添加的事件就用什么方式移除事件
el.onclick=function(){};
// 移除
el.onclick=null;
el.addEventListener("click",fn1)
// 移除
el.removeEventListener("click",fn1)
el.attachEvent("onclick",f1)
// 移除
el.detachEvent("onclick",fn1)
用户操作后要执行的什么代码
screen e.screenX 和 e.screenY 获取的是点击的位置相对于屏幕左上角的坐标
page e.pageX,e.pageY 获得的是点击的位置相对于页面(文档)左上角的坐标 有兼容性的问题,IE8不支持,自己计算 pageX=e.clientX + 页面往左滚出去的距离 (scrollLeft) pageY=e.clientY + 页面往上滚出去的距离 (scrollTop)
offset e.offsetX,e.offsetY 获得是是点击的位置相当于事件源的左上角的位置 ie属性 有bug offsetX=e.clientX - 盒子到可视区域的left (el.getBoundingClientRect.left) offsetY=e.clientY - 盒子到可视区域的top (el.getBoundingClientRect.top)
this 和 e.currentTarget 是一樣的 当前调用的是谁的事件 那么this就是谁 e.currentTarget ie8 不支持=> 直接用this
e.target 获取事件源(目标阶段) 正在触发事件的那个元素 ie8不支持=> e.target 兼容代码 var target=e.target || e.srcElement
在事件里可以通过 e.eventPhase 来捕获当前是哪个阶段 捕获=> 1 目标=> 2 冒泡=> 3
捕获 目标 冒泡
一种现象 与冒泡阶段相反 从window开始 依次一级一级往下调用子元素的同名事件,直到找到真正触发事件的事件源 事件捕获默认看不见 想要看到捕获阶段则需要通过 addEventListener来绑定事件,并且第三个参数传true
找到真正触发事件的那个元素 -> 事件源
一种现象 当元素事件触发后 会从事件源开始依次一次一次往上调用父元素的同名事件,直到window 事件冒泡默认存在
好处:给父元素添加事件相当于给子元素添加了事件 -> 事件委托 -> e.target 带来的影响(坏处):如果子元素和父元素有同名事件 并且业务逻辑相反 则会冲突影响
设置捕获
先捕获 从window开始 依次一级一级调用子元素的同名事件 -> 找到目标(真正触发事件的元素) -> 从目标元素开始 依次一级一级调用父元素的同名事件 直到window
未设置捕获
找到目标(真正触发事件的元素) -> 从目标元素开始 依次一级一级调用父元素的同名事件 直到window
阻止事件冒泡和阻止事件捕获 e.stopPropagation() ie8魔鬼不支持(ie8只有事件冒泡,没有事件捕获)=> e.cancelBubble=true
只能存储字符串 查看本地存储 浏览器F12->Application->Local || Session Storage->fille://
可以把数据存储到本地(浏览器) 只要用户不删除 则会一直保存 每个域名都是独立的保存数据 不同域名不能互相访问 长久保存数据可以存储到 localStorage
短暂存储数据 可以多页面传值 相当于localStorage会更安全 浏览器关闭后就不会保存了
给元素添加动画定时器 可以将定时器id直接给元素 元素.timeId
每隔一段时间执行一段代码
/*
参数一: 要执行的代码 可以写字符串 在字符串里面写js代码 或者写函数
参数二: 间隔事件 单位是毫秒 1000毫秒=1秒
*/
window.setInterval()
一段时间后执行一段代码
/*
参数一: 要执行的代码 可以写字符串 在字符串里面写js代码 或者写函数
参数二: 延迟事件 单位是毫秒 1000毫秒=1秒
*/
window.setTimeout()
clearInterval(定时器id)
clearTimeout(延时器id)
将a标签的href的路径改为 javascript:void(0) || javascript:void(null) || 简写 javascript:
给a标签添加点击事件 在事件处理函数的最后 return false
阻止事件默认行为 e.preventDefault()
return和事件对象e阻止跳转的区别 return后面的代码不执行 e.preventDefault()不会影响后面代码执行
先把大家恢复成默认,再让自己特殊 tab切换
只能获取行内样式
只能取值 (number) 不能赋值 offsetWidth 和 offsetHeight 获取包括padding和border和width||height
获取盒子的最终宽度
获取盒子的最终高度
获取自身上外边框到定位父级上内边框的距离
获取自身左外边框到定位父级左内边框的距离
scrollWidth 和 scrollHeight 获取的包括了隐藏的部分 只能获取(number)不能修改 scrollLeft 和 scrollTop 可以获取也可以修改 想要滚动条滚动到最右变 直接赋值为 scrollWidth即可
获取盒子内容的总宽度
获取盒子内容的总高度
获取内容上边滚出去的距离
获取内容左边滚出去的距离
scrollTop和scrollLeft有兼容问题 兼容代码
var scrollTop=window.pageYOffset
|| document.documentElement.scrollTop
|| document.body.scrollTop
|| 0;
var scrollLeft=window.pageXOffset
|| document.documentElement.scrollLeft
|| document.body.scrollLeft
|| 0;
如果元素有滚动条 那么这个元素的可视宽度就是 整个盒子的宽度 - 滚动条的宽度
获取可视区域的宽
获取可视区域的高
获取左边框的宽度
获取上边看的宽度
如果没有这个元素 则返回null 有则返回一个对象
获取 id 只能通过document来获取
document.getElementById("id")
如果没有这个元素 则返回一个空集合[伪数组] document.getElementsByClassName('class')
ie8魔鬼有兼容问题 document.getElementsByTagName("div")
document.getElementsByName("name")
document
document.documentElement
document.head
document.body
区别
el.parentNode可以获取到document el.parentElement不能获取到document 因为document不是一个元素
父元素.appendChild("子元素")
父元素.removeChild("子元素")
父元素.insertBefore(插入的新元素,要在哪个元素前面插入)
父元素.replaceChild(新的元素,被替换的元素)
既可以操作自带属性,也可以操作自定义属性
在自定义属性前面加 data- 如果自定义属性前面添加了 data- 那么这些自定义属性都会保存到el.dataset '对象' 里面 想要取得属性直接遍历对象即可 取值时 data-会被去掉 并且如果后面还有- 会把后面的-也去掉 并把-后面的首字母大写(驼峰命名法)
只能在body添加元素,并且会覆盖之前页面中的元素
创建一个标签存在内存里面 再通过 父元素.appendChild(“创建出来的元素”) 渲染到页面 appendChild细节 给父元素追加一个元素,添加在最后,如果此元素已经存在,则被移动到最后
为某元素添加内容,会覆盖原来的内容 +=就只会追加不会覆盖 每次innerHtml赋值(+=)都是重新渲染, 所以有可能会让之前的元素丢失, 还会让之前元素的事件丢失(事件委托可解决) 渲染耗性能,大量资源浪费 先拼接字符串 再循环完了后一次性追加到页面中
样式名 如果在css 有 "-" 的 应使用 驼峰命名法 background-color=> backgroundColor
el.classList 返回的是一个伪数组 保存的是元素上的所有类名
let flag=this.value=="隐藏" ? true : false divBox.style.display=flag ? "none" : "block" this.value=flag ? "显示" : "隐藏" // 这里用来下一次 点击再次toggle 所以需要与设置的flag相反设定对应的值
加上代表禁用 不加上代表启动 js里面设置它为 true 代表禁用、false 代表启用
innerHTML没有兼容问题 既可以拿到文本也可以渲染标签
innerText和textContent都是设置标签里面的文本内容 将数据当成字符串输出到页面 不会渲染 innerText在老版火狐里面不支持 textContent在ie9以下都不支持
window.getComputedStyle(element)["width"]
window.getComputedStyle(element).width
返回的string属性值 "100px"
/*ie8魔鬼专用*/
element.currentStyle['width']
element.getBoundingClientRect()
element.getBoundingClientRect().left
element.getBoundingClientRect().top
获取鼠标位置相对于自身的x和y (offsetX和offsetY有bug) e.clientX - 盒子到可视区域的left e.clientY - 盒子到可视区域的top
若有感兴趣的小伙伴,需要WebAPI思维导图原图的,关注我,私信回复获取:WebAPI思维导图原图
作者:蓝海00
转载链接:https://www.jianshu.com/p/d3b815c8d914
*请认真填写需求信息,我们会在24小时内与您取得联系。