细节决定成败–无css时网页的可读性

先上示例,首页酒店模块的效果图如下:

首页酒店模块效果图

代码结构如下:

<dl>
 <dt>酒店</dt>
 <dd>北京</dd>
 <dd>上海</dd>
</dl>
<ul>
 <li>北京酒店列表</li>
 <li>北京酒店列表</li>
 <li>上海酒店列表</li>
 <li>上海酒店列表</li>
</ul>

这种结构在显示上没有任何问题,切换城市时下面的列表会相应改变。但当无法正常加载css时显示效果就比较杯具了,截图如下:

无css时的显示效果

接下去是其它城市的列表,太长了图片没有截全。我们需要的至少是城市与所属它的列表显示在一起,在视觉上归属同一个模块,也就是说要在代码结构上把它们按照业务逻辑重现出来:

<dl>
 <dt>北京</dt>
 <dd>
  <ul>
   <li>北京酒店列表</li>
   <li>北京酒店列表</li>
  </ul>
 </dd>
</dl>
<dl>
 <dt>上海</dt>
 <dd>
  <ul>
   <li>上海酒店列表</li>
   <li>上海酒店列表</li>
  </ul>
 </dd>
</dl>

这样当页面出现no css的时候显示效果就比较接近真实需求:

利用dl重组代码结构还原网页内容

到这里就离成功不远了,接下来的问题是如何用现在的 dl, dt, dd 实现想要的视觉效果。

1. 先给所有 dl 的外层 div 加样式:position: relative,再给 dd 设置 position: absolute,这样列表就可以脱离 dl 的文本流了,切换列表时保证它们显示在同一个位置;
2. 城市横排显示,这时设 dl 为浮动 float: left,再刷新果然横过去了。不过现在笑还早了点,不要忘了还有那万恶的 IE6 要兼容:给 dt 设置浮动并转行内元素,否则会有多余的空隙 float: left; display: inline; 再刷新就OK了;
3. 补充一点为什么要在 dd 中加 ul,这要视页面结构而定,每一条除了标题还有价格,还有个需要转化的人民币符号 ¥,如果直接用 a 链接就需要大批量行内转块元素,比较耗性能。最初想用多个 dd,但因为有绝对定位的原因列表会重叠在一起,所以更换方案。

这个构想是我刚进公司时听强哥提到的,那个什么三层分离的东东,上午完成一个关于首页的变更刚好看到这个模块可以优化,重构这东西成本太大,我决定见一个改一个,然后偷偷传上去,哈哈哈哈,邪恶的笑声~~~~话说可视化编辑窗口坏掉了,靠想象排版还真是辛苦啊,这次就不给文字加颜色了。

文字环绕图片

像Word一样实现文字环绕图片一直都不受前端们的重视,我们总能找到其它方法来代替,比如position定位,比如让开发人员控制输出字数,再比如使用JS脚本……刚刚上线的机票二期有个小模块遇到类似问题,其实N个月前就折腾过这个变态的东东,上周整理出来搞个全组分享,觉得不过瘾还是写出来吧~~~

文字环绕图片
代码拆分

原理很简单,就是构造一个宽度为0的层,设为浮动,再设置需要的高度,这样被环绕的模块就被挤到下面去了,当然前提是清掉上面的浮动。

似乎WordPress不能上传Demo文件,还是直接贴代码了:

<div class=“surround”>
<div class=“space”></div>
<div class=“surrounded”><a href=“###”>这里可以环<br />绕一张图片</a></div>
Maybe God wants us to meet a few wrong people before meeting the right one, so that when we finally meet the person, we should know how to be grateful. Meeting you was fate, becoming your friend was a choice, but falling in love with you was beyond my control. How was it that you came to me… how blessed I was, but it’s hard to believe.
</div>

样式如下:

