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

IE中IMG元素上应用padding的奇特bug

    博客分类:
  • CSS
阅读更多
最近又(又说了“又”)发现了一个IE的奇特bug。

我们知道,在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的部分。

<!DOCTYPE html>
<html>
<head>
<title>Image Padding Test</title>
<style>
body { background:silver; }
#myImg { padding:50px 10px; background:white; }
</style>
<script>
function resetImageSize() {
	myImg.runtimeStyle.width = 'auto';
	myImg.runtimeStyle.height = 'auto';
}
function addImageObject() {
	var obj = document.createElement('object');
	obj.data = 'Sunset.jpg';
	obj.width = 240;
	obj.height = 120;
	myDiv.appendChild(obj);
}
function checkImageSize() {
	alert([myImg.currentStyle.width, myImg.currentStyle.height]);
}
</script>
</head>
<body>

<h1>Image and Object Test</h1>


<div id="myDiv">
	<input type="button" onclick="addImageObject()" value="add image object " />
	<input type="button" onclick="checkImageSize()" value="check image size" />
	<input type="button" onclick="resetImageSize()" value="reset image size " />
	<hr />
	<img id="myImg" src="fu.gif" width="200" height="82" />
	<hr />
</div>

</body>
</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的效果),也能避免出现这种情况。




分享到:
评论
3 楼 D-tune 2007-09-06  
hax 写道
IE7没有测试。你确定Sunset.jpg存在么?

确定,我使用本地的图片
2 楼 hax 2007-09-04  
IE7没有测试。你确定Sunset.jpg存在么?
1 楼 D-tune 2007-09-04  
IE7这个bug已经解决了,另外请教hax一个问题,ie7里的这段代码
function addImageObject() {   
    var obj = document.createElement('object');   
    obj.data = 'Sunset.jpg';   
    obj.width = 240;   
    obj.height = 120;   
    myDiv.appendChild(obj);   
}

中的
引用
obj.data = 'Sunset.jpg'; 
怎么老是报错呢
我后来自己改成:
    var obj = document.createElement('img');   
    obj.src = 'Sunset.jpg'; 

