day0329

day0329

DOM 是一项 W3C (World Wide Web Consortium) 标准。

HTML DOM(文档对象模型)

HTML DOM 是 HTML 的标准对象模型和编程接口。它定义了:

 - 作为对象的 HTML 元素
 - 所有 HTML 元素的属性
 - 访问所有 HTML 元素的方法
 - 所有 HTML 元素的事件

换言之:
HTML DOM 是关于如何获取、更改、添加或删除 HTML 元素的标准。

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

HTML DOM 模型被结构化为对象树:

 

DOM对象常用属性

DOM对象属性设置或者更改都会引起重绘

宽高:width  height

位置:left   top

鼠标位置: x y

 

DOM对象:

document对象:

document.documentElement→HTML元素

body对象:

document.body→body元素

DOM常用属性必须已经是 放在页面中 渲染的DOM对象元素

 

HTML DOM document对象:

文档对象代表网页。

如果希望访问 HTML 页面中的任何元素,那么总是从访问 document 对象开始。

提示:Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。

 

查找HTML元素:
 

 

改变HTML元素:

 

添加和删除元素:

 

添加事件处理程序:

 

查找HTML对象:

 

HTML DOM Element 对象

 

属性和方法

 

Element补充:

 

属性

 

 

宽高

属性中文含义解释
clientWidth clientHeight   客户宽高边框(不含)以内的所有宽高之和-滚动条宽高17px
offsetWidth offsetHeight 偏移宽高DOM元素在页面中占位的宽高
scrollWidth  scrollHeight滚动区域宽高 会变为内容宽度


    
      
   

 

 

 

scrollWidth会变为内容宽度

 

位置

属性中文含义解释
clientLeft  clientTop客户位置 边线宽高
offsetLeft  offsetTop偏移位置元素左上角(占位的左上顶点)的相对位置
scrollLeft  scrollTop滚动条位置滚动条位置

 

 

 

 

 

 

offsetLeft  offsetTop父元素有定位,相对于父元素;父元素无定位,相对于body

scrollLeft scrollTop 滚动条距离上端  可读可写

 

X/CH=ST/SH

 

初始化第一次渲染时,页面中的滚动条不可以设置,当第一次渲染完毕,交互时有效

 

实现返回顶部按钮

user-select:none   文本不能被选择

.div3{
            width: 100px;
            height: 10000px;
            overflow: scroll;
            border: 1px solid #000;
        }
        .div2{
            width: 50px;
            height: 50px;
            font-size: 50px;
            border:1px solid #000;
            text-align: center;
            user-select: none;/*文本不能被选择*/
            position: fixed;
            bottom: 100px;
            right: 100px;
            display: none;
        }
 
<div class="div2">^</div>
<div 
 class="div3">asdasd<br>asdasd<br>asdasd<br>asdasd<br>asdasd<br>asdasd<br>asdasd<br>asdasd<br>asdasd<br>asdasd<br>asdasd<br>asdasd<br></div>
       var div2;
       var bool=false;
        init();
        function init(){
            div2=document.querySelector(".div2");
            div2.addEventListener("click",clickhandler);
            document.addEventListener("scroll",scollHandler);
            setInterval(animation,16);//向上滚动有个过渡
        }

        function scollHandler(e){
            if(document.documentElement.scrollTop>document.documentElement.clientHeight){
                div2.style.display="block";
            }else{
                div2.style.display="none";
            }
        }

        function clickhandler(e){
            bool=true;
        }

        function animation(){
            if(!bool) return;
            document.documentElement.scrollTop-=500;
            bool=document.documentElement.scrollTop!==0;
        }

原来用body.scrollTop,现在用documentElement.scrollTop??

BFC导致margin合并

外边距合并:当两个块元素的垂直外边距相遇时,它们将形成一个外边距。合并的外边距的高度等于两个发生合并的外边距的高度中的较大者。

三种情况:

1.兄弟元素位于上下,上面的margin-bottom与下面的margin-top合并

2.父子元素margin-top合并

3.单独元素无内容,上下margin合并

 

事件

事件驱动型语言  与  注入式语言

解耦合

 

事件基础

Event

侦听接收   抛发

document.addEventListener("click",clickhandler);

        function clickhandler(e){
            console.log("aaa")
        }

系统事件:

自定义事件:

如果需要接收和抛发事件,必须要有对应的对象,接收和抛发的对象


接收和抛发的对象必须是同一个,而且必须是继承EventTarget类型的对象


所有的DOM对象都是可以抛发和接收事件的
        
接收和抛发对象必须一致,侦听事件类型必须和抛发事件类型一致,侦听必须在先,抛发在后

侦听事件的函数中,有且仅有一个参数,这个函数就是抛发的事件对象

document.dispatchEvent(evt);抛发事件

document.addEventListener("chilema",chilemeHandler);


var evt=new Event("chilema");
evt.a=10;
document.dispatchEvent(evt);//抛发事件

function chilemeHandler(e){
   console.log(e.a);
   console.log(e===evt);
}

