前端攻城狮---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的方法。下面我们来写一个封装一个能力检测获取计算后样式的方法。



   
   
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document </title>
  6. <style type="text/css">
  7. div {
  8. padding: 10px 20px 30px 40px;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <div> </div>
  14. <script type="text/javascript">
  15. var div = document.getElementsByTagName( "div")[ 0];
  16. /**
  17. obj元素,property属性:可能是css样式的,可能是驼峰式的需要做处理
  18. **/
  19. function isComputedStyle(obj,property){
  20. if ( window.getComputedStyle) { //能力检测
  21. return getComputedStyle(obj)[property]; //因为css样式或者是驼峰式都可以
  22. } else{
  23. if (property.indexOf( "-")) { //非驼峰式需要转成驼峰式
  24. property = property.replace( /\-([a-z])/g, function(match,$1){
  25. return $ 1.toUpperCase();
  26. })
  27. }
  28. return obj.currentStyle[property];
  29. }
  30. }
  31. console.log(isComputedStyle(div, "padding-left"));
  32. </script>
  33. </body>
  34. </html>

透明度

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

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

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

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



   
   
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document </title>
  6. <style type="text/css">
  7. div {
  8. width: 300px;
  9. height: 300px;
  10. background: #000;
  11. opacity: 0.2;
  12. filter: alpha(opacity=20); /*为了兼容IE*/
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div>
  18. </div>
  19. <script type="text/javascript">
  20. // 获取div的透明度
  21. var oDiv = document.getElementsByTagName( "div")[ 0];
  22. alert(getComputedStyle(oDiv)[ "opacity"]); //0.2 高版本浏览器
  23. // alert(oDiv.currentStyle.opacity); // IE6 7 8 .2
  24. </script>
  25. </body>
  26. </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

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



   
   
  1. var timer = setInterval(function() {
  2. }, 50);
  3. clearInterval(timer)
setTimeout

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



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

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



   
   
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document </title>
  6. <style type="text/css">
  7. div {
  8. width: 100px;
  9. height: 100px;
  10. background-color: pink;
  11. position: absolute;
  12. left: 60px;
  13. top: 40px;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <div class="box" id="box"> </div>
  19. <script type="text/javascript">
  20. // 页面一打开,div运动到702px自动停止
  21. var box = document.getElementById( "box");
  22. var num = 60;
  23. var timer = setInterval( function() {
  24. num+= 8;
  25. if(num>= 702) {
  26. // 拉终停表
  27. num = 702;
  28. clearInterval(timer);
  29. }
  30. box.style.left = num + "px";
  31. }, 30);
  32. </script>
  33. </body>
  34. </html>

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

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


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



   
   
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document </title>
  6. <style type="text/css">
  7. *{
  8. margin: 0;
  9. padding: 0;
  10. }
  11. .banner{
  12. width: 600px;
  13. height: 130px;
  14. overflow:hidden;
  15. border: 1px solid black;
  16. margin: 0 auto;
  17. position: relative;
  18. }
  19. .banner .content {
  20. width: 5400px;
  21. height: 130px;
  22. position: absolute;
  23. }
  24. ul{
  25. list-style: none;
  26. }
  27. .banner .content li{
  28. float: left;
  29. }
  30. .banner .content li img{
  31. width: 600px;
  32. height: 130px;
  33. }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="banner" id="banner">
  38. <div class="content" id="content">
  39. <ul>
  40. <li> <a href=""> <img src="img/0.png"> </a> </li>
  41. <li> <a href=""> <img src="img/1.png"> </a> </li>
  42. <li> <a href=""> <img src="img/2.png"> </a> </li>
  43. <li> <a href=""> <img src="img/3.png"> </a> </li>
  44. <li> <a href=""> <img src="img/4.png"> </a> </li>
  45. <li> <a href=""> <img src="img/5.png"> </a> </li>
  46. <li> <a href=""> <img src="img/6.png"> </a> </li>
  47. <li> <a href=""> <img src="img/7.png"> </a> </li>
  48. <li> <a href=""> <img src="img/0.png"> </a> </li>
  49. </ul>
  50. </div>
  51. </div>
  52. <script type="text/javascript">
  53. var banner = document.getElementById( "banner");
  54. var content = document.getElementById( "content");
  55. var img_list = content.getElementsByTagName( "li");
  56. var move_num = 0;
  57. var timer;
  58. move();
  59. for( var i = 0;i<img_list.length;i++){
  60. img_list[i].onclick= function(){
  61. if (timer!= undefined) {
  62. clearInterval(timer);
  63. timer = undefined;
  64. } else{
  65. move();
  66. }
  67. }
  68. }
  69. function move (){
  70. timer = setInterval( function(){
  71. move_num -= 5;
  72. if (move_num<= -600*(img_list.length -1)) {
  73. move_num = 0;
  74. // clearInterval(timer);
  75. }
  76. content.style.left = move_num+ "px";
  77. }, 10);
  78. }
  79. </script>
  80. </body>
  81. </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网站。
目录
相关文章
|
2月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
2月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
2月前
|
JSON 前端开发 JavaScript
JavaScript中对象的数据拷贝
本文介绍了JavaScript中对象数据拷贝的问题及解决方案。作者首先解释了对象赋值时地址共享导致的值同步变化现象,随后提供了五种解决方法:手动复制、`Object.assign`、扩展运算符、`JSON.stringify`与`JSON.parse`组合以及自定义深拷贝函数。每种方法都有其适用场景和局限性,文章最后鼓励读者关注作者以获取更多前端知识分享。
30 1
JavaScript中对象的数据拷贝
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
61 5
|
2月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
87 1
|
2月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
58 4
|
3月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
225 14
|
3月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
62 0
|
3月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
3月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。