javascript - 怎样才能读取到元素的offsetTop属性呢?
高洛峰
高洛峰 2017-04-11 11:21:14
0
1
234

我在做一个写个练习,生成一排p后,依次下落,当最后一个p落到目标点后,再从第一个p依次往上飞回原来的位置。这是我写的代码

请输入代码
window.onload=function(){
    var str=document.createElement("p");
    var len=10;
    for(var i=0;i<len;i++){
        str.innerHTML += '<p style="width:50px;height:50px;background:red;border-radius:50px;position:absolute;top:0px;left:'+i*50+'px"></p>';
    }
    document.body.appendChild(str);
    alert(str.style.width)
    var ap=str.getElementsByTagName("p");
    function fall(obj,v,target,callback){
            v= obj.offsetTop<target? v :-v   //此处不停报错说can't read //property "offsetTop" of undefined;
            
            clearInterval(obj.timer);
            obj.timer=setInterval(function(){
               var top=obj.offsetTop+v;
               if(top>target&&v>0||top<target&&v<0){
                  top=target;
               }
               obj.style.top=top+"px";
               if(top==target){
                   clearInterval(obj.timer);
                   callback&&callback();
               }
           },50)
    }
  var num=0;var timer=null;
  document.onclick=function(){
        clearInterval(timer);
        var flag=true;
          timer = setInterval(function () {
              if (flag) {
                  fall(ap[num], 20, 500);
                  num++;
                  if (num == ap.length/*//ap[ap.length-1].offsetTop===500*/) {
                      flag = false;
                      num = 0;
                  }
              } else {
                  fall(ap[num], 20, 0)
                  num++;
              }
          }, 60)
      }
  }"
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

Antworte allen(1)
阿神

目前找到一个错误。你在else部分未作长度判断

if (num == ap.length/*//ap[ap.length-1].offsetTop===500*/) {
                      flag = false;
                      num = 0;
                  }

导致num=10;
ap的索引只到9,ap[10]undefined,所以报错。
补充:
根据你的逻辑我贴下修改后的代码

   if (flag) {
                  if (num == ap.length) {
                      flag = false;
                      num = 0;
                  }else{
                  fall(ap[num], 20, 500);
                  num++;
                  }
              } else {
                  if (num == ap.length) {
                      flag = true;//这记得将flag重置为true,否则只能循环一次
                      num = 0;
                  }else{
                  fall(ap[num], 20, 0)
                  num++;
                  }
              }

可以自己再优化下。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!