相关推荐

    HTML中的多媒体元素应用,基础的HTML多媒体元素的应用教学

    ### HTML中的多媒体元素应用 #### 一、引言 随着互联网技术的发展,多媒体内容成为了网页设计不可或缺的一部分。HTML(超文本标记语言)作为构建网页的标准语言之一,提供了丰富的标签和属性来实现多媒体元素的...

    css常见的bug(ie)

    在IE中,img元素下方有时会出现额外的空白。这通常是由于默认的行内元素行为造成的。通过将图片的`display`属性设置为`block`,可以消除这个空白。 以上只是CSS在IE浏览器中部分常见问题的解决方法。在实际开发中...

    img图片在ie下有有空隙

    ### img图片在IE下出现...同时,在实际开发过程中还需要注意检查图片及其父元素的CSS样式,以及考虑使用特定版本的IE特有的CSS Hack来进一步提高兼容性。通过以上措施,可以有效地解决这类兼容性问题,提升用户体验。

    IE 常见bug 及其fix

    在Web开发领域,Internet Explorer(IE)曾是程序员们的一大挑战,尤其是对于前端开发者来说,因为IE中存在许多特有的bug。这些bug不仅让开发者头疼,还严重影响了开发效率。本篇将详细介绍9个最常见的IE bug及其...

    实现ie6的png图片透明的2种方法

    本文将详细介绍两种在IE6中实现PNG图片透明的方法:一种针对`&lt;img&gt;`标签,另一种则应用于CSS背景图。 #### 方法一:针对`&lt;img&gt;`标签 这种方法主要是通过JavaScript来解决PNG图片的透明度问题。具体实现思路如下: ...

    解决ie img标签内存泄漏的问题

    在IE浏览器中,由于其...总结,解决IE img标签内存泄漏的问题,关键在于正确地清理不再使用的img元素,以及确保它们与内存中的资源断开关联。通过上述方法,可以有效地防止内存泄漏,提高应用程序的性能和稳定性。

    CSS浏览器兼容和IE中bug问题

    ### CSS浏览器兼容性与IE中的Bug处理 #### CSS兼容性问题概述 在Web开发中,浏览器的兼容性问题一直是开发者需要面对的重要挑战之一。不同浏览器(如IE、Chrome、Firefox等)对CSS的支持程度和解释方式存在差异,...

    IE浏览器下的图片空隙间距BUG和解决办法.pdf

    尽管我们设置了li和img的margin和padding为0,但在IE浏览器下,图片之间仍会有间距,这是因为每个`&lt;li&gt;`元素下的`&lt;img&gt;`标签之间存在一个隐形的空格。 解决这个问题的方法有很多种,以下是几种常见的解决方案: 1....

    关于块级元素和行内元素

    块级元素和行内元素在 CSS 中的应用 在 CSS 中,我们可以通过设置 display 属性来控制元素的显示方式。例如,我们可以将块级元素设置为行内元素,反之亦然。 块级元素的 display 属性可以设置为 block、inline、...

    09_img元素中的图片路径.html

    09_img元素中的图片路径

    可以给img元素设置背景图

    通过将&lt;img&gt;元素设置为块级元素并添加padding,同时指定background属性,即可在&lt;img&gt;元素上实现背景图像的效果。例如,一个简单的样式应用可以是这样的: ```css img { display: block; padding: 10px; ...

    关于firefox下img元素拖拽效果处理

    在Firefox浏览器中,img元素的拖放(drag-and-drop)行为与其它浏览器可能存在差异,这主要是由于Firefox对HTML5拖放API的实现不同。本文将深入探讨如何在Firefox下处理img元素的拖拽效果,同时也会涉及到一些源码...

    IE8 序号不动bug完美修复新增鼠标放置控件停止效果

    在IT行业中,尤其是在网页开发领域,我们经常遇到各种浏览器兼容性问题,特别是涉及到较旧版本的浏览器,如IE8。本文将深入探讨“IE8序号不动bug”的完美修复方法,以及如何新增鼠标放置时停止图片动画的效果。这两...

    12_a元素和img元素结合使用.html

    12_a元素和img元素结合使用

    IE6中觉得PNG格式图片阴影的方法

    通过在CSS中引入这个文件,并将其应用到需要修复的元素上,我们可以使IE6正确显示带阴影的PNG图片。尽管这种方法在当时是一个有效的解决方案,但随着浏览器的更新换代,现在已经推荐使用更现代的浏览器和适应性更强...

    最好用的ROM中img格式文件打开工具

    2. **提取文件**:如果你需要从img文件中单独提取某个应用或者驱动,WinImage提供了这一功能。开发者可以将特定的APK文件或其他重要文件提取出来,用于移植到其他设备或者进一步分析。 3. **编辑内容**:在某些情况...

    png_IE6_img_透明

    只能用于IE6 中的img元素,网上找的,也不知道CSDN中是不是以有了

    AndroidRom之system.img内容提取工具

    可用附件中的simg2img.exe来转化一下原始的system.img,然后再用其中的ext2Explorer来浏览提取system.img中的内容。 用法:1、将system.img改名为system.img.ext4。2、命令行cd到simg2img.exe目录下,执行命令“simg...

    img文件浏览器 修改IMG文件

    标题中的“img文件浏览器 修改IMG文件”指的是一个专门设计用于浏览和编辑IMG文件的应用程序,主要针对Android系统的系统文件。IMG文件在IT行业中通常是指一种包含磁盘映像的文件格式,广泛应用于操作系统安装、固件...

    IE7下父元素及子元素的隐藏顺序不当带来的display:none出现BUG

    IE 7 下, 先隐藏 父元素,后隐藏子元素,再显示父元素, 被隐藏的子元素 重叠区域下面, 存在另一个可见的元素, 则该 display:none的子元素出现BUG: 背景和图片(img元素,不仅仅是图片背景)仍然显示, 但文字不...

Global site tag (gtag.js) - Google Analytics