Archive

Archive for the ‘css’ Category

介绍几个CSS3新属性和动画效果

August 7th, 2011 No comments

最近稍微玩了一下CSS几个有用的新特性,

主要是transition(过渡效果),translate(移动),transform(变形)以及animation(动画)。
几个新特性的叠加可以产生很强大的效果,而且比起写JS要方便得多,当然,目前只有webkit和mozilla以及难见踪影的IE10支持CSS3,webkit支持得最好,moz次之,IE杯具。所以目前CSS3的应用主要还是在iOS和android上会比较有前途,PC上就算了,玩玩就好了。稍微介绍一下这几个属性。
1.CSS3 Transitions 过渡效果
可以很方便地指定两种样式之间的切换过渡效果,比方说我们移动一个div的位置,从x = 0px 到 x = 200px,这时候使用transition指定缓动效果为ease-in-out,我们可以看到DIV移动时会减速。
.box:hover{
/* 这里的all是指适用在所有效果,如果想只适用width或者height,直接替换即可,多个效果用“,”隔开 */
    -moz-transition: all 800ms;
    -webkit-transition: all 800ms;
    -o-transition: all 800ms;
    -ms-transition: all 800ms;
}

 

2.CSS3 Translate 移动元素
以前如果我们要写一个元素移动的动画,通常我们会设置某元素位置为absolute,然后通过JS改变其top,left,right,bottom等属性来实现动画,现在我们可以使用css3 translate来做到这一点,而完全不需要设置position为absolute。另外,这里提醒一下大家,使用css translate在android上相当杯具,而在iOS的mobile safari里面使用,则transalte2d的效果远远不如translate3d,所以,如果需要在mobile safari里面使用该属性,强烈建议使用translate3d(x,y,z)的形式,即使只是修改其中的X或者Y,也这样写。我测试过使用translateX或者translateY,效果跟2d的一样烂。
而translate3d是webkit才支持的属性,估计内部实现与2d不同,所以效果流畅很多。
.example:hover .translate{
/*这里示例的是2D的translate,参数为x,y,如果用3D则translate3d(x,y,z),但目前只有webkit支持3D*/
-moz-transform: translate(500px,0);
-webkit-transform: translate(500px,0);
-o-transform: translate(500px,0);
-ms-transform: translate(500px,0);
}
3.CSS3 transform 形变
CSS3提供了几个很有用的属性来改变元素的形状:缩放scale,旋转rotate,倾斜skew。(IE10+也支持,但是要加-ms-前缀。)
.rotate:hover{
-moz-transform: rotate(720deg);
-webkit-transform: rotate(720deg);
-o-transform: rotate(720deg);
-ms-transform: rotate(720deg);
}
下面给出几个实例并附上相关代码(猛击这里新窗口查看效果):
Categories: css, WEB, 技术 Tags:

[每周读书] 第二十四周 《编写高质量代码——WEB前端开发修炼之道》

May 26th, 2011 No comments

互联网业界里头,WEB前端开发算是颇为年青的一行了,大约是从原先的“网页制作”演变而来。在WEB开发还被称为“网页制作”的时代,WEB的内容还大都是静态的,内容、结构混在一起,直到WEB2.0兴起,才把前端、设计、后台等很好的分开来。而前端所要掌握的最基本的技能,大约包括:CSS、HTML和JS。

这本书的作者曹刘阳前辈,是一名资深WEB前端开发工程师,先后就职于雅虎中国和淘宝,现就职于新浪。书中所写的内容都是很实在的,没有泛泛而谈的长篇大论,有的只是实战中积累下来的大量宝贵的经验,对于前端工程师来说很有帮助。虽然你可能已经做过不少网站,虽然这些网站看起来都没有多大问题,甚至运行的很好,也兼顾了浏览器兼容性,但是你总会有没有注意到的东西。比方说HTML,这个看起来很简单的东西,往往深入去了解就会发现其实很复杂。这本书介绍了HTML、CSS和JS里头各种需要注意的地方,很细很重要,这本书的主要读者应当是已经做过一两个项目的前端工作者,对于CSS、HTML和JS都有一定程度的了解和掌握,才能比较好地理解其中的专业词汇。不过总的来说还是很容易理解的。

