Position是prototype中定义的一个对象,提供了操作DOM中与位置相关的方法,要很好的理解元素在页面中的位置,具体代码如下,按照代码说说,其中英文是作者的注释,中文的才是偶的说明或翻译英文的注释,采用顶式注释法(注释在要说明的代码的上面)说明

  // set to true if needed, warning: firefox performance problems

  // NOT neeeded for page scrolling, only if draggable contained in

  // scrollable elements

  //只有在使用拖动的时候元素包含在有滚动条的元素中才需要设置为true

  includeScrollOffsets: false,http://www.hrbfc120.com

  // must be called before calling withinIncludingScrolloffset, every time the

  // page is scrolled

  //当页面被scrolled后,使用withinIncludingScrolloffset的时候需要先调用这个方法

  prepare: function() {

  //横向滚动条滚动的距离

  this.deltaX = window.pageXOffset

  || document.documentElement.scrollLeft

  || document.body.scrollLeft

  || 0;

  //纵向滚动条滚动的距离

  this.deltaY = window.pageYOffset

  || document.documentElement.scrollTop

  || document.body.scrollTop

  || 0;

  },

  //元素由于滚动条偏移的总距离http://www.120hrb.com

  realOffset: function(element) {

  var valueT = 0, valueL = 0;

  do {

  valueT += element.scrollTop || 0;

  valueL += element.scrollLeft || 0;

  element = element.parentNode;

  } while (element);

  return [valueL, valueT];

  },

  //元素在页面中由offsetParent累积的offset,当offsetParent都没有滚动条时,就是元素在页面中的位置

  cumulativeOffset: function(element) {

  var valueT = 0, valueL = 0;

  do {

  valueT += element.offsetTop || 0;

  valueL += element.offsetLeft || 0;

  element = element.offsetParent;

  } while (element);

  return [valueL, valueT];

  },

  //元素相对于containing block("nearest positioned ancestor")的位置,也就是相对于最近的一个position设置为relative或者absolute的祖先节点的位置,如果没有就是相对于 body的位置,跟style.top,style.left一样?

  positionedOffset: function(element) {

  var valueT = 0, valueL = 0;

  do {

  valueT += element.offsetTop || 0;

  valueL += element.offsetLeft || 0;

  element = element.offsetParent;

  if (element) {

  if(element.tagName==’BODY’) break;

  var p = Element.getStyle(element, 'position’);

  if (p == 'relative’ || p == 'absolute’) break;

  }

  } while (element);

  return [valueL, valueT];

  },

  //offsetParent

  offsetParent: function(element) {

  if (element.offsetParent) return element.offsetParent;

  if (element == document.body) return element;

  while ((element = element.parentNode) && element != document.body)

  if (Element.getStyle(element, 'position’) != ’static’)

  return element;

  return document.body;

  },

  // caches x/y coordinate pair to use with overlap

  //判断指定的位置是否在元素内

  within: function(element, x, y) {

  if (this.includeScrollOffsets)

  return this.withinIncludingScrolloffsets(element, x, y);

  this.xcomp = x;

  this.ycomp = y;

  this.offset = this.cumulativeOffset(element);

  return (y >= this.offset[1] &&

  y < this.offset[1] + element.offsetHeight &&

  x >= this.offset[0] &&

  x < this.offset[0] + element.offsetWidth);

  },

  //跟within差不多,不过考虑到滚动条,也许是在元素上面,但不是直接在上面,因为滚动条也许已经使元素不可见了

  withinIncludingScrolloffsets: function(element, x, y) {

  var offsetcache = this.realOffset(element);

  this.xcomp = x + offsetcache[0] - this.deltaX;

  this.ycomp = y + offsetcache[1] - this.deltaY;

  this.offset = this.cumulativeOffset(element);

  return (this.ycomp >= this.offset[1] &&http://www.hebby120.com

  this.ycomp < this.offset[1] + element.offsetHeight &&

  this.xcomp >= this.offset[0] &&

  this.xcomp < this.offset[0] + element.offsetWidth);

  },

  // within must be called directly before

  //在调用这个方法前,必须先调用within,返回在with指定的位置在水平或者垂直方向上占用的百分比

  overlap: function(mode, element) {

  if (!mode) return 0;

  if (mode == 'vertical’)

  return ((this.offset[1] + element.offsetHeight) - this.ycomp) /

  element.offsetHeight;

  if (mode == 'horizontal’)

  return ((this.offset[0] + element.offsetWidth) - this.xcomp) /

  element.offsetWidth;

  },

  //返回元素相对页面的真实位置

  page: function(forElement) {

  var valueT = 0, valueL = 0;

  var element = forElement;

  do {

  valueT += element.offsetTop || 0;

  valueL += element.offsetLeft || 0;

  // Safari fix

  if (element.offsetParent==document.body)

  if (Element.getStyle(element,’position’)==’absolute’) break;

  } while (element = element.offsetParent);

  element = forElement;

  do {

  if (!window.opera || element.tagName==’BODY’) {

  valueT -= element.scrollTop || 0;

  valueL -= element.scrollLeft || 0;

  }

  } while (element = element.parentNode);

  return [valueL, valueT];

  },

  //设置target为source的位置,大小

  clone: function(source, target) {

  var options = Object.extend({

  setLeft: true,

  setTop: true,

  setWidth: true,

  setHeight: true,

  offsetTop: 0,

  offsetLeft: 0

  }, arguments[2] || {})

  // find page position of source

  source = $(source);

  var p = Position.page(source);

  // find coordinate system to use

  target = $(target);

  var delta = [0, 0];

  var parent = null;

  // delta [0,0] will do fine with position: fixed elements,

  // position:absolute needs offsetParent deltas

  if (Element.getStyle(target,’position’) == 'absolute’) {

  parent = Position.offsetParent(target);

  delta = Position.page(parent);

  }

  // correct by body offsets (fixes Safari)

  if (parent == document.body) {

  delta[0] -= document.body.offsetLeft;

  delta[1] -= document.body.offsetTop;

  }

  // set position

  if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px’;

  if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px’;

  if(options.setWidth) target.style.width = source.offsetWidth + 'px’;

  if(options.setHeight) target.style.height = source.offsetHeight + 'px’;

  },

  //将element的position设置为absolute的模式http://www.hrbfkyy120.com

  absolutize: function(element) {

  element = $(element);

  if (element.style.position == 'absolute’) return;

  Position.prepare();

  var offsets = Position.positionedOffset(element);

  var top = offsets[1];

  var left = offsets[0];

  var width = element.clientWidth;

  var height = element.clientHeight;

  element._originalLeft = left - parseFloat(element.style.left || 0);

  element._originalTop = top - parseFloat(element.style.top || 0);

  element._originalWidth = element.style.width;

  element._originalHeight = element.style.height;

  element.style.position = 'absolute’;

  element.style.top = top + 'px’;;

  element.style.left = left + 'px’;;

  element.style.width = width + 'px’;;

  element.style.height = height + 'px’;;

  },

  //将element的position设置为absolute的模式

  relativize: function(element) {

  element = $(element);

  if (element.style.position == 'relative’) return;

  Position.prepare();

  element.style.position = 'relative’;

  var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);

  var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

  element.style.top = top + 'px’;

  element.style.left = left + 'px’;

  element.style.height = element._originalHeight;

  element.style.width = element._originalWidth;

  }

  }

  // Safari returns margins on body which is incorrect if the child is absolutely

  // positioned. For performance reasons, redefine Position.cumulativeOffset for

  // KHTML/WebKit only.

  if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {

  Position.cumulativeOffset = function(element) {

  var valueT = 0, valueL = 0;

  do {

  valueT += element.offsetTop || 0;

  valueL += element.offsetLeft || 0;

  if (element.offsetParent == document.body)

  if (Element.getStyle(element, 'position’) == 'absolute’) break;

  element = element.offsetParent;

  } while (element);

  return [valueL, valueT];

  }

  }

  终于把Prototype的所有部分都写完了,哈哈,越来越佩服自己的耐力了

  下一步决定写写Scriptaculous这个超级流行的效果库

  Prototype1.5的下载为什么不简单点

  这几天在论坛和博客上看到很多人问Prototype1.5怎么下载,为什么下载这么困难呢?

  Prototype的官方网站是:http://prototype.conio.net/,如果你一下子找不到,到google上搜索Prototype就找到了

  下载当然要到官方网站下载了,但是问题是Prototype官方网站更新太慢,首页上的下载连接还是prototype1.4的,而且只是一个单独的js文件

  那么怎么下载最新版本的呢?

  1,如果你只想得到一个单独的js文件使用的话,其实官方网站提供了最新版1.5的下载, 下面连接就是下载地址了http://dev.rubyonrails.org/browser/trunk/railties/html/javascripts/prototype.js?format=raw

  2,如果你想得到详细的源文件以及测试代码,需要通过svn下载:使用下面的命令就可以了:svn co http://dev.rubyonrails.org/svn/rails/spinoffs/prototype

  如果你没有svn的话,我已经下载打包了传到51js论坛中,查看下面连接的帖子中有下载的:http://bbs.51js.com/viewthread.php?tid=65070&highlight=prototype

  想必很多prototype爱好者都一直在等待着prototype1.5的发布,虽然等待的时间很长,但是这一令人激动的一天终于到来了

  因为网友提醒,今天访问prototype网站,发现原来的网址已经自动跳转到新的网站去了, 作者使用了一个独立的域名 http://www.prototypejs.org/

  刚才在google里搜索prototype,发现搜索结果中出现的已经是新网站了,google爬虫也蛮勤快的嘛

  更让人高兴的是,一向被人诟病的文档问题这一版有了非常大的提高,可以说是有了质的飞跃,以前的版本基本上没有文档,要使用只有自己理解了,

  现在在它的官方网站上有专门的API参考以及一些使用的例子,看来作者真正的关于这个问题来了,prototype爱好者应该高兴一把了哈哈,赶快到prototype官方网站下载了Engoy吧 如果感觉阅读英文是一种折磨的话,可以参考我以前写的prototype 1.5使用指南系列文章.

  --声明:该使用指南文章为转载,由于是来源于多次转载,未找到原出处。再次感谢作者与翻译人员。

转载于:https://www.cnblogs.com/hljmly/p/5655975.html

prototype使用学习手册指南之Position.js相关推荐

  1. EduCoder js学习手册15 答案

    EduCoder js学习手册15 事件:指用户在网页上的操作或者网页元素加载过程中发生的事情. 比如,用鼠标点击了一个按钮,按下了回车键,鼠标移动到图片上,这些都是事件. 可以看出的是,每一个事件都 ...

  2. 如何成为一名牛逼Web前端开发人员?入行学习完整指南

    经过如此多的试验和测试,而不是说你从头开始创建了所有内容,接着,你在网页上创建了第一个登录表单时,你感觉如何? 经过了多次更改后,将布局分配给第一个Web应用程序时感觉如何? 当成功处理了数千个用户的 ...

  3. 【转载】XML轻松学习手册

    XML越来越热,关于XML的基础教程网络上也随处可见.可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介 ...

  4. 2023年的深度学习入门指南(6) - 在你的电脑上运行大模型

    2023年的深度学习入门指南(6) - 在你的电脑上运行大模型 上一篇我们介绍了大模型的基础,自注意力机制以及其实现Transformer模块.因为Transformer被PyTorch和Tensor ...

  5. 安卓开发重磅炸弹!程序员福利!《高级Kotlin强化实战学习手册(附Demo)》开放下载!

    前言 自Google宣布将 Kotlin 作为 Android 开发的首选语言 (Kotlin-first),现已有60% 的专业 Android 开发者已经采用了该编程语言.在 Google Pla ...

  6. PostgreSQL学习手册(五) 函数和操作符

    PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:     常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:     下面是Po ...

  7. python学习手册中文版免费下载-Python学习手册 第三版

    <Python学习手册(第3版)>讲述了:Python可移植.功能强大.易于使用,是编写独立应用程序和脚本应用程序的理想选择.无论你是刚接触编程或者刚接触Python,通过学习<Py ...

  8. C#新手该如何规划学习【学习路线指南】

    花费了几天时间整理了C#学习路线图,可以说是纯野生C#程序员成长路线规划,在这里分享下,希望可以帮助到想从事C#开发的同学们.本人阅历尚浅,有些知识点可能分享不正确,希望广大网友评论区补充,我会同步修 ...

  9. NumPy 数组学习手册·翻译完成

    原文:Learning NumPy Array 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 面试求职交流群 ...

最新文章

  1. LeetCode—笔记—51、N皇后——递归回溯,个人思路,简单易懂
  2. 一条标准SQL语句是怎么执行之“步步惊心”过程详解与案例分析
  3. x64 stack walking、调用约定、函数参数识别
  4. Ubuntu 更改源
  5. 字段不显示 继承_Springboot Shiro页面按钮显示、路径越权访问题
  6. iis7 php 中文乱码,php输出文字乱码的解决方法
  7. Java实现HTML页面截图功能
  8. java web 播放flv,实现网页中播放FLV文件的源代码
  9. MongoDB find查询语句详解
  10. pc端vue登录如何调用软键盘_vue.js怎样隐藏软键盘
  11. 广讯通显示连接服务器失败怎么办,苹果手机连接服务器失败原因
  12. 【办公-excel】Excel批量翻译
  13. Akka(二):使用Akka模拟yarn
  14. 如何打造高效的团队(一) - 团队架构
  15. mfc实现c语言的注释,C语言学习:标识符、关键字、注释、表达式和语句
  16. [nlp] 车载语音助手
  17. 《神经网络与深度学习》算法伪代码汇总
  18. 操作系统(二)进程管理
  19. 如何用python制作正方形模拟器 python项目小发明 【安安教具】-【数学】-【正方形】模拟器
  20. 【读书笔记】用Python获取A股行情数据的4种方法

热门文章

  1. 火力全开2不显示服务器,火力全开2搜不到服务器怎么办 需要root吗
  2. 计算机对等网络,对等网
  3. 芯科EmberZNet_ZigBee3.0_EFR32MG开发日记五:新建EmberZNet工程1
  4. OPGLOBE DTE2638EP气锤
  5. 如何设计一个循环队列
  6. h5棋牌房间如何安装 现在分享一套搭建教程
  7. 深入浅出讲解h5棋牌开发的socket通信
  8. “双碳”目标,数字化的新阵地
  9. 闲鱼跳转支付宝源码+独立后台
  10. 轮式移动机器人基础及滑模控制仿真