最近在支持行业运营的一个推广页面,遇到了非常规的页面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偏移解决方法-汇聚素材网

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

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

    网页背景居中的方法有很多种的.这里介绍一些用CSS让背景图片居中的方法. 让背景图片居中的第一个方法是用像素设定,很多都用这种,但是也是最麻烦的: <div style="width: ...

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

    网站迁移后,dedecms织梦系统后台验证码图片不显示的解决方法通用解决方案-取消后台验证码功能因为没有验证码,不能进后台,所以修改php文件源代码:方法一:打开dede/login.php 找到如下 ...

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

    在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...

  4. 亲历谷歌 Chrome 浏览器弹窗境外广告的解决方法(图) | 技术乐园

    亲历谷歌 Chrome 浏览器弹窗境外广告的解决方法(图) | 技术乐园 转 https://www.hack520.com/338.html 谷歌的 Chrome 浏览器是我非常喜欢的一款的浏览器, ...

  5. CSS设置浮动导致背景颜色设置无效的解决方法

    float浮动会使父元素高度塌陷,父级元素不能被撑开,所以导致背景颜色不能被撑开 解决方法: 对父元素设置高度 对父元素设置 overflow:hidden清除浮动 把父元素也设置为float浮动 结 ...

  6. navigationItem.rightBarButtonItem 设置背景图片,颜色更改解决的方法

    self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@& ...

  7. PS切图导出代码后出现的图片布局散乱的解决方法——table布局

    前言: 一般来说,大部分美工PS切图后导出的都是使用PS默认的table布局的页面,出现最多的异常是上传代码,替换图片后,发现图片布局散乱,完全不是想要的效果.轻微的是浏览器不兼容,只有部分浏览器可以 ...

  8. 微信图片不可显示java解决方法

    先看知乎:https://www.zhihu.com/question/35044484 场景: 微信上传了图片素材,返回了图片url,然后不能在img标签中正常显示. 原因是微信做了图片防盗连接. ...

  9. css图片居中,通过纯css实现图片居中的多种实现方法

    在网页布局中,图文排版是我们常用的,那么经常会遇到如何让图片居中显示呢,这篇文章将总结常用css实现图片居中的方法总结: html结构: <div class="demo" ...

随机推荐

  1. live555—VS2010/VS2013 下live555编译、使用及测试(转载)

    Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等 的支持.Live555实现了对多种音视频 ...

  2. CF Round #354 Div.2

    http://codeforces.com/contest/676 A. Nicholas and Permutation 题意:有一个从1到n的数列,可以任意对调两个数字一次,问数字1和n所在位置之 ...

  3. Abstract和Virtual

    在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别. 它们有一个共同点:二者都是用来修饰父类的,只能作为基类使用,通过覆盖父类的定义,让子类与overri ...

  4. vim 常用操作

    a 进入INSERT MODE x 删除当前光标下的字符dw 删除光标之后的单词剩余部分.d$ 删除光标之后的该行剩余部分.dd 删除当前行. c 功能和d相同,区别在于完成删除操作后进入INSERT ...

  5. CSS行高line-height的一些深入理解及应用

    一.一些字面意思. “行高”大约是指:一行文字的高度.具体来说是指两行文字间基线之间的距离.基线是在英文字母中用到的一个概念,我们刚学英语使用的那个英语本子每行有四条线,其中底部第二条线就是基线,是a ...

  6. C++笔记(to be cont'd)

    最近在看这个:LearnCpp 主要是一些我自己容易忽视的地方 记一些笔记在下面,还有错漏地方请不吝赐教 CH1.10 Preprocessing The preprocessor copies th ...

  7. Java内部类的使用小结

    转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...

  8. python之~【空格】可不能随便加唷~

    上个礼拜学习从.proto文件转xxpb2.py文件的时候,明明成功了的. 结果周末的时候在家里,以及今天周一来到公司电脑,都遇到同样的一个问题. 我就纳闷了.这个路径确实存在呀. 而且我找遍了搜索引 ...

  9. HDU 5831 Rikka with Parenthesis II

    如果左括号数量和右括号数量不等,输出No 进行一次匹配,看匹配完之后栈中还有多少元素: 如果n=2,并且栈中无元素,说明是()的情况,输出No 如果n=2,并且栈中有元素,说明是)(的情况,输出Yes ...

  10. hdu 3986 Harry Potter and the Final Battle

    一个水题WA了60发,数组没开大,这OJ也不提示RE,光提示WA...... 思路:先求出最短路,如果删除的边不是最短路上的,那么对结果没有影响,要有影响,只能删除最短路上的边.所以枚举一下最短路上的 ...