`
yiminghe
  • 浏览: 1465603 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

解析 Ext.Element.setXY()

阅读更多

用于将元素定位到指定的页面绝对坐标处。深刻理解relative,absolute 的区别 ,与 offsetParent 的关系

 

setXYArray pos , [Boolean/Object animate ]  ) : Ext.Element

Sets the position of the element in page coordinates, regardless of how the element is positioned. The element must b...
Sets the position of the element in page coordinates, regardless of how the element is positioned. The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
Parameters:
  • pos : Array
    Contains X & Y [x, y] values for new position (coordinates are page-based)
  • animate : Boolean/Object
    (optional) True for the default animation, or a standard Element animation config object
Returns:
  • Ext.Element
    this

setXY: function (el, xy) {
    el = Ext.fly(el, '_setXY');
    // 如果当前元素没有被定位, 将当前元素  相对定位(relative),这样才能用 top left 移动才元素
    //这一句后,当前元素只能为 relative 或者 absolute (fixed 暂不考虑)
    el.position();
    //主要函数,
    //如果当前元素为 absolute 得到当前元素相对于它已定位父亲的 top left 值
    //如果当前元素为 relative 得到和当前元素位置的偏移量,与它已定位父亲无关
    var pts = el.translatePoints(xy);
    //根据得到的值,设置
    if (xy[0] !== false) {
        el.dom.style.left = pts.left + "px";
    }
    if (xy[1] !== false) {
        el.dom.style.top = pts.top + "px";
    }
}
 
重点就是  translatePoints

原理:

1.当前元素定位relative :得到和现在位置的差值即可,就是相对定位的定义。

2.当前元素为 absolute,根据绝对定位的定义,需要得到当前元素相对于它已定位父亲的 top left 值



translatePoints: function (x, y) {
    if (typeof x == 'object' || Ext.isArray(x)) {
        y = x[1];
        x = x[0];
    }
    var p = this.getStyle('position');
    //得到 未移动前 元素在页面上的绝对坐标
    var o = this.getXY();
    //对于绝对定位 :得到相对于已定位父亲的 差值
    //对于相对定位:取得该元素原先的偏移量
    // ff 若没有 手动 设置 则返回 当前计算得到的数值
    //ie 若没有手动设置 ,则返回 auto
    var l = parseInt(this.getStyle('left'), 10);
    var t = parseInt(this.getStyle('top'), 10);
    //如果 没有设置 ,
    //对于 绝对定位需要得到和已定位祖先的差值,则取  this.dom.offsetLeft
    //对于相对定位 则证明和原先位置无偏移,取0,为了下面计算公式统一
    if (isNaN(l)) {
        l = (p == "relative") ? 0 : this.dom.offsetLeft;
    }
    if (isNaN(t)) {
        t = (p == "relative") ? 0 : this.dom.offsetTop;
    }
    //对于绝对定位:o[0]-l 为 已定位的父亲节点 的 页面绝对坐标, x-(o[0]-l) 即为 相对于 已定位的父亲节点 的 相对坐标
    //对于相对定位 :o[0]-l 为 当前元素没有偏移时的位置,x-(o[0]-l) 是 为了使元素达到 x,y绝对坐标 ,需要偏移原来位置的数值
    return {
        left: (x - o[0] + l),
        top: (y - o[1] + t)
    };
}
 
于是就实现了将元素移到了指定的页面绝对坐标。

1.对于当前元素没有定位的情况(首先设置为相对定位)或相对定位的情况:
就是要计算出要达到的目的位置和当前位置的差值,然后设置left top css

2.对于当前元素绝对定位的情况:
实际上 就是设置了合适的 相对于 他已定位父亲元素的 left top css值

注意 :
top left 只有在 postion 为 relative absolute 是才起作用,且都是相对于它的祖先节点(postion 为 relative absolute的祖先节点),偏移 top left 的。

注意2:
此方法当绝对定位元素没有设置初始left,top时,ie下会有bug :

 

  • 大小: 15.1 KB
分享到:
评论

相关推荐

    EXTJS总结.txt

    // 返回下一个侧边节点,但一定要是div的,找到就返回,类型是Ext.Element Ext.fly('elId').next("div"); 27.prev 获取上一个侧边节点,跳过文本节点。可选地可送入一个期待的选择符。 // 返回上一个侧边节点,...

    对Ext库的总体概述和完成一些常见的程序任务。新用户应从这里开始

    对于新用户而言,掌握`Ext.onReady`函数以及`Ext.Element`对象的基本用法是非常重要的。随着对Ext库更深入的学习,你会发现它还提供了更多高级的功能,如数据绑定、图表绘制等,可以满足更复杂的应用场景需求。

    ExtJs查看图片控件,并且图片可以拖动例子.docx

    ### ExtJs查看图片控件并且图片可拖动的知识点解析 #### 一、ExtJs简介 ExtJs 是一款用于构建企业级 Web 应用程序的前端框架,它提供了丰富的 UI 组件库,使得开发者能够快速地开发出功能完备且美观的应用界面。...

    用extjs 4.0打造自己的WEB桌面

    Ext.fly(item).setXY([col.x, row.y]); row.y = row.y + btnHeight + btnPadding + 4; } } ``` 接下来,我们需要在适当的地方调用 initShortcut 函数。例如,在 Apps.js 文件的 init 函数中,我们可以调用 ...

    解决extjs 桌面图标换行方法

    Ext.fly(items[i]).setXY([col.x, row.y]); // 设置图标位置 row.index++; row.y = row.y + btnHeight + btnPadding; } } ``` ##### 2. 在`createDataView`函数中添加监听器 接下来,在`createDataView`函数中...

    Ext 4 桌面图标换行

    Ext.fly(items[i]).setXY([col.x, row.y]); // 更新行索引和位置 row.index++; row.y = row.y + btnHeight + btnPadding; } } // 在createDataView中添加监听器 createDataView: function () { return { // ...

    extjs4.0desktop图标换行

    - 使用`Ext.fly(items[i]).setXY([col.x,row.y]);`动态设置每个图标的坐标,实现了灵活的布局控制。 ### 总结 通过上述分析,我们深入了解了如何在ExtJS 4.0中利用Desktop组件实现桌面图标自动换行功能。这不仅...

    经典的YUI 示例中文文档

    - **`YAHOO.util.Dom.setXY(element, [x, y])`**:同时设置元素`element`的水平和垂直坐标。 - **`YAHOO.util.Dom.getX(element)`**:获取元素`element`的水平坐标。 - **`YAHOO.util.Dom.getXY(element)`**:获取...

    YAHOO UI 工具库

    ### YAHOO UI 工具库深度解析 #### 引言 YAHOO UI 工具库,简称YUI,是雅虎推出的一款强大的前端开发框架,旨在简化Web应用程序的开发过程,提供了一系列高效、易用的工具和功能。本文将深入探讨YUI的核心组件及其...

    YAHOO.util.Dom.rar_YAHOO.util_YAHOO.util.Dom.chm_yahoo.util同步

    - `setXY(element, xy)`:设置元素的位置坐标。 - `getWidth(element)`和`getHeight(element)`:获取元素宽度和高度。 - `setWidth(element, width)`和`setHeight(element, height)`:设置元素的宽度和高度。 4....

    PCLOGO命令.pdf

    17. SETXY:设置小海龟的坐标。 18. SETX:设置小海龟的横坐标。 19. SETY:设置小海龟的纵坐标。 数学函数 20. SUM:求和函数。 21. REMAINDER:余数函数。 22. QUOTIENT:求商函数。 图形模式 23. DRAW:初始...

    c++程序设计实验指导:类和对象初识(2)

    主函数中创建 `Test` 类的对象 `p1` 和 `p2`,并通过 `Setxy` 函数为 `p1` 设置值,接着通过 `Getx` 和 `Gety` 函数获取这些值,并存储在变量 `a` 和 `b` 中。 **输出**: 3 5 **内存表示图**: 与方法2类似。 ####...

    C++对象和指针的引用

    从输出结果可以看出,当在被调用函数fun中,改变了对象的数据成员值[m1.setxy(12, 15)]和指向对象指针的数据成员值[m2->setxy(22, 25)]以后,可以看到只有指向对象指针作参数所指向的对象被改变了,而另一个对象作...

    C++及Windows可视化程序设计第5章PPT学习教案.pptx

    void Setxy(int a, int b); // 公有成员函数 void Move(int a, int b); void Display(); int Getx(); // 返回x坐标 int Gety(); // 返回y坐标 }; ``` 类的实例称为对象,通过类的构造函数创建。例如: ```cpp...

    c++基础day02作业.txt

    #### 知识点解析: 在C++中,函数重载(Overloading)允许在一个作用域中声明多个同名函数,只要这些函数的参数列表不同即可。这为程序设计提供了极大的灵活性。 #### 示例: ```cpp int func(int a, int b); // 两...

    SCJP Braindump SCJP 题库 SCJP 考题

    ### SCJP知识点解析 #### SCJP概述 - **SCJP**(Sun Certified Programmer for the Java Platform)是一项由Sun Microsystems提供、旨在验证Java程序员对Java语言掌握程度的专业认证。 - SCJP考试覆盖了Java编程的...

    贪吃蛇c语言代码

    ### 贪吃蛇C语言代码解析 #### 一、程序概述 本程序是一个基于C语言编写的简单贪吃蛇游戏。它适用于Windows环境下的控制台应用程序开发,具体而言是通过构建一个Win32 Console Application来实现的。该程序利用了`...

    YUI 详细说明文档

    提供了`setPosition`, `getXY`, `setXY`等方法来获取和设置元素的位置坐标。 #### 三、YUI提供的element工具 Element工具集扩展了DOM操作的能力,提供了一系列更高级的DOM处理方法。 #### 四、YUI提供的Event工具...

    STM32LCD12864

    3.setXY函数:locate_x_y(u8 x,u8 y),用于设置LCD12864液晶显示屏的显示坐标。 4.显示字符串函数:display_string(u8 x,u8 y,u8 *dat),用于在LCD12864液晶显示屏上显示字符串。 5.显示整型变量函数:DisInt(u8 x...

    C++课程设计上机实验PPT(2)

    例如,`void Point::Setxy(int a, int b)`就是`Point`类的`Setxy`成员函数的定义。 7. **对象的建立与成员函数的调用**: 在C++中,对象是类的实例。例如,`Point A, B;`创建了两个`Point`类型的对象。可以通过`.`...

Global site tag (gtag.js) - Google Analytics