Experience10  Creative, Develop, UX, Wireframe, Productivity

#Front End

Win 8 Metro App 中的字距调整 (XAML)

根据Win8 Design Guideline中的指导,Metro对文字在Canvas中的的定位有着明确的网络对齐要求。但实际情况是,XAML中的TextBlock所实际占据的渲染区域,并不是Pixel Perfect。因此如果要完全附合Metro UX Guideline,自己直接放几个Textblock上去是很难达成的。最简单的方式是使用Metro App模板中的标准样式(StandardStyles.xaml)。但如果自己要放置TextBlock的话,就一定要注意一些字体的属性设置

以下是未加位移与加了位移的对比

通用设置

在所有情况下,TextBlock因当加如下属性:

<Setter Property="LineStackingStrategy" Value="BlockLineHeight"/>

Page Header 42pt

对于大标题而言,需要做以下设置,以达成与网格对齐的目的:

<Setter Property=”LineHeight” Value=”40″/>

<Setter Property=”RenderTransform”>

<Setter.Value>

<TranslateTransform X=”-2″ Y=”8″/>

</Setter.Value>

</Setter>

 

Sub Header 20pt

子标题的设置

<Setter Property=”LineHeight” Value=”30″/>

<Setter Property=”RenderTransform”>

<Setter.Value>

<TranslateTransform X=”-1″ Y=”6″/>

</Setter.Value>

</Setter>

Body Text 11pt/9pt

正文及11pt字号的文字的设置

<Setter Property=”LineHeight” Value=”20″/>

<Setter Property=”RenderTransform”>

<Setter.Value>

<TranslateTransform X=”-1″ Y=”4″/>

</Setter.Value>

</Setter>

April 1st, 2012 at 2:07 pm by . 0 Comments
filed under Front End, Metro UI

面向对象CSS(OOCSS)

本文介绍面向对象的CSS(object oriented CSS)以及如何使用种技术提高性能以及可维护性。

OOCSS的原则

与其它面向对象编程的方法一样,OOCSS的目标在于提高代码的复用性,最终,更快以及更高效的进行开发,更方便的添加样式及维护样式。

OOCSS

OOCSS GitHub的维基上, OOCSS简述为二条重要原则。

将结构从样式(Skin)中分离

在大部分网页设计中,可视的元素往往会重复使用,如颜色、渐变、边框样式。同时也有一些不可视的元素(如“结构”)也同样在重复的使用着。当我们抽象这些元素的时候,这些元素往往可以能更多的重复使用,在下面的代码中我们将做一些解释。

以下是一套典型未应用任何OOCSS原则的样式代码:

#button {
	width: 200px;
	height: 50px;
	padding: 10px;
	border: solid 1px #ccc;
	background: linear-gradient(#ccc, #222);
	box-shadow: rgba(0, 0, 0, .5) 2px 2px 5px;
}
#box {
	width: 400px;
	overflow: hidden;
	border: solid 1px #ccc;
	background: linear-gradient(#ccc, #222);
	box-shadow: rgba(0, 0, 0, .5) 2px 2px 5px;
}
#widget {
	width: 500px;
	min-height: 200px;
	overflow: auto;
	border: solid 1px #ccc;
	background: linear-gradient(#ccc, #222);
	box-shadow: rgba(0, 0, 0, .5) 2px 2px 5px;
}

三个不同的页面组件使用不可复用的ID进行区分,但同时他们之间的确存在一些可以共用的样式代码。
如果经过简单的思考的话,我们可以将共用的代码部分抽象出来,如下所示:

.button {
	width: 200px;
	height: 50px;
}
.box {
	width: 400px;
	overflow: hidden;
}
.widget {
	width: 500px;
	min-height: 200px;
	overflow: auto;
}
.skin {
	border: solid 1px #ccc;
	background: linear-gradient(#ccc, #222);
	box-shadow: rgba(0, 0, 0, .5) 2px 2px 5px;
}

现在所有元素使用class定义,同时可复用的部分我们定义为”skin”,这样代码中就没有重复的部分。我们只需要给所有元素都加上skin的class即可。这便是简单的抽象的例子,但还未能做到“更少代码,更多的可能复用”的层次。

内容与容器的分离

以下为原始代码:

#sidebar h3 {
	font-family: Arial, Helvetica, sans-serif;
	font-size: .8em;
	line-height: 1;
	color: #777;
	text-shadow: rgba(0, 0, 0, .3) 3px 3px 6px;
}

