var RelativePosition = function(){
function getLeft( align, rect, rel ){
var iLeft = 0;
switch (align.toLowerCase()) {
case "left" :
return rect.left - rel.offsetWidth;
case "clientleft" :
return rect.left;
case "center" :
return ( rect.left + rect.right - rel.offsetWidth ) / 2;
case "clientright" :
return rect.right - rel.offsetWidth;
case "right" :
default :
return rect.right;
};
};
function getTop( valign, rect, rel ){
var iTop = 0;
switch (valign.toLowerCase()) {
case "top" :
return rect.top - rel.offsetHeight;
case "clienttop" :
return rect.top;
case "center" :
return ( rect.top + rect.bottom - rel.offsetHeight ) / 2;
case "clientbottom" :
return rect.bottom - rel.offsetHeight;
case "bottom" :
default :
return rect.bottom;
};
};
//定位元素 相对定位元素
return function ( fix, rel, options ) {
//默认值
var opt = $$.extend({
align: "clientleft",//水平方向定位
vAlign: "clienttop",//垂直方向定位
customLeft: 0,//自定义left定位
customTop: 0,//自定义top定位
percentLeft: 0,//自定义left百分比定位
percentTop: 0,//自定义top百分比定位
adaptive: false,//是否自适应定位
reset: false//自适应定位时是否重新定位
}, options || {});
//定义参数
var rect = $$D.clientRect(fix)
,iLeft = getLeft(opt.align, rect, rel) + opt.customLeft
,iTop = getTop(opt.vAlign, rect, rel) + opt.customTop;
//自定义百分比定位
if (opt.percentLeft) { iLeft += .01 * opt.percentLeft * fix.offsetWidth; };
if (opt.percentTop) { iTop += .01 * opt.percentTop * fix.offsetHeight; };
//自适应视窗定位
if (opt.adaptive) {
//修正定位参数
var doc = fix.ownerDocument
,maxLeft = doc.clientWidth - rel.offsetWidth
,maxTop = doc.clientHeight - rel.offsetHeight;
if (opt.reset) {
//自动重新定位
if (iLeft > maxLeft || iLeft < 0) {
iLeft = getLeft(2 * iLeft > maxLeft ? "left" : "right", rect, rel) + opt.customLeft;
};
if (iTop > maxTop || iTop < 0) {
iTop = getTop(2 * iTop > maxTop ? "top" : "bottom", rect, rel) + opt.customTop;
};
} else {
//修正到适合位置
iLeft = Math.max(Math.min(iLeft, maxLeft), 0);
iTop = Math.max(Math.min(iTop, maxTop), 0);
};
};
//加上滚动条
iLeft += $$D.getScrollLeft(fix); iTop += $$D.getScrollTop(fix);
//返回定位参数
return { Left: iLeft, Top: iTop };
};
}();

原文来自:

http://www.cnblogs.com/cloudgamer/archive/2009/10/29/Cloudgamer_JavaScript_Library.html

http://www.cnblogs.com/cloudgamer/archive/2009/08/10/FixedMenu.html

