前端攻城狮---js之dom对象(2)

简介:

本章节主要讲计算后样式和测量的相关知识点。

我们可以通过dom提供的可靠的api,去获取样式计算后最终的值。

计算后样式

获取计算后的样式的方法有以下几种

  • window.getComputedStyle("对象").getPropertyValue("属性");//window可以忽略
  • getComputedStyle("对象")["属性"];
  • 对象.currentStyle.属性;/对象.currentStyle[属性]

我们来分析一下三者的使用区别

-----getComputedStyle("对象").getPropertyValue("属性")

该方法无法兼容到IE6 7 8 ,后面的属性同css样式一样的写法

-----getComputedStyle("对象")["属性"];

该方法同样也无法兼容到IE6 7 8,后面的属性可以用css名字,也可以用到驼峰式。驼峰式如background-color要写成backgroundColor

------对象.currentStyle.属性/对象.currentStyle[属性]
对象.currentStyle.属性/对象.currentStyle[属性]

该方法用于IE6 7 8,后面的属性也需要驼峰式。

-----------------------------------------------------------------

那么有人会问,如果去兼容到IE6 7 8要怎么做?这时候我们就需要进行能力检测。

能力检测

    if(window.getComputedStyle){

        大于IE8的获取计算后样式的方法    

    }else{

        小于IE6 7 8 获取计算后样式的方法    

    }

以上就是获取计算后样式兼容性问题的解决方案,if里面的条件就是能力检测,去检测当前浏览器是否有getComputedStyle方法,没有也就是意味着IE版本小于等于8,则使用小于IE6 7 8的方法。下面我们来写一个封装一个能力检测获取计算后样式的方法。


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
div {
padding: 10px 20px 30px 40px;
}
</style>
</head>
<body>
<div></div>
<script type="text/javascript">
var div = document.getElementsByTagName("div")[0];
/**
obj元素,property属性:可能是css样式的,可能是驼峰式的需要做处理
**/
function isComputedStyle(obj,property){
if (window.getComputedStyle) {//能力检测
return getComputedStyle(obj)[property];//因为css样式或者是驼峰式都可以
}else{
if (property.indexOf("-")) {//非驼峰式需要转成驼峰式
property = property.replace(/\-([a-z])/g,function(match,$1){
return $1.toUpperCase();
})
}
return obj.currentStyle[property];
}
}
console.log(isComputedStyle(div,"padding-left"));
</script>
</body>
</html>

透明度

透明度在css样式中有两种设置方法,和js中设置的方法

    opacity:0.5;    ---->元素.style.opacity = 0.5;

    fliter:alpha(opacity=50);  ---->元素.style.fliter = "alpha(opactity="+50+");";

所以在通过计算后样式的时候,可能会有顾虑,其实高版本就要高版本的获取方式去获取opacity,低版本就用低版本的获取方法去获取opacity就可以算兼容,前提是opacity的值于fliter的值相等即可


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
div {
width: 300px;
height: 300px;
background: #000;
opacity: 0.2;
filter: alpha(opacity=20); /*为了兼容IE*/
}
</style>
</head>
<body>
<div>
</div>
<script type="text/javascript">
// 获取div的透明度
var oDiv = document.getElementsByTagName("div")[0];
alert(getComputedStyle(oDiv)["opacity"]); //0.2 高版本浏览器
// alert(oDiv.currentStyle.opacity); // IE6 7 8 .2
</script>
</body>
</html>
就可以做到兼容。

offsetLeft/offsetTop

因为offsetTop同offsetLeft一样,故在此我们就讲解offsetLeft

offsetLeft表示这个元素的左边距的外面到offsetParent的左边距的内侧的距离。

什么是offsetParent?offsetParent表示参照物,那么offsetParent参照的依据是什么呢?这里就是要为不同的浏览器的版本进行分析。

IE9以及chrome等高级浏览器

            自己祖先元素中,离自己最近的且设置了定位的元素,若都没有则以body为offsetparent。

