Zoom更改设计布局

16

我正在开发一个新网站,希望它能够完美地兼容IE6+、Firefox、Chrome、Opera和Safari浏览器。

我已经让它与所有这些浏览器兼容了,但是有一个问题我处理不了——当缩放时,所有的布局都变得混乱。

这是一个带有问题的示例fiddle: http://jsfiddle.net/pdQrQ/1/

在Chrome(14.0.835)、Firefox(7.0.1)和IE9中,缩小页面时,右上角的框的大小会改变(至少看起来是这样),然后它就不能与下面的框右对齐。

编辑:
我知道原因了——边框!

解释:每个浏览器的缩放功能会改变div元素的宽度/高度,但不会改变边框的大小,因此会导致此故障/浮动。 如果我删除边框,一切都很完美。

但是我想使用边框,否则我的设计将变得更加丑陋。

我该怎么修复呢?

谢谢!


你可能想从这里开始:https://dev59.com/0XI-5IYBdhLWcg3wta1q,看看是否可以根据逻辑/物理DPI比例更改布局。如果你找到了更优雅的方法,那么请发布出来。 - Andrew T Finnell
这个问题太宽泛了,就像是说我造了一辆车,但是它无法启动,为什么呢?请发布基本的HTML布局和CSS代码。但是如果你想支持IE6+和其他所有浏览器的“完美”部分几乎是不可能的。 - ashwoods
这取决于你对“无序”一词的理解。据我所知,浏览器中的“缩放”功能并不是真正的缩放,而只是影响文本的大小。这意味着你的文本与其他任何内容(包括所有的“盒子”格式)之间的关系将发生变化,因此整体布局也会有所不同。 - Colin Fine
我添加了更多信息和示例链接。 @Colin-Fine,我知道“缩放”功能不是真正的缩放,但它确实存在,人们使用它。我想知道如何修复它... - Ron
Ron,你尝试过给你的元素添加position:absolute;属性吗?我之前也遇到过同样的问题,我的页眉保持居中,但是在缩小页面时,其他的CSS框会向左移动。后来我将它们的位置设定为绝对位置,只是简单地加了这一属性,结果发现它起作用了。值得一试!我自己也因此苦恼了好久! - NVMK
显示剩余4条评论
2个回答

25

我的最佳猜测是这是由于缩小比例时的四舍五入误差导致的。例如,如果你想象一个宽度为250px的盒子,其中包含两个宽度为125px的并排放置的盒子。显然,它们可以并排放置。如果你缩小到一半大小,则外部盒子将为125px,内部盒子将为62.5px,每个盒子都会四舍五入为63px(半像素是你能得到的最小值)。这两个盒子现在总宽度为126px,因此不能并排放置,一个必须放在另一个下面。

我认为这基本上就是你在这里工作的原理。我认为最好的解决方案是使两个并排放置的盒子变窄,并将一个向右漂移,以使右边框不被打断。这可能意味着中间有些微小的间隙,但希望这个间隙可以吸收你缩小时的四舍五入误差。

编辑:

正如你所说,边框是造成困惑的主要原因。它们可以从外部容器中取出,并放在一个专门设计用来添加边框的嵌套容器中。

http://jsfiddle.net/chrisvenus/pdQrQ/6/

上面是一个Fiddle(基于你的),它创建了包含边框的内部DIV标签,而浮动容器则根本没有边框。这似乎足够强大,可以在IE8、FF7.0.1或Chrome 14.0.835.202中工作。

所做的更改是将div添加到HTML中,并在它和其父级之间交换一些类。有一个新的innercontainer类,将高度和宽度设置为100%,以确保它填充包含盒子(因此边框位于所需位置)。此外,我更改了底部盒子的宽度,使其正确对齐。

如果这对你有用,请告诉我。


float:right; 不能解决问题。问题是由边框引起的。我无法按照这个原则工作,因为它会破坏我的设计(使它完全不同)。 - Ron
我在我的答案中添加了一个新的部分,介绍如何将边框放在内部div上,以利用它可以在没有边框的情况下工作,但您仍然想保留它们的优点。现在外部div处理布局,而内部div则处理边框等内容。 - Chris
我现在已经在IE6+、FF 7.0.1、Chrome 14.0.835.202和Safari 5.0.5上进行了测试,它们都完美地工作,除了IE6。在IE6中,顶部区域的宽度为750,而底部区域的宽度为752。我不知道该如何解决它... - Ron
@Ron:也许你还需要在底部的div里面加上border。听起来底部的那个可能是750宽,两侧各1像素边框。对它也使用同样的技巧,看看效果如何。不幸的是,我没有IE6进行测试。 - Chris
我不知道为什么我没有想到这个解决方案。理论上它应该有效,但实际上却不行——我不知道为什么。我正在使用IETester在IE6中进行测试。你有其他的建议吗?编辑:提示:删除文档类型会在IE中解决问题,但会导致其他浏览器出现问题。 - Ron
显示剩余3条评论

12

现在最好的做法是 "box-sizing:border-box"。

* { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }


小提琴: http://jsfiddle.net/oneeezy/pdQrQ/113/


1
这确实解决了我的问题。我还找到了一些有趣的相关文章。其中一篇是这篇:http://www.paulirish.com/2012/box-sizing-border-box-ftw/ 当然,多年后,随着CSS3的正式“发布”,这些前缀就不再需要了。 - reaper_unique
1
工作得很顺利 - 没有理论只有实践。不错。 - Mahesh.D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接