代码指定所有的sidebar下的h3的样式。但如果我们要对另一个元素下的所有h3样式也使用同样的代码该如何处理?而且如果在另一个元素下,我们还需要有一些不同的字号大小和文字阴影效果的例外 情况呢?
以下是我们可能会修改后的代码:

#sidebar h3, #footer h3 {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 2em;
	line-height: 1;
	color: #777;
	text-shadow: rgba(0, 0, 0, .3) 3px 3px 6px;
}
#footer h3 {
	font-size: 1.5em;
	text-shadow: rgba(0, 0, 0, .3) 2px 2px 4px;
}

或者我们会改成这样子(更糟):

#sidebar h3 {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 2em;
	line-height: 1;
	color: #777;
	text-shadow: rgba(0, 0, 0, .3) 3px 3px 6px;
}
/* other styles here.... */
#footer h3 {
	font-family: Arial, Helvetica, sans-serif;
	font-size: 1.5em;
	line-height: 1;
	color: #777;
	text-shadow: rgba(0, 0, 0, .3) 2px 2px 4px;
}

我们在不经意间造成了大量的代码重复。如果基于OOCSS思想,我们需要有更多的超前思维去抽象公用的元素,并将这些元素分离到不同的模块或对象中,然后不停的重用。
上面的代码被指派到了特定的对象中,如sidebar或footer。这使得重用极为困难。我们应该保证我们的样式不应当基于任何明确的元素存在,这样我们才可以在文档中随处使用。

真实案例


先看看原始代码:

.header-inside {
	width: 980px;
	height: 260px;
	padding: 20px;
	margin: 0 auto;
	position: relative;
	overflow: hidden;
}

只有少数样式只针对header,在部分可以重用给其它元素,因此我们抽象后的样式结构如下:

.globalwidth {
	width: 980px;
	margin: 0 auto;
	position: relative;
	padding-left: 20px;
	padding-right: 20px;
	overflow: hidden;
}
<p>.header-inside {
	padding-top: 20px;
	padding-bottom: 20px;
	height: 260px;
}

globalwidth这个类的样式将被用于其它可复用的区域,如下代码所示:

<header>
	<div class="header-inside globalwidth">
	</div>
</header>
<div class="main globalwidth">
</div>
<header>
	<div class="footer-inside globalwidth">
	</div>
</footer>

有些人可能认为这样使得html的标记变得混乱,违备了把标记(markup)从表现(presentation)中分离的原则。但不可否认的是这样能更快的去使用和修改公用的样式。

The Media Object

一位有关OOCSS的先行者Nicole Sullivan。她创建了一个称为media object 的开源代码, 如她的博文中所说, 这套代码可以帮你节省上百行的代码.

OOCSS

Media object是一个很好的OOCSS的例子,他使得任何需要做图片在做,内容在右的这种类型的容器排版的问题。

OOCSS的好处

更快的载入

更多可复用的代码意味着更少的文件尺寸,使得加快网页的载入速度。

的确会造成HTML中的标记增加。但相对来说是一种值得使用的代价。

可维护的样式

以模块的形式去维护内容,而不是不停的增加样式

如果想得够全面的话,在构建新页面的时候更快捷

值得注意的地方

可以继续使用ID

OOCSS的原则只是尽量不要使用ID来做为选择符,其它情况下应该继续使用

小型项目也许不需要使用OOCSS

小项目使用OOCSS也许没有太大必要,必尽速度为王

具体实现上的原则

  • 不要使用递进式选择符(如 .sidebar h3)
  • 不要使用ID作为样式选择符
  • 不要将样式置在对象元素上(如 div.header)
  • 除非有必要,不要使用!important
  • 使用 CSS Lint 检查你的样式 (and know that it has options and method to its madness)
  • 使用 CSS grids

跟进作者Nicole Sullivan

作者网站Nicole Sullivan.

基它一些作者之前有关OOCSS的演讲内容和资料

原文出处:an introduction to object oriented css – OOCSS

简要翻译:Experience10.com

December 21st, 2011 at 10:00 am by . 0 Comments
filed under Front End

控件化HTML结构 Part 1

很长时间没有写过总结或技术贴了。最近时不时的在做一些原型,想把自己的经验记录一下。

Web Application大行其道。Silverlight和Flash始终无法赶上Web应用的脚步,不少框架和库,如jQuery,EXT都有着非常漂亮的设计思路来帮助大家快速开发Web应用,有的甚至不需要写一行HTML代码就能够搭建Web应用。在Web应用普及的今天,HTML该如何才能更好的应对越来越快速的开发呢?其实一些在RIA中的设计思想可以为现在的Web开发建立一些良好的指导与规范。