下面贴一下我看了本书之后的一些笔记。

第一章和第二章从网站重构一直谈到团队合作的重要性,没有很深入涉及技术,但是都很重要。

 

第三章高质量的HTML

HTML里面最需要注意的应当是标签的语义化,这点在《超越CSS》一书也重点强调过。

1.为什么要使用语义化的标签。

比方说从h1~h6,我们在浏览器中看到的内容都是经过CSS定义过样式的,但是搜索引擎“看不到”这些样式,它们看到的是直接的代码,而富有语义的代码则对搜索引擎更加友好。比方说一个网页的大纲,使用h1~h6来定义要远远好过使用无数个div。

“但是搜索引擎看不到视觉效果,看到的只是代码,只能通过标签来判断内容的语义。”

CSS很强大,但是如果使用不当,容易是我们陷入CSS布局的一个误区——只要不是table布局,只要是通过CSS布局的,就是对的,就是符合WEB标准的。如果只考虑最终视觉效果,而不考虑标签语义,其实又走上了table布局的老路。

正确的做法是:先确定HTML,确定语义的标签,再来选用合适的CSS。

2.如何确定你的标签是否予以良好

去掉样式,看网页结构是否组织良好有序,是否仍然有很好的可读性。如著名的“CSS裸体日”。

推荐使用Firefox上的一个扩展——Web Developer.

可以看看W3C官网,去掉CSS样式之后网页的可读性依然极佳。

3.常见模块

1)标题用h1~h6,段落用p等等

2)表单中,用filedset包括起来,用legend写表单的title,用label设置input的名称。(这样讲不太清楚,建议看看原书。)

3)table中,使用caption,thead,tbody,tfoot和th等标签。

第四章 高质量的CSS

这章和后面一章高质量的JavaScript都是重点。

1.怪异模式和DTD

DTD即Document Type Definition,我们一般写在HTML开头作为文件类型声明。虽然类型挺多,常见的有四种,都挺长的,而目前最新的HTML5直接写为<!DOCTYPE HTML>即可。怪异模式就又是IE的专利了,如果我们的DTD漏写了,在FF里面是没问题的,但是在IE(6、7、8都是)里面就会变得很诡异了。

2.组织CSS

书中介绍一种把CSS分为三层的方法:base层->common层->page层。

最底层的base层可以说是css reset,中间common层则提供组件,page层则每个页面都不同,也是我们写CSS的重点。

base层因为只是做reset工作,一般有一个成熟的文件就可以了,可以使用作者推荐的base.css文件,在书里有,或者直接用YUI框架里头的那个也行。

3.划分模块

写CSS类的时候我们通常需要观察设计稿中相同的部分,然后划分出各个不同的模块,最大程度地使得模块可以重用。

以下是划分模块的技巧:

1)模块与模块之间尽量不要包含相同的部分,如果有相同的部分,应将它们提取出来,拆分成一个独立的模块。

2)模块应在保证数量尽可能少的原则下,做到尽可能简单,以提高重用性。

4.CSS命名

CSS的命名推荐使用英语。

常用的命名法有骆驼命名法和划线命名法。推荐将这两种方法组合使用。比方说一个ul(比方class为timeList)中最后一个li我们要设置不一样的样式,比方多个左下右下的圆角或者少个下划线什么的,那么通常我们会在最有一个li里面定义一个”last”的class,然后再用子选择符比方这么写: .timeList li{…} .timeList li:last{…}这样。但是这样涉及一个问题:滥用子选择符。为了避免多工程师合作时产生的样式层叠等问题,不推荐轻易使用子选择符。

这时候就使用两种命名法组合使用,给最后一个li命名为timeList-last,或者timeList_last。这样可以很清晰地看到这个last属于timeList模块,而又不至于名字太长。

多工程师合作的时候,为了避免不同的工程师在同个页面用了同样的class名称,可以加个前缀,比方说zhang xia工程师负责的内容,就给命名前面加个zx-xxxx。这样命名虽然会变很长,但是当项目很大的时候这样的命名还是很有帮助的,利大于弊。

5.多用组合,少用继承

