- 浏览: 1433053 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
有兴趣的可以在 ie ff 中分别执行这段代码 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>setXY bug</title> <!-- <script type="text/javascript" src="ext-base.js"></script> <script type="text/javascript" src="ext-core.js"></script> --> <script type="text/javascript" src="ext-core-3.0.js"></script> </head> <body> <div id="test1" style="position:relative;width:100px;height:100px;border:1px solid green; padding:20px;"> <div id="test2" style="position:absolute;width:50px;height:50px;margin:10px; border:1px solid red;"> </div> </div> <script type="text/javascript"> //<![CDATA[ Ext.onReady(function(){ alert("getBoundingClientRect of test2 : "+ document.getElementById('test2').getBoundingClientRect().left); alert("offsetLeft of test2 : "+document.getElementById('test2').offsetLeft); alert("getBoundingClientRect of test2's parent : "+ document.getElementById('test1').getBoundingClientRect().left); Ext.get('test2').setX(Ext.get('test2').getX()); //if fixed by myself //Ext.get('test2').setX(Ext.get('test2').getX() - //parseInt(Ext.get('test2').getStyle("margin-left"),10)); alert("after current getBoundingClientRect of test2 : "+ document.getElementById('test2').getBoundingClientRect().left); }); //]]> </script> </body> </html>
将得到的页面坐标再设置回去,ie元素位置却改变了。
分析:
在以前的文章 也分析过,由于 ie 不能取得运行时的未显式设置的 left 值,于是 extjs 用offsetLeft 变通了一下,可是毕竟 offsetleft 和 left 还是不一样的 。
left 可能都比较熟悉了,有一点注意: css 2.1 规定偏移是以外边距边界而不是以内容边界。
关于 offsetleft
在元素 A 上读取 offsetLeft 属性时,必须按以下算法返回结果值:
1. 如果元素 A 是 HTML 的 body 元素,其 display 属性计算值是 none,或者不具有 CSS 布局盒子,则返回 0,并停止本算法。
2. 如果元素 A 的 offsetParent 是 null 或者是 HTML 的 body 元素,以 CSS 像素为单位返回元素 A 左边框距画布原点的水平距离,并停止本算法。
3. 以 CSS 像素为单位返回元素 A 左 border edge 距其 offsetParent 左 padding edge 的距离。关于 border edge 与 padding edge 可见 css2.1 的相关定义
。
为了更好地理解,可以参照下图:
上图中,大块是小块的 offsetParent,红色是大块的边框,蓝色是小块的边框,蓝框外白色区域是大块的 padding 或/和 小块的 margin 或其他元素或其他原因造成的空白。offsetTop 是小块上边框上部与大块上边框下部的距离;offsetLeft 是小块左边框左部与大块左边框右部的距离。
则可见在例子中情况下 offsetLeft = left + margin-left
所以精确需要的话改动一下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>setXY bug</title> <script type="text/javascript" src="ext-base.js"></script> <script type="text/javascript" src="ext-core.js"></script> <!-- <script type="text/javascript" src="ext-core-3.0.js"></script> --> </head> <body> <div id="test1" style="position:relative;width:100px;height:100px; border:1px solid green;padding:20px;"> <div id="test2" style="position:absolute;width:50px;height:50px; margin:10px;border:1px solid red;"> </div> </div> <script type="text/javascript"> //<![CDATA[ Ext.onReady(function(){ alert("getBoundingClientRect of test2 : "+ document.getElementById('test2').getBoundingClientRect().left); alert("offsetLeft of test2 : "+document.getElementById('test2').offsetLeft); alert("getBoundingClientRect of test2's parent : "+ document.getElementById('test1').getBoundingClientRect().left); if(!isNaN(parseInt(Ext.get('test2').getStyle("left")))) Ext.get('test2').setX(Ext.get('test2').getX()); else Ext.get('test2').setX(Ext.get('test2').getX() - parseInt(Ext.get('test2').getStyle("margin-left"),10)); alert("after current getBoundingClientRect of test2 : "+ document.getElementById('test2').getBoundingClientRect().left); }); //]]> </script> </body> </html>
PS:
其实对于任何不能得到精确用户未设置left数值的浏览器都存在ie中的情况。(现代的标准浏览器可以避免),进一步发散来讲,这就涉及了 ie 下取得css属性像素值的问题 。另外还有
关于 setXY 的一点剖析 ,特别对于以html为包含块的情况。
已提交 extjs 官方bug报告。
评论
var xy = inputel.getXY(); date.style.top=0; date.style.left=0; date.setXY([xy[0]+1,xy[1]-1]);
发表评论
-
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8546模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5283目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 5954看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7284promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1745为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2784简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2788场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2199分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 6938作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2410这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2126事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1588一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 4420随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2564@slideshare 原生: ... -
事件机制探讨
2010-06-21 13:54 2176由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1537很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1769yui3 的沙箱机制可以在 ... -
yui3下的load事件触发
2010-06-01 13:31 3161以前的一些总结:页面l ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 1956YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2713资料: 关于新发 ...
相关推荐
// 返回下一个侧边节点,但一定要是div的,找到就返回,类型是Ext.Element Ext.fly('elId').next("div"); 27.prev 获取上一个侧边节点,跳过文本节点。可选地可送入一个期待的选择符。 // 返回上一个侧边节点,...
在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。所以,在C++编程中,人们喜欢用对象...
setxy,打印,st,ht,干净 汇编 全部:runMe runMe:绘图.o操作.o维护.o动作.o计算.o内存.o main.o gcc绘图.o操作.o维护.o动作.o计算.o内存.o main.o -o bin / runMe -导致-lm -Iinclude drawing.o:src / ...
用法: ... $pdf = new PDF_Chinese('P', 'mm', 'A4');...$pdf->SetXY($dycs['xm12'][0], $dycs['xm12'][1]); $len = strlen($xm12); $pdf->Cell($len, 14, $xm12); //打印输出 $pdf->Output();
放弃使用徽标解析器的支持SVG的分支! SVG.js的最小徽标命令集: 前进/后退落后左/左右/右SETX,SETY,SETXY 重复n [...] 至FOO:ARG1:ARG2 BODY END 计划: 重启家清除屏幕/清除/ CS 颜色[rgb] MAKE“ X 1(将:X...
请参见标准字词: print println if else goto gosub return for next end let rem徽章定制词led X,Y控制LED,X [0..2] RGB,Y [0..1]开/关tune A,B,C,D在持续时间D播放音调A,B,C clrscr清晰画面setxy X,...
void SetXY();//设置图片旋转 void setCurrentPos(int);//设置当前的位置 void KeyDownF1();//按下F1时触发 bool getIntarrayIndes(int);//获得当前要旋转的数 int GetEndPos();//获得结束位置 int ...
易语言七彩异形效果源码,七彩异形效果,generateTriangles,createQuad,loop,updateTriangles,renderTriangles,requestAnimationFrame,create,getX,getY,setX,setY,setXY,getLength,setLength,getAngle,atan2,setAngle...
void setXy(int x, int y);//获取窗口坐标 void updateScore();//更新分数 int delay = 0;//延迟 int eatFlag = 0;//吃了目标点的标记,默认为没有吃,吃了为1 int state = 1;//判断蛇状态的标记, 如果state==0,...