从这个例子开始。一个Button结构我们一般会怎做?大部分会是这个样子:

<div class=”simpleBtn”>Click Me</div>

然后我们会有可能数行的CSS代码来描述这个按钮的样式,这样做可以吗?当然。但是在结构化的HTML及Web应用的今天,太过具体的设计造成未来无法复用。如果这个按钮要求有纯文字,另一个按钮要求有图标。是不是得分别处理二个呢?

我简化了一个Silverlight中的按钮控件来看看他是怎么做:

<Button>
	<Grid>
		<Border>
			<Border x:Name="BackgroundAnimation"/>
			<Rectangle x:Name="BackGroundGradient">
				<LinearGradientBrush />
			</Rectangle>
		</Border>
		<Content Presenter/>
		<Rectangle x:Name="DisabledVisualElement"/>
		<Rectangle x:Name="FocusVisualElement"/>
	</Grid>
</Button>

在大部分RIA框架中,控件的设计思想就是为了复用与继承。比如这个Button控件,最终展示的内容,由Content Presenter这个对象来决定。他是文字或是图片,与按钮本身无关,按钮本身的目标就是把这个内容展示出来而已。而有关按钮的样式,由另一个对象组叫Border来决定。这样内容与样式也有对象上的分离。而其它二个Rectangle分别命名为DisabledVisualElement和FocusVisualElement大家一看也能明白,就是Disable和Focus的样式。也与内容本身有了分离,方便未来在不同的状态下调用。那么最终应用时可能会是这个样子:

<button Content="Click Me" Border="2" Background="Silver"/>

可以注意到。其实在这里的Border及Background有点像我们的CSS行间样式。在以前的CSS实践中,我们不太推荐使用行间样式,但是换回一些RIA的开发思路来看,无论是行间还是可复用的样式,都是比较通用的做法。没有人能写出绝对完美的,无垃圾代码的应用,按需使用就好。

那么,现在看看如何应用这种设计模式,来设计一个HTML/CSS的按钮呢?

<div class="C-SimpleButton" style="width:200px;height:50px;">
	<div class="C-Grid">
    	<div class="background"/>
        </div>
         <div class="C-ContentPresenter">Click Me</div>
    </div>
</div>

一个模仿Silverlight Button的HTML结构,其中Style中指定了一个行间样式让这个按钮在画面中有个默认大小。CSS样式我就不贴了,通过这个结构也能看出未来将如何来定义这个样式。

当然,我们没有办法像Silverlight一样用一个<Button/>就顺利的应用这个控件(方法也有,就是封装成JS)。但这样的规范当我们有效的建立之后,我们只需要关心将什么内容放入到<div class=”C-ContentPresentor”>节点。里面可以是一个文字,甚至可以是另一个控件。当我们的控件积累到一定量的时候,我们在搭建一个Web应用的方式,如同搭积木一样互相嵌套。控件的可读性更强,由于语义化了这个元素的结构,也使得这个控件更容易被JS来控制。

有人会问,这样做是不是在牺牲性能换语义结构?的确有这样的可能性,但是现在的在浏览器已经发展到了更高级的版本。每一年的新版本在性能上比上一代都有近50%甚至200%的提升,这种HTML结构上的解析运算量还不足以影响浏览器的性能。

其实语义化HTML结构并不新鲜,如果有兴趣,可以多翻看一下Gmail或是其它Web应用的源代码,几乎已经嵌套到了上百级的DIV结构。其目的只有一个,更有效,更快速的构建Web应用。

August 18th, 2010 at 10:55 am by . 0 Comments
filed under Front End, HTML5

display:table 使得盒模型不一致

Safari 下如果display:table;那么Box的宽度将只算Width的宽度,不算Padding/Margin,而在Firefox下面,还是和传统的元一样,最终Width=width+Padding+margin。

解决办法是,经过测试,就算父元素不使用display:table;子元素继续使用display:table-cell;也能使整个元素继续以表格状态呈现。

May 17th, 2010 at 12:41 pm by . 0 Comments
filed under Front End

《CSS网站布局实录2》源码下载

的确不记得是不是有发过源码或是更新过上次的源码了,所以再贴一次,点此下载

March 20th, 2009 at 8:58 am by . 0 Comments
filed under Front End

IE(7)的GIF渲染似乎有问题

昨天以前的同事通过Gmail发来了一个问题,看了一下觉得很有意思,贴出来分享一下:

先看这个页面,用鼠标移上各个标题,注意,用IE6或IE7,我是用Vista下的IE7看到的问题