IE8 

            同高级浏览器一样,但是需要多算上一条border的宽度(父亲的边框)

IE6 7

            第一种情况,自己有定位的,则offsetParent就是离自己最近的且有定位的元素

            第二种情况,自己没有定位的,则offsetParent就是离自己最近的且有width/height的元素

想要去兼容这三种情况要怎么去做?

            自己定位,父无边宽,且父设置了定位。

offsetWidth/offsetHeight

表示自己当前元素的宽高。(都兼容)

    offsetWidth = 左右border+width+左右padding

    offsetHeight = 上下border+height+上下padding

假如没有设置宽度和高度,则width和height有内容撑开。

clientWidth/clientHeight

也是表示自己当前元素的宽高。(都兼容 IE6有点小问题)

    clientWidth = width+左右padding

    clientHeight = height+上下padding

IE6  假如没有设置宽高的话,clientHeight的高度为0,其他浏览器都是正常的

定时器

1.setInterval(function(){},time)

2.setTimeout(function(){},time)

setInterval

表示每个一段时间去调用方法。对应的清除方法是如下


var timer = setInterval(function() {
}, 50);
clearInterval(timer)
setTimeout

表示延迟多少时间去调用方法,方法只调用一次。


var timer = setTimeout(function(){
console.log("setTimeout");
}, 1000);
clearTimeout(timer)

那么我们就可以通过定时器,去给修改元素的值,从而变了动画。下面我们来看看demo


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
div {
width: 100px;
height: 100px;
background-color: pink;
position: absolute;
left: 60px;
top: 40px;
}
</style>
</head>
<body>
<div class="box" id="box"></div>
<script type="text/javascript">
// 页面一打开,div运动到702px自动停止
var box = document.getElementById("box");
var num = 60;
var timer = setInterval(function() {
num+=8;
if(num>=702) {
// 拉终停表
num = 702;
clearInterval(timer);
}
box.style.left = num + "px";
}, 30);
</script>
</body>
</html>

以上demo就是用过定时器去不断的改变left,当left到了的值大于702的时候,就要去解绑定时器。

可以通过定时器去写一个自动无缝的轮播图,还有点击暂停再点击播放的功能。效果图如下。


有几个注意点,从最后一张到第一张图片的过渡,每一张图片的无缝。


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.banner{
width: 600px;
height: 130px;
overflow:hidden;
border: 1px solid black;
margin: 0 auto;
position: relative;
}
.banner .content {
width: 5400px;
height: 130px;
position: absolute;
}
ul{
list-style: none;
}
.banner .content li{
float: left;
}
.banner .content li img{
width: 600px;
height: 130px;
}
</style>
</head>
<body>
<div class="banner" id="banner">
<div class="content" id="content">
<ul>
<li><a href=""><img src="img/0.png"></a></li>
<li><a href=""><img src="img/1.png"></a></li>
<li><a href=""><img src="img/2.png"></a></li>
<li><a href=""><img src="img/3.png"></a></li>
<li><a href=""><img src="img/4.png"></a></li>
<li><a href=""><img src="img/5.png"></a></li>
<li><a href=""><img src="img/6.png"></a></li>
<li><a href=""><img src="img/7.png"></a></li>
<li><a href=""><img src="img/0.png"></a></li>
</ul>
</div>
</div>
<script type="text/javascript">
var banner = document.getElementById("banner");
var content = document.getElementById("content");
var img_list = content.getElementsByTagName("li");
var move_num = 0;
var timer;
move();
for(var i = 0;i<img_list.length;i++){
img_list[i].onclick=function(){
if (timer!=undefined) {
clearInterval(timer);
timer = undefined;
}else{
move();
}
}
}
function move (){
timer = setInterval(function(){
move_num -=5;
if (move_num<=-600*(img_list.length-1)) {
move_num = 0;
// clearInterval(timer);
}
content.style.left = move_num+"px";
},10);
}
</script>
</body>
</html>

