惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
L
Lohrmann on Cybersecurity
Simon Willison's Weblog
Simon Willison's Weblog
P
Proofpoint News Feed
P
Privacy International News Feed
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
S
Securelist
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
GbyAI
GbyAI
B
Blog RSS Feed
A
About on SuperTechFans
C
CXSECURITY Database RSS Feed - CXSecurity.com
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyberwarzone
Cyberwarzone
I
Intezer
T
Tor Project blog
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
aimingoo的专栏
aimingoo的专栏
Cisco Talos Blog
Cisco Talos Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
W
WeLiveSecurity
D
DataBreaches.Net
U
Unit 42
Project Zero
Project Zero
Martin Fowler
Martin Fowler
V
V2EX
The Last Watchdog
The Last Watchdog
Security Archives - TechRepublic
Security Archives - TechRepublic
C
Cisco Blogs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V2EX - 技术
V2EX - 技术
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threat Research - Cisco Blogs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tenable Blog
F
Full Disclosure
T
The Exploit Database - CXSecurity.com
H
Heimdal Security Blog
Latest news
Latest news
Webroot Blog
Webroot Blog

博客园 - 过河卒A

.net控件开发(十一)之.net设计期功能 第一部分 左中右3栏布局中最先显示中栏内容的方法 IE中z-index BUG 关于String、Function、Array的属性和用法 javascript实现的数据结构 lisp入门 函数式编程让JS更优美 函数式JavaScript编程指南 JavaScript 随笔汇集 如何杜绝iframe挂马 怎么用javascript进行拖拽(转摘) .net的幕后英雄 (转摘) 微软计划2008年初发布Windows Server2008 微软:将以SQL Server授权拉拢甲骨文客户 微软发布SQL Server 2008测试版 明年上市 微软MSN推出新一代Live服务 能离线编辑博客 谷歌发布GPhone 创始人亲自上阵 微软刘振宇:Windows live for Mobilo带来新机遇 微软招募经理 欲开发下一代照片视频共享服务
IE中IMG元素上应用padding的奇特bug
过河卒A · 2007-12-10 · via 博客园 - 过河卒A

我们知道,在IE的怪癖模式(quirk mode)下,<IMG>元素会忽略所设定的padding。而在标准模式下,则会有padding。

问题是,IE所表现出来的情况说明,整个IE的开发,大量的问题不是从认真修复和从根本上重构,而貌似是不断patch。

举一个例子。最初IE就具有一个bug,即操作scrollbar,会导致控件(如input文本输入框)的focus丢失。为了解决这个问题,MS做了一个补丁,使得body元素上的scrollbar不会抢走焦点。但是这个补丁做得非常之差。第一,这个补丁无法解决其他元素的scrollbar抢焦点的问题,事实上任何一个hasLayout的元素都可能抢走控件焦点。第二,在标准模式下,整个浏览器的canvas从body元素变成了html元素,也就是浏览器window上的scrollbar变成了html元素的scrollbar。结果bug回来了。而标准模式下的body元素的scrollbar(如果有的话),却没有这个问题。可见原本的patch仅仅是对于body元素的一种特定patch。我甚至能想像这个patch的代码逻辑:在scrollbar的scroll相关事件处理器中,如果是在body元素上,则首先记录当前获得焦点的元素,然后执行原先的scroll的处理代码,处理完毕后再把焦点设回去。

这是一个多么低劣的patch!

回过头来看IMG上padding的问题。从原理上判断,IMG元素本身始终是hasLayout的,因此其渲染是由IMG元素本身处理的,估计是直接交由一个图像组件处理的,这可能是它无法处理padding的原因。在标准模式下,要支持padding,这一部分代码肯定要修改。同时,标准模式下,box model也发生变化,width不再包括padding的部分。

代码

  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <title>Image Padding Test</title>  
  5. <style>  
  6. body { background:silver; }   
  7. #myImg { padding:50px 10px; background:white; }   
  8. </style>  
  9. <script>  
  10. function resetImageSize() {   
  11.     myImg.runtimeStyle.width = 'auto';   
  12.     myImg.runtimeStyle.height = 'auto';   
  13. }   
  14. function addImageObject() {   
  15.     var obj = document.createElement('object');   
  16.     obj.data = 'Sunset.jpg';   
  17.     obj.width = 240;   
  18.     obj.height = 120;   
  19.     myDiv.appendChild(obj);   
  20. }   
  21. function checkImageSize() {   
  22.     alert([myImg.currentStyle.width, myImg.currentStyle.height]);   
  23. }   
  24. </script>  
  25. </head>  
  26. <body>  
  27.   
  28. <h1>Image and Object Test</h1>  
  29.   
  30. <div id="myDiv">  
  31.     <input type="button" onclick="addImageObject()" value="add image object " />  
  32.     <input type="button" onclick="checkImageSize()" value="check image size" />  
  33.     <input type="button" onclick="resetImageSize()" value="reset image size " />  
  34.     <hr />  
  35.     <img id="myImg" src="fu.gif" width="200" height="82" />  
  36.     <hr />  
  37. </div>  
  38.   
  39. </body>  
  40. </html>  

上述代码在IE6中打开,首先你可以在图像上按右键查看图像的属性,你会发现其值并非是200*82,而是220*182,是其clientWidth和clientHeight的值。即使图像文件不存在也是同样的结果。

然后请点击add image object这个按钮,会在网页中插入一个Object元素,并且其引用的是一个图像(必须是实际存在的图像)。然后,你可以试着改变浏览器窗口的大小,看到了没有?

图像莫名的放大了。如果仔细观察,你会发现图像恰好缩放为220*182,即算上padding后的大小。如果你现在查看图像属性,结果是240*282。还可以试着缩小浏览器窗口,你会发现当窗口缩小到小于图像的宽度和高度的时候,图片居然会跟着缩小!

通过check image size按钮,可以看到stylesheet的最后计算结果居然是220*182,而在窗口缩小到一定程度的时候,会变得更小。

奇怪的是,如果这个html里有两张图片,就不会出现这个情况。此外,如果img上应用任何width和height的样式,甚至只是设置成“auto”(在上面这个网页里点击reset image size的效果),也能避免出现这种情况。

(来自javaeye  的hax)