我们知道class和id的区别在于class可以有多个而id只能有一个。

在给几个看起来很相似的ul定义不同的样式的时候,我们可以给每个ul都定义不同的名字然后分别定义样式。但是这样的话,我们的CSS代码会看起来很冗长,当然,使用诸如 .numberList1, .numberList2{….}这样的方法可以是代码变得简洁。但是如果几个ul的浮动、字体大小和颜色各不相同的时候我们还是得多写很多行代码。

所以可以预先定义几个浮动类 .fl{float:left} .fr{float:right},定义几个字体类 .ft12{font-size:12px} .ft16{font-size:16px},颜色类 .red{color:red},之后只要在numberList1和2中挂上各自需要类就完了。

<ul>

<li>111</li>

</ul>

<ul>

<li>111</li>

</ul>

6.处理上下margin

对于模块来说,每个模块的margin通常都是不定的,因为设计的需要会有不同的margin。所以我们可以跟第5点一样挂上个 .mt20{margin-top:20px} 这样的类。

值得注意的是,如果相邻两个div都设置了margin-left或者margin-right那么距离会被叠加,而margin-top或者margin-bottom则只会显示其中一个数值。

比方

<style type=”text/css”>

.up{margin-bottom: 10px}

.down{margin-top: 10px}

</style>

<div class=”up”></div>

<div class=”down”></div>

本来我们指望这两个div可以相距20px,但事实上只相距了10px。

总结:如果不确定上下模块的上下margin特别稳定,最好不要将它写到模块的类里,而是使用类的组合,单独为上下margin挂用于边距的原子类(例如mt10,mb20)。模块最好不要混用margin-top和margin-bottom,统一使用margin-top或者margin-bottom。

 

7.低权重原则

当不同选择符的样式设置有冲突的时,会采用权重高的选择符设置的样式。

权重的规则是这样的:HTML标签的权重是1,class的权重是10,id的权重是100。例如p的权重是1,”div em”的权重是1+1=2,”strong.demo”的权重是10+1=11,”#test .red”的权重是100+10=110。

如果CSS选择符的权重相同,那么样式会遵循就近原则,哪个选择符最后定义,就采用哪个选择符的样式。(也就是说,写在CSS文件里面比较靠后的会覆盖写在前面的。)

为了保证样式容易被覆盖,提高可维护性,CSS选择符需保证权重尽可能低。

8.CSS sprite

为了减少HTTP请求,可以把不常变动的图片,比方说那些箭头啦下拉框啦按钮啦什么的合成一张图(这个大家应该不陌生了)。

不过这个也有缺点:1)影响开发速度;2)大图中每一个小图都不可以轻易改动,牵一发则动全身,等下整张图要重来过,而相关的CSS坐标也要全部重新标过

由于代价挺大的,所以流量不大的网站就没什么必要花费时间在这个东西上了,不划算呀。

9.常见问题

1)编码风格

作者推荐使用一行式代码风格。就是:

.test{width:960px;…}

.demo{background-color:green;…}

2)id和class

a.同一个网页,相同的id只能出现一次而class可以多次

b.id的选择符权重为100而class为10

c.原生的JS提供getElementById(),但是木有getElementByClassName(),所以要么自己写个要么用框架。

 

3)CSS hack

各种hack的方法大家应该都不陌生了,不一一赘述,总之轻易别hack,而各种hack方法各有利弊,自己是情况使用。

 

4)hasLayout

又是IE的专利,在IE里头如果出现各种诡异的错误想破脑袋解决不了的话可以试试触发IE才有的hasLayout属性,这是IE用于CSS的解析引擎,有时候触发这玩意儿一些诡异的错误就自动解决了。出发方法可以使用“zoom:1”来触发,这是相对比较好的方法。

 

5)块级元素和行内元素的区别

就是block和inline的区别。块级元素有div、p、form、ul等,行内元素有span、strong、em等。

块级元素会独占一行,默认情况下宽度自动填满父级元素。行内元素则不会独占一行,相邻的元素会排列在一行,排不下再自动换行,宽度随内容自适应。

块级元素可以设置margin和padding。行内元素的margin和padding则很诡异,水平的没问题,但是竖直的设置了会变大但是没有边距效果。

