- 浏览: 1471611 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
我们常常需要获得某个元素在页面的绝对位置,比如:经常需要弹出一个绝对定位的 div 在特定位置,有时是在一个元素的周围,有时是在鼠标单击的地方,如果我们方便的获得了 想要的页面绝对位置,那么指定 top left 属性即可,很方便,偏偏在这方面 IE 与标准却达不成一致,需要总结一下,Extjs 就是现成的桥接工具,帮我们屏蔽了各个浏览器的差异。
主要是 两个地方:
Ext.Element.getXY()
该方法获得页面中某个元素边框开始(不包括边框)的左,上,右和下分别相对浏览器视窗(即不包括滚屏长度)的位置 ,和浏览器模式无关。
测试代码:
<!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>窗口测试</title> <style type="text/css"> html,body{ margin:0; border:0; padding:0; } </style> </head> <body> <div id="q" style="border:1px solid red;padding:10px;margin:100px;width:600px;height:600px;position:relative;" > z <div id="demo" style="border:1px solid red;padding:10px;margin:100px;width:10px;height:10px;" > </div> </div> <script type="text/javascript"> alert(document.getElementById('demo').getBoundingClientRect().top - document.getElementById('q').getBoundingClientRect().top); </script> </body> </html>
获得一个页面元素的绝对页面位置。这个方法主要利用了 getBoundingClientRect (注意:IE 默认body有边框,而 firefox,chrome 则没有) 以及目前尚没有明确标准的offsetTop 以及 offsetParent,offsetTop 是指当前元素和他的包含块元素之间的高度差(详见:盒模型 )。这点 ie ff 表现得基本一致,差别很小见下。但是对于相对元素offsetParent 却有争议( 详见:offsetParent 探讨 )。
1.如果存在 getBoundingClientRect
Ext 的方法用了 约定俗称 的 :
if (el.getBoundingClientRect) { b = el.getBoundingClientRect(); scroll = fly(document).getScroll(); return [b.left + scroll.left, b.top + scroll.top]; }
2. 其它
offsetParent 就是当前元素的已定位的祖先元素(position属性不等于static),因此并不一定是父元素offsetTop 不包括当前元素的上边框ie,ff 都认为 body 没有 offsetParent。
于是粗略的讲,只要沿着 offsetParent 向上,累加 offsetTop 即可,Extjs正是这样做的,只不过对各个浏览器的细节进行了更多考虑,特别是当该元素的祖先元素们含有滚动条(overflow 不为 visible)时,要减去如:
//x,y 为根据 offsetTop offsetParent 方法 算出的 ,然后 while (p && p != bd) { if (!Ext.isOpera || (p.tagName != 'TR' && !fly(p).isStyle("display", "inline"))) { x -= p.scrollLeft; y -= p.scrollTop; } p = p.parentNode; }
x 坐标 同 y 坐标。
Ext.EventObject.getPageY()
这个表示 当前事件的发生绝对页面位置 , 只有 是鼠标事件时才有效,例如单击 , 鼠标经过等。
w3c 中 直接 规定 event.pageX 为 当前事件的发生绝对页面位置。
而ie 没有直接的获得方式,ie 专有的 event.clientX 为绝对可见位置,(忽略了向上滚动条),则我们只需要把滚动条条滚掉的页面高度加上即可。即页面向上滚动了多少?正是body.scrollTop 属性,意思也很明白
元素 :body
行为 :scroll
方向 :top
值 body.scrollTop
如果页面处于 w3c 标准模式:那么以上的 body 就要换做 document.documentElement 了,标准模式时这些属性都放在html节点上了。
下篇 简析 Ext.EventObject 的怎么阻止默认事件发生,以及传统的return false.
PS: KISSY 实现 与 iframe 内元素的考虑 :
考虑 iframe ,对其内的元素先求解在 iframe 的坐标,再递归向上求解 iframe element 在其包含的窗体中的坐标。
/** * support elment in iframe * @param elem * @param refDocument */ function getOffset(elem, refDocument) { var box, x = 0, y = 0, currentWindow = elem.ownerDocument.defaultView || elem.ownerDocument.parentWindow, currentDoc = elem.ownerDocument, currentDocElem = currentDoc.documentElement; // 1. 对于 body 和 docElem, 直接返回 0, 绝大部分情况下,这都不会有问题 // 2. 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式 if (elem[GET_BOUNDING_CLIENT_RECT]) { if (elem !== currentDoc.body && currentDocElem !== elem) { box = elem[GET_BOUNDING_CLIENT_RECT](); // 注:jQuery 还考虑减去 docElem.clientLeft/clientTop // 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确 // 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin x = box.left + _scrollLeft(currentWindow, currentDocElem, currentDoc); y = box.top + _scrollTop(currentWindow, currentDocElem, currentDoc); } if (refDocument) { var refWindow = refDocument.defaultView || refDocument.parentWindow; if (currentWindow != refWindow && currentWindow.frameElement) { //note:when iframe is static ,still some mistake var iframePosition = DOM.offset(currentWindow.frameElement, refDocument); x += iframePosition.left; y += iframePosition.top; } } } return { left: x, top: y }; }
PS2 : 设置页面绝对位置的探讨
发表评论
-
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8659模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5417目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6092看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7427promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1794为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2887简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2860场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2277分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7113作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2496这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2179事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1671一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 5347随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2702@slideshare 原生: ... -
事件机制探讨
2010-06-21 13:54 2261由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1601很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1828yui3 的沙箱机制可以在 ... -
yui3下的load事件触发
2010-06-01 13:31 3263以前的一些总结:页面l ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 2015YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2801资料: 关于新发 ...
相关推荐
### CAD的120个绝对实用技巧:深入解析与运用 #### 技巧1:解决Ctrl+N新建命令失效的问题 当遇到使用`Ctrl+N`进行新建命令时却弹出选择面板的情况,可以通过调整AutoCAD的选项设置来解决。具体操作步骤如下: 1. ...
利用JavaScript或VBScript,可以获取页面中控件的绝对位置。例如,JavaScript代码如下: ```javascript function getIE(e) { var t = e.offsetTop; var l = e.offsetLeft; while (e = e.offsetParent) { alert...
2. **定位布局(positioning)**:使用`position`属性可以精确控制元素的位置,如绝对定位和相对定位。 3. **Flexbox弹性盒模型**:适用于动态调整元素大小和位置的现代布局方式,尤其适合响应式设计。 4. **Grid...
(3)针对页面自适应问题,本文结合渐进增强以及拥抱流式布局的思想,同时研究利用了移动设备的视口特性,实现跨分辨率、跨设备的页面自适应。 (4)针对系统的功能实现问题,通过结合利用原生态框架与HTML5的跨平台...
相对定位是基于元素原本的位置,而绝对定位则是相对于最近的非static定位的祖先元素。固定定位则相对于浏览器窗口。 3. **流体布局与响应式设计**:流体布局使页面元素能根据浏览器宽度自动调整大小,适应不同屏幕...
`),我们可以控制它们在页面上的位置。然后,使用绝对定位(`position: absolute;`)将标签相对于输入框进行定位,使其在获得焦点时可以自由移动。 3. **动画效果**:为了平滑过渡,可以使用CSS的`transition`属性...
在创建这个元素时,同样设置了绝对定位,使其位于页面中心,并通过JavaScript动态调整其位置。放大图片的z-index属性值被设置为10001,以确保它能够显示在遮罩层之上。 在JavaScript函数中,还对放大图片的位置进行...
在本文中,我们将深入...如果你正在使用Laravel并寻找提升页面速度的方法,那么Laravel-jet-pages绝对值得你去探索和使用。通过深入了解和实践,你可以充分利用这个工具,为你的项目带来更高的用户满意度和性能优势。
这个领域对于新手来说具有广阔的探索空间,因为淘宝是中国最大的电子商务平台之一,拥有海量的商品和用户基础,为淘宝客提供了丰富的推广资源。 首先,入门淘宝客需要了解网络赚钱的基本概念和模式。网络赚钱,即...
通过以上步骤,大部分`swiper`不显示图片的问题都可以得到解决。在开发过程中,养成良好的代码管理和调试习惯,及时查阅官方文档,以及充分利用微信开发者工具提供的调试功能,将有助于快速定位并解决问题。感谢阅读...
这种方式遵循了防御性设计的原则,确保即使在不理想的浏览器环境下,用户也能获得一定的使用体验。相关资源如下: - [HTML5 Shiv](http://ejohn.org/blog/html5-shiv/) - [HTML5预览]...
`div`是HTML中的一个块级元素,常用于构建页面结构,通过CSS可以控制其尺寸、位置和内容排列方式,从而实现各种复杂的布局设计。这份大全可能会涵盖流式布局、网格布局、响应式设计等概念,帮助开发者掌握基于CSS的...
它不仅可以定义颜色、字体、背景等视觉样式,还可以定义元素的布局,比如相对定位、绝对定位、浮动和弹性盒子(Flexbox)。使用CSS,我们可以创造出响应式设计,使网页在不同的设备和屏幕尺寸下都能保持良好的显示...
3. **定位与布局**:CSS提供了多种定位机制,如静态、相对、绝对和固定定位,以及Flexbox和Grid布局系统。它们能帮助你实现复杂的设计布局。 4. **响应式设计**:随着移动设备的普及,响应式设计成为必备技能。通过...
- **网格布局与Flexbox**:探索现代CSS布局技术,如CSS Grid和Flexbox,这些技术提供了更强大、更灵活的布局控制能力。 #### 3. 响应式设计 - **媒体查询**:了解如何使用媒体查询来适应不同的屏幕尺寸和设备,...
《Linux Kibana 7.16.3:探索数据可视化的新境界》 Kibana是Elastic Stack(以前称为ELK Stack)的关键组件之一,它是一个强大的数据分析和可视化工具,专为与Elasticsearch数据库配合使用而设计。Elasticsearch是...
- **定位机制**:绝对定位、相对定位、固定定位等,以及如何使用这些定位来精确控制元素的位置。 ##### 2. 响应式设计 - **媒体查询**:通过媒体查询来适应不同屏幕尺寸的设备,实现自适应布局。 - **流体网格系统*...
2. **属性与值**:学习各种CSS属性,如颜色(color)、字体(font)、尺寸(width、height)、位置(margin、padding、border)等,以及它们的可能值。 3. **层叠与继承**:了解CSS的层叠规则,以及如何通过继承来...
在网页制作过程中,CSS(Cascading Style Sheets)起着至关重要的作用,它负责定义网页内容的样式和布局。本文将深入讲解CSS的基础知识、...实践中不断探索和尝试,你的网页制作技能将得到大幅提升,让布局不再是困扰。