秋风的萧瑟 又见湖边木叶飞

欢迎来到梁良 | LonBlog,这里记录下了我生活点点滴滴。

15个最佳jQuery幻灯插件和教程

 在网站前端中使用jQuery库已经变得越来越流行,前端开发人员发布或撰写的相关的插件和教程也与日俱增。

  幻灯(通常也被称为“内容滑动”、内容切换效果、焦点图等)是在网站或博客的较小区域展示大量内容的很好的方法。动态的自动滑动内容在很多网站上都是很流行的。你是否也对在自己的网站上实现类似的效果感兴趣?那就看一下本文列出的jQuery插件吧!

  1. jFlow

  官方网站 | 演示

  一个漂亮而整洁的图片幻灯,被nettut推荐,如果你想自己做一个图片幻灯效果,就去看看吧。

  2. 使用jQuery UI实现推荐内容的幻灯展示

  官方网站

posted @ 2010-06-10 18:00 梁良 阅读(241) | 评论 (0)编辑 收藏

jQuery常用技巧

1、关于页面元素的引用

通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。

2、jQuery对象与dom对象的转换

只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是jquery对象。

普通的dom对象一般可以通过$()转换成jquery对象。

如:$(document.getElementById(”msg”))则为jquery对象,可以使用jquery的方法。

由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。

