IE/Chrome背景图片居中1px偏移解决方法

最近在支持行业运营的一个推广页面,遇到了非常规的页面banner图居中的问题,为了解决此问题,做了简单的测试,做了一个小结,为经常做大促页面的兄弟姐妹们提供参考解决方案。

  1. 首先来看看现象。最经典的页面如下图
  2. 从图中可以看到本页面为经典的顶部大图通栏,尺寸为1210px,但是为了兼顾所有分辨率,所以作为背景图片居中处理。内容区域为常用的经典栅格布局990px,设置margin:0 auto;大概的伪代码结构如下:
  3.  XHTML

    1

    2

    3

    4

    <div id=”content”>

    <div class=”top” style=”height:200px;background:url(bg.png) no-repeat 50% 0;”>顶部通栏banner区域</div>

    <div class=”main” style=”width:990px;margin:0 auto;”>内容区域</div>

    </div>

    理论上内容区域应该和上方背景图对齐。但是理论和现实总有差距的,在chrome和IE以及safari浏览器下面经常可以发现两部分并没有对齐,直接导致了很明显的一条线错位,所以不容忽视。但是,所有的又是不规律的,并不是必现,所以还是需要好好归纳一下现象。

  4. 归纳现象规律。以本案例为例子,经过测试发现:IE7/8/9/10居中问题处理的都很不错,都能够正常的显示,两部分吻合的很好;但是在IE6和高贵的chrome下面居然出现了问题(其他高富帅的opera和safari没测试,但是通过搜集网上现象,貌似safari也有和chrome一样的问题,opera没问题)。最后通过各种分辨率,以及不停的resize浏览器视窗,得出以下规律(所有前提是背景大图为1210px的偶数尺寸,不建议很蠢的用奇数的尺寸去导致所有浏览器都有问题):1)  IE6浏览器:还算比较有节操的,只有当页面宽度大于背景图片宽度(本例当中为1210px)且页面宽度为奇数尺寸时才会出现内容区域向左偏差1px的现象。2) Chrome浏览器:这家伙自作聪明,很没节操,一会儿向左一会儿向右偏移,搞不清楚总有问题。后来多次对比就是当页面宽度大于背景图宽度且页面宽度为奇数时,内容区域向左偏移1px(这个就很没节操只是偶尔显现,大部分时间没出现);当页面宽度小于背景图宽度且页面宽度为奇数时,内容区域向右偏移1px(这种现象是必现的)。大概总结出来就以上两点问题,也去网上搜罗了一下,以下同学也在呐喊,也做了一些原因分析:[1] http://stackoverflow.com/questions/6454019/background-center-with-chrome-bug[2] http://stackoverflow.com/questions/9752201/how-do-i-fix-1px-margin-on-google-chrome[3] http://philfreo.com/blog/fixing-safaris-1px-background-image-centering-problem/
  5. 查资料分析一下原因(没有官方定论,只是YY)。从大家讨论的结果当中看,应该是webkit内核的浏览器的一个通病,当页面宽度为奇数时,background-position:50% 0;结合其与背景图的宽度一起计算出图片应该定位的位置:背景图x坐标=(背景图所在的元素宽度-背景图宽度)*50%因此,可能浏览器器在处理这个奇数宽度带来的0.5像素的宽度时存在四舍五入的现象,但是对于这个规则的处理就如现象的描述一样。当页面宽度小于背景图宽度时,则存在负的0.5,当页面宽度大于背景图宽度时则存在正的0.5,所以总是出现了要么入,要么舍带来的偏移。而这个入与舍,IE6与chrome则表现出了不同的原则,也就有了以上不同的现象。而正常的浏览器我估计能更加精确的定位吧,至少按照这位哥的描述应该是:“While 1px isn’t the end of the world, it can really hurt a design!”
  6. 提供解决方案。每个地方都有人提供了各种尝试。例如把背景图设为奇数,但是此举绝对不靠谱,不建议尝试,当然如果你的背景图能够足够宽到跨越一切分辨率的时候可以采纳,例如5000px;或者如果是中间掏空的那种背景图可以掏空的时候比内容区左右各少1px,这个还可以;再或者html{margin-left:1px;},一样不是很靠谱,况且还有白边。。。经过上面的讨论以及各种尝试,目前个人觉得最好的/最没办法的通用解决方法就是一下这种了,如果你觉得还有更好的,欢迎交流。—————js专门hack—–!!!。。。对于IE6当页面宽度大于背景图宽度时,给内容区域增加一个padding-left:1px;的属性,其他情况去除这个属性。对于webkit内核的浏览器,则当页面宽度小于背景图宽度时,给背景图所在元素增加background-position:49.999% 0;属性;当页面宽度大于背景图宽度时则给背景图所在元素增加background-position:50.001% 0;当然要给浏览器增加resize监听事件,每次改变都要调整一下。以上hack不用区分页面宽度的奇数偶数情况都能正常显示了,不信你看看!贴一下基本代码:

var $ = jQuery,
isIE6 = $.browser.msie && $.browser.version == ‘6.0’,
isWebkit = $.browser.webkit,
fixDiv;
function fixWidthBug(){
var _w=$(document).width();
if(isIE6){
if(_w>1210){
fixDiv.css(‘padding-left’,’1px’);
}else{
fixDiv.css(‘padding-left’,’0px’);
}
}
if(isWebkit){
if(_w>1210){
fixDiv.css(‘background-position’,’50.001% 0′);
}else{
fixDiv.css(‘background-position’,’49.999% 0′);
}
}
return ;
}
function initPageWidth(){
if(!(isIE6 || isWebkit)){
return ;
}
if(isIE6){
fixDiv = $(‘div.backgroundimage-els’);
}
if(isWebkit){
fixDiv = $(‘div.content-els’);
}
$(window).on(‘resize’,fixWidthBug);
fixWidthBug();
}
initPageWidth();

文章转载请注明:IE/Chrome背景图片居中1px偏移解决方法-汇聚素材网

时间: 2024-10-03 23:17:20

IE/Chrome背景图片居中1px偏移解决方法的相关文章

用CSS让网页背景图片居中的方法

网页背景居中的方法有很多种的.这里介绍一些用CSS让背景图片居中的方法. 让背景图片居中的第一个方法是用像素设定,很多都用这种,但是也是最麻烦的: <div style="width:800px;height:600px;background:url(../images/logo.jpg) no-repeat 250px 270px;border:1px solid #cccccc;"></div> 第二种居中方法:用50%设定,很方便: <div sty

DIV+CSS中让布局居中_背景图片居中_文字内容居中

DIV+CSS中让布局居中_背景图片居中_文字内容居中

chrome显示12px以下字体的解决方法

demo如下: <!doctype html> <html> <head> <title>chrome显示12px以下字体的解决方法</title> </head> <style type="text/css"> * { margin: 0px; padding: 0px; font-family: "微软雅黑"; } .px12 { font-size: 12px; } .px10

dedecms织梦系统后台验证码图片不显示的解决方法

网站迁移后,dedecms织梦系统后台验证码图片不显示的解决方法通用解决方案-取消后台验证码功能因为没有验证码,不能进后台,所以修改php文件源代码:方法一:打开dede/login.php 找到如下代码    if(($validate=='' || $validate != $svali) && preg_match("/6/",$safe_gdopen)){        ResetVdValue();        ShowMsg('验证码不正确!','logi

universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使用UIL遇到了这个问题,相信这个问题许多使用UIL的人都碰到过 现在把解决方法贴出来给有同样问题的朋友做参考 先看下UIL的工作流程 在已经允许内存,存储卡缓存的前提下,当一个图片被请求display时,首先要判断图片是否缓存在内存中,如果false则尝试从存储卡读取,如果依然不存在最后才从网络地址

采集百度搜寻结果,图片不显示的解决方法

1.根据关键字采集百度搜寻结果 根据关键字采集百度搜寻结果,可以使用curl实现,代码如下: <?php function doCurl($url, $data=array(), $header=array(), $timeout=30){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_R

[转]关于Chrome不能登录和同步的解决方法

原帖地址:http://tieba.baidu.com/p/3086127792?pn=1 在本机的hosts文件(C:\Windows\System32\drivers\etc)里加入下面内容: #SmartHosts START #Google Services START 203.208.46.200 0.docs.google.com 203.208.46.200 0.drive.google.com 203.208.46.200 1.docs.google.com 203.208.46

chrome &#39;adobe flash player 已过期&#39;解决方法

http://labs.adobe.com/downloads/flashplayer.html下载 WindowsDownload Flash Player for Opera and Chromium based applications – PPAPI 安装-重启浏览器 chrome 'adobe flash player 已过期'解决方法

JavaScript中的window.close在FireFox和Chrome上不能正常动作的解决方法

原文:JavaScript中的window.close在FireFox和Chrome上不能正常动作的解决方法 JS中关闭窗口的方法window.close()在IE上能够正常动作,而在FireFox和Chrome上无法动作. (当时,在Chrome35.0上的时候还是可以的,Chrome36.0上就无法动作了JS中关闭窗口的方法window.close()在IE上能够正常动作,而在FireFox和Chrome上无法动作. (当时,在Chrome35.0上的时候还是可以的,Chrome36.0上就