非常好的一个JS代码(RelativePosition.js)的更多相关文章

  1. JavaScript 之 动态加载JS代码或JS文件

    2.动态加载JS文件 <script type="text/javascript"> function loadScript(url, callback) { var ...

  2. 重构JS代码 - 让JS代码平面化

    js中的嵌套函数用的很多,很牛叉,那为何要平面化? 易懂(自己及他人) 易修改(自己及他人) 平时Ajax调用写法(基于jQuery) $.post('url', jsonObj, function ...

  3. 一个用于将sql脚本转换成实体类的js代码

    以前写过一段C#,苦于编译才能用.这样的小工具最好是用脚本语言来编写,易于执行,也易于修改. js 代码 convert.js ------------------------------------ ...

  4. 利用ajax获取到的网页源码不能执行js代码

    今天觉得我的博客中加载腾讯微博的速度很慢,所以就想改写为js,本来以为直接新建一个页面,把获取函数移到新的页面中,原来的页面只要使用xmlhttp去GET一下,然后把div的innerhtml属性等于 ...

  5. JS代码平面化

    重构JS代码 - 让JS代码平面化   js中的嵌套函数用的很多,很牛叉,那为何要平面化? 易懂(自己及他人) 易修改(自己及他人) 平时Ajax调用写法(基于jQuery) $.post('url' ...

  6. python 调用js代码

    Python2   安装pyv8 pip install-egit://github.com/brokenseal/PyV8-OS-X#egg=pyv8 from pyv8 import PyV8 c ...

  7. JS代码执行机制

    JS代码从编译到执行 我们写出一段JS代码,JS的引擎并不是按照我们书写的顺序从上到下顺序编译并且执行的,首先是按照自己的规则对我们的代码先进行编译,然后从上到下执行编译的代码. 在全局作用域中,JS ...

  8. 页面加载完之后在执行js代码

    把代码写在 window.onload = function () { //js代码 //此处js代码是页面完全加载完之后执行 } 即可. 例: <script type="text/ ...

  9. 如何在一个网站或者一个页面,去书写你的JS代码

    // JavaScript Document //如何在一个网站或者一个页面,去书写你的JS代码: //1.js的分层(功能) : jquery(tools) 组件(ui) 应用(app), mvc( ...

  10. 一个只有99行代码的JS流程框架

    张镇圳,腾讯Web前端高级工程师,对内部系统前端建设有多年经验,喜欢钻研捣鼓各种前端组件和框架. 最近一直在想一个问题,如何能让js代码写起来更语义化和更具有可读性. 上周末的时候突发奇想,当代码在运 ...

随机推荐

  1. 【环境配置】出现:Microsoft Visual C++ 14.0 is required 的解决方案

    参考blog https://download.csdn.net/download/amoscn/10399046 https://blog.csdn.net/weixin_42057852/arti ...

  2. Autel MaxiIM IM608:如何更新和一些评论

    MaxiIM IM608是最先进的,因此是与众不同的一种钥匙编程和诊断工具,它将先进的钥匙编程,所有系统医学和先进的服务融合在一个主要基于10.1英寸触摸屏的机械人中.它配备了XP400关键计算机用户 ...

  3. npoi 导出

    npoi 导出 public void Output(DataTable table, string SheetName, string reportName) { string result = s ...

  4. [SCOI2009]windy数 代码 (对应数位dp入门)

    Code1 (DP版) #include<bits/stdc++.h> #define in(i) (i=read()) using namespace std; int read() { ...

  5. Java集合框架之简述

    Java集合框架简述 Java中的集合类是一种工具类,就像是容器,存储任意数量的具有共同属性的对象,集合框架是一个用来代表和操纵集合的统一架构,包含如下部分: 1.接口: 接口是代表集合的抽象数据类型 ...

  6. js获取键盘编码

    原理:键盘上的按键都有各自的键码,通过这个键码可以来判断按下的是哪个键,下面函数可以获取键盘的键码,按下键盘按键就会在控制台打印出相应的键码 document.addEventListener(&qu ...

  7. 基于Redis的分布式锁安全性分析-转

    基于Redis的分布式锁到底安全吗(上)?  2017-02-11 网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词“Redis 分布式锁”随便到哪个搜索引擎上去搜索一下就知道了 ...

  8. ARTS打卡计划第五周

    Algorithms: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 采用了map的 ...

  9. 码云转移至阿里云Code记录

    用起来还是挺简单的,跟码云差不多,但关键是企业私有项目成员人数没有限制!码云限制5人(免费) 注意两点: 1.导入仓库链接的时候,如果username是邮箱含@,要换成%40,不然这个项目直接报500 ...

  10. Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference

    指针基础知识package main import "fmt" func main() { var p *int p = new(int) *p = 1 fmt.Println(p ...