如:$(”#msg”)[0],$(”div”).eq(1)[0],$(”div”).get()[1],$(”td”)[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。

以下几种写法都是正确的:

 

$(”#msg”).html();
$(”#msg”)[
0].innerHTML;
$(”#msg”).eq(
0)[0].innerHTML;
$(”#msg”).get(
0).innerHTML;

3、如何获取jQuery集合的某一项

 

对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq或get(n)方法或者索引号获取,要注意,eq返回的是jquery对象,而get(n)和索引返回的是dom元素对象。对于jquery对象只能使用jquery的方法,而dom对象只能使用dom的方法,如要获取第三个<div>元素的内容。有如下两种方法:

 

$(”div”).eq(2).html(); //调用jquery对象的方法
$(”div”).get(2).innerHTML; //调用dom的方法属性

4、同一函数实现set和get

 

jQuery中的很多方法都是如此,主要包括如下几个:

 

$(”#msg”).html(); //返回id为msg的元素节点的html内容。
$(”#msg”).html(”<b>new content</b>”);
//将“<b>new content</b>” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content

$(”#msg”).text();
//返回id为msg的元素节点的文本内容。
$(”#msg”).text(”<b>new content</b>”);
//将“<b>new content</b>” 作为普通文本串写入id为msg的元素节点内容中,页面显示<b>new content</b>

$(”#msg”).height();
//返回id为msg的元素的高度
$(”#msg”).height(”300″); //将id为msg的元素的高度设为300
$(”#msg”).width(); //返回id为msg的元素的宽度
$(”#msg”).width(”300″); //将id为msg的元素的宽度设为300

$(”input”).val(”);
//返回表单输入框的value值
$(”input”).val(”test”); //将表单输入框的value值设为test

$(”#msg”).click();
//触发id为msg的元素的单击事件
$(”#msg”).click(fn); //为id为msg的元素单击事件添加函数

同样blur,focus,select,submit事件都可以有着两种调用方法。

 

5、集合处理功能

对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。

包括两种形式:

 

$(”p”).each(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]})
//为索引分别为0,1,2的p元素分别设定不同的字体颜色。

$(”tr”).each(
function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
//实现表格的隔行换色效果

$(”p”).click(
function(){alert($(this).html())})
//为每个p元素增加了click事件,单击某个p元素则弹出其内容

6、扩展我们需要的功能

 

 

$.extend({
min:
function(a, b){return a < b?a:b; },
max:
function(a, b){return a > b?a:b; }
});
//为jquery扩展了min,max两个方法

使用扩展的方法(通过“$.方法名”调用):

 

 

alert(”a=10,b=20,max=+$.max(10,20)+”,min=+$.min(10,20));

7、支持方法的连写

 

所谓连写,即可以对一个jquery对象连续调用各种不同的方法。例如:

 

$(”p”).click(function(){alert($(this).html())})
.mouseover(
function(){alert(’mouse over event’)})
.each(
function(i){this.style.color=['#f00','#0f0','#00f'][ i ]});

8、操作元素的样式

 

主要包括以下几种方式:

 

$(”#msg”).css(”background”); //返回元素的背景颜色
$(”#msg”).css(”background”,”#ccc”) //设定元素背景为灰色
$(”#msg”).height(300); $(”#msg”).width(”200″); //设定宽高
$(”#msg”).css({ color: “red”, background: “blue” });//以名值对的形式设定样式
$(”#msg”).addClass(”select”); //为元素增加名称为select的class
$(”#msg”).removeClass(”select”); //删除元素名称为select的class
$(”#msg”).toggleClass(”select”); //如果存在(不存在)就删除(添加)名称为select的class

9、完善的事件处理功能

 

jQuery已经为我们提供了各种事件处理方法,我们无需在html元素上直接写事件,而可以直接为通过jquery获取的对象添加事件。

 

$(”#msg”).click(function(){alert(”good”)}) //为元素添加了单击事件
$(”p”).click(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]})
//为三个不同的p元素单击事件分别设定不同的处理

jQuery中几个自定义的事件:

 

(1)hover(fn1,fn2):一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。

//当鼠标放在表格的某行上时将class置为over,离开时置为out。
$(”tr”).hover(function(){
$(
this).addClass(”over”);
},
function(){
$(
this).addClass(”out”);
});

(2)ready(fn):当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。

 

 

$(document).ready(function(){alert(”Load Success”)})
//页面加载完毕提示“Load Success”,相当于onload事件。与$(fn)等价

(3)toggle(evenFn,oddFn): 每次点击时切换要调用的函数。如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数。随后的每次点击都重复对这两个函数的轮番调用。

 

 

//每次点击时轮换添加和删除名为selected的class。
$(”p”).toggle(function(){
$(
this).addClass(”selected”);
},
function(){
$(
this).removeClass(”selected”);
});

(4)trigger(eventtype): 在每一个匹配的元素上触发某类事件。
例如:

 

 

$(”p”).trigger(”click”); //触发所有p元素的click事件

(5)bind(eventtype,fn),unbind(eventtype): 事件的绑定与反绑定
从每一个匹配的元素中(添加)删除绑定的事件。例如:

 

 

$(”p”).bind(”click”, function(){alert($(this).text());}); //为每个p元素添加单击事件
$(”p”).unbind(); //删除所有p元素上的所有事件
$(”p”).unbind(”click”) //删除所有p元素上的单击事件

10、几个实用特效功能

 

其中toggle()和slidetoggle()方法提供了状态切换功能。
如toggle()方法包括了hide()和show()方法。
slideToggle()方法包括了slideDown()和slideUp方法。

11、几个有用的jQuery方法

$.browser.浏览器类型:检测浏览器类型。有效参数:safari, opera, msie, mozilla。如检测是否ie:$.browser.isie,是ie浏览器则返回true。

$.each(obj, fn):通用的迭代函数。可用于近似地迭代对象和数组(代替循环)。如

 

$.each( [0,1,2], function(i, n){ alert( “Item #” + i + “: ” + n ); });

等价于:

 

 

var tempArr=[0,1,2];
for(var i=0;i<tempArr.length;i++){
alert(”Item #”
+i+”: “+tempArr[ i ]);
}

也可以处理json数据,如

 

 

$.each( { name: “John”, lang: “JS” }, function(i, n){ alert( “Name: ” + i + “, Value: ”
 
+ n ); });

结果为:

 

 

Name:name, Value:John
Name:lang, Value:JS

$.extend(target,prop1,propN):用一个或多个其他对象来扩展一个对象,返回这个被扩展的对象。这是jquery实现的继承方式。

 

如:

 

代码
$.extend(settings, options);
//合并settings和options,并将合并结果返回settings中,相当于options继承setting并将继承结果保存在
setting中。

var settings = $.extend({}, defaults, options);
//合并defaults和options,并将合并结果返回到setting中而不覆盖default内容。

可以有多个参数(合并多项并返回)

 

 

$.map(array, fn):数组映射。把一个数组中的项目(处理转换后)保存到到另一个新数组中,并返回生成的新数组。

如:

 

 

var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
tempArr内容为:[
4,5,6]
var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
tempArr内容为:[
2,3]
$.merge(arr1,arr2):合并两个数组并删除其中重复的项目。
如:$.merge( [0,1,2], [2,3,4] ) //返回[0,1,2,3,4]
$.trim(str):删除字符串两端的空白字符。
如:$.trim(”   hello, how are you? “); //返回”hello,how are you? ”

12、解决自定义方法或其他类库与jQuery的冲突

 

很多时候我们自己定义了$(id)方法来获取一个元素,或者其他的一些js类库如prototype也都定义了$方法,如果同时把这些内容放在一起就会引起变量方法定义冲突,Jquery对此专门提供了方法用于解决此问题。
使用jquery中的jQuery.noConflict();方法即可把变量$的控制权让渡给第一个实现它的那个库或之前自定义的$方法。之后应用Jquery的时候只要将所有的$换成jQuery即可,如原来引用对象方法$(”#msg”)改为jQuery(”#msg”)。
如:

 

jQuery.noConflict();
// 开始使用jQuery
jQuery(”div p”).hide();
// 使用其他库的 $()
$(”content”).style.display = ‘none’;

 

posted @ 2010-06-10 17:59 梁良 阅读(210) | 评论 (0)编辑 收藏

最佳jQuery教程和实例

由Noupe带来的51个最佳jQuery教程和实例, 向大家介绍了jQuery的一些基本概念和使用的相关教程, 帕兰继续为你翻译, 如果你对jQuery感兴趣, 也可以查看帕兰之前翻译的一些文章:

John Resig

John Resig, 这位是 JQuery JavaScript脚本库的创建者, 同时也是Mozilla公司的技术人员.

进一步了解John Resig

15 Days Of jQuery

15 Days Of jQuery-15天内从零到精通的 jQuery教程.

进一步查看这个教程15 Days Of jQuery

学习jQuery

Learning jQuery

进一步查看 LearningjQuery.com里面的教程

Bassistance

Bassistance- 这个教程向你展示如何通过jQuery创建插件.

进一步查看Bassistance教程

  • Getting Started with jQuery- 本指南介绍了该jquery库。它一步一步的解释jQuery的细节,包括一个简单的Hello World举例演示,选择和活动的基本知识,Ajax, FX和使用情况以及如何创建插件。

Cody Lindley

Cody Lindley- ThickBoxjTip plugins的创建人

Featured Tutorials on Cody Lindley

Remy sharp’s Blog

Remy sharp- 在 他的博客里面, 有许多关于jQuery的教程和插件,.

PS. 越翻越深奥, 有的看不懂, 无法翻译. 这jQuery的基础还真不好懂. 没精神翻了, 大家自己看看英文吧. 改天有精神再翻译剩下的.

Featured Tutorials on Remy sharp’s Blog

  • Text box hints-You will see a lot of web sites with search boxes have text alreadypopulated inside of the field and when you select the input text box itdisappears and reappears when it’s not selected. This tutorial willshow you how can add a small amount of jQuery to add this feature toany of your web sites.
  • Auto-populating Select Boxes using jQuery & AJAX-Allow the user to select a top level category from one select box andto automatically populate the sub-category using jQuery and Ajax.

Featured Tutorials on jQueryForDesigners

  • Using Ajax to Validate Forms-With this tutorial you will be able to have your first forms that dothe following: 1) Live username checking, 2) Password confirmation andstrength, 3) Checking if an email address is already registered, 4) URLvalidation
  • Image Cross Fade Transition- How to fade one image in to another?

Web Designer Wall

  • jQuery Tutorials for Designers-This article contains 10 visual tutorials intended for web designersand newbies on how to apply Javascript effects with jQuery. Effectsinclude: Simple slide panel, Simple disappearing effect, Chain-abletransition effects, Accordion, Animated hover effect, Entire blockclickable, Collapsible panels.

CSS-Tricks

CSS-Tricks is a home forexamples, tutorials, tips, tricks, and news regarding Cascading StyleSheets. Chris Coyer is getting into jQuery lately and postinginteresting jQuery tutorials in his journey to learn jQuery.

Featured Tutorials on CSS-Tricks

Getting started with jQuery

  • The jSkinny on jQuery- A tutorial on the jQuery javascript library (from a Ruby/Rails perspective).
  • How to Get Anything You Want- An introduction to jQuery selectors and traversal methods, and their use in navigating the DOM.
  • It’s all about CSS- If you’ve got a good understand of CSS selectors, then you’re already familiar with how to query the DOM.
  • jQuery Crash Course-For those who’d like to learn more about jQuery, one of the morepopular libraries, here’s a crash course written with code-savvy webdesigners in mind.
  • jQuery in 15 minutes- A short introduction to jQuery.
  • jQuery Basics- This section covers basic usage of jQuery from getting started to finding elements and working with CSS.
  • Easy JavaScript for Designers-A nice little writeup for the jQuery Java Script Library. Designersneed all of the coding shortcuts they can and jQuery seems to deliver.

jQuery Cheat Sheets

  • jQuery Cheatsheet-The cheat sheet comes in two flavors: 1) Made for iPhone and iPodTouch, and any other mobile device with internet access. 2) Old-schoolprintable A4 cheat sheet
  • jQuery 1.2 Cheat Sheet

Building jQuery Plugins

jQuery Effects and Techniques

Ajax development with jQuery

  • Easy Ajax with jQuery-Akash Mehta will show us how to simplify the process of adding Ajax tothe application even further with the help of jQuery, a popularJavaScript library.
  • Simplify Ajax development with jQuery- Discover how easy Ajax and DOM scripting can be
  • Quick and Dirty AJAX- A walk through tutorial showing some of the basic ways you could use jQuery to add AJAX functionality to your site.
  • A Quick Code Igniter and JQuery Ajax Tutorial- A step-by-step tutorial will show you how to combine the power of jQuery with Code Igniter(a PHP framework based on the MVC design pattern) to quickly andpainlessly pass a record ID through the javascript and over to theserver, where it will be passed to a mysql database, used to retrievesome data, and sent back to the page for display.

jQuery Fixing common Browser Issues

posted @ 2010-06-10 17:58 梁良 阅读(338) | 评论 (0)编辑 收藏

[ZT]VPS 快速安装 Linux+Nginx+MySQL+PHP 环境

再次出手购买了VPS,这次买的是性价比不错的PhotonVPS的Xen Plan,下面介绍一下快速配置LNMP(Linux+Nginx+MySQL+PHP)环境的方法(一般不出意外只要20分钟就可以搞定)。

首先当然得购买一款VPS(废话),推荐国内的 Rashost,国外的 Diavps(是一群中国人在做),PhotonVPS,Rashost 和 Diavps 可以用支付宝支付,PhotonVPS 可以用 Paypal 支付,一般支付以后最多等一两个钟头就可以收到邮件,一个VPS的IP,一个root的密码。
(PS:购买尽量选择CentOS 5.3 32bit ,别买64位,占用内存很大的)

接着,下载 Putty ,运行 putty.exe ,输入你的 IP 和用户名(root)。

然后开始安装著名的 LNMP( Linux+Nginx+MySQL+PHP )环境,接着,用猫猫童鞋的修改版LNMP一键安装套装,我简述一下方法:

1.首先登陆VPS,用SSH登陆.

2.安装LNMP,进入一个目录: cd /usr/local/src

然后就下载LNMP: wget http://imcat.in/LNMP.zip

解压缩 unzip LNMP.zip

有些VPS安装后没有unzip这个命令,那么运行 yum install unzip

进入该目录 cd LNMP

给脚本添加执行权限:chmod +x down.sh install.sh opt.sh startup.sh

下载安装所需的源代码文件: ./down.sh

开始安装: ./install.sh

(安装过程会询问要默认绑定的域名,然后会要求确认输入y即可)

安装完后,请运行:passwd www

为 www 用户设置一个密码.这个用户和密码就是ftp的用户名和密码

修改您的 MySQL 的 root 密码
使用命令:mysqladmin -u root -p password mypasswd //mypasswd为自己的密码
如果提示没有mysqladmin命令.请运行:yum install mysql

这样你就可以上传你的网站了.

程序安装路径:
MySQL : /usr/local/mysql
PHP : /usr/local/php
Nginx : /usr/local/nginx
Web目录 /web/www

这个套装没有安装熟悉的 PhpMyAdmin ,接下来就下载一个 PhpMyAdmin:

返回主目录 cd /
进入网站所在目录 cd web/www
下载phpmyadmin wget http://downloads.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-3.2.0.1-all-languages.zip?use_mirror=ncu
解压 unzip phpMyAdmin-3.2.0.1-all-languages.zip

然后在浏览器输入 http://你的ip/phpMyAdmin-3.2.0.1-all-languages/ 即可进行数据库管理操作,切记删除除了root以外的几个用户(在右上角的权限上,没密码的几个傻蛋用户全部删除)

接下来安装 WordPress ,Nginx 配置用我昨天给的那份,OK,一个没有优化过的最简单的LNMP环境就配置好了,运行一下 http://你的ip/phpinfo.php 成功的话就说明OK鸟~

posted @ 2010-06-10 17:51 梁良 阅读(278) | 评论 (0)编辑 收藏

[ZT]如何挑选最适合自己的美国VPS主机商

购买VPS已经快一年了,最这个行业也算是摸清了底细,最近很多朋友来询问我如何挑选合适的VPS主机,我就不一一回答,直接博文献上。

如何挑选最适合自己的美国VPS主机商

一、什么是VPS(Virtual Private Server)

VPS(Virtual Private Server 虚拟专用服务器)技术,将一部服务器分割成多个相互隔离的虚拟专享服务器的优质服务。 每个VPS的运行和管理都与一台独立主机完全相同,都可分配独立公网IP地址、独立操作系统、独立超大空间、独立内存、独立CPU资源、独立执行程序和独立系统配置等。 用户除了可以分配多个虚拟主机及无限企业邮箱外,更具有独立服务器功能,可自行安装程序,单独重启服务器,总而言之,VPS是一项具备高弹性、高质量及低成本效益的服务器解决方案,是高端虚拟主机用户的最佳选择。您不再受其他用户程序对您造成的影响, 得到的是更加公平的资源分配,远远低于虚拟主机的故障率。(来源

说的通俗一点,VPS能得到比一般的虚拟主机更高的权限和体验,一般每个VPS都带有至少一个独立IP,可以随意建站,可以随意装系统扩展,可以随意下载东西,总之,在高度虚拟化的技术下,VPS和独立服务器已经差不多,甚至,配置好的VPS性能已经远超于一般配置的独立服务器。

二、VPS主机商流行的虚拟化技术

市场上的VPS商家主要有 Xen 和 OpenVZ 两种开源的虚拟化技术

Xen 是一个开放源代码虚拟机监视器,由剑桥大学开发。它打算在单个计算机上运行多达 100个满特征的操作系统。操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性)。这使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。

OpenVZ是开源软件,是基于Linux平台的操作系统级服务器虚拟化解决方案。OpenVZ采用 SWsoft  的 Virutozzo 虚拟化服务器软件产品的内核,Virutozzo 是 SWsoft 公司提供的商业虚拟化解决方案。

说得通俗一点,Xen VPS 更接近于真实的系统,所以 PPTP VPN 这类需要系统底层支持的软件只能安装在 Xen VPS 上,关于 Xen 和 OpenVZ 平台的具体区别和优缺点,可以查看这几篇文章:

挑选VPS:Xen与OpenVZ有什么区别?

Xen和OpenVZ在内存管理方式的区别

Xen、vmware、OpenVZ三大vps主机系统比较

根据我的经验,如果 OpenVZ VPS 不超售(你认为可能吗?),性能绝对比 Xen VPS 好,256M内存的 OpenVZ 甚至能跑起 5000 IP 的 WordPress。无论是国内还是国外,90%购买 VPS 的站长都会选择 Xen ,这是为什么呢?请接着往下看。

三、VPS主机商的超售伎俩

以前有一种言论,说 Xen VPS 绝不会超售,而且成本比 OpenVZ 高,所以很多站长都倾向于 Xen VPS。

这里我就很通俗地为大家解释一下为何以前人们会有这种观点,因为 Xen VPS 虚拟程度高,对CPU和内存要求比较高,每划分一个 Xen VPS,实际的内存就会相应减少,而 OpenVZ 则不同,虚拟化程度低,内存也是虚拟的,每划分一个 OpenVZ VPS,对服务器原有的内存大小并不影响。

也就是说,如果VPS主机商想要超售 OpenVZ VPS 的话,只要那么划分 VPS 即可,贪婪一点的,一台服务器甚至可以划分50 60个VPS,在这点上,巴斯(Burst)绝对是高手中的高手,不仅超售严重,而且还会很“聪明”地把占用资源高的VPS移动到总体资源小的服务器上。

随着服务器硬件的发展, Xen VPS 也是可以“超售”的,如何做到呢?买个服务器,高配置,大内存,大硬盘,大流量。比如配置24G内存,5T硬盘,100M独享流量,这么一款服务器的成本大概在300美元左右。然后,可以卖40多个512M内存的Xen VPS(服务器本身也要占用内存),100来个128M内存的Xen VPS……

啥叫超售的最高境界,就是让用户感觉不到一点超售的迹象,一旦发现占用资源大的网站,悄悄移动到空闲的服务器,用户丝毫感觉不出异常。

四、如何挑选适合自己的VPS

1、明确你购买VPS的目的

如果只是想学习Linux服务器技术,购买最便宜的即可,也不用管稳定不稳定,首推巴斯(Burst

如果是用来放网站的,则要考虑很多方面,比如网站的应用程序,如果是 WordPress 之类的程序,消耗内存比较大,就需要内存较大的VPS(实测经验,WordPress流量稍大插件稍多,数据库放本地,至少需要128M以上的内存,推荐256M或512M以上内存),推荐 LinodePhotonVPSDiaHosting 等服务商。如果是图片站之类对内存消耗不太大,但是对流量要求较大的,推荐 EcVPSRasHost 等支持大流量VPS的服务商。

同理,如果要搭建SSH或者VPN服务器(仅供自己和朋友使用),也需要选择大流量的服务商,因为PPTP不能装在 OpenVZ 平台上,需要购买之前看清楚服务商的 VPS 平台,推荐 PhotonVPSEcVPS

2、不要超出自己的预算

购买之前,必须要考虑好每个月的预算,个人强烈建议月付,而不是年付,因为年付风险比较大,月付风险小,哪天觉得不合适,直接走人就是。按照市场价,根据 Xen VPS 的内存,大致就这个价格

128M内存 - 10美元/月  256M内存 - 15美元/月  512M内存 - 20美元/月  1024M内存 - 30美元/月

当然只是美国的VPS,本文讨论的VPS全部是美国的,这也是一般的市场价,如果看到某个VPS商的价格比这个便宜很多或者贵很多,那就要担心是否会稳定了。便宜很多的肯定会超售,贵很多的性能也不一定很好。

3、最贵的并不是最合适的

可能你会觉得卖得贵的VPS就是最好的,其实不然。那些价格摆出来都是骗小白的,谁有钱谁上当,按照美国的带宽、服务器硬件、人工成本,基本上主机行业这个市场大体上已经稳定,无论是价格还是配置。如果遇到哪家卖得超贵,比如(Media Temple),那就要当心了。应付一般的网站,MT的配置已经足够,如果流量稍大,VPS必挂无疑。

4、多学习国内外论坛,看清VPS主机提供商的线路

众所周知,在天朝,网络线路是个很复杂的东西,电信、网通(联通)、铁通,还有什么通的,访问美国的机房,就会走不通的线路。没有一条很稳定的线路,更没有一条适合所有国内运营商的线路。

至于如何查看线路,开始,运行,输入 cmd ,在弹出的窗口中输入 tracert ip(或者域名)就能看到从你的网络走到服务商的网络所经过的线路。

目前对电信较好的线路有:Peer1(电信直连,服务器价格也最贵)、nlayer、he.net、Global Crossing、XEEX、Savvis等等

对网通较好的线路有:Tinet、Comcast、Cogentco等等

对电信很杯具的线路有:Level3 (坚决不要买 Level3 线路的产品)等等

对网通很杯具的线路有:Level3(亲身体验)、he.net等等

至于如何挑选最适合的VPS,多去全球代购论坛酷胖优惠码VPS侦探等网站看看就会学到。

5、摸清楚VPS主机提供商的服务器提供商

这个关系看似复杂,其实很简单。很多VPS主机提供商因为自己成本的缘故,服务器都是直接租用而不是托管的,根据美国的服务器提供商,大致划分以下几个:

Softlayer(顶级机房,网通一般走Comcast,电信一般走ATT或Qwest,抽风正常):EcVPSHawkHost

ThePlanet(同上,网通一般走Comcast,电信走Att,最近在抽风):Linode

PacificRack(电信走nLayer,网通走Cogentco,均不错):DiaHostingGh.VC

Take2Hosting(电信走Cogent,网通走Cogent):EcVPSRashostVPSYou

He.net/WebNX(直接走He.net,电信不错网通晚上杯具):LinodeRahost

Peer1(电信直连,网通走Tinet绕道):D9Host

(因为天朝的网络复杂,电信和网通随时会更换自己的线路,可能明天就不是这个线路,然后……)

自己有机房的VPS商家有:

Photonvps

五、我现在所使用的VPS

目前走点路博客架设在 PhotonVPS Xen VPS 1G内存(WARP 2 )上

人人都是艺术家架设在 VPSVille 的 Peer1 线路,OpenVZ VPS (512M内存,Metropolis )上,优惠码 LEADSDISC 享受终身9折

以前的饭否.De(包括Rabr)架设在 Diahosting 加州VPS(1G内存,PR机房)上

歮谈架设在EcVPS 1G内存上

英文站目前架设在Linode 720M内存上

所有 VPS 都是 CentOS系统+LNMP一键安装包 配置,如果需要查看更多VPS推荐信息,欢迎围观:http://vps.cn.com/ 更多我使用过的 VPS 详细信息可以参考 LeadVPS :http://www.leadvps.com/

有关VPS或者服务器的其他问题,可以直接留言,对这个行业比较了解,能回答的我都会回答你。

PS:统计一下原来买了那么多个VPS,想着下个月是不是去直接买台服务器得了……

posted @ 2010-06-10 17:48 梁良 阅读(303) | 评论 (0)编辑 收藏

[ZT]Macbook Pro初体验

今年2月28日,我购买了一台苹果的笔记本–Macbook Pro,这是我使用的第三款苹果的产品。当时我就计划写一篇Macbook体验报告,但根据我用iPhone的经验,一件产品没有使用2个月以上,是写不出真实感受的。于是这篇文章一直到现在才写。

细心的读者一定能发现,近2个月我的文章截图风格有了改变,至少从字体上是有了改变。

或许你经常看到有人在Twitter上说Macbook有多好,又或许你经常看到有人说苹果粉丝是脑残,你在犹豫是否入手一台苹果电脑。这篇文章或许能帮你判断是否值得购买一台苹果电脑。

一、我为什么买Macbook Pro?

我以前使用的是一台联想的笔记本,装Win7操作系统。在看了同事和朋友使用Mac OS之后,我被它华丽的界面吸引了。同时因为我使用iPhone已经有1年多,我知道苹果在很多细节地方的体验非常优秀,于是我认为我需要体验一下Mac OS。

然后我尝试在PC上安装“黑苹果”,因为缺少硬件驱动,2台电脑的安装都以失败告终。

所以我下定决心购买一台MacBook,最终我选择了MacBook Pro,因为我更喜欢Pro的外型。

你可以看到,我购买苹果电脑主要有2个原因:

1、从外界知道苹果的体验做得好,想充分体验它。

2、受朋友影响。

二、MacBook Pro硬件篇

Macbook Pro采用全金属的外壳,观感和手感都十分让人陶醉,你会发现,它不仅仅是一台笔记本,还是一件艺术品。

内存、硬盘、CPU都不是我关心的,在硬件方面,下面这些是值得介绍的:

1、多点触控板

我先购买了iPhone,然后再买Macbook。第一次使用iPhone时,我就被多点触屏吸引了,这真的是个体验超棒的玩意。

在Macbook的多点触控板上,你能做的不仅仅是移动鼠标和左击、右击,你还能:

(1)一只手指移动能操控光标

(2)两只手指轻敲能打开右键菜单(不必非要按右下角)

(3)两只手指上下左右移动能移动滚动条(不必非要在右侧滚动)

(4)两只手指绕着指间旋转能旋转照片

(5)两只手指距离缩小与扩大能控制照片的缩放

(6)三只手指左右移动能前进和后退

(7)四只手指向上推能将所有窗口“推开”,重见桌面。向下推能看到所有打开的程序

……

下面的嵌入视频演示了多点触摸板有多“精彩”:

在安装一些辅助软件后,手势还可以变得更“精彩”。有时你甚至觉得鼠标是多余的

2、背光键盘

在光线比较暗的时候,键盘背光灯能给你很大的帮助。

尤其是你和其他人同睡一间房,你想继续用电脑又不想打扰别人睡觉,显然你是不能打开日光灯的,这时你就能感受到背光键盘有多好。

3、磁性充电插口

MacBook Pro拿到手那天,我像以往使用其它笔记本一样,准备“用力地”将电源线插到MacBook上。但当我将电源线插销移近MBP的充电插口时,“嗒”一声,电源线与MBP紧紧地接上了,完全不需要我用力插。

我认为这个细节体验非常良好,我甚至不需要看我是否对准了插口,只需在插口旁边移动,然后等待插销被“吸进去”

4、电池指示灯

电源线的插销上有一盏很小的指示灯,以绿黄两色来显示电池是否充满(第3点的gif图片能看到)。

另外,在机身左侧靠近身体的地方,有八盏小灯,按一下旁边的按钮,小灯就会根据电池电量情况亮起相应的数量。在开机或关机的时候按下按钮小灯都能显示电量。

5、Magic Mouse

Magic Mouse是另外购买的配件,外形有点像肥皂。相比起其它鼠标,它的价格较贵。

Magic Mouse神奇的地方在于多点触摸。和Macbook Pro本身的多点触摸板一样,不同的手指数在Magic Mouse上不同的运动都对应着相应的操作。

比如我就设置了中指固定食指左移关闭浏览器的Tab,右移恢复关闭的Tab。这比鼠标手势还好用

然而,Magic Mouse有2个的弱点:

(1)太沉重。装着2颗5号电池,想不沉很难。

(2)耗电太快。我用2颗2400mAH的电池,基本上10天就需要换一次。

6、电池续航能力

苹果在官网上号称我购买的这款笔记本的电池续航能力有8小时,但我想这应该是关掉WiFi对着屏幕发呆什么都不干后得到的续航时间。我从来没能拔掉电源使用超过5小时。

根据我自己的测试,不间断地播放mkv格式的电影(使用耳机),我这台MBP能坚持4小时左右。

所以你最好不要期望你的MBP能续航能像苹果说的那样,对半算会比较好

三、Mac OS X软件篇

苹果的高体验设计不但体现在硬件上,在软件上一样技艺超群。

Mac OS X 10.6.3是我目前使用的操作系统,以前的苹果系统是什么样子我不关心,它目前给我的体验是我用过所有操作系统里最好的。

1、华丽

“华丽”是我第一个对Mac OS X的形容词。

不管是软件界面、按钮、字体、图标,都能让我这个从Windows阵营投靠过来的人震惊不已。图片能说明一切:

这是程序列表:

Mac下的程序图标都做得很漂亮,这是某个GTD软件的图标:

以Cover Flow的方式来预览川岛和津实的写真:

 

2、简单

Mac OS X操作系统非常容易上手,一切的操作都非常自然。

在Mac里,拖曳操作是再自然不过的操作。你不仅仅可以将文件夹里要删除的文件拖放到废纸篓(对应Windows的回收站),程序里的项目都能拖到废纸篓删除。比如你能将日历里的某个项目拖到废纸篓,这样就完成了删除动作。为什么你要按delete键?

这里要插入一个小故事。

我母亲从来没接触过电脑,我上个月尝试给她玩Macbook,她打开一张图片后我告诉她图片可以放大。

接着,她不是控制鼠标去点击程序里的放大按钮,而是很“自然”地两只手指在多点触控板上扩张进行图片放大。

你不得不感叹苹果在拟物化上花了多大的功夫,以致于操作系统能如此自然、如此简单。

3、软件安装\卸载方便

在Mac里安装和卸载软件比在Windows下要简单得多。

很多软件的安装过程就是你从安装镜像里将app文件“拖曳”到你要安装的位置,完成了,安装就是这么简单。

卸载软件更简单,将程序“拖曳”到废纸篓,完成了,卸载也是如此的简单。

4、操作高效

(1)颜色标记文件

在Mac里,你可以给某个文件(夹)标记一种颜色,以方便查找。

(2)Spotlight

在任何情况下,按下Control+Space都会打开一个全局搜索框,这就是Spotlight,在Spotlight里,你能搜索任何东西,包括程序、文件、浏览器历史等。

Google桌面搜索有点类似。

(3)最适合大小

每个打开的窗口左上角都有3个图标:关闭、最小化、最适合大小。

等等,不是还有最大化吗?

Mac OS里没有最大化的概念,只有最适合大小。比如你正在浏览的网页宽度是960px,那么Safari的最适合宽度就是970px左右;如果你当前浏览的网页宽度是600px,那Safari的最适合宽度也会跟着变成610px左右。

(4)快捷键无处不在

以前用Windows的时候,除了复制粘贴,我很少用快捷键。

在Mac下,我用快捷键的频率明显提高。我觉得Mac OS X的快捷键设置要比windows的来得人性化,至少我更容易记住Mac的。

Macbook的键盘没有Home, End, Page Down/Up等按钮,这些按钮都是通过上下左右键与功能键结合来操作,键盘的物理空间更加充裕。

(5)全局使用服务

以前在Windows下,我想将繁体中文转换成简体,我会打开Microsoft Word来转换。我很希望简繁转换这个服务能全局使用。

Mac完成了我这个心愿。

在Mac里,你可以设置在任何程序里都能使用系统自带的服务。

比如在任何程序的文本里,我都能选择进行简繁切换。

反选任何程序里的文字,我都能使用Google来搜索它们,或者将它们添加到备忘录里。

很强大?真的很强大。

(6)拖曳一切

前面已经说到,在Mac OS里,很多操作都能用拖曳来完成,很方便快捷。

(7)强大的Expose

Expose是Mac OS的窗口管理程序之一。利用Expose,我可以设置当鼠标移动到左下角时打开所有打开的应用程序,鼠标移动到右下角打开当前程序所有的窗口,就像下面截图的例子,我能瞬间预览所有已经打开的Safari窗口。

(8)预览功能

在Finder(相当于Windows里的资源管理器)里,用户能预览多种格式的文件。

比如我能直接预览PDF文件,如下图所示,我能直接翻页。

(9)固定的菜单栏

和Windows不一样,程序的菜单栏是不跟随程序的位置移动的。它一直是固定在左上角。

我认为这样更方便,不管在什么时候,我想打开程序的菜单,只需将鼠标往左上角移动,不需要看清楚程序窗口在什么位置,然后再点击菜单栏。这种方式的方便之处在于,鼠标移动到左上角是不需要“眼看”操作的。

5、和杀毒软件说再见

杀毒软件让电脑开机变慢,运行效率降低是不争的事实。我在Mac里没有安装任何杀毒软件,不是说Mac OS里没有病毒,而是网上绝大多数的病毒都是针对Windows的,尤其是在中国,exe扩展名让人感到恐惧。

我在Mac里只开了防火墙,浏览网页都用Firefox和Safari,我没有感受到任何来自病毒的威胁。

事实上,杀毒软件永远是治标不治本的,病毒总是比杀软先进,良好的电脑使用习惯是避免病毒的入侵的最好方式。

6、体验较差的地方

(1)看图

我个人非常喜欢windows里的看图方式:打开一个图片文件夹,双击一张图片,在图片查看器里就能按下一张按钮来切换查看下一张图片。

然而,在Mac里,我双击一张图片打开预览后,是不能按“下一张”按钮来查看同文件夹内的其它图片的,我必须先选择了要查看的图片,才能在预览程序里切换下一张。

(2)菜单栏图标无法隐藏

Windows7任务栏有隐藏图标的功能,不常用的图标会被隐藏到“箭头”按钮里。

但Mac下无法隐藏图标,以致于我的菜单栏图标过多。

四、从Windows切换到Mac

我大概用了2天的时间就适应了Mac OS X的基本操作,你可以想象苹果操作系统的易用性有多高。

1、替代软件

我以前在Windows下常用的软件分别有对应的替代品:

(1)搜狗输入法–>Fun Input Toy

(2)Foobar2000–>iTunes

(3)Firefox–>Firefox

(4)Clipx–>ClipMenu

(5)Microsoft Office–>iWork

(6)Notepad++–>Smultron

(7)Gtalk/MSN–>Adium

(8)Snagit–>Snagit

其它软件也基本能找到替代品。

2、网银问题

对于国内的用户来说,切换到Mac最麻烦的事可能来自网银。

因为国内的大多数网银都是IE Only的,甚至有些网银是IE6 Only的。

目前能够较好地支持非IE内核浏览器的网银是浦发银行建设银行,其中浦发银行的体验相对更好。

如果你必须使用IE Only的网银,可以安装一个Virtual Box,虚拟一个Windows XP。也可以使用现成的工具,模拟运行IE。

五、购买Macbook小贴士

1、水货更便宜

如果你打算入手苹果电脑,建议不要购买国内的行货,水货的价格大概能便宜1000-2000。至于保修的问题是无需担心的,因为Macbook是全球联保的

2、购买更便宜的Apple Care

在默认情况下,Macbook的保修期为1年。根据经验,电子产品很少会在一年内出现问题。保修期过后苹果的硬件维护价格是很高的,所以你可以选择购买Apple Care来获得3年免费保修。

如果你选择在中国购买Macbook Pro的Apple Care,价格在1600元左右。但由于苹果的保修是全球联保的,你可以购买那些来自其它国家价格相对较低的Apple Care,在淘宝上能找到一大堆。

六、这不是苹果的软文

或许有人会认为只是一篇苹果的软文,实际上这更像一篇由脑残苹果粉丝写的脑残文

有不少人看到其他人说苹果的产品好就说对方脑残,我认为这是因为这些人没有深入地感受苹果的产品。

我刚开始用iPhone的时候,觉得这是一台超烂的手机。但过了2个月左右,我意识到这是一台极具革命性的手机,优秀的体验存在于细节当中,需要细细品味。

所以我跟自己说,《Macbook初体验》一定要在使用2个月Macbook后再写,至少2个月的不间断使用才基本能感受出一个产品的优缺点。2个月下来了,我爱上了Macbook,觉得Mac OS是我用过最好用的操作系统,于是我推荐给其他人,包括可能吧的读者们。

不管你喜欢苹果与否,它那种高度关注用户体验以及敢于创新的精神,都是值得我们钦佩的。不可否认,它是技术上的领先者。

 


 

除非注明,本博客文章均为原创,转载请以链接形式标明本文地址
本文地址:http://www.kenengba.com/post/2934.html
本文短网址:http://knb.im/3sx

posted @ 2010-06-10 17:46 梁良 阅读(475) | 评论 (0)编辑 收藏

编写跨浏览器兼容的 CSS 代码的金科玉律

作为 Web 设计师,你的网站在各种浏览器中有完全一样的表现是很多人的目标,然而这是一个永远无法真正实现的目标,很多人认为,完美的跨 浏览器兼容并不必要,这样说虽然没错,但在很多情形,一种近似的兼容还是很容易实现的,本文讲的是各种跨浏览器兼容的 CSS 编码准则和技巧。

Browsers-css in The Principles Of Cross-Browser CSS Coding
理解 CSS 盒子模型
如果你想实现不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码,透彻地理解 CSS 盒子模型是首要事情,CSS 盒子模型并不难,且基本支持所有浏览器,除了某些特定条件下的 IE 浏览器。

CSS 盒子模型负责处理以下事情:

  • 一个 blcok (区块)级对象占据多大的空间
  • 该对象的边界,留白
  • 盒子的尺寸
  • 盒子与页面其它元素的相对位置
    CSS 盒子模型有以下准则:
  • Block (区块)对象都是矩形 (事实上所有对象都如此)
  • 其尺寸由 width, height, padding, borders, 以及 margins 决定
  • 如果不设置高度,该盒子的高度将自动适应其包含的内容,加上留白等(除非使用了 float)
  • 如果不设置宽度,一个非 float 型盒子水平上将充满其父容器(扣除父容器的留白)
    处理 block 级对象时,必须注意以下事项:
  • 如果一个盒子的宽度设置为 100%,它就不能再设置 margins, padding, 和 borders,否则会撑破其父容器
  • 垂直毗邻的 margin 会引起复杂的坍塌问题,导致布局问题(比如两个垂直毗邻的 Block 对象,上面的对象的 bottom-margin 为 40,下面的对象的 top-margin 为 20,则两个对象的间距将是 40,而不是 60 - 译者)
  • 拥有相对位置和绝对位置的对象,拥有不同的行为
    Css-box-model in The Principles Of Cross-Browser CSS Coding
    在 Firefox 的 Firebug 中显示的盒子模型

    理解 block 级和 inline 级 对象的区别
    这个看似简单的问题事如果能透彻地理解,会受益匪浅

    下图讲解了 block 级对象和 inline 级对象的区别:

    Block-inline in The Principles Of Cross-Browser CSS Coding

    下面是 block 级对象和 inline 级对象的基本区别:
  • Block 级对象会自然地水平充满其父容器,因此没有必要为之设置 100% 宽度属性
  • Block 级对象的起始摆放位置是其父容器的左上边界,并顺排在其前面的兄弟 Block 对象的下方(除非设置 float 或绝对位置)
  • Inline 级对象会忽略其宽度和高度设置
  • Inline 级对象会随着文字排版,并受排版属性的影响(如 white-space, font-size, letter-spacing)
  • Inline 级对象可以使用 vertical-align 属性控制其垂直对齐,block 级对象不可以
  • Inline 级对象的下方会保留一些自然的空间,以适应字母 g 一类的会向下探出的笔画
  • 一个设置为 float 的 inline 对象将变成 block 对象理解 Floating 和 Clearing 属性
    实现多栏排版的最好方法是使用 float 属性,float 也是一个将使你受益匪浅的属性。一个 float 对象可以居左或居右,一个设置为 float 的对象,将根据设置的方向,左移或右移到其父容器的边界,或其前面的 float 对象的边界,而紧随其后的非 float 对象或内容,则包围在其相反的方向。

    Float-css in The Principles Of Cross-Browser CSS Coding

    以下是使用 float 和 clear 属性的一些重要准则:
  • 一个 float 对象,将从其置身的 block 级非 float 内容流中跳出,换句话说,如果你要将一个 box 向左边 float,它后面的 block 级非 float 对象会显示到下方,inline 级内容会在旁边包围
  • 要让一段内容从一侧包围一个 float 对象,这段内容必须要么是 inline 级的,要么也设置为相同方向的 float
  • 一个 float 对象,如果没有设置宽度,则会自动缩成其包含的内容的宽度,因此最好为 float 对象明确设置宽度
  • 如果一个 block 对象包含 float 子对象,会出现本文中阐述的问题
  • 一个设置了 clear 属性的对象,将不会包围其前面的 float 对象
  • 一个既设置了 clear 又设置了 float 属性的对象,只有 clear:left 属性生效,clear:right 不起作用首先使用 IE 进行测试
    虽然我们都痛恨 IE6 和 IE7,但当你开始一个新项目的时候,最好还是首先针对这两种浏览器进行测试,否则,如果你在设计在后期才想起针对 IE6 和 IE7 进行测试,将出现以下问题:
  • 你将不得不使用一些奇巧淫技,甚至使用独立的 IE6/7 CSS,导致 CSS 文件臃肿。
  • 某些地方的布局将不得不重新设计
  • 会增加测试的时间
  • 你的布局在 IE/6/7 中和其它浏览器中不一样
    如果你设计的是个人项目,Web 程序等,则不建议你针对旧版本 IE 做太多工作,而对一些公司类站点,它的用户群中有大量 IE 用户,这些技巧会让你避免大量的头痛。如果将 IE 的问题归类为 IE 的 BUG 而不去处理,会带来很多负面的影响,和 IE 和平共处是 Web 开发与设计者不可逃避的现实。

    译者注:在 IE6/7 仍有大量用户基础的国内(感谢中行,建行,农行,工行,以及各级政府网站),忽视这两种浏览器是极不明智的,首先针对 IE6/7 进行设计是一种很好的方法,一般来说,在IE6/7 通过测试的站点,在 Firefox,Chrome,Safari,Opera 等标准浏览器面前基本不会出现问题,前提是,你的 CSS 设计是基于 W3C 标准的。
    IE 浏览器最常见的问题
  • IE6 中不可滥用 float,否则会带来内容消失以及文字重复等稀奇古怪的问题
  • IE6 中,float 对象,在 float 方向的那边,会出现双倍 margin,将 display 设置为 inline 会解决这个问题
  • IE6/7 中,一个没有直接或间接设置 hasLayout 的对象,会发生各种稀奇古怪的问题 (译者注:对这类问题,zoom 这个 css 属性可以帮很大的忙,将 zoom 设置为除了 normal 之外的其它值,可以迫使一个对象 hasLayout 同时不影响这个对象的任何视觉外观)
  • IE6 不支持 min-width, max-width, min-height, max-height 一类的属性
  • IE6 不支持固定位置背景图
  • IE6/7 不支持很多 display 属性值(如 inline-table, table-cell, table-row)
  • IE6 中,只有 a 这个对象才可以使用 :hover 这个伪类
  • IE 的某些版本对某些 CSS 选择器支持很少(如属性选择器,子对象选择器)
  • IE6~8 对 CSS3 的支持很有限 (不过有一些变通方法) 永远不要指望在所有浏览器中都一模一样
    在不同浏览器实现相同的体验个功能是可能的,实现近似像素级的一致外观也是可能的,但永远不要指望一模一样。
    Form 控件在不同浏览器显示总是不同

    以下是 Facebook 首页中的 select 控件,在5种不同浏览器的显示差异(基于 Adobe’s Browserlab 截图)



    某些 Form 控件,如果要求必须跨浏览器一致,可以找到变通办法,如,可以使用图片 替代 submit 按钮,但有一些控件,比如 radio,select, textarea,文件选择框,是永远都不可能一模一样的。
    字体的表现都有差异
    先不谈有的字体在有的系统中根本不存在,即时存在,它们在不同系统的渲染效果也不完全一样,比如,Windows ClearType 支持 IE7,但不支持 IE6,导致同一个字体在 IE7 和 IE6 有不同的样子。

    Cleartype-ie in The Principles Of Cross-Browser CSS Coding
    A List Apart’s 文章字体在 IE6 and IE7 中的区别

    使用 CSS 清零
    使用 CSS 清零(CSS Reset)是实现跨浏览器兼容的灵丹妙药,CSS 清零可以消除不同浏览器对 margin,padding 这些属性的默认表现,你可以更容易控制诸如对齐,间隙等等问题。推荐使用 Eric Meyer’s CSS 清零代码

    Reset-wd in The Principles Of Cross-Browser CSS Coding



    参考 SitePoint’s CSS 兼容表
    SitePoint CSS Reference 是一个非常好的资源(下载离线版),可以用来检查某些 CSS 属性的跨浏览器兼容问题

    Sitepoint-chart in The Principles Of Cross-Browser CSS Coding

    结语
    跨浏览器兼容是个永恒的话题,本文介绍的跨浏览器兼容 CSS 准则只是帮助 Web 开发设计者尽可能实现这一目标,除了这些,基于 CSS3 的渐进式增强设计也是一种趋势,Web 开发与设计者可以针对某些浏览器提供增强功能,而在不支持这些增强功能的浏览器中降级使用基本功能。
    延伸阅读
  • 跨浏览器测试资源大全
  • 跨浏览器兼容测试8大利器
  • 关于跨浏览器测试那点事
    本文国际来源:Smashing Magazine The Principles Of Cross-Browser CSS Coding
    原文作者:Louis Lazaris

    Louis Lazaris 是一位自由职业 Web 开发者,住在多伦多,他创办了 Impressive Webs, 以及 Interviews by Design,后者主要是一些著名 Web 设计师访谈,他的 Twitter 地址是 http://twitter.com/ImpressiveWebs

    中文编译来源:锐商企业CMS 网站内容管理系统 官方网站
  • posted @ 2010-06-09 14:11 梁良 阅读(285) | 评论 (0)编辑 收藏

    用CSS的float和clear创建三栏液态布局的方法

    三栏布局是目前最常见的网页布局,主要页内容放在中间一栏,边上的两栏放置导航链接之类的内容。基本布局一般是标题之下放置三栏,三栏占据整个页面的宽度,最后在页的底端放置页脚,页脚也占据整个页面宽度。
           绝大多数网页设计者都熟悉传统的网页设计技术,用这些技术可以生成带有表格、创建固定宽度布局或者“液态”(它可以根据用户浏览器窗口宽度自动伸缩)布局的网页。

    现在,我们都开始抛弃基于表格的布局技术,许多网络设计者正在从XHTML标记和CSS格式这一新范例中寻找创建三栏布局的方法。用绝对定位的方法从CSS中得到固定宽度的布局并不困难;但是得到液态布局就有点困难了。因此,本文介绍一种用CSS的float和clear属性来获得三栏液态布局的方法。

    基本方法

    基本的布局包含五个div,即标题、页脚和三栏。标题和页脚占据整个页宽。左栏div和右栏div都是固定宽度的,并且用float属性来把它们挤压到浏览器窗口的左侧和右侧。中栏实际上占据了整个页宽,中栏的内容在左、右两栏之间“流淌”。由于中栏div的宽度并不固定,因此它可以根据浏览器窗口的改变进行必要的伸缩。中栏div的左侧和右侧的填充(padding)属性保证内容安排在一个整齐的栏中,甚至当它伸展到边栏(左栏或者右栏)的底端也是这样。

    三栏布局的一个例子

    请看看用本文所介绍的技术进行三栏布局的例子。这个例子用鲜艳的颜色来区分布局的各个div。下面是XHTML代码: 
    XML/HTML代码
          
    1. <body>    
    2.     
    3. <div id="header">    
    4.     
    5.     <h1>Header</h1>    
    6.     
    7. </div>    
    8.     
    9. <div id="left">    
    10.     
    11.     Port side text...    
    12.     
    13. </div>    
    14.     
    15. <div id="right">    
    16.     
    17.     Starboard side text...    
    18.     
    19. </div>    
    20.     
    21. <div id="middle">    
    22.     
    23.     Middle column text...    
    24.     
    25. </div>    
    26.     
    27. <div id="footer">    
    28.     
    29.     Footer text...    
    30.     
    31. </div>    
    32.     
    33. </body>    

    下面是CSS代码:

    XML/HTML代码
          
    1. body {    
    2.     
    3.     margin: 0px;    
    4.     
    5.     padding: 0px;    
    6.     
    7. }    
    8.     
    9. div#header {    
    10.     
    11.     clear: both;    
    12.     
    13.     height: 50px;    
    14.     
    15.     background-color: aqua;    
    16.     
    17.     padding: 1px;    
    18.     
    19. }    
    20.     
    21. div#left {    
    22.     
    23.     float: left;    
    24.     
    25.     width: 150px;    
    26.     
    27.     background-color: red;    
    28.     
    29. }    
    30.     
    31. div#right {    
    32.     
    33.     float: right;    
    34.     
    35.     width: 150px;    
    36.     
    37.     background-color: green;    
    38.     
    39. }    
    40.     
    41. div#middle {    
    42.     
    43.     padding: 0px 160px 5px 160px;    
    44.     
    45.     margin: 0px;    
    46.     
    47.     background-color: silver;    
    48.     
    49. }    
    50.     
    51. div#footer {    
    52.     
    53.     clear: both;    
    54.     
    55.     background-color: yellow;    
    56.     
    57. }    

    代码说明

           HTML代码中各部分出现的顺序是非常重要的。左栏和右栏div必须在中栏之前出现。这样才可以让这两个边栏浮动到它们的位置上(屏幕两侧),并让中栏的内容将“流”入它们之间的空间。如果浏览器在一个或者两个边栏div之前先发现中栏,那么中栏将占据屏幕的一侧或者两侧,这样浮动的部分就会跑到中栏的下面而不是中栏的旁边了。 

           div#header和div#footer样式(style)中的clearoth申明用来确保这浮动部分不会占据标题和页脚的空间。div#header样式中的padding:1px申明用来消除页头背景色中的异常边,如果padding设置为零,那么在Netscape浏览器中就会看到这个异常。

           div#left样式中的float:left申明是用来把左栏挤压到左侧。width:150px申明用来设置栏的固定宽度,不过你也可以把它的宽度设置为其它具体值。类似的,div#right样式中的float:right申明用来把右栏div挤压到右侧。在本例中,float把左栏和右栏完全挤压到浏览器窗口的左边缘和右边缘。然而,如果这些div被其它div包含,那么float将会把它们挤压到包含它们的div的边缘。

             在div#middle样式中,clear申明允许中栏的内容“流淌”在两个边栏之间。padding:0px 160px 5px 160px申明设置了到左栏和右栏的填充,这样允许150象素宽度的栏div,在加上10象素的间距。

           这个例子非常粗糙和简单,但是它很好的演示了用浮动div来创建三栏液态布局的边栏这一基本技术。


    本文地址: http://www.vxxp.com/archives/2.html

    posted @ 2010-06-09 14:06 梁良 阅读(244) | 评论 (0)编辑 收藏

    [ZT]用PHP输出静态页面的两种方法

             用PHP输出静态页面的方法,就我所知道的,有2种,一种是利用模板技术,另一种是用ob系列函数。两种方法,看起来都差不多,但是实际上,却是不同的。

    第一种:利用模板。目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。

    这里我用smarty做例子,说明如何生成静态页

    <?php
    require('smarty/Smarty.class.php');
    $t = new Smarty;
    $t->assign("title","Hello World!");
    $content = $t->fetch("templates/index.htm");
    //这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了
    $fp = fopen("archives/2005/05/19/0001.Html", "w");
    fwrite($fp, $content);
    fclose($fp);
    ?>
    第二种方法:利用ob系列的函数。这里用到的函数主要是 ob_start(), ob_end_flush(), ob_get_content(),其中ob_start()是打开浏览器缓冲区的意思,打开缓冲后,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区,直到你使用了ob_end_flush().而这里最重要的一个函数,就是ob_get_contents(),这个函数的作用是获取缓冲区的内容,相当于上面的那个fetch(),道理一样的。代码:

    <?php
    ob_start();
    echo "Hello World!";
    $content = ob_get_contents();//取得php页面输出的全部内容
    $fp = fopen("archives/2005/05/19/0001.html", "w");
    fwrite($fp, $content);
    fclose($fp);
    ?>


    本文地址: http://www.vxxp.com/archives/29.html

    posted @ 2010-06-09 13:43 梁良 阅读(225) | 评论 (0)编辑 收藏

    [ZT]很棒的教程“阿蜜果学习系列教程”

    阿蜜果学习系列教程

    文:阿蜜果

    日期:2009-12-21

    l        Struts系列教程

    1、 struts1.2客户端表单验证错误解决

    2、 validation.xml验证文件的配置常用struts标签使用举例--bean

    3、 validation.xml验证文件的配置常用struts标签使用举例--html

    4、 validation.xml验证文件的配置 struts标签使用举例--logic

    5、 struts-config.xml配置

    6、 web.xml.properties资源文件的配置

    7、 validation.xml验证文件的配置

    l        Hibernate系列教程

    1hibernate中对象的3种状态----瞬时态、持久态、脱管态

    2Hibernate的核心接口学习

    3hibernat配置文件中set元素中各属性的定义

    4Hibernate3.x调用存储过程

    5hibernate.cfg.xml配置

    6....hbm.xml配置

    7使用举例

    8常见异常总结(不断补充)

    l        Spring系列教程

    1AOP != Interception翻译(未完待续)

    2springbean的高级属性之list, set, map以及props元素(含举例)

    3springApplicationContext提供有三种实现(举例)

    4异常备忘:No WebApplicationContext found: no ContextLoaderListener registered

    5Servlet action is not available异常备忘

    6使用spring发送邮件例

    7springAOP实现异常拦截

    8利用Java的反射与代理机制实现IOC

    9Sping常见异常总结

    l        Web Service系列教程

    1、 使用XFire+Spring构建Web Service(一)——helloWorld

    2、 使用XFire+Spring构建Web Service(二)

    3、 根据wsdl生成对应的Java代码进行接口测试(一)

     

    l        Java系列教程

    1、 JDK Timer实现任务的调度举例

    2、java.lang.OutOfMemoryError学习笔记

    3、java.util.ConcurrentModificationException

    4、生产者/消费者模型模拟实现

    5、Java反射机制学习笔记(一)

    6、Java反射机制学习笔记(二)

    7、LADP资料收集

    8、备忘——DES加密解密类

    9、对象的序列化和反序列化

    10、             HttpURLConnection使用中遇到的一个问题

    11、              异常备忘:java.lang.UnsupportedClassVersionError: Bad version number in .class file

    12、              Java获得当前性能信息

    13、              《重构》学习笔记(一)——代码的坏味道

    14、             【异常备忘】不断更新

     

    l        Database系列教程

    1、 OracalLpad函数

    2、 MySql异常备忘】Client does not support authentication protocol requested by server

    3、 sql语句学习

    4、 mysql过招

    5、 MySql异常备忘】mysql+hibernate出现java.net.SocketException MESSAGE: Broken pipe错误

    6、 MySql异常备忘】往自建log表插入数据出现ERROR 1064问题

    7、 MySql学习系列】视图

    8、 MySql学习系列】视图

    9、 MySql学习系列】常用函数

     

    l        JavaScript系列教程

    1、 单选按钮默认选择问题的解决方法

    2、 js模拟软键盘实现资料收集

    3、 js中用于对象的语句——withfor...in语句学习专题

    4、 IE中的拖放事件

    5、  JavaScript学习笔记——错误处理

    6、 JavaScript学习笔记——JavaScript中的XML

    7、 JavaScript学习笔记——客户端与服务器端的通信

    8、 JavaScript学习笔记——表格排序

    9、 JavaScript学习笔记——事件

    10、              JavaScript学习笔记——浏览器中的JavaScript

    11、              JavaScript学习笔记——继承

    12、              js操作iframe的一些知识

     

    l        Struts2系列教程

    1、 Struts2学习进阶(基础篇一)——序言

    2、 Struts2学习进阶(基础篇二)——Hello World

    3、 Struts2学习进阶(基础篇三)——使用Struts2的标签

    4、 Struts2学习进阶(基础篇四)——编写Action

    5、 Struts2学习进阶(基础篇五)——选择结果

    6、 Struts2学习进阶(基础篇六)——验证输入值

    7、 Struts学习进阶(基础篇七)——本地化输出

    8、 Struts2学习进阶(实例篇一)——struts2-blank-2.0.8实例学习

     

    l        图形与报表相关教程

    1、 JFreeChart增强JSP报表的用户体验

    2、 JFreeChart实现数据下探(给柱状图的每根柱子加链接的例子)

    3、 Eclipse BIRT问题解决汇总(不断更新)

    l        设计模式系列教程

    1Java与模式》学习笔记(1--模式的概念. 要素

    2设计模式学习笔记--原型(Prototype)

    3设计模式学习笔记--建造模式(Builder)

    4设计模式学习笔记--模板方法(Template Method)模式

    5设计模式学习笔记--策略模式(待续)

    6设计模式学习笔记--备忘录模式(Memento)

    7设计模式学习笔记--调停者模式(Mediator)

    8设计模式学习笔记--观察者模式(Observer) (未完待续)

    l        其它

    1eXtremeComponents总结系列】使用总结(不定期更新中)

    2CSS基础教程(上)

    3CSS基础教程(下)

    4用自动代码生成来减轻我们的工作

    5AppFuse学习进阶

    6使用CVS进行版本控制实战

    7Ant实现Java项目的自动构建和部署

    8CMMI3的学习和思考

    9OpenSymphonyQuartz里的作业、调度器使用举例

    10通用权限管理设计篇(一)

    11通用权限管理设计篇(二)——数据库设计

    12通用权限管理系统设计篇(三)——概要设计说明书

    posted @ 2010-06-09 11:30 梁良 阅读(210) | 评论 (0)编辑 收藏

    [ZT]http协议学习和总结系列——基础概念篇

    1. 基础概念篇

    1.1 介绍

      HTTPHyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETFInternet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFCRFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1

    HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

    HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

    1.2 TCP/IP协议栈中的位置

    HTTP协议通常承载于TCP协议之上,有时也承载于TLSSSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
       

    默认HTTP的端口号为80HTTPS的端口号为443

    1.3 HTTP的请求响应模型

    HTTP协议永远都是客户端发起请求,服务器回送响应。见下图:
       

    这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。

    HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。

    1.4 工作流程

    一次HTTP操作称为一个事务,其工作过程可分为四步:

    1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

    2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

    3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

    4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

    如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

    1.5 使用WiresharkTCPhttp

    打开Wireshark,选择工具栏上的“Capture->Options”,界面选择如图1所示:
                                

    1 设置Capture选项

    一般读者只需要选择最上边的下拉框,选择合适的Device,而后点击“Capture Filter”,此处选择的是“HTTP TCP port80)”,选择后点击上图的“Start”开始抓包。
                                     

    2 选择Capture Filter

    例如在浏览器中打开http://image.baidu.com/,抓包如图3所示:
        http://www.blogjava.net/images/blogjava_net/amigoxie/40799/o_http%e5%8d%8f%e8%ae%ae%e5%ad%a6%e4%b9%a0-%e6%a6%82%e5%bf%b5-3.jpg

    3   抓包

    在上图中,可清晰的看到客户端浏览器(ip192.168.2.33)与服务器的交互过程:

    1No1:浏览器(192.168.2.33)向服务器(220.181.50.118)发出连接请求。此为TCP三次握手第一步,此时从图中可以看出,为SYNseq:X x=0

    2No2:服务器(220.181.50.118)回应了浏览器(192.168.2.33)的请求,并要求确认,此时为:SYNACK,此时seqyy0),ACKx+1(为1)。此为三次握手的第二步;

    3No3:浏览器(192.168.2.33)回应了服务器(220.181.50.118)的确认,连接成功。为:ACK,此时seqx+1(为1),ACKy+1(为1)。此为三次握手的第三步;

    4No4:浏览器(192.168.2.33)发出一个页面HTTP请求;

    5No5:服务器(220.181.50.118)确认;

    6No6:服务器(220.181.50.118)发送数据;

    7No7:客户端浏览器(192.168.2.33)确认;

    8No14:客户端(192.168.2.33)发出一个图片HTTP请求;

    9No15:服务器(220.181.50.118)发送状态响应码200 OK

    ……

    1.6 头域

    每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

    在抓包的图中,No14点开可看到如图4所示:
       http://www.blogjava.net/images/blogjava_net/amigoxie/40799/o_http%e5%8d%8f%e8%ae%ae%e5%ad%a6%e4%b9%a0-%e6%a6%82%e5%bf%b5-4.jpg

    4 http请求消息

           回应的消息如图5所示:
                  

    5 http状态响应信息

    1.6.1 host头域

    Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

    5host那行为:
       

    1.6.2 Referer头域

    Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。

    在图4中,Referer行的内容为:
       

    1.6.3 User-Agent头域

    User-Agent头域的内容包含发出请求的用户信息。

    在图4中,User-Agent行的内容为:
       http://www.blogjava.net/images/blogjava_net/amigoxie/40799/o_http%e5%8d%8f%e8%ae%ae%e5%ad%a6%e4%b9%a0-%e6%a6%82%e5%bf%b5-8.jpg

    1.6.4 Cache-Control头域

    Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cacheno-storemax-agemax-stalemin-freshonly-if-cached,响应消息中的指令包括publicprivateno-cacheno-storeno-transformmust-revalidateproxy-revalidatemax-age

    在图5中的该头域为:
       

    1.6.5 Date头域

    Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMTDate描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

    5中,该头域如下图所示:
      
     

    1.7 HTTP的几个重要概念

    1.7.1连接:Connection

    一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。

    http1.1requestreponse头中都有可能出现一个connection的头,此header的含义是当clientserver通信时对于长链接如何进行处理。

    http1.1中,clientserver都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close。不论request还是responseheader中包含了值为closeconnection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。

    1.7.2消息:Message

    HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。

    1.7.3请求:Request

    一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号。

    1.7.4响应:Response

    一个从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如成功没找到”)和文档的MIME类型。

    1.7.5资源:Resource

    URI标识的网络数据对象或服务。

    1.7.6实体:Entity

    数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。

    1.7.7客户机:Client

    一个为发送请求目的而建立连接的应用程序。

    1.7.8用户代理:UserAgent

    初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。

    1.7.9服务器:Server

    一个接受连接并对请求返回信息的应用程序。

    1.7.10源服务器:Originserver

    是一个给定资源可以在其上驻留或被创建的服务器。

    1.7.11代理:Proxy

    一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。

    代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。

    1.7.12网关:Gateway

    一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。

    网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。

    1.7.13通道:Tunnel

    是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。

    1.7.14缓存:Cache

    反应信息的局域存储。

        附录:参考资料

    http_百度百科》:http://baike.baidu.com/view/9472.htm

    《结果编码和http状态响应码》:http://blog.tieniu1980.cn/archives/377

    《分析TCP的三次握手》:

    http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763104c8c711923d030678197027fa3c215cc7905141130a8e5747e0d548d98297a5ae91e03f7f63772315477e3cacdd94cdbbdc42225d82c36734f844315c419d891007a9f34d507a9f916a2e1b065d2f48193864353bb15543897f1fb4d711edd1b86033093b1e94e022e67adec40728e2e605f983431c5508fe4&p=c6769a46c5820efd08e2973b42&user=baidu

    《使用Wireshark来检测一次HTTP连接过程》:

    http://blog.163.com/wangbo_tester/blog/static/12806792120098174162288/

    http协议的几个重要概念》:http://nc.mofcom.gov.cn/news/10819972.html

    http协议中connection头的作用》:

           http://blog.csdn.net/barfoo/archive/2008/06/05/2514667.aspx 

    posted @ 2010-06-09 11:27 梁良 阅读(256) | 评论 (0)编辑 收藏

    [ZT]http协议学习和总结系列——协议详解篇

         摘要: 2. 协议详解篇 2.1 HTTP/1.0和HTTP/1.1的比较 RFC 1945定义了HTTP/1.0版本,RFC 2616定义了HTTP/1.1版本。 笔者在blog上提供了这两个RFC中文版的下载地址。 RFC1945下载地址: http://www.blogjava.net/Files/amigoxie/RFC1945(HTTP)中文版.rar RFC2616下载地...  阅读全文

    posted @ 2010-06-09 11:26 梁良 阅读(286) | 评论 (0)编辑 收藏

    [ZT]http协议学习和总结系列——深入了解篇

            这篇开篇的时候,要感谢一下我的老大,他看到我在写这个系列,给我提供了一个他以前做内部培训时,写得很赞的两个ppt,被我拿来为我所用,(*^__^*) 嘻嘻……。另外感谢下网上提供各种资料的IT同仁们。
    3. 深入了解篇

    3.1 CookieSession

    CookieSession都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。

    Session可以用Cookie来实现,也可以用URL回写的机制来实现。用Cookie来实现的Session可以认为是对Cookie更高级的应用。

    3.1.1两者比较

    CookieSession有以下明显的不同点:

    1Cookie将状态保存在客户端,Session将状态保存在服务器端;

    2Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookiesSession并没有在HTTP的协议中定义;

    3Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;

    4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。

    3.1.2 Session机制

    Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

    当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session idsession id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

    3.1.6 Session的实现方式

    3.1.6.1  使用Cookie来实现

    服务器给每个Session分配一个唯一的JSESSIONID并通过Cookie发送给客户端。

    当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session

    流程如下图所示:
       

    3.1.6.2  使用URL回显来实现

    URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带会服务器。

    如果直接在浏览器输入服务端资源的url来请求该资源,那么Session是匹配不到的。

    TomcatSession的实现,是一开始同时使用CookieURL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用response.encodeURL()

    3.1.3J2EE项目中Session失效的几种情况

    1Session超时:Session在指定时间内失效,例如30分钟,若在30分钟内没有操作,则Session会失效,例如在web.xml中进行了如下设置:

    <session-config>
            <session-timeout>30</session-timeout> //单位:分钟
        </session-config>

    2使用session.invalidate()明确的去掉Session

    3.1.4Cookie相关的HTTP扩展头

    1Cookie客户端将服务器设置的Cookie返回到服务器

    2Set-Cookie服务器向客户端设置Cookie

    3Cookie2 (RFC2965)):客户端指示服务器支持Cookie的版本

    4Set-Cookie2 (RFC2965)服务器向客户端设置Cookie

    3.1.5Cookie的流程

    服务器在响应消息中用Set-Cookie头将Cookie的内容回送给客户端,客户端在新的请求中将相同的内容携带在Cookie头中发送给服务器。从而实现会话的保持。

    流程如下图所示:

    3.2 缓存的实现原理

    3.2.1什么是Web缓存

    WEB缓存(cache)位于Web服务器和客户端之间。

    缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。

    HTTP协议定义了相关的消息头来使WEB缓存尽可能好的工作。

    3.2.2缓存的优点

    q      减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快。

    q      减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。

    3.2.3与缓存相关的HTTP扩展消息头

    q      Expires:指示响应内容过期的时间,格林威治时间GMT

    q      Cache-Control:更细致的控制缓存的内容

    q      Last-Modified:响应中资源最后一次修改的时间

    q      ETag:响应中资源的校验值,在服务器上某个时段是唯一标识的。

    q      Date:服务器的时间

    q      If-Modified-Since:客户端存取的该资源最后一次修改的时间,同Last-Modified

    q      If-None-Match:客户端存取的该资源的检验值,同ETag

    3.2.4客户端缓存生效的常见流程

    服务器收到请求时,会在200OK中回送该资源的Last-ModifiedETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-SinceIf-None-Match两个头。两个头的值分别是响应中Last-ModifiedETag头的值。服务器通过这两个头判断本地资源未发生变化,客户端不需要重新下载,返回304响应。常见流程如下图所示:

    3.2.5 Web缓存机制

    HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽;HTTP用“验证(validation)”机制来为此目的。

    HTTP定义了3种缓存机制:

    1Freshness:允许一个回应消息可以在源服务器不被重新检查,并且可以由服务器和客户端来控制。例如,Expires回应头给了一个文档不可用的时间。Cache-Control中的max-age标识指明了缓存的最长时间;

    2Validation:用来检查以一个缓存的回应是否仍然可用。例如,如果一个回应有一个Last-Modified回应头,缓存能够使用If-Modified-Since来判断是否已改变,以便判断根据情况发送请求;

    3Invalidation 在另一个请求通过缓存的时候,常常有一个副作用。例如,如果一个URL关联到一个缓存回应,但是其后跟着POSTPUTDELETE的请求的话,缓存就会过期。

    3.3 断点续传和多线程下载的实现原理

    q      HTTP协议的GET方法,支持只请求某个资源的某一部分;

    q      206 Partial Content 部分内容响应;

    q      Range 请求的资源范围;

    q      Content-Range 响应的资源范围;

    q      在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。

    分块请求资源实例:

    Eg1Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分;

    Eg2Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节;

    客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的。目前流行的FlashGet和迅雷基本都是这个原理。

    多线程下载的原理:

    q      下载工具开启多个发出HTTP请求的线程;

    q      每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000

    q      合并每个线程下载的文件。

    3.4 https通信过程

    3.4.1什么是https

    HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL

    见下图:
       

    https所用的端口号是443

    3.4.2 https的实现原理

    有两种基本的加解密算法类型:

    1对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DESAES等;

    2非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSADSA等。

    下面看一下https的通信过程:
      

    https通信的优点:

    1)客户端产生的密钥只有客户端和服务器端能得到;

    2)加密的数据只有客户端和服务器端才能得到明文;

    3)客户端到服务端的通信是安全的。

    3.5 http代理

    3.5.1 http代理服务器

    代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。

    代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。

    而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。

    更重要的是:Proxy Server(代理服务器)Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。

    3.5.2 http代理服务器的主要功能

    主要功能如下:

    1)突破自身IP访问限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国外网站;

    2)访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务;

    3)突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国 外的代理服务器试试;

    4)提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度;

    5)隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。

    3.5.3 http代理图示

    http代理的图示见下图:
      

    对于客户端浏览器而言,http代理服务器相当于服务器。

    而对于Web服务器而言,http代理服务器又担当了客户端的角色。

    3.6 虚拟主机的实现

    3.6.1什么是虚拟主机

    虚拟主机:是在网络服务器上划分出一定的磁盘空间供用户放置站点、应用组件等,提供必要的站点功能与数据存放、传输功能。  

    所谓虚拟主机,也叫网站空间就是把一台运行在互联网上的服务器划分成多个虚拟的服务器,每一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWWFTPE-mail等)功能。一台服务器上的不同虚拟主机是各自独立的,并由用户自行管理。但一台服务器主机只能够支持一定数量的虚拟主机,当超过这个数量时,用户将会感到性能急剧下降。

    3.6.2虚拟主机的实现原理

    虚拟主机是用同一个WEB服务器,为不同域名网站提供服务的技术。ApacheTomcat等均可通过配置实现这个功能。

    相关的HTTP消息头:Host

    例如:Host: www.baidu.com

    客户端发送HTTP请求的时候,会携带Host头,Host头记录的是客户端输入的域名。这样服务器可以根据Host头确认客户要访问的是哪一个域名。

    附录:参考资料

    《理解CookieSession机制》:

    http://sumongh.javaeye.com/blog/82498

    《浅析HTTP协议》:

    http://203.208.39.132/search?q=cache:CdXly_88gjIJ:www.cnblogs.com/gpcuster/archive/2009/05/25/1488749.html+http%E5%8D%8F%E8%AE%AE+web%E7%BC%93%E5%AD%98&cd=27&hl=zh-CN&ct=clnk&gl=cn&st_usg=ALhdy2-vzOcP8XTG1h7lcRr2GJrkTbH2Cg

    http代理_百度百科》:

    http://baike.baidu.com/view/1159398.htm

    《虚拟主机_百度百科》:

    http://baike.baidu.com/view/7383.htm

    https_百度百科》:http://baike.baidu.com/view/14121.htm

    posted @ 2010-06-09 11:25 梁良 阅读(387) | 评论 (0)编辑 收藏

    ATI HD系列显卡驱动安装简便方法(只有1条命令)

    作者:caryloo

    登陆http://support.amd.com/us/gpudownload/Pages/index.aspx 选择自己的显卡型号(HD)系列的驱动程序

    以Linux(x86)的平台为例,分别点击 “Linux(x86)" --> "Radeon"-->"ATI Radion HD 4350 Series"--->Go

    下载的文件为ati-driver-installer-9-7-x86.x86_64.run,放到你的home文件夹或者其他某个文件夹里

    在终端模式下进入该文件夹,运行以下命令:

    sudo sh ati-driver-installer-9-7-x86.x86_64.run

    即可进入ATI显卡的图形安装模式。顺利安装完成以后,重新启动计算机,就能实现compiz里所有能够实现的特效了。

    posted @ 2010-06-08 20:40 梁良 阅读(364) | 评论 (0)编辑 收藏

    [ZT]Ubuntu下安装bin格式的软件

    首先在终端里cd到bin文件所在的目录,然后执行:
    sudo chmod +x *.bin (*指你的bin文件名),这一步给这个bin文件增加执行权限。
    然后执行:sudo ./*.bin 就开始安装了。

    posted @ 2010-06-08 17:41 梁良 阅读(265) | 评论 (0)编辑 收藏

    Ubuntu的默认面板菜单栏删除后恢复的方法

    我在一次不小心给Ubuntu的面板菜单栏删除了,害我很多事情不能做,因为没有面板。研究了一下怎么恢复的方法。

    其实很容易,在个人的主目录。然后

    rm -rf  .gconf

    这样就行了,在重新进入,是不是面板都恢复成默认的啦。

    如果还不行,那就

    rm -rf .gconfd 这个也删除啦

    另外,如果只是面板上面应用程序的面板菜单没有了

    给.config/menus/application.menu 删除后重新登录好了

    posted @ 2010-06-08 17:32 梁良 阅读(917) | 评论 (0)编辑 收藏

    location.reload和location.replace刷新页面的区别

    location.reload和location.replace都可以实现页面的刷新,他们的区别是什么?
    reload 方法,该方法强迫浏览器刷新当前页面。
    语法: location.reload([bForceGet])
    参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页。
    true, 则以 GET 方式,从服务端取最新的页面, 相当于客户端点击 F5("刷新")

    replace 方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,你不能通过“前进”和“后退”来访问已经被替换的URL。
    语法: location.replace(URL)
    参数: URL

    在实际应用的时候,重新刷新页面的时候,我们通常使用: location.reload() 或者是 history.go(0) 来做。因为这种做法就像是客户端点F5刷新页面,所以页面的method="post"的时候,会出现“网页过期”的提示。那是因为Session的安全保护机制。可以想到: 当调用 location.reload() 方法的时候, aspx页面此时在服务端内存里已经存在, 因此必定是 IsPostback 的。如果有这种应用: 我们需要重新加载该页面,也就是说我们期望页面能够在服务端重新被创建, 我们期望是 Not IsPostback 的。这里,location.replace() 就可以完成此任务。被replace的页面每次都在服务端重新生成。你可以这么写: location.replace(location.href)

    posted @ 2010-06-08 15:10 梁良 阅读(523) | 评论 (0)编辑 收藏

    实现页面跳转的几种方式

    通过js或者html或者php等动态程序都可以方便的实现跳转,这里搜集了几种页面跳转的方式
    js方式的页面跳转
    1.window.location.href方式
        <script language="javascript" type="text/javascript">
               window.location.href="http://www.dayanmei.com/";
        </script>

    2.window.navigate方式跳转
       <script language="javascript">
        window.navigate("top.jsp");
      </script>

    3.window.loction.replace方式实现页面跳转,注意跟第一种方式的区别
    <script language="javascript">
        window.location.replace("http://www.dayanmei.com");
    </script>
    有3个jsp页面(1.jsp, 2.jsp, 3.jsp),进系统默认的是1.jsp ,当我进入2.jsp的时候, 2.jsp里面用window.location.replace("3.jsp");与用window.location.href ("3.jsp");从用户界面来看是没有什么区别的,但是当3.jsp页面有一个"返回"按钮,调用window.history.go(-1); wondow.history.back();方法的时候,一点这个返回按钮就要返回2.jsp页面的话,区别就出来了,当用 window.location.replace("3.jsp");连到3.jsp页面的话,3.jsp页面中的调用 window.history.go(-1);wondow.history.back();方法是不好用的,会返回到1.jsp 。

    4.self.location方式实现页面跳转,和下面的top.location有小小区别
       <script language="JavaScript">
              self.location='top.htm';
       </script>

    5.top.location
       <script language="javascript">
              top.location='xx.jsp';
       </script>

    6.不推荐这种方式跳转
     <script language="javascript">
       alert("返回");
       window.history.back(-1);
     </script>

    7.在php程序中,这种方式跳转前面不能有任何输出
    <?php
        header("url.php");
    ?>

    8.meta方式实现跳转(content = 3 单位是秒)
    <meta http-equiv=refresh content=3;URL="http://www.dayanmei.com">


    9.SSH
    Action中
    mapping.forward("ForwardName");

    posted @ 2010-06-08 15:08 梁良 阅读(280) | 评论 (0)编辑 收藏

    博客称iPhone 4无法阻止Android手机迅猛发展

    美国科技博客Silicon Alley Insider作者丹·弗洛梅尔(Dan Frommer)周一撰文称,苹果首席执行官史蒂夫·乔布斯(Steve Jobs)在周一美国旧金山举行的全球开发者大会中发布了第四代iPhone智能手机“iPhone 4”。毫无疑问,iPhone 4是iPhone系列产品中最好的产品,但其依旧无法阻止谷歌Android操作系统的迅猛发展。

    以下为文章内容摘要:

    苹果今日推 出的iPhone 4,无疑是苹果最好的一款iPhone。但是iPhone 4无法阻止谷歌Android操作系统的迅猛发展,而且iPhone 4也没有吸取Android的一些长处。

    这一点非常重要,因为谷歌已快速成为苹果在 移动产业的主要竞争对手。谷歌正在对Android进行快速的更新,向其不断添加苹果不具备的新功能。不过对于Android的这些新功能,苹果并未予以 还击。苹果正在朝着不同的方向发展。

    首先,iPhone 4给人留下了深刻的印象。它的新显示屏和摄像头看上去非常不可思议;基于Wi-Fi的Facetime视频聊天功能也令我们感到非常兴奋。iPhone 4的新硬件非常性感,而且电池续航能力的延长也将会非常实用。简而言之:乔布斯今天就是想要说服用户,继续购买一部新iPhone并使用两年,不要购买采 用Android操作系统的手机。

    不过与谷歌对Android改进不同的是,乔布斯 并没有像谷歌一样,iPhone的“云”能力进行大幅的改进。相反,苹果iPhone 4强调的是新硬件和软件功能。例如,新推出的iMovie应用可编辑视频;FaceTime可进行视频聊天。iPhone 4还用了前置摄像头,新显示屏技术,iBooks电子书商店和iAd广告平台。这些都是iPhone 4的新功能,从某种程度上看,苹果的领先优势将让谷歌无法追赶上。

    此外,与苹果仅携 手AT&T不同的是,谷歌与美国各大运营商都保持着良好的合作关系,在这一点上苹果无法与谷歌相提并论。也正是因为这样,才使采用Android 操作系统的手机销量在美国市场超越了iPhone。

    乔布斯今天让iPhone变得更好,但他没有让Android变得更加糟糕。

    posted @ 2010-06-08 10:40 梁良 阅读(229) | 评论 (0)编辑 收藏

    使用css3仿造window7的开始菜单

    相当逼真,css3果然强悍。

    友情提示:请勿在IE下浏览。

    查看实例:http://www.jankoatwarpspeed.com/examples/windows7menu/

    点击下载:http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=170

    来看下原作者的设计草图:

    简明创建过程

    第一步 :创建如下菜单结构

    <div id="startmenu">
    <ul id="programs">
    <li><href="#"><img src="firefox-32.png" alt="" />Mozilla Firefoxa>li>
    <li><href="#"><img src="chrome.png" alt="" />Google Chromea>li>
    <li><href="#"><img src="safari.png" alt="" />Safaria>li>
    <li><href="#"><img src="opera.png" alt="" />Operaa>li>
    <li><href="#"><img src="ie.png" alt="" />Internet Explorera>li>
    <li><href="#"><img src="rss_32.png" alt="" />RSS Feedsa>li>
    <li><href="#"><img src="twitter_32.png" alt="" />Twittera>li>
    <li><href="#"><img src="delicious_32.png" alt="" />Deliciousa>li>
    ul>
    <ul id="links">
    <li class="icon"><img src="folder.png" alt="" />li>
    <li><href="#"><span>Documentsspan>a>li>
    <li><href="#"><span>Picturesspan>a>li>
    <li><href="#"><span>Musicspan>a>li>
    <li><href="#"><span>Computerspan>a>li>
    <li><href="#"><span>Networkspan>a>li>
    <li><href="#"><span>Connect tospan>a>li>
    ul>
    div>

    win7的开始菜单有二个部分,左侧程序菜单,右侧系统菜单。

    第二步:菜单容器css

    #startmenu { border:solid 1px #102a3e; overflow:visible; display:inline-block; margin:60px 0 0 20px;
                         -moz-border-radius:5px;-webkit-border-radius:5px; position:relative;
    box-shadow: inset 0 0 1px #fff; -moz-box-shadow: inset 0 0 1px #fff; -webkit-box-shadow: inset 0 0 1px #fff;
    background-color:#619bb9;
    background: -moz-linear-gradient(top, rgba(50, 123, 165, 0.75), rgba(46, 75, 90, 0.75) 50%, rgba(92, 176, 220, 0.75));
    background: -webkit-gradient(linear, center top, center bottom, from(#327aa4),color-stop(45%, #2e4b5a), to(#5cb0dc)); }

    有几个关注的点,可以留意下:

    • -moz-border-radius:5px;-webkit-border-radius:5px;圆角效果,这是css3中应用最广的
    • box-shadow: inset 0 0 1px #fff; -moz-box-shadow: inset 0 0 1px #fff; -webkit-box-shadow: inset 0 0 1px #fff;阴影效果
    • background: -moz-linear-gradient(top, rgba(50, 123, 165, 0.75), rgba(46, 75, 90, 0.75) 50%, rgba(92, 176, 220, 0.75));渐变背景

    第三步:菜单左侧部分的css

    #programs { background:#fff; border:solid 1px #365167; margin:7px 0 7px 7px;
    box-shadow: 0 0 1px #fff; -moz-box-shadow: 0 0 1px #fff; -webkit-box-shadow: 0 0 1px #fff;
                        -moz-border-radius:3px;-webkit-border-radius:3px;}
    #programs a { border:solid 1px transparent; display:block; padding:3px; margin:3px;
    color:#4b4b4b; text-decoration:none; min-width:220px;}
    #programs a:hover {border:solid 1px #7da2ce;
                         -moz-border-radius:3px; -webkit-border-radius:3px;
    box-shadow: inset 0 0 1px #fff; -moz-box-shadow: inset 0 0 1px #fff; -webkit-box-shadow: inset 0 0 1px #fff;
    background-color:#cfe3fd;
    background: -moz-linear-gradient(top, #dcebfd, #c2dcfd);
    background: -webkit-gradient(linear, center top, center bottom, from(#dcebfd), to(#c2dcfd));}
    #programs a img {border:0; vertical-align:middle; margin:0 5px 0 0;}

    这里值得留意的是鼠标经过菜单项的效果设置,也就是#programs a:hover里的样式,这是难点,也是css3的强大之处,依旧是圆角、阴影、渐变背景。

    第四步:菜单右侧的CSS部分

    #links {margin:7px; margin-top:-30px;}
    #links li.icon {text-align:center;}
    #links a {border:solid 1px transparent; display:block; margin:5px 0; position:relative;
    color:#fff; text-decoration:none; min-width:120px;}
    #links a:hover {border:solid 1px #000;
                          -moz-border-radius:3px; -webkit-border-radius:3px;
     box-shadow: 0 0 1px #fff; -moz-box-shadow: inset 0 0 1px #fff; -webkit-box-shadow: inset 0 0 1px #fff;
     background-color:#658da0;
     background: -moz-linear-gradient(center left, rgba(81,115,132,0.55), rgba(121,163,184,0.55) 50%, rgba(81,115,132,0.55));
     background: -webkit-gradient(linear, 0% 100%, 100% 100%, from(#517384), color-stop(50%, #79a3b8), to(#517384));
     
    }
     #links a span { padding:5px; display:block; }
     #links a:hover span { background: -moz-linear-gradient(center top, transparent, transparent 49%, rgba(2,37,58,0.5) 50%, rgba(63,111,135,0.5));
     background: -webkit-gradient(linear, center top, center bottom, from(transparent), color-stop(49%, transparent),
                                    color-stop(50%, rgba(2,37,58,0.5)), to(rgba(63,111,135,0.5))); }

    要留意的点依旧是哪几项,难点在于细节的微调,尤其是渐变背景的制作,css3中非常灵活,下次有机会,发篇css3渐变背景的详细教程。
    英文原文:http://www.jankoatwarpspeed.com/post/2010/04/06/windows-7-start-menu-css3.aspx

    posted @ 2010-06-08 10:38 梁良 阅读(246) | 评论 (0)编辑 收藏

    仅列出标题
    共6页: 上一页 1 2 3 4 5 6 下一页 
    <2024年11月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    导航

    公告

        欢迎光临

    常用链接

    随笔分类

    随笔档案

    相册

    .我的网站.

    友情博客

    开源社区

    科技博客

    资料网站

    最新随笔

    搜索

    最新评论

    阅读排行榜

    Powered by:
    LonLeung
    Copyright © 梁良

    本页生成时间:毫秒