- 浏览: 1465408 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 8633模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5372目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6058看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7402promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1790为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2853简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2851场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2271分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7077作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2483这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2172事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1664一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 5244随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2682@slideshare 原生: ... -
事件机制探讨
2010-06-21 13:54 2246由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1591很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1817yui3 的沙箱机制可以在 ... -
yui3下的load事件触发
2010-06-01 13:31 3250以前的一些总结:页面l ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 2008YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2788资料: 关于新发 ...
相关推荐
// 返回下一个侧边节点,但一定要是div的,找到就返回,类型是Ext.Element Ext.fly('elId').next("div"); 27.prev 获取上一个侧边节点,跳过文本节点。可选地可送入一个期待的选择符。 // 返回上一个侧边节点,...
对于新用户而言,掌握`Ext.onReady`函数以及`Ext.Element`对象的基本用法是非常重要的。随着对Ext库更深入的学习,你会发现它还提供了更多高级的功能,如数据绑定、图表绘制等,可以满足更复杂的应用场景需求。
这里的关键在于使用了 `Ext.Panel` 和 `Ext.image` 这两个组件来封装图片展示逻辑。 ##### 3.2 拖动功能的实现 为了使图片可以被用户拖动,需要使用到 ExtJs 提供的拖放 API。主要涉及到的类有 `Ext.dd....
在上面的代码中,我们使用 Ext.create 方法创建了一个存储模型,并将其作为 desktop 的配置项。在这里,我们可以添加、删除或修改桌面图标,以查看不同的效果。 小结 在本教程中,我们使用 ExtJS 4.0 创建了一个...
Ext.fly(items[i]).setXY([col.x, row.y]); // 更新行索引和位置 row.index++; row.y = row.y + btnHeight + btnPadding; } } // 在createDataView中添加监听器 createDataView: function () { return { // ...
Ext.fly(items[i]).setXY([col.x, row.y]); // 设置图标位置 row.index++; row.y = row.y + btnHeight + btnPadding; } } ``` ##### 2. 在`createDataView`函数中添加监听器 接下来,在`createDataView`函数中...
- **`YAHOO.util.Dom.setXY(element, [x, y])`**:同时设置元素`element`的水平和垂直坐标。 - **`YAHOO.util.Dom.getX(element)`**:获取元素`element`的水平坐标。 - **`YAHOO.util.Dom.getXY(element)`**:获取...
- 使用`Ext.fly(items[i]).setXY([col.x,row.y]);`动态设置每个图标的坐标,实现了灵活的布局控制。 ### 总结 通过上述分析,我们深入了解了如何在ExtJS 4.0中利用Desktop组件实现桌面图标自动换行功能。这不仅...
- `setXY(element, xy)`:设置元素的位置坐标。 - `getWidth(element)`和`getHeight(element)`:获取元素宽度和高度。 - `setWidth(element, width)`和`setHeight(element, height)`:设置元素的宽度和高度。 4....
YUI提供了详尽的位置控制和访问功能,如`setX`, `setY`, `setXY`, `getX`, `getY`, `getXY`用于定位元素,`getRegion`获取元素区域,以及获取页面可视区和文档尺寸的方法。 #### 结语 YAHOO UI 工具库不仅是一个...
5. **添加水印**:使用fpdf的`SetFont()`方法设置字体,`SetXY()`设置位置,`Cell()`或`MultiCell()`方法添加文本水印,`Image()`方法添加图片水印。注意,对于中文,你需要确保设置的字体支持中文字符。 ```php $...
std::cout << "Element at index 0 in v2: " << v2.at(0) ; // 输出:Element at index 0 in v2: 1.1 return 0; } ``` 通过以上内容的学习,我们可以了解到C++中的类模板和向量的基本概念及使用方法。类模板为...
3.setXY函数:locate_x_y(u8 x,u8 y),用于设置LCD12864液晶显示屏的显示坐标。 4.显示字符串函数:display_string(u8 x,u8 y,u8 *dat),用于在LCD12864液晶显示屏上显示字符串。 5.显示整型变量函数:DisInt(u8 x...
17. SETXY:设置小海龟的坐标。 18. SETX:设置小海龟的横坐标。 19. SETY:设置小海龟的纵坐标。 数学函数 20. SUM:求和函数。 21. REMAINDER:余数函数。 22. QUOTIENT:求商函数。 图形模式 23. DRAW:初始...
可以使用`SetXY`来设置文字的位置,`SetFont`来选择已注册的字体,`SetFontSize`来设定字体大小,`Cell`或`Text`来写入水印文本。 ```php function addWatermark($pdf, $text) { $pdf->SetTextColor(150, 150, ...
在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。所以,在C++编程中,人们喜欢用对象...
提供了`setPosition`, `getXY`, `setXY`等方法来获取和设置元素的位置坐标。 #### 三、YUI提供的element工具 Element工具集扩展了DOM操作的能力,提供了一系列更高级的DOM处理方法。 #### 四、YUI提供的Event工具...
在使用 FPDF 之前,你需要先下载扩展库文件。通常,这些文件包含一个 `fpdf.php`,将其放在项目中的适当目录下。然后在 PHP 脚本中通过 `require_once` 或 `include_once` 引入该文件,使你的脚本能够访问 FPDF 类...
《YUI使用文档》汉语版是一份详细的YUI学习材料,它涵盖了这个JavaScript库的核心功能和使用方法。YUI,全称Yahoo! User Interface Library,是Yahoo开发的一个开放源代码的JavaScript库,旨在帮助开发者创建交互式...
9. **SETX, SETY, SETXY**: 设定海龟的横纵坐标,使其移动到指定位置。 10. **SETHEADING**: 设置海龟的朝向,可以指定一个角度。 11. **XCOR, YCOR, GETXY**: 获取海龟当前的位置坐标。 12. **SETPC, SETBG**: 分别...