Json

与后台的大部分数据交互都是json格式。

    var person = {
    "name":"heihei",
    "age":18,
    "sex":"m",
    "wife": {
    "name": "Angelababy",
    "age":16,
    "shengao":168
    }
    };

其中name就是key,heihei就是value,key必须是字符串带着双引号的。

如何去获取key对应的value?如获取name对应的值

    person.name / person["name"]这两种方式都可以去获取。

如何去给person添加新的值呢?

    person.hobby=["haha","heihei"];直接添加即可

如何去删除某个属性

    delete person.age

如何循环的获取person的k,value?

         for(var k in person) {
          alert(k);// 代表某个属性
          alert(person[k]); // 属性值
         }   

同样json对象还能存放方法

 person.myfun=function(){ console.log("hahaha")};直接添加即可

js的dom对象的基本知识已讲完,接下来会来讲自己封装一个动画运动框架,如有表达错的请谅解,并请提出指出,且修改错误,望能共同进步。

本文作者:gaoyouhuang
本文发布时间:2018年06月23日
本文来自云栖社区合作伙伴 CSDN,了解相关信息可以关注csdn.net网站。
目录
相关文章
|
14天前
|
JavaScript
JS 获取对象数据类型的键值对的键与值
JS 获取对象数据类型的键值对的键与值
|
19天前
|
前端开发 JavaScript 网络协议
前端最常见的JS面试题大全
【4月更文挑战第3天】前端最常见的JS面试题大全
41 5
|
17天前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
1天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
11 3
|
3天前
|
JavaScript 前端开发 UED
深入解析JavaScript原生操作DOM技术
【4月更文挑战第22天】本文深入探讨JavaScript原生DOM操作技术,包括使用`getElement*`方法和CSS选择器获取元素,借助`createElement`与`appendChild`动态创建及插入元素,修改元素内容、属性和样式,以及删除元素。通过掌握这些技术,开发者能实现页面动态交互,但应注意避免过度操作DOM以优化性能和用户体验。
|
3天前
|
JavaScript 前端开发 开发者
JavaScript中的错误处理:try-catch语句与错误对象
【4月更文挑战第22天】JavaScript中的错误处理通过try-catch语句和错误对象实现。try块包含可能抛出异常的代码,catch块捕获并处理错误,finally块则无论是否出错都会执行。错误对象提供关于错误的详细信息,如类型、消息和堆栈。常见的错误类型包括RangeError、ReferenceError等。最佳实践包括及时捕获错误、提供有用信息、不忽略错误、利用堆栈信息和避免在finally块中抛错。
|
8天前
|
JavaScript
【Js】检查Date对象是否为Invalid Date
【Js】检查Date对象是否为Invalid Date
10 0
|
9天前
|
存储 JavaScript 前端开发
JavaScript的引用数据类型主要包括对象
【4月更文挑战第16天】JavaScript的引用数据类型主要包括对象
16 4
|
10天前
|
存储 JavaScript 前端开发
JavaScript DOM 操作:解释一下 cookie、sessionStorage 和 localStorage 的区别。
Cookie是服务器发送至客户端的文本信息,会随每个请求发送回服务器,适合控制会话状态但可能暴露隐私。SessionStorage仅在当前会话中存储数据,关闭浏览器后清除,适合临时存储如登录状态。LocalStorage则持久保存数据,即使关闭浏览器也不会清除,适用于存储长期设置。三种方式各有侧重,应按需求选择。
15 0
|
10天前
|
JavaScript 前端开发 安全
JavaScript DOM 操作:解释一下浏览器的同源策略。
**同源策略**是浏览器安全基石,它阻止脚本跨不同协议、域名或端口访问资源,防止恶意行为。例如,HTTP页面无法直接用JS获取HTTPS页面内容。**CORS**允许跨域请求,但需服务器配合设置,通过`document.domain`属性可配置,但仍受限于服务器配置。
14 4