10.网格布局

注意:main的内容比sidebar的更重要,无论sidebar和main在样式上谁左谁右,在html标签上要保证main的标签在sidebar之前被加载(就是写在在sidebar之前)。

11.使用IETester进行IE兼容性调试。

 

 

第四章 高质量的JavaScript

1.使用匿名函数将脚本抱起来,可以有效控制全局变量,避免冲突隐患。如:

(function(){

var a = 123;

//工程师A写的代码

})();

(function(){

var a = 456;

//工程师B写的代码

})();

这样,虽然同样有个变量为a,如果没有匿名函数包裹那么a就是全局变量,互相之间就会影响到,用匿名函数包裹起来则作用域就在函数内,不会互相影响了。

2.使用命名空间

GLOBAL.A={};

GLOBAL.A.str2=a;

GLOBAL.A.str=b;

还可以使用多级命名空间:

GLOBAL.A.CAT={};

GLOBAL.B.CAT={};

GLOBAL.A.CAT.name=”mimi”;

GLOBAL.B.DOG.name=”wangcai”;

GLOBAL.A.CAT.move=function(){

}

GLOBAL.B.CAT.move=function(){

}

3.window.onload和DOMReady

二者都是在页面加载完成后执行函数。但是window.onload是必须所有元素都加载完成,也就是所有图片啦各种富媒体啦都下载完才会执行,而像DOMReady则是各种JS框架基本都提供的方法,比方jQuery的$(document).ready(); 用这个函数则会判断所有节点已生成时执行,即便图片没下载完,所以执行速度会快很多。

如果不想用JS框架那么就把自己的JS代码放在文件尾部的</body>前面,这样所有节点生成完就会执行该JS代码鸟~

4.CSS放在页头,JavaScript放在页尾

网速慢或者文件大的时候,用户需要第一时间看到最重要的内容,把JS文件放在页尾可以加快载入速度,而CSS放在页头则是不希望在网速慢的时候用户看到完全没样式的页面。

5.文件压缩

JS源文件我们一般有大量的空格和注释,使用压缩工具可以去掉空格和注释,还可以使用比较短的变量名代替原有变量名,使得文件变小很多。不过压缩后的文件可读性就差了,所以我们要记得备份源文件。

压缩可以使用Packer和YUI Compresser。

Packer是在线的,YUI Compresser则需要下载并使用命令行执行。

(剩下的JS高级部分就不列出来的,反正光用文字也说不清楚[其实是偷懒= =!],各位如果有兴趣就看看原书吧,还是挺不错的书的。^^)

HTML和CSS入门

January 17th, 2011 No comments

很久前就想写CSS入门,但是每次都写了开头就发现太难写写不下了。
其实html也好css也好,都是极简单的语言,简单到C/C++程序员要鄙视那些把html和css成为计算机语言的人。正因为简单,所以更难写教程,如同教授1+1=2一般。
所以这篇博文不是教程,只是收集整理了一些资料,然后加上枫影自己的理解写出来的。希望大牛表拍我,每个人都不是一开始就什么都会的,都是需要经过漫长的学习过程的。
不废话了。直接一、HTML
参考维基百科的定义如下:
超文本置标语言(英文:HyperText Markup Language,简称为HTML)是为「网页创建和其它可在网页浏览器中看到的信息」设计的一种置标语言。HTML被用来结构化信息——例如标题、段落和列表等等,也可用来在一定程度上描述文档的外观和语义。由蒂姆·伯纳斯-李给出原始定义,由IETF用简化的SGML(标准通用置标语言)语法进行进一步发展的HTML,后来成为国际标准,由万维网联盟(W3C)维护。
以我个人的理解,就是一种标记性语言,整个html文件就是有多个标记“<tag></tag>”来组成的。“<tag>”是标记的开始,“</tag>”是标记的结束,另一个tag形式是<tag/>,以”/”作为整个标记的结束,浏览器会解析这些标记,并通过内置的标记的含义来显示该标记的内容。比方说“<textarea></textarea>”这个标记是用来显示多行文本框的,效果如下:

整个html文件是一颗docment tree(也称dom树,数学意义上的树),根节点为<html>。一个基本的html页面由以下几个固定的节点组成:
<html>
<head>
</head><!–一般head标记里面放各种链接,meta等属性的定义–>
<body>
</body><!–body标记里面显示的就是显示在浏览器里面我们可以看到的内容–>
</html>

接下来介绍属性,attribute。“<input type=”text” name=”username” value=”请输入用户名”/>”
在这个语句里面,有一个标记<input>,他拥有多个属性,type,name,和value。type=”text”表示这个input标签的类型是text,也就是我们和常见到的那些要求输入用户名的框框。

大致一个标准的html可以这样子写:

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<title>Insert title here</title>
</head>
<body>

<p>Hello World~!</p>

</body>
</html>

保存以上代码为test.html文件,然后在浏览器里面打开,就会看到显示“Hello World~!”字样。至于其他的,比方顶部规定了DOCTYPE以及head定义了charse之类的属性则不在入门之列,大致的意思是,使用HTML 4.01版本,设置页面的字符集为UTF-8字符集,入门时只要知道设置UTF-8就不会使中文乱码即可,更深入的可以google之或者我以后写文可能会讨论到。
然后介绍两个重要的属性id和class。
与我们后面要介绍的CSS有很大关联。
对于任何一个标记我们都可以给他一个id属性或者class属性。
比方<input id=”usernameinput” type=”text” name=”username” value=”请输入用户名”/>
则这个提示我们输入用户名的框框的id就是usernameinput,我们将可以在css中使用“#usernameinput”这样的方式来对这个标记的样式进行定义,简而言之,就是这个input标记的名字。同样的我们也可以设置他的class为usernameinput,比如:
<input type=”text” class=”usernameinput” name=”username” value=”请输入用户名”/>
在CSS中我们就使用“.usernameinput”这样的方式来对这个标记的样式进行定义。那么id和class的区别在哪里呢?从标准上来说,一个id在整个dom树里面只允许出现一次,即唯一的,而class则可以多次。
举个例子,我们有一个输入用户名密码的表单:

<input id=”username” type=”text” name=”username” value=”请输入用户名”/>
<input id=”password” type=”password” name=”username” value=”请输入密码”/>

那么我们这么写是对的,但是如果把密码那个框框的id也改成username,那么就是错的,因为username作为id不能出现两次,跟身份证号码一样,不可能有重复的。不过目前的浏览器是不会对重复ID报错的,这点不太好。
那么class呢?例子如下:

<input id=”username” type=”text” name=”username” value=”请输入用户名”/>
<input id=”password” type=”password” name=”username” value=”请输入密码”/>

同样是那个表单,这里class=”formclass”出现了两次,但是是合法的,我们在CSS里面,使用.formclass来定义样式的时候,就会一次定义了两个标记的样式。
总结:id是身份证,只能有一个值,不会有相同的id。而class是类,一个类名,允许有多个标记的class重名,因为他们是同类的。
这里可以还不太能明白,看到后面的CSS就会比较明白了。

另外列出一份HTML的标记的表格:
然后下面是我整理的常用的几个标记:
input 输入标记

type属性为text则输入字符串,password则输入字符时会显示为*号或者圈圈以隐藏字符,button则为按钮,radio则为单选,checkbox为多选
name属性是改输入标记的名字,用于在后台程序语言获取该值

div   容器,用来装各种内容,可以认为他是一个透明的盒子。
p     用于存放文字
ul    无序列表
ol    有序列表
li    放在ul和ol标记里面作为一个表项(list)

更多内容可以参考维基百科。

二、CSS
维基定义如下:Cascading Style Sheets(层叠样式表/串樣式列表),简写为CSS,由W3C定义和维护的标准,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言。目前最新版本是CSS 2.1,为W3C的候选推荐标准。下一版本CSS 3仍然在开发过程中。

CSS作为面向设计师的语言,简易是他的特点,不过貌似现在的设计师还是不太习惯通过代码来控制界面。
一个简单的CSS的代码块可以如下:

#username{
margin: 5px 4px 3px 2px;
color: #000000;
font-size: 14px;
}