同事发现A:Hover的背景显示在IE下特别迟缓,而在FF下没事,通过测试,再看这个页面

似乎在IE下没问题了吧?在拿到页面后经过一些测试,发现最后竟然是小小的GIF背景搞的事,可能是IE对GIF的渲染有一定的问题,大量平铺后造成渲染计算缓慢,把GIF另存为JPG后,再平铺,就不存在这个问题了。以前我也没碰见过,很奇怪是不是?

November 25th, 2007 at 9:09 am by . 0 Comments
filed under Front End

给CSS学习者一剂万能药方

其实我平时做CSS的东西较少了,主要工作是在做创意方面的事情,但是也经常有CSS学习者在QQ或MSN上问我一些问题,但很多问题呢,总是很重复.有时候,一个图片显示不了,一个东西长度或宽度不够,和想象中不一样,大家就着急了..但是从我的角度出发去看待这些着急的问题的时候..我觉得主要是解题思路问题:
首先我反对利用一些高级技巧,高级技巧太偏门,而且不好理解.当然,CSS中也没有啥太高级的技巧,所以所有编写方式都很简单,如果一个东西位置或样式不对,我觉得我们没必要死磕在正确的位置上,而是应该找原因所在.我最常用的方法,就是使用border:1px solid #000fff;这样一句话,这句话让我当前这个DIV有1px的蓝色边框,有了蓝色边框,我就知道这个DIV的位置,大小等信息,那么我就能进一步知道这个元素与预想中的位置或大小有多少差异.而且有时候我会截屏,用photoshop去量一下实际误差,那么知道误差了,我就再去找误差的原因,比如我把上一层DIV也加上边框,去看看与上一层的关系,看是不是由于上一层引起来,逐层向上推进,总能找到一个东西,阻碍了我的CSS实现.那么对于平级的DIV也是一样的,也是用这个方法,基本上是手工加边框再加上分析,慢慢推导出一个问题,举个例子:

某背景图片,在IE中正常,而在FF中不正常,那么我用Border:1px solid #000fff;加亮这个显示背景的DIV,结果发现,在IE中,这个DIV是个大框.而在FF中,这个DIV高度只有5px,难怪.原来DIV不够高,自然背景显示不了..这和FF或FF支不支持背景没关系.而大多数人一直在问自己,为什么没有背景,其实不是没背景,而是没有高度.问题出来了..如何把这个DIV拉高?绝对定位?绝对高度?还是在DIV下面塞一个clear:both的小方块?都行,这就是CSS问题的解决思路.

那么试着把这个问题解决…高度不够,看上去像是没撑开,OK,在这个DIV封闭的地方/div的地方加个数字,比如123,结果发现.DIV撑开了..原来下面没有实体,所以没撑开..OK,继续,我想保持这个状态,但又不想显示数字123..怎办?123换成空格,嗯.没问题,那么空格有高度,怎办?DIV不是可以overflow:hidden吗,就这样,我把空格放进一个div中,这个DIV高度为0,空格也不显示了..而且这个DIV帮助我们把这个DIV撑开了..

September 4th, 2007 at 9:19 am by . 0 Comments
filed under Front End

CSS实录第二版在线购买地址

最近有点忙得不可开交之势,而第二版图书也出来了,目前线上书店只看见卓越有卖,随后我会将目录对比附上,可能等2天.

China-Pub购买地址

源码方面,变化不是很大.因为重写的过程中,大部分是优化和改进,大家可以先下载这套源码,我今天回去再查一下新的源码

补充区别:
因为一直很忙,没有时间仔细写这本书二版之间的区别,所以我简述一下:

1 本书修订了第一版中所有的错别字,所有的代码错误,编辑部也做了审校.质量会比第一版有所上升
2 本书增加了DREAMWEAVER CS3中的特性,以及增加了20%左右的新内容.稍后我上目录对比

August 18th, 2007 at 9:21 am by . 0 Comments
filed under Front End

拿到第二版的样书

今天收到了出版社寄来的样书,看了一下,页数增加到了409页,定价增到39元。印刷质量比上次有所提高,但是还是没达到我的要求,此外还有一些其它一些印刷方面的小问题,打电话到社里说这次印数没全印,下次能改进。还是特别感谢kennyL设计的封面。现在外面应该有售了

August 11th, 2007 at 9:23 am by . 0 Comments
filed under Front End

第二版图书新封面

特别邀请kenny帮我设计的。

再过一个月就能见到卖了

June 11th, 2007 at 9:30 am by . 0 Comments
filed under Front End, UPDATE