这个词已经喊了很久了,一直都是小打小闹,没正经的做过大的响应式全站,这次终于有机会了。网站刚上线半个月,就要改版为响应式设计,支持手机/PC等各类终端显示浏览。今天把首页做好,并测试无误,这里把一些应该记录的东西写下来,一是备忘,二是分享给需要的人。
这次要讲的包括6个问题,1)html5标签的支持,2)响应式设计的单位选择,3)IE对媒体查询media query的支持,4)png24与png8图片选择的再探讨和IE私有滤镜filter:AlphaImageLoader的重温,5)定位position:fixed与IE6固定和抖动现象的恩怨,6)移动设备轮播图swipe插件和touchslider插件的选择及其使用注意事项总结。7)背景透明文字不透明的兼容写法,8)iphone下input[type=submit]提交按钮表现与CSS设置不一致的修复方法。下面分别简单总结一下。
一、对不支持html5标签的IE,可以使用类似html5 shiv的插件(地址http://html5shim.googlecode.com/svn/trunk/html5.js)也可以自己使用javascript 的createElement将这些不支持的标签创建一次,记得在CSS里要批量声明一下这些Html5标签为block类型,防止一些情况下IE不识别这些html5标签下的CSS样式。
二、响应式设计要尽量使用百分比宽度,以适应不同设备的显示需求。对于字体大小,为了对小屏幕手机设备写media query时候维护方便,请结合像素单位px并适当使用相对单位,虽然CSS3新增的相对单位rem(root em)比较灵活方便,但由于IE8和之前低版本不支持,所以目前来说,还是建议使用em,用到的地方自己就不要怕麻烦,多计算一下吧。
三、让IE支持媒体设备查询,可以使用MediaQueries.js和Respond.js,当然,如果你有时间和能力,自己去写的话,那就更有针对性啦。这里只是说明一下,在使用MediaQueries.js时候,对于结构稍微复杂或者使用定位position不当会造成IE下不生效,或者显示有问题,这时可以尝试以下方法排查一下:
1)将本地页面相关文件上传到服务器端,再进行测试预览。
2)将body元素进行定位,如设置为position:relative;这一招可以解决一些正常页面在添加了mediaqueries.js后显示反而错乱的问题,比如最经常遇到的IE7下某些元素显示为白板,不能点选。
3)必要时,响应式设计利器CSS3 media query和IE条件注释一起使用,为了表现一致或IE的向下兼容,这又是一个好的配合。强调一点,有些代码只让标准浏览器认识,而在IE中不生效,可以使用IE条件注释,但注意写法。你可能会觉得很简单:
正确的写法应该是:
只有非IE浏览器才能看到我
在IE中被当作内部注释,而在非IE浏览器中会与之前的
#focus-wrap{position: relative;height: 287px; width: 100%; overflow: hidden;}
.swipe {
overflow: hidden;
visibility: hidden;
position: relative;
}
.swipe-wrap {
overflow: hidden;
position: relative;
}
.swipe-wrap .swipe-item {
float:left;
width:100%;
position: relative;
}
.swipe-item-img{height: 287px;width: 100%;}
#swipe-nav{position: absolute; margin: 0 auto; width: 100%; height: 50px; left: 0; bottom: 0; background: #fff; -webkit-opacity: .5; -moz-opacity: .5; opacity: .5; filter:alpha(opacity=50);}
#position{text-align: center; line-height: 50px;}
#position li{display:inline-block;width:10px;height:10px;border-radius:10px;background:#141414;box-shadow:inset 0 1px 3px black,0 0 1px 1px #202020;margin:0 2px;cursor:pointer;}
#position li.on{box-shadow:inset 0 1px 3px -1px #28b4ea,0 1px 2px rgba(0,0,0,.5);background-color:#1293dc;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#1293dc),color-stop(100%,#0f6297));background-image:-webkit-linear-gradient(top,#1293dc,#0f6297);background-image:-moz-linear-gradient(top,#1293dc,#0f6297);background-image:-ms-linear-gradient(top,#1293dc,#0f6297);background-image:-o-linear-gradient(top,#1293dc,#0f6297);background-image:linear-gradient(top,#1293dc,#0f6297);}
调用插件的js代码:
如果你要考虑IE6,IE7,建议使用touchslider插件。附上我的代码:
为了给浏览器减轻负担,不建议使用最新的jQuery库,touchslider官网用的是v1.7.2,个人感觉还是有些笨重,经过测试,发现jQuery 1.2.4即可支持该插件的运行,但是轮播切换动画效果会有瑕疵,使用jQuery v1.2.5自动轮播切换动画不再有问题,不过依然存在的缺点是对手指触摸向左滑动支持的有些问题,如果要保证触摸体验,至少应该引入jQuery 1.6.0才能保证完全的效果,有洁癖的要注意这一点。
使用,只有30K左右的大小。因为做的是响应式网站,所以要保证在各浏览器上都要有正确的效果呈现,我的需求是窄屏幕按一栏显示,轮播图要100%宽度显示,大屏幕左右两栏,轮播图在右侧,并随着窗口resize保证右栏填满,用户体验要好。所以我写了个resize的处理追加在html页面的尾部:
#focus-wrap{position: relative;height: 287px; width: 100%; overflow: hidden;}
.index-img{position:relative;height:100%;background:#efefef;overflow:hidden;text-align:center;-webkit-tap-highlight-color:transparent}
.index-img ul{position:absolute;left:0;height:100%;-webkit-transition:all 0.2s;overflow:hidden;-webkit-tap-highlight-color:transparent}
.index-img li.touchslider-item{float:left;height:100%;width:665px;}
.index-img li.touchslider-item img{height:287px;width:100%;margin:auto;vertical-align:middle;}
.touchslider-item-link{position:relative;display: block;height: 100%;width: 100%;}
.touchslider-item-desc{position:absolute;left:0; bottom:0;width:100%;height:50px; line-height:50px;padding-bottom:2px;background:#000;-webkit-opacity: .6;-moz-opacity: .6;opacity: .6; filter:alpha(opacity=60);text-align:left}
.touchslider-item-desc h5{width:90%;margin:0 0 0 14px;font-size:1.285em;color:#fff;text-shadow:0 1px 2px #171818;-webkit-text-overflow:ellipsis;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;}
.index-img .touchslider-nav{display:inline-block;position:relative;bottom:35px;overflow:hidden;position:absolute;bottom:5px;right:10px}
.index-img .touchslider-nav-item{float:left;width:10px;height:10px;overflow:hidden;/*fix ie6*/cursor:pointer;margin:3px;background:#c2c2c2;-webkit-box-shadow:inset 0 1px 0 #666;border-radius:15px;text-indent:-999em}
.index-img .touchslider-nav-item-current{background:#6FC0FF;}
7)我们知道IE9+支持CSS3的新属性RGBA,可以设置透明度,而低版本ie是不支持这个属性的。这里我们处理IE也是使用IE的滤镜,并且要注意需要给包裹文字的子元素设置定位属性,消除透明,代码如下:
距离活动结束还有 00天00小时00分00秒
活动时间2013.12.05-2013.12.08开奖时间2013.12.08
.countdown{position:absolute;bottom:0;width:100%;font-size: 1.714em;line-height:1.5em;padding:10px 0;background:RGBA(0,99,159,.6)!important;background-color:#00639f;filter:alpha(opacity=60);}
.countdown p{text-align: center;position: relative;}
.time{font-family: "STHeitiSC";padding:30px 0;}
.time i{font-size: 2.5em;font-family: helvetica;}
.intro{font-size: .917em;padding:0 20px;}
.form-action input{
//other css code
-webkit-appearance: none;
}
今天太晚了,要下班去吃饭了。今天就写这么多,感觉还有的问题没说全面,下次接着说。
推荐文章阅读:
图片优化 第五章:AlphaImageLoader http://s5s5.me/2286
Microsoft CSS Vendor Extensions http://blogs.msdn.com/b/ie/archive/2008/09/08/microsoft-css-vendor-extensions.aspx
[译]IE6终极备忘单:修复IE6下 25+ Bugs http://bbs.blueidea.com/forum.php?mod=viewthread&tid=2965546