观察者模式

中介者模式

Event补充:

 

事件原理

事件是针对事件目标对象的,来抛发内容

但是并不是直接抛发过去,尤其是针对DOM元素,根据  树型结构  来传递事件

var t=new EventTarget();//创建事件目标对象

三个阶段:

eventPhase

1.捕获阶段

外到內

2.目标阶段

停着

3.冒泡阶段

内到外冒泡

 

div{
    margin: auto;
    position: absolute;
    left:0;
    top:0;
    right: 0;
    bottom: 0;
}
.div1{
    width:300px;
    height: 300px;
    background-color: red;
}
.div2{
    width: 150px;
    height: 150px;
    background-color: orange;
}
.div3{
    width: 50px;
    height: 50px;
    background-color: yellow;
}   

 

<div class="div1">
    <div class="div2">
        <div class="div3"></div>
    </div>
</div>

 

 

var div1=document.querySelector(".div1");
var div2=document.querySelector(".div2");
var div3=document.querySelector(".div3");

 

addEventListener()

addEventListener(事件类型,事件执行函数,是否捕获阶段触发|事件配置对象)

 

事件类型 :

系统事件类型 被分为多个类别 例如  Event,MouseEvent,事件类型必须是字符串

事件执行函数  :

有且仅有一次参数,不能通过事件直接传入参数内容,因为事件执行函数是一个事件处理后回调的函数,所以只能传入函数名

如果传参就需要执行才可以,但是回调函数必须是函数名,因此不能在这里传参

div1.addEventListener("click",divclickHandler1);
div2.addEventListener("click",divclickHandler2);
div3.addEventListener("click",divclickHandler3);

 

事件执行函数是一个回调执行的,在事件处理中并没有处理这个回调执行的结果,也就意味着

事件执行函数不能是return返回数据

事件执行函数里面的this发生了改变
        
事件是否在捕获阶段被触发,默认是false,冒泡阶段触发

div2.addEventListener("click",divclickHandler2,true);

事件对象中的方法e.stopPropagation()是阻止传递

function divclickHandler3(e){
    console.log(e);
    e.stopPropagation();
    e.cancelBubble=true;//IE 8及以下
}

属性e.cancelBubble=true;//IE 8及以下

 

事件配置对象

 

{once:true}只触发一次

div1.addEventListener("click",divclickHandler1,{once:true});

{bubbles:true}就会让抛发的事件冒泡

var evt=new MouseEvent("click",{bubbles:true,clientX:100,clientY:100})
div3.dispatchEvent(evt);

侦听的事件目标对象和被点击到的目标对象并不是相同的

div1.addEventListener("click",divclickHandler1);

function divclickHandler1(e){
    console.log("div1","___________")
    console.log("this:",this)
    console.log("e.currentTarget:",e.currentTarget)
    console.log("e.srcElement:",e.srcElement)
    console.log("e.target:",e.target)

}

点击外面的红色div1:

 

点击中间的橙色div2:

 

点击里面的黄色div3:

 

在事件触发函数中

e.target和e.srcElement(IE兼容)相同:

事件  触发  的目标对象(比如可能是内部子元素)

this和currentTarget相同:

事件 侦听 的目标对象(设置侦听的)

事件委托

将子元素或者后代元素的事件委托给父元素

减少事件侦听的增加,防止内存泄漏

实现三级菜单点击隐藏

 

   ul {
        max-height: 1000px;
        transition: all 0.5s;
        overflow: hidden;
      }

 

    <ul class="menu">
      <li>
        北京
        <ul>
          <li>朝阳</li>
          <li>
            昌平
            <ul>
              <li>沙河</li>
              <li>老牛湾</li>
              <li>回龙观</li>
              <li>霍营</li>
              <li>天通苑</li>
            </ul>
          </li>
          <li>海淀</li>
          <li>东城</li>
          <li>通州</li>
        </ul>
      </li>
      <li>上海</li>
      <li>山西</li>
      <li>
        陕西
        <ul>
          <li>西安</li>
          <li>
            咸阳
            <ul>
              <li>泾阳</li>
              <li>三原</li>
              <li>淳化</li>
              <li>旬邑</li>
            </ul>
          </li>
          <li>铜川</li>
          <li>宝鸡</li>
        </ul>
      </li>
      <li>河北</li>
      <li>河南</li>
    </ul>

 

var menu = document.querySelector(".menu");
      menu.addEventListener("click", clickHandler);

      function clickHandler(e) {
        if (e.target.nodeName !== "LI") return;
        if (
            e.target.firstElementChild &&
            e.target.firstElementChild.nodeName === "UL"
        ) {
          if (!e.target.bool) {
            e.target.firstElementChild.style.maxHeight = 0;
            e.target.bool = true;
          } else {
            e.target.firstElementChild.style.maxHeight = "1000px";
            e.target.bool = false;
          }
        }
      }

点击对应的地点可折叠/显示

 

 

 

 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值