其中“#username”是选择器,selector,用来确定在“{}”里面的定义是针对那个标记的,这里是针对id=”username”的标记进行定义,如果要对class=”username”的进行定义,则使用“.username”,那么所有把class属性命名为username的那些标记都会被这个代码块控制。

接下来看里面的定义,首先我们把一个<div></div>这样的标记成为容器,这也是目前常用的Html标记之一。假设这个容器的id设置为username,那么margin定义的是该容器对外部的距离,“:”后面的四个数字分别是上右下左,也就是说,margin: 5px 4px 3px 2px;这句话表示该容器距离外部容器的距离是上面5像素,右边4像素,其他类推。
color定义的是字体的颜色,采用“#”加十六进制数表示,#000000表示黑色。font-size表示字体大小。

所以,简单地看,CSS就是由选择器和定义来构成的,只要记住了这些定义我们就可以使用CSS来控制我们的页面显示的样式了。
其他更多内容的建议阅读《CSS禅意花园》和《超越CSS》这两本书。

更多内容可以参考维基百科。

Categories: css, 技术 Tags: ,

使用cufon让网页支持自定义字体

September 3rd, 2010 No comments

昨天画了一下OPhoto的首页,写CSS的时候发现中间的两句标语有点问题,我的意愿是要让后台动态生成这两句标语的文本,以便适应不同的用户,所以这两句就不能使用图片来做,但是字体又是特殊字体,怎么办呢?

google只发现一个可以支持修改网页字体的好东西,cufon,这个 东西可以把字体文件转换成JS文件然后在页面载入时导入这个字体JS就能实现页面字体的自定义了,实际上也是利用JS把字体转换成矢量的形式载入的,很强大,遂推荐之。

这是它的官网:http://cufon.shoqolate.com/generate/

把需要的字体上传后生成JS文件,再下载必要的JS文件,导入自己的HTML页即可。

注意,jquery的导入一定要在最前,不然字体在IE6下无效。

http://www.google.com/url?sa=t&source=web&cd=1&ved=0CBUQFjAA&url=http%3A%2F%2Fcufon.shoqolate.com%2F&ei=XS6ATIXOFYyfcaKN4bcL&usg=AFQjCNEkym1BzbKgtGiMUKxr12gghpMIvQ&sig2=TAGS9xupBjRV6iDoBVQRVQ
Categories: css, JS & JQuery, 技术 Tags: ,

JQuery——lightbox效果

May 25th, 2010 No comments

写了一个基于JQuery的lightbox效果,作为练习。还没写教程,先放个DEMO上来,教程以后再写。

不过可能会用纯JS写多一遍之后再放教程。

DEMO里用了CSS3做圆角和阴影,IE没有圆角但使用了IE的filter做阴影效果。

目前没做动画效果,以后补教程的时候再做。

DEMO地址:http://www.windyshade.com/wp-content/wh-demos/lightbox/demo.html

源码:猛击这里下载源码

Categories: css, JS & JQuery, 技术 Tags: , , , ,

用CSS3写出Hello World!

May 25th, 2010 2 comments

一般的计算机语言入门的时候都会有经典的一课——输出hello world!其实就是要让读者觉得能让计算机说出hello world就意味着能让它做任何事。
但是CSS没有。CSS是一门标记性语言,用于定义文档对象的高宽等样式。同为标记性语言的HTML很简单就能让网页输出hello world但是CSS不行。
所以今天我就稍微用了一下CSS3,尚未普及使用的新标准,来补当初学CSS时没有上过的经典一课。

其实实现起来也不能,就是麻烦了点。枫影这里参考到的字体是经典的Arial,需要用到的CSS3新标记为:
border-radius和rotate。也就这两个。本想加个box-shadow(因为不是字体而是用div画出来的所以没用到text-shadow),不过我的div有遮罩,就懒得去改了。

下面是在FF和Chrome下浏览的截图:
两者的显示效果,或者说对上面两个标记的支持是一样的。

下面附上DEMO观看地址以及源码下载:

DEMO地址:http://www.windyshade.com/wp-content/wh-demos/css3-hello-world/helloworld.html

源码:猛击下载源码

Categories: css, 技术 Tags: ,