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

推荐订阅源

T
Troy Hunt's Blog
Last Week in AI
Last Week in AI
D
DataBreaches.Net
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyberwarzone
Cyberwarzone
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
月光博客
月光博客
博客园 - 司徒正美
C
CERT Recently Published Vulnerability Notes
L
LangChain Blog
Simon Willison's Weblog
Simon Willison's Weblog
The Register - Security
The Register - Security
T
The Blog of Author Tim Ferriss
V
V2EX
F
Fortinet All Blogs
AWS News Blog
AWS News Blog
T
Tor Project blog
V
Vulnerabilities – Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
小众软件
小众软件
L
Lohrmann on Cybersecurity
量子位
F
Full Disclosure
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
Intezer
NISL@THU
NISL@THU
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
Scott Helme
Scott Helme
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 三生石上(FineUI控件)
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
N
Netflix TechBlog - Medium
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
P
Privacy & Cybersecurity Law Blog
T
Threat Research - Cisco Blogs
J
Java Code Geeks
S
Schneier on Security

博客园 - 过河卒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)