.surround { width: 600px; margin: 20px auto 0; padding: 20px; background: #fff; overflow: hidden; }
.space { float: left; width: 0; height: XXpx; }
.surrounded { clear: left; float: left; margin-right: 10px; background: #000; }
.surrounded a { color: #fff; }

前端最想看到的UI规格标注

  比如一个404页面如下:

404页面

  Art从平面视觉角度会给出这种图图:

Art的UI规格标注图

  而前端要把它拆解成需要的盒模型,即结构+表现模块化,拆解后的图应该是这样的:

前端最想看到的UI规格标注

  如果真要做成这样那前端得兴奋得跟磕了药一样,做完页面出去逛逛街买买下午茶,不过我想设计师做鬼都不会放过我的⊙﹏⊙ 上午的视觉规范部门分享会刚好提到这个问题,心里小小滴YY了一下,决定写给Art们和有志做Art的同学看O(∩_∩)O

  1. 这个任务的设计稿比较简单,我先拿来做个范例,LSL同学不要想太多,哈哈^^
  2. 第二张图(箭头版)对前端来说有用的地方没有几处(再次强调:LSL同学不要想太多),比如Ctrip全站行高1.6,内外补丁是不会贴着文字上下基线走的,所以切图的时候要精确到像素还原设计稿还是要自己量一遍;
  3. Art和前端对于结构的理解毕竟不在同一范畴,比如什么地方用margin、什么地方用padding就不能写死在设计稿上,如果Art真到了这地步那前端基本就可以直接去6楼了(在Ctrip,6楼是个神奇的地方,可以解决部门内外一切争端,绝无后患--人事部离职办理专柜╮(╯_╰)╭);
  4. 既然是这样,那我们可以考虑一个折中方案:
   a. 前端充分了解业务需求,考虑扩展性,适当灵活一点,毕竟在Firebug里调像素值要比Photoshop快多了。工作的重点不在像素值,而在于需求,我们不是冷酷无情的Coder,而是有情有义有实现能力的艺术家 ♡_♡
   b. Art空下来的时候可以关注一下盒模型,尽量使间距对称,行高神马的只在规范里写就好,设计稿就不用量了,只要把模块框出来就可以,其它的全都丢给前端吧 ┭┮﹏┭┮

  借用一下豆瓣前端kejun关于UI规格标注里的一句话:Design is about how it works, not just how it looks.

一个外间距合并的BUG


body { background:#fff; } #base_bd { margin:10px auto; height:auto !important; height:600px; min-height:600px; background:#eee; } #base_bd:before { clear:both; content:"\020"; display:block; height:0; overflow:hidden; } .rfp_txt_list { width:480px; margin:10px auto; padding:10px; background:#fff;white-space: pre-wrap; white-space: -moz-pre-wrap; word-wrap: break-word; }

css:
#base_bd:before { clear:both; content:”\020″; display:block; height:0; overflow:hidden; } 解决边距bug

.rfp_txt_list { width:480px; margin:10px auto; padding:10px; background:#fff;white-space: pre-wrap; white-space: -moz-pre-wrap; word-wrap: break-word; } 解决字数撑大bug

注意事项:
#base_bd:before { clear:both; content:”.”; display:block; height:0; overflow:hidden; } 别用content:”\020″ 不然firefox2不认识。

菜单多层级多效果

依旧是之前的项目,第二个让人纠结的模块,效果见上图。设计师后期一时兴起多加了红色小尖角害我返工重写代码结构。。。我一直有个邪恶的念头:就是和设计师轮岗,让他也尝尝被虐的滋味~~~

重复部分忽略,贴关键代码:

<dl>
<dt class=“menu_current”><a href=“###”>后台首页</a></dt>
<dt class=“menu_unfold”><a href=“###”>客栈维护</a></dt>
<dd><a href=“###”>基本信息维护</a></dd>
<dt class=“menu_fold”><a href=“###”>客栈查看</a></dt>
</dl>

1. 如果没有小尖角右边线用 border 就OK,鉴于目前这种结构还是把右边线切进背景比较方便,否则就要给尖角单独写标签,当然不单独写也可以,就是再套一层代码,很不幸的是我有强迫症==!!
2. dt 底部的虚线距左右是有距离的,所以要把文字 padding 进去,把 border 加到 a 上,鼠标滑过变成黄色时再用负margin 向两侧延长;
3. 折叠展开的小箭头加到 a 上,因为 dt 要读取右边线及是否有小尖角的背景,同理 dd 上的小点儿也要加到 a 上;
4. 因为小尖角的原因 padding 值左右不同;
5. 鼠标滑过状态没有底部虚线,用了重置 border 为与背景同色直线的方法,或者增大 padding-bottom 值,但要重设 border 为 none,鉴于要多写一句代码,放弃;
6. 下面的黄色边线模块也用了红色小尖角,为了使左右对齐,要给 a 设与尖角等高的高度值。
—————————————-
样式比较长,两部分共23行,谁写得比我少请回复,本博主送亲笔签名照一张,hohooooooo~~~~

负margin是好东西

上个月完成的项目,举个让我纠结N小时的模块,先上图:

sozhen_status

默认状态为灰色,不带圆圈,已完成状态为红色,当前进行中显示为黄色,并且圆圈在两个字中间,最后一个状态“成功”如果为灰色,线条要小于文字,但其它部分要连贯。原型代码如下,为了JS结构当然越简单越好:

<ul>
<li class=“status_finished”>选择</li>
<li class=“status_current”>预订</li>
<li>支付</li>
<li>成功</li>
</ul>

让人纠结的时候到了:圆圈左右线的颜色不同,如果切在一起那最后一个状态就要单独应用没有右侧多余线条的图片,等于要切两套图,方案要放弃;如果每个状态只切到圆圈部分,给右侧留点空白出来它就会显示在两个字中间了,但紧接着的状态怎么延续到左侧?有一个方法:负margin~~~

放大后的效果图:

样式如下:

ul { margin: 36px auto; height: 30px; }
ul li { float: left; width: 164px; margin-right: -6px; padding-top: 15px; text-align: right; background: url(“xxxx.gif”) no-repeat right XXpx; color: #666; }
ul li.status_finished { background-position: right XXpx; }
ul li.status_current { background-position: right XXpx; font-weight: bold; color: #000; }

注意:合并图片的时候圆圈右侧要留出6px(具体值根据实际情况确定)透明空隙,左侧线条为自适应考虑尽可能长一点。

上海站Web标准化交流会5月概况

上海站5月Web标准化交流会于2010年5月29日在携程大学举办~

以下是相关活动图片:

由于是周末携程大楼6楼前台MM没有上班,大家没有一饱眼福的机会^__^;

位于携程网络技术大楼楼顶的“携程大学”,阳光和空气都相当的好。

查看详细 »

Page 1 of 1212345»10...Last »