响应式 Web 设计应该避免的错误

英文原文:Mistakes to Avoid With Responsive Web Design

开发一个带有响应式交互设计的网站变得非常有意义,因为其可以在不同的设备运行,因此,你可以节约针对不同平台开发不同网站的成本。但是,要做最大限度相应的网页设计,有些错误你应当避免。

不要优先为桌面版设计

开发者通常会犯的一个常见错误是,但他们设计网站时优先考虑桌面版,因为在这些人严重,将基于桌面版的网站转变为针对其他设备的响应式web设计是件很轻松愉快的事情。但是,这个发生在计划规划阶段的错误本身会变成一个非常巨大的问题。甚至会造成返工,当然,大量的错误也会蔓延出来。
然而,基于移动设备开发网站看起来会消耗一些时间并且在刚开始会有些困难。这是因为它迫使你在包含什么内容上做出取舍,并且以一种你不习惯的方式去思考。然而,这样做会使得内容和设计整体上更优秀。粗略来讲,你可以首先尝试在比较小的设备上。一旦你在手机上做出了不错的设计,适配到更大的屏幕上会变得很轻松。

导航栏菜单的麻烦

当为移动端进行设计时,导航栏设计的问题可能会成为你的一个祸根,所以不得不避免产生麻烦。不想是固定宽度的设计,响应式设计的导航应当根据设备类型进行确定(所以智能手机的导航菜单可能和平板电脑,当然还有桌面版的导航菜单互有差异)。
许多设计者会发觉他们自己被这样一项任务搞的很崩溃——尝试设计一个可以适应所有屏幕的导航菜单。在很多情况下,设计者奋力将水平列表菜单转换为垂直列表菜单,尤其是在适配较小的手机屏幕时。然而,由于该导航栏并不是根据屏幕进行设计,这可能会导致一项很差的用户体验。

不应隐藏内容

响应式设计通常会有更少的空间展示图片和内容,但是这并不意味着你的内容应当被忽略。你不得不采取一种方式重新安排内容,使其能够保证易读性。这个比较容易实现,可以通过创建导航链接并且使用锚,是用户在一个页面中能看到他们一直在寻找的内容。那些通过CSS布局控制内容隐藏的应当明白,这些内容依然会被加载,因此,你通过为用户提供完整的观看体验也没什么大不了。简单而言,用户不应该由于他们所使用的设备而遭受开发者的“惩罚”。

单独的移动端网站地址

单独为移动端网站分配一个地址整个就是一个灾难,这摧毁了我们起初交互设计的目的,并且是可以论证的。当用户在访问网站时,重定向到移动端版本,结果是不得不浪费了很多宝贵的时间。此外,这也能非常严重地影响到你的搜索排名。但是,理所当然,使用不同的URL也有许多优势。它可以确保你能够架构具有更轻便页面的移动端网站,并且能够在智能设备上表现更好。该站点也能照顾到在特定平台上的性能和表现。不幸的是,具有单独移动端网站地址的消极影响远大于积极影响。

糟糕的用户体验

你不能简单的把桌面版的内容压缩成移动版;这么做将会影响你的用户的体验,用户可能会抛弃你的产品。在手机的有限空间内创建一个友好的界面是十分重要的。你可以采取一些措施,比如,使用一个下拉菜单代替桌面上的导航条,这样会节省你的空间。如果你先设计的是移动端,那么这通常不会是一个令人头疼的问题。

不要忽视跨情景的公约

当你在做一个响应式的设计,你不能只考虑台式和移动手机设备,你还应该考虑到其它类型的设备。人们可能会通过内嵌浏览器的智能电视或机顶盒来访问你的网站。在现在,甚至掌上电脑都有不同的类型。但是,这并不意味着你可以为所有的设备创建一个相同的用户界面,你最好是为不同的设备创建不同的网站。你所需要做的是创建一个响应导航和一个用户容易理解的设计。创建的这个导航可以清楚的保存设备的上下文环境。

不要忽视页面的加载时间

随着宽带的普及,网页开发者开始习惯在页面上大量的使用相对来说较大的资源。然而,当我们使用手机时,我们的用户使用的是较慢的2G和3G网络。同样的,那些保持minf国际的用户,他们是按使用的带宽量来付费的。
一个页面在台式机上很快的加载进来,但是,在手机上加载一个页面会花费很长时间或者去使用额外的、昂贵的带宽。更糟糕的是,当用户被迫去等待页面加载时,即使是几秒钟,他们会离开这个页面,同时你就会失去了你的流量

不要为触摸屏设备开发

今天大多数手持的设备使用的是触摸屏,甚至是很多笔记本也开始使用触摸屏了。因此,当你设计响应式设计时,很重要的一点是不要忽略掉处理触摸的重要性。有以下两个方面原因:第一,可点击项,比如按钮要考虑到用户的手指的大小(不要让用户缩放点击)。第二,你要正确的处理触摸事件。这么做可以克服300ms的点击事件延迟。

使用CSS3的@media来实现网页自适应

如今,电脑显示器的屏幕分辨率向越来越大发展,而手机等移动设备终端的分辨率却不可能大到哪里去。越来越多的网站,开始让自己的页面自适合各种分辨率,在小分辨率下显示基本的内容,在大分辨率下显示全部功能,甚至是分多等级的多版本。
作为web前端开发人员需要知道并且会用这种知识。

css2的@media

css2里面虽然支持@media属性,但是能实现的功能比较少,一般只用做打印的时候做特殊定义的CSS。
语法: @media sMedia { sRules }
说明:
sMedia :  指定设备名称。请参阅附录:设备类型
sRules :  样式表定义
指定样式表规则用于指定的设备类型。请参阅link对象的media属性(特性)。
示例:

  1. // 设置显示器用字体尺寸
  2. @media screen {
  3. BODY {fontsize:12pt;}
  4. }
  5. // 设置打印机用字体尺寸
  6. @mediaprint{
  7. @import“print.css”
  8. BODY {fontsize:8pt;}
  9. }

css3的@media

@media 属性在CSS3里面已经演变成一种 media queries(媒体查询/匹配)了,在CSS3里面,可以用查询语句来匹配各种类型的屏幕。
语法:@media : { sRules }
取值:

  1. <sMedia>:指定设备名称。请参阅附录:设备类型
  2. {sRules}:样式表定义。

说明:
判断媒介(对象)类型来实现不同的展现。此特性让CSS可以更精确作用于不同的媒介类型,同一媒介的不同条件(分辨率、色数等等).

media_query:[only |not]?<media_type>[and]*
expression:(<media_feature>[:]?)
media_type: all | aural | braille | handheld |print| projection | screen | tty | tv | embossed
media_feature: width | min-width | max-width
| height | min-height | max-height
| device-width | min-device-width | max-device-width
| device-height | min-device-height | max-device-height
| device-aspect-ratio | min-device-aspect-ratio | max-device-aspect-ratio
| color | min-color | max-color
| color-index | min-color-index | max-color-index
| monochrome | min-monochrome | max-monochrome
| resolution | min-resolution | max-resolution
| scan | grid

解析
media_query:媒体查询条件。包括了 only not and 这些经常在程序里面出现的逻辑判断。
expression:表达式。媒体特征的匹配与否。
media_type:媒体的种类。包括了很多。
media_feature:媒体的特征。常用的是 min-width max-width 最小最大宽度的判断。

DEMO(推荐在Chrome或者FIREFOX下打开,打开后,按快捷键“CTRL”+”+”,“CTRL”+”-”来缩放页面):
使用CSS3的@media来实现网页自适应的效果图

CSS代码

body{background:blue;}/*宽度500px-800px之间+高度100px-400px之间 蓝色*/@media screen and(max-width:500px){body{background:green;}}/*宽度小于500px时 绿色*/@media screen and(min-width:800px){body{background:red;}}/*宽度大于800px时 红色*/@media screen and(max-height:100px){body{background:yellow;}}/*高度小于100px时 黄色*/@media screen and(min-height:400px){body{background:pink;}}/*高度大于400px时 粉色*/

HTML代码

效果演示,请缩小/扩大浏览器的窗口大小注意背景色的变化。逻辑如下:/*宽度500px-800px之间+高度100px-400px之间 蓝色*//*宽度小于500px时 绿色*//*宽度大于800px时 红色*//*高度小于100px时 黄色*//*高度大于400px时 粉色*/

demo演示地址:http://www.zjgsq.com/example?pid=1180

Bing的几个严格限制成人内容显示的国家

必应将某些国家/地区归类为严格市场。在这些严格市场中,我们可能会限制成人内容的显示(视当地的相关定义而定),而且由于当地习俗、规范和法律,我们可能将“安全搜索”设置限制为“严格”。设置为“严格”时,“安全搜索”对图片、视频和文字过滤色情搜索结果的显示内容。限制为“严格”的市场包括:

  • 中国
  • 印度
  • 印度尼西亚
  • 朝鲜
  • 马来西亚
  • 中东地区
  • 新加坡
  • 泰国
  • 土耳其

20个步骤呈现完美网站布局设计

  Claudio Guglieri 在纽约广告公司 B-Reel 任职总监,他撰写了本网站设计培训指南,深圳网站建设贝尔利认为旨在帮助您了解设计网站布局的全过程。

  开始讲述设计网站布局的主题之前,我想先分享自己多年从事设计工作中看到的一些常见错误,尤其是”网站设计培训”中所述的实习生和新手们的通病。

  深圳网站建设贝尔利的本文罗列了打造完美网站布局的步骤,旨在涵盖开始新项目前以及项目设计过程中的各项应知应会,适合数字广告公司内就职的所有网站设计师新人阅读。

  以下原则不仅包含各种设计细节,还提供了常规工作流程,从而帮助您出色地完成工作。遵循这些原则,您很快就能上手,设计出专业的网站布局。

  01. 先在纸上整理思绪

 initial sketch

  世界各处城市插图系列简笔

  此条显然很重要,但是我经常发现一些设计师会跳过这步直接使用 Photoshop CS6 而不去思考他们需要解决的问题。设计的目的在于解决问题,而这些有待解决的问题无法通过渐变或阴影效果得到解决,而是需要完美的布局和清晰的结构。想一想内容、布局和功能,然后再开始上阴影效果。

  02. 从顶层框架草图入手

 UX sketch

  草绘基本的框架将帮助你解决 UX 问题,并组织布局结构

  如果我要做一个项目的外观和感觉,第一件事就是先建一个顶层框架,可解决所有设计问题。框架是指内容周围的 UI,有助于执行操作并进行浏览。其中包括导航和各类组件,例如边栏和底栏。

  如果你从这点着手设计,则设计主页以外的部分时,布局内容将了然于心。

  03. 为 PSD 添加网格

 grid

  以 10 像素基线绘制的 978 网格示例

  这步操作非常简单。在 Photoshop 中着手设计任何内容前,你需要创建一个合适的网格。这一步的道理众所周知,如果你没有这么做,我可以断言,最后的设计总是无法尽善尽美。

  借助于网格,你能安排不同部分的布局结构;还能指导你按照特定屏幕尺寸要求进行设计,并能帮助你创建相应的模板,以便符合间距和其他设计问题。

  04. 选择排版样式

 typography

  根据常规经验,一个网站布局中所用字型最好不要超过两种

  了解不同的字型和配色是项目开发阶段的工作。我建议一个网站中所用字型不要超过两种,不过实际上,还需取决于你可用的色系。总之,所选字体需便于阅读大量文字,且与标题和操作相映成趣。大胆使用大字体,并在使用字型时保持整体一致性和生动感。

  05. 选择主题颜色

 colours

  使用有限的色阶和色调以免产生视觉疲劳

  选完要使用的一系列字型后,你应开始研究 UI、背景和文本该用什么颜色。关于颜色,我建议在处理常规用户界面是用色及色调需简洁。

  根据元素功能在设计 UI 时保持一致性非常重要。想想 Facebook、Twitter、Quora 和 Vimeo 之类的网站布局。除 UI 外,插图或图形细节部分只要没有干扰组件功能的话,在用色方面也没什么限制。

  06. 划分布局

 B-reel homepage

  网站结构越简单,用户浏览时就越方便

  网站各个部分都需要发挥各自的作用。对于用户而言,每个部分都有各自存在的理由,并能得到相应的最终结果。布局需要帮助强调其内容着重显示该部分最重要的信息。实际上,一个页面并不需要太多调用按钮,因此每个内容都应推动到最终”我可以在此实现什么目的”。

  思考一下,你可以为一个简单的目标构想到的最简单的布局,并开始添加所需组件。最后你会惊喜的发现简洁也并非易事。

  07. 重新思考已建内容

 search button

  我们真的还需要一个搜索按钮吗?在大多数情况下,答案是不。

  作为设计人员,我们构建了用户浏览互联网的方式,需要采取多少步骤才能执行一个简单的操作以及网站的复杂性都是由我们来决定的。我们一直都在遵循一些设计模式和惯例,因为它们切实有效,但有时候只是因为没人有足够的时间进行衡量或者重新思考。重新思考组件上已建的交互模式,并看看是否可以进行改进,这点至关重要。

  08. 自我挑战

  我鼓励每位设计人员不要墨守成规,而是在每个项目上进行自我挑战。并非每个项目都要求创新,因此,需要我们自己决定是否要增加一些交互设计相关的内容。比如,各种自我挑战可能包括使用新的网格系统、创建新的组件,或者甚至包括一些小挑战,诸如避免混合模式或者避免使用特定的颜色。

  09. 注意细节

 game work in progress

  正在进行的游戏项目:细节视图

  这条也算是老生常谈了,但并非始终在成品中得到应用。根据项目的概念,”关注点”也会有所不同。

  可以注重小型交互、意想不到的动画或审美感受,例如按钮上的小渐变或是背景盒子周围的微妙笔画之类。但是总的来说,如果你乐在其中,这种感受非常重要,而且非常自然。

  10. 认真对待每个组件,就当参加设计比赛

 video component

  注重每个组件,一加一大于二

  我必须承认这并不是我首创的理论。过去曾在 Fantasy Interactive 上听到这种说法,当时我就震惊了,这句话如此明确中肯。每个组件都需单独设计,使其卓绝超凡。有时候,设计师会将一些部分归为最不重要的内容,最终并不会对其引起重视。

  11. 提高设计作品清晰度

 blurry pixels

  避免出现像素模糊的现象,尝试正确设置笔触效果和背景之间的对比度或背景颜色

  除美学考量之外,有些共同的问题需要予以避免,从而创造出一个干净正确的作品。尝试提高设计清晰度时应注意以下几点:梯度条带、模糊的边缘、字体渲染选项(部分字体取决于字体大小,最好在特定的渲染模式下查看)以及与背景融合的笔触效果。

  以上列出了一些基本注意事项,但实际上需要注意的问题还有很多。务必以整体视角检查设计,看看是不是都非常完美,然后再单独分析每个组件还有什么问题。

  12. 整理 PSD

  如果你通过 Photoshop 进行设计,那么这点至关重要(结合网格使用)。无论项目有多大,有多少设计师参与其中,你都需要保证文件干净。这样就能保证不同部分都能轻松导出,从而提高设计流程的速度,并能处理与其他设计师共享的文件。

  13. 设计最好的情况,但为最坏的情况做准备

 Clear app

  谨记不同设备和尺寸大小上如何让你的设计发挥作用

  作为设计师,我们的工作就是通过不同的限制解决问题。网页设计过程中,会遇到各种限制,包括概念和技术问题以及内容相关的问题。

  我们需要创建一个网站,其不仅可以在理想状态下运行,同时也可以在最糟糕的环境下运行。例如,用户可使用相当小的屏幕查看网站,此时网站上的内容看起来支离破碎。

  但是,鉴于我们展示设计作品的目的,我个人强烈建议为其创建最佳环境。因此我们将要显示最理想的内容量,同时以最佳浏览器尺寸进行展示,也就是用户最常用的环境。

  14. 沉迷于设计,因爱生恨

  如果你钻研设计,我保证你已经干过这种事。只要完成一项设计就会倍感自豪,设计已经成为生活的一部分了。还会截图,与其他设备比较,将其设为桌面背景,甚至打印出来挂在墙上。

  整个过程中,我达到某个临界点,最终产生厌恶;我开始发现各种缺点和错误,然后进行修改。不喜欢自己以前的设计是成熟的表现,也就是说,你最终发现自己的问题。

  15. 与客户交流前避免浪费太多时间设计概念

  提交交互概念或设计外观与体验时,你需要确保你和客户尽快同步。初始概念通过审核后,你可以稍作放松,然后开始设计。

  但是如果提交后初始概念后,并未深得客户的欢心,你就应该收集各种反馈,以便第二次提交的概念方案能够符合客户的要求。

  16. 和你的开发者成为好友

 developer Rafael Mumme

  纽约广告公司 HUGE 的 Rafael Mumme 就设计师如何更好地与开发者合作的提出的建议,请访问 www.netmagazine.com/opinions/20-things-drive-web-developers-crazy

  开发者创意十足,而且热爱自己的工作,和你一样。但是他们并非总是在项目一开始就参与其中,而且大多时候,他们都是在概念设计敲定之后才开始参与设计的,因此他们的创意工作就遭到了抹杀。这种流程是错误的;一些非常优秀的想法都是开发团队提出的。分享你的概念,你会惊喜地发现他们会把它变成更加美观、更加便于设计。

  17. 展示:说明时请将受众想象为四岁儿童

  展示作品和设计作品一样重要。使用错误的展示方式,可能会埋没优秀的设计或者使其惨遭淘汰。谨记,受众第一次看到你的设计时,并不了解你了然于心的各个重点。

  18. 肯定自己的创意,但不要成为其奴隶

  了解何时宣传自己的创意,或是了解团队或客户何时会产生分歧,这里存在一个小小的临界点。作为设计师,你需要坚信自己的设计,但是你也应乐于接受他人意见,快速改变自己的创意以及展开后续调整。不要忘记条条大路通罗马。

  19. 开发过程中跟进设计

  如果您在广告公司中工作,你必须明白,虽然你刚刚完成的一个项目已经投入开发,你不得不参加另一个新项目的设计,这是家常便饭。大家普遍认为 PSD 和样式表提交后就万事大吉了,这是不对的,其实一切还刚刚开始。

  如果你真的关心自己的设计和交互理念是否完全贯彻,可以实时与开发者友人沟通,并尽量提供帮助,以便达到至臻至美的效果。

  20. 逐步正在设计的作品

 style sheets

  与大家分享样式表和正在设计的组件

  作为设计团队的一员,我们不仅希望看到最终的成品,同时也想看一看正在设计的作品。有时候,出于种种原因,项目最优秀的部分可能会被忽略,然后一直存放在归档文件夹中。项目完成并获得客户/制作方认可后,可以着手进行改善,如有可能,可以创建案例研究,分析设计中的作品以及最终并未采用的作品。这有助于帮助拓宽团队知识,同时你也能收集宝贵的反馈意见。

如何用HTML5和CSS3搭建网站留言到邮箱的PHP程序

HTML5, CSS3 and PHP Contact FormPersonally, I feel it is important to be aware of the [positive] impact HTML5 will have on forms and the way they will function in years to come. Realistically, we can’t implement all of the new features today, but you don’t want to be lagging behind the rest of the industry when these features finally become widely supported.

Having said that, this tutorial will be focusing on the new HTML5 features that are already supported by all the major browsers, or that at least employ graceful degradation for the browsers that are still trying to play catch up.

View DemoView CSS

1. The Design

First of all, this is not a Photoshop tutorial. I have designed the look of the form, but we’re going to be focusing on replicating it using the latest coding techniques and making it function correctly.

Contact From Design

2. The HTML5 Markup

Now we have a design to work towards, we’re going to form the structure of the contact form using HTML5. Firstly, open up a new PHP file and save it as index.php. Now, because we need to use PHP to make the form function, you will need access to a web server in order to test your code. Ideally, you could set up your own machine as a server using Xampp; alternatively, if you have some online hosting space, you could use that, however this method means you will have to re-upload the files whenever you want to test them.

Doctype

Okay, now we’ve got our blank PHP document, let’s start with the appropriate doctype, which is a lot simpler in HTML5 than previous versions to say the least!

<!DOCTYPE HTML>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Contact Form</title>
</head>

<body>
</body>

</html>

Yep, that’s right. There’s no horrible combination of letters and numbers to remember for the HTML5 doctype. Just simply; <!DOCTYPE HTML>.

Just to compare, here’s the doctype for XHTML; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">.

I get the feeling we have a clear winner here? I think this sets the precedent for HTML5, as many of the new tags and attributes represent a simplified method of doing the things that used to take twice the amount of code or several lines of JavaScript.

Structure

The next step is to code the basic structure of the page, so we need to take a look at the design and divide it into logical sections.

Contact Form sections

So, we have a header section, a content section and a footer section. All very simple right? Yes, but with HTML5, it’s even simpler. And much more semantic too.

<!DOCTYPE HTML>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Contact Form</title>
</head>

<body>

    <header class="body">
    </header>

    <section class="body">
    </section>

    <footer class="body">
    </footer>

</body>

</html>

That’s right. No divs. HTML5 has introduced new tags that actually have real meaning and purpose, much more semantic than simply using divs all over the place. I’ve also given each of these elements a class of ‘body’ to show that they are part of the main content body and can be styled as such. You could of course achieve this with a div wrapper, but with only a few main body elements, it’s just as easy to assign classes in this case.

The Form

It’s about time we got onto the Contact Form, right? Obviously, the markup for the form will go within the main <section> tags.

<form>
        
    <label>Name</label>
    <input name="name" placeholder="Type Here">
            
    <label>Email</label>
    <input name="email" type="email" placeholder="Type Here">
            
    <label>Message</label>
    <textarea name="message" placeholder="Type Here"></textarea>
            
    <input id="submit" name="submit" type="submit" value="Submit">
        
</form>

So that’s the form markup, now to explain a few things.

Input Tag

You may have noticed that the input tags work slightly differently to XHTML, where they are closed using the forward-slash character; <input />. In HTML5, this tag has again, been simplified to just <input>.

Input Name

All of the <input> tags also have the name attribute declared. This comes into play later on when we create the PHP script that will handle the form data.

Input Type

The type attribute has seen some major improvement in the transition from XHTML to HTML5. Unfortunately, most of the new <input> types can’t realistically be used as of yet due to minimal support, but it’s nice to know that they will make our jobs a lot easier in years to come.

There are however, certain <input> types that we can use, and see the benefits of right now – however small these benefits might be. I have included type="email" in this tutorial, because there is no downside to employing it – there are only positives. It may not be anything mind-blowing, but it’s worth implementing, as any browsers that don’t support this new input type, simply recognise it as type="text". And on the iPhone, this <input> type causes a modified keyboard to appear when the email field is selected, which includes a reduced space bar and the @ symbol takes centre focus.

iPhone Email Keyboard

Placeholder Attribute

<input> attributes are another area of major innovation in HTML5, allowing developers to achieve things that were previously only possible through the use of several lines of JavaScript. The particular one we’re using is the placeholder attribute, which is reasonably well supported in the most recent browser releases. It allows you to assign a value to a text field, which when selected, disappears and, if no text has been entered, will reappear again when de-selected. I’ve used this idea for a long time now, but it’s always used some bulky, ugly JavaScript code to make it work.

HTML5 Placeholder

3. The CSS

After having wrote the markup for the page, this is the result…

Contact Form un-styled

Not very pretty is it? This is where we can use some CSS to spruce things up a bit and make it look closer to the original design. Firstly, let’s give the form a more familiar feel by making it read top to bottom rather than left to right.

label {
    display:block;
    margin-top:20px;
    letter-spacing:2px;
}

Giving the label elements a property and value of display:block; allows them to behave like a block level element, thus forcing the text boxes down onto the next line. I’ve also applied a couple of other self-explanatory properties for spacing and aesthetic purposes.

Contact Form

Next, we need to centre the page and the form, and we’re going to style the <input> boxes, after which we will really start to see the page transform.

/* Centre the page */
.body {
    display:block;
    margin:0 auto;
    width:576px;
}

/* Centre the form within the page */
form {
    margin:0 auto;
    width:459px;
}

/* Style the text boxes */
input, textarea {
	width:439px;
	height:27px;
	background:#efefef;
	border:1px solid #dedede;
	padding:10px;
	margin-top:3px;
	font-size:0.9em;
	color:#3a3a3a;
}

textarea {
	height:213px;
	background:url(images/textarea-bg.jpg) right no-repeat #efefef;
}

All of the above is pretty standard CSS; applying a width to the elements with the .body class as well as margin:0 auto; will centre the page, and the same technique centres the form within the page.

The input and textarea elements share many of the same CSS values, but there are a couple of properties that differentiate the main message text box from the text fields. Obviously thetextarea requires much more height, but we’re also applying a very subtle background image to this element. To do this we simply state the image source and position it correctly by setting the other background values to right and no-repeat.

Contact Form Input Boxes

Okay, now we can add the finishing touches to the text boxes with a bit of CSS3.

input, textarea {
    width:439px;
    height:27px;
    background:#efefef;
    border:1px solid #dedede;
    padding:10px;
    margin-top:3px;
    font-size:0.9em;
    color:#3a3a3a;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    border-radius:5px;
}

You can see that we have added three new lines to our CSS which will render rounded corners in all major browsers… except of course for Internet Explorer 8 and below. The standard border-radius property will work in Opera, the -webkit prefix works for Chrome and Safari and the -moz prefix renders rounded corners in Firefox.

Rounded Corners

One last thing to address regarding the text boxes is to assign them a very subtle :focusstate in order to provide some visual feedback to the users actions. This, once again, couldn’t be simpler.

input:focus, textarea:focus {
    border:1px solid #97d6eb;
}

You can see that we have just given the <input> and <textarea> elements a subtle blue border when they are currently selected.

Focus State

Finally, we’re going to create our custom submit button. The submit button is an <input>element, so we gave it its own id="submit" in order to override some of the CSS we had already assigned to <input> elements, as shown below.

#submit {
    width:127px;
    height:38px;
    background:url(images/submit.jpg);
    text-indent:-9999px;
    border:none;
    margin-top:20px;
    cursor:pointer;
}

	#submit:hover {
	    opacity:.9;
	}

Firstly, we assign the appropriate width and height of the button, before setting its background image to the button we created in the design. The text-indent:-9999px; line is a little trick to hide the actual ‘Submit’ text from the button and simply display the background image.

Finally, we assign the button a :hover state, within which we’ve utilised another little aspect of CSS3 in the form of the opacity property, which is widely supported across the major browsers, except from… yep, you’ve guessed it.

Submit Button

4. Making the form function with PHP

First things first, we need to revisit the HTML so we can add a couple of bits that will allow the form to communicate with the PHP script.

<form method="post" action="index.php">
        
    <label>Name</label>
    <input name="name" placeholder="Type Here">
            
    <label>Email</label>
    <input name="email" type="email" placeholder="Type Here">
            
    <label>Message</label>
    <textarea name="message" placeholder="Type Here"></textarea>
            
    <input id="submit" name="submit" type="submit" value="Submit">
        
</form>

So what’s been added? Take a look at the opening <form> tag. We’ve added two new attributes; method and action.

The method="post" attribute provides the PHP script with a method of extracting the values from the form, so the script can then do what it wants with those values. Theaction="index.php" attribute simply tells us the location of the PHP script; in this case, because it’s only a few lines of code, we’re going to insert it just above the form in our index.php file. So when the form is submitted, it will go to index.php and find the script.

Take another look at the HTML above and you will see that each of the form elements have the name attribute. The PHP uses this attribute to extract the data from each of the form elements. Let’s look at how it does this…

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
?>

If you’ve never used PHP before, it might look a bit confusing – but it’s actually really simple. The $_POST part is a built in PHP function which is used to collect data from a form that usesmethod="post" like ours does. The part that immediately follows this function, ['name']must correspond to the name attribute from the form input; in the first instance, name="name"!

So, this will collect whatever data has been entered into the name field – now we need something to store that data in. This is where variables come into play. In this case, $name is the variable that we will use to store the data from the name field. We can then do the same for the email and message fields. Simple!

Now, we’re going to add a few more variables that the form requires in order to function.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: TangledDemo'; 
    $to = 'contact@tangledindesign.com'; 
    $subject = 'Hello';
?>

These new variables determine the destination of the email, the subject field and where the email has come from. In the next step, we will be storing all of the data from the form in one variable in order to simplify things a little.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: TangledDemo'; 
    $to = 'contact@tangledindesign.com'; 
    $subject = 'Hello';

    $body = "From: $name\n E-Mail: $email\n Message:\n $message";
?>

You can see from the above snippet that we have taken the variables we declared previously and have now stored them all in one variable called $body, which will be the actual content of the email.

It’s almost time to use the mail() function to actually send the email! But first, we need to explain how this function is only performed when the form is submitted and not every time the user loads index.php.

<?php
if ($_POST['submit']) {
    /* Anything that goes in here is only performed if the form is submitted */
}
?>

Basically, any code inside the above if statement will only be performed once the submit button has been pressed. Again, the ['submit'] part must correspond to the name of the submit button in your form.

Now we can go ahead and use the mail() function.

<?php
if ($_POST['submit']) {
    if (mail ($to, $subject, $body, $from)) { 
        echo '<p>Your message has been sent!</p>';
    } else { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}
?>

The mail() function is a built in PHP function that actually performs the task of sending the email to the appropriate recipient. The above code uses an if statement, which basically states that if the mail function is performed correctly, then tell the user the message has been sent; if the mail function didn’t perform correctly, then notify the user that there has been a problem.

Now, if you test the form on your server you should find that it works correctly! The best way to ensure the form is working is to upload it to an online server and set the recipient email address as an email hosted on the same server.

Note that you can place this script wherever you want the confirmation message to appear. For example, if you want the message to appear above the form as it does in the demo, then you simply place the PHP script directly above the form, NOT in a separate PHP file.

Spam Prevention

Before we finish off, we’re going to look at a very simple method of spam prevention. To begin this process we must once again revisit the HTML and add in one more <input>element to our form. We’re going to insert this element just before the submit button.

<label>*What is 2+2? (Anti-spam)</label>
<input name="human" placeholder="Type Here">

Now back to the PHP, we need to use the POST method to extract whatever the user has entered into this field. Because we gave the element a name of “human”, we add the following line to our PHP; $human = $_POST['human'];.

Remember the PHP if statement we used to carry out functions only once the form had been submitted? Well we’re going to need to slightly modify that statement now.

<?php
if ($_POST['submit'] && $human == '4') {
    if (mail ($to, $subject, $body, $from)) { 
        echo '<p>Your message has been sent!</p>';
    } else { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}
?>

The statement now requires that the value of ‘human’ (the response to the anti-spam question) must be ‘4′ in order for the mail function to be carried out. Now we need to add one last bit of code to let the user know if they have answered the anti-spam question incorrectly.

<?php
if ($_POST['submit'] && $human == '4') {
    if (mail ($to, $subject, $body, $from)) { 
        echo '<p>Your message has been sent!</p>';
    } else { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
} else if ($_POST['submit'] && $human != '4') {
    echo '<p>You answered the anti-spam question incorrectly!</p>';
}
?>

We have added to our if statement by using else if, which in this case states that if the form has been submitted and the answer to the anti-spam question was not ‘4′, then do not perform the mail() function and notify the user that their answer was wrong.

And that… is that! The Final PHP code can be found below and links to the demo and the CSS file can be found even further below. Thanks for reading. If you read it all – good effort! And let me know how you got on by leaving a comment below.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: TangledDemo'; 
    $to = 'contact@tangledindesign.com'; 
    $subject = 'Hello';
    $human = $_POST['human'];
			
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";
				
    if ($_POST['submit'] && $human == '4') {				 
        if (mail ($to, $subject, $body, $from)) { 
	    echo '<p>Your message has been sent!</p>';
	} else { 
	    echo '<p>Something went wrong, go back and try again!</p>'; 
	} 
    } else if ($_POST['submit'] && $human != '4') {
	echo '<p>You answered the anti-spam question incorrectly!</p>';
    }
?>

View DemoView CSS

Update

One or two people have asked about making the form work with required fields. Here’s the script you’d need if the name and email fields in my example were both required fields…

if ($_POST['submit']) {
    if ($name != '' && $email != '') {
        if ($human == '4') {				 
            if (mail ($to, $subject, $body, $from)) { 
	        echo '<p>Your message has been sent!</p>';
	    } else { 
	        echo '<p>Something went wrong, go back and try again!</p>'; 
	    } 
	} else if ($_POST['submit'] && $human != '4') {
	    echo '<p>You answered the anti-spam question incorrectly!</p>';
	}
    } else {
        echo '<p>You need to fill in all required fields!!</p>';
    }
}

And here’s how it would work!

国内比较常用的几个CSS框架

前端CSS框架目前越来越多,各大小互联网公司也都推出了自己的解决方案并开源免费给大家使用!国外的以Bootstrap、foundation、960GS等为首的解决方案受到众多前端人士的热捧!Yahoo也推出了Pure,配合YUI3,堪称完美。

国内淘宝推出了JS库Kissy和相应的CSS框架,网易给我们带来了JS库NEJ和CSS框架NEC。

NEC特色功能(Nice+Easy=Better)

  • 读规范,让你的代码更具智慧和美丽的方法
  • 用框架,选择一份合适的HTML和CSS基础代码
  • 找代码,在这里找到她,或给你启发,或她就是你的
  • 装插件,帮助你快速有效的使用代码库

NEC官网:http://nec.netease.com/

NEJ官网http://nej.netease.com/

Pure中文版

Pure的网站:http://purecss.io/

http://pure-site.ap01.aws.af.cm

 

Google reCAPTCHA 验证码

您肯定上过论坛吧?几乎所有正规的论坛都要求注册时输入验证码,这是为了防止乱发垃圾广告的家伙用注册机来恶意注册。这个源自美国卡内基-梅隆大学的发明被称为CAPTCHA(用于区分人类与电脑的全自动图灵测试),因为注册者需要辨识图片上七歪八扭的文字,而这项工作只有真正的人类才能完成。

它其实是 Google 提供的 reCAPTCHA 服务(link),可以免费申请和使用。

关于 reCAPTCHA 验证码

验证码大家每天都会见到,可是你会想到当你每次不耐烦的输入一个单词的时候都为人类做出了一点贡献吗?

验证码(CAPTCHA)或者叫做全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart),使我们上网的人每天都可以见到的,而它的作用除了防止垃圾注册或者评论以外还有别的吗?来自Google的reCAPTCHA(上图)告诉我们,你其实还可以为人类做贡献。

题外话:现在OCR的阅读效率实在是不高,下面这张图就可以说明问题。
关于 reCAPTCHA 验证码

它的情景是这样的,有一天,某台机器扫描了一本书,想把它转成电子版:
关于 reCAPTCHA 验证码

处理出来是这样子的:

The Hreckinridge’ and Lane Democrats, having taken courage at the recent eastern advises, are [xxxxxxxxxx] energetically for the campaign: Several prominent Democrats who at first favoredDonoLea, are coming out. for the other aide, apparently under the [xxxxxxxx] of Federal [xxxxxxxxx]. An address to the National Democracy of ,1ifornia, urging the party to supportHaeeslipslDas, has recently been published, which manifestlybss strengthened that aide of the [xxxxxxxxx]: It is signed by 65 Democrats, many of whom occupy respectab e and prominent positions in the party, 22 of them are Federal office-holders,[xxxxx] more are recipients of Federal patronage, and the others represent a mass of politicians giving the document [xxxx][xxxxxx] mTheDcu8las Democrats are also active The Irish and German vote will mostly go with ths# branch of the party, but it is[xxxxxxxxx] to [xxxxxxxx] [xxxxx] [xxxx] [xx] the stronger. Thus far 17 IT newspapers have declared for DonGres, 13 for Base$- IaaIDGS and 9 remain non-committal, with even chances of going either way. Under these circumstances the Republicans entertain not unjustifiable hopes that the Democratic divisions may be so equal,- ly balanced as to give the State [xx] LIaCOLV.Same very [xxxxxxx] Bell and Everett meetings have been held in different parts of the State, bat thus far that party does not exhibit much rank sad ale air en.

这个是原书质量比较差的:
关于 reCAPTCHA 验证码

看到这个,电脑就傻眼了,吐出来一堆这种东西:

‘ letz-1- rrk fit: 1′ . on its to Vc ,rt, cann into tlm yc H_ tcr,la, .n. ‘l l; , arc ti:( h of thc 1″,ats that to ltc rc: ,;. , I; ., l: rel!;n. tani., , ./olio, IJuteilu, . 1!’i./_ ;lr”n. Iiam! Jr.r. F’l,nr_.Z.._%i;;, ,, : rt-Irn: am/ tf.rri.:, t?m steamer as a tr nW r. Uu ,tin;t, c ac?1 1″,at firm/ a t;nn, accor.liu; to .t rn. ‘Cl.w r. wu ru lm:nui MistinW /y in u;th, -. ink ;:,k as to “what w ax 1111, :111(I vle:iR a of ;: (,am( into, mnr r-, tm if tlm wo r( uu.i n:’ of t?u : la?:Iv. \ ‘c : ol in thc , ucr:atic , , Tlau :; will h:aw tu-li.r \. ’1′Im yap?tts Il ,,n an,/ I, ,rr:l. r, (,t tf,is r:ity, start witli it, with lu:rtic: ol \ 1- e:l.k.

看得懂吗?反正我是看不懂。验证码的出现,就是为了改变这种情况的。这张图可以很好的解释它的工作原理:
关于 reCAPTCHA 验证码

1、我们首先扫描了一本有一大堆单词的书
2、我们找出不能被电脑识别的单词,这些单词有可能是不同的字体。当然了,损坏程度也与书籍年代以及扫描质量有关。
3、为了让这些验证码更安全,我们会让它更扭曲并且在上面加入横线。
4、一个验证码是有两个这样的单词组成的。

有了它的帮助,第二张图片上面的文字就会变得清楚多了(不过还是有一点小错误):

The New-York State yacht Squadron, on its annual cruise to Newport came into the harbor yesterday afternoon. The following are the names of the boats that came to anchor here: Jessie, gera loliv erelun Annie, Mannering, Julia, Bonita, Magic wut, Rambler, floumblie, Henrietta, Sea-Drift and Maria, with the steamer America as a tender. On anchoring each boat fired a gun, according to custom. The reports were heard distinctly in the city, causing considerable inquiry as to “what was up,” and quite a number of sanguine individuals came into our office to inquire if the guns were not annunciatory signals of the successful laying of the Atlantic Cable. We invariably replied in the negative. The squadron will leave to-day for Newport. The yachts Washington and buub r of this city, start with it, with parties of New Haven people.

有的人可能要问了,既然机器都看不明白那他怎么判断你输对了还是错了呢?我一开始也有这样的问题,Google是这样解释的:
两个验证码里面有一个是正确的,被人审核过的,而另一个是不正确的,机器读不出来的。当你把那个正确的输对以后我们就会默认另外一个也是对的,这样,你每输入一次验证码,就为人类的知识宝库里增加了一个单词。

了解和申请 reCAPTCHA :www.google.com/recaptcha

dedecms安全配置整理,防止网站被黑必看!

网上有很多CMS开源程序,发现很多朋友或做医院的都用到DEDECMS,之前我也使用过,不过后来被挂过几次马,就觉得DEDE也不什么好,不过做垃圾站的话,排名效果还是不错的,至少对百度的收录和排名都比较友好。任何一款开源程序都存在或多或少的漏洞,只是没被别人发现而已。自己不能开发这么强大的系统,只能拿现成的来改了。很多所谓的“黑客”都是用工具来扫描入侵,厉害点的人是不屑来黑我们的小网站的,所以我们一般做好安全防护就可以了。以下是我收集整理的内容:
第一:安装的时候数据库的表前缀,最好改一下,不用dedecms默认的前缀dede_,可以改成ljs_,随便一个名称即可。
第二:后台登录开启验证码功能,将默认管理员admin删除,改成一个自己专用的,复杂点的账号。
第三:装好程序后务必删除install目录
第四:将dedecms后台管理默认目录名dede改掉。
第五:用不到的功能一概关闭,比如会员、评论等,如果没有必要通通在后台关闭。
第六:以下一些是可以删除的目录:
member会员功能
special专题功能
company企业模块
plus\guestbook留言板第
第七:管理地址使用noindex和nofollow标记,防止搜索引擎抓路让一些人通过社工获取管理地址和程序版本号。
以下是可以删除的文件:
管理目录下的这些文件是后台文件管理器,属于多余功能,而且最影响安全
file_manage_control.php file_manage_main.php file_manage_view.php media_add.php media_edit.php media_main.php
再有:
不需要SQL命令运行器的将dede/sys_sql_query.php 文件删除。
不需要tag功能请将根目录下的tag.php删除。不需要顶客请将根目录下的digg.php与diggindex.php删除。
第八:多关注dedecms官方发布的安全补丁,及时打上补丁。
第九:下载发布功能(管理目录下soft__xxx_xxx.php),不用的话可以删掉,这个也比较容易上传小马的.
第十:DedeCms官网出的万能安全防护代码http://bbs.dedecms.com/read.php?tid=15538,我发在文章后面,官网的要会员才能看.
第十一:最安全的方式:本地发布html,然后上传到空间。不包含任何动态内容,理论上最安全,不过维护相对来说比较麻烦。
第十二:还是得经常检查自己的网站,被挂黑链是小事,被挂木马或删程序就很惨了,运气不好的话,排名也会跟着掉。所以还得记得时常备份数据.

转自:http://blog.sina.com.cn/s/blog_bada4e1c01017urr.html

30个最常用css选择器解析

你也许已经掌握了id、class、后台选择器这些基本的css选择器。但这远远不是css的全部。下面向大家系统的解析css中30个最常用的选择器,包括我们最头痛的浏览器兼容性问题。掌握了它们,才能真正领略css的巨大灵活性。
1. *

* {
margin: 0;
padding: 0;
}

星状选择符会在页面上的每一个元素上起作用。web设计者经常用它将页面中所有元素的margin和padding设置为0。 *选择符也可以在子选择器中使用。

#container * {
border: 1px solid black;
}

上面的代码中会应用于id为container元素的所有子元素中。 除非必要,我不建议在页面中过的的使用星状选择符,因为他的作用域太大,相当耗浏览器资源。 兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera
2. #X

#container {
width: 960px;
margin: auto;
}

井号作用域有相应id的元素。id是我们最常用的css选择器之一。id选择器的优势是精准,高优先级(优先级基数为100,远高于class的10),作为javascript脚本钩子的不二选择,同样缺点也很明显优先级过高,重用性差,所以在使用id选择器前,我们最好问下自己,真的到了非用id选择器的地步? 兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera
3. .X

.error {
color: red;
}

这是一个class(类)选择器。class选择器与id选择器的不同是class选择器能作用于期望样式化的一组元素。 兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera
4. X Y

li a {
text-decoration: none;
}

这也是我们最常用的一种选择器——后代选择器。用于选取X元素下子元素Y,要留意的点是,这种方式的选择器将选取其下所有匹配的子元素,无视层级,所以有的情况是不宜使用的,比如上述的代码去掉li下的所有a的下划线,但li里面还有个ul,我不希望ul下的li的a去掉下划线。使用此后代选择器的时候要考虑是否希望某样式对所有子孙元素都起作用。这种后代选择器还有个作用,就是创建类似命名空间的作用。比如上述代码样式的作用域明显为li。 兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera
5. X

a { color: red; }
ul { margin-left: 0; }

标签选择器。使用标签选择器作用于作用域范围内的所有对应标签。优先级仅仅比*高。 兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera
6. X:visited和X:link

a:link { color: red; }
a:visted { color: purple; }

使用:link伪类作用于未点击过的链接标签。:hover伪类作用于点击过的链接。 兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
7. X+Y

ul + p {
color: red;
}

相邻选择器,上述代码中就会匹配在ul后面的第一个p,将段落内的文字颜色设置为红色。(只匹配第一个元素) 兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
8. X>Y

div#container > ul {
border: 1px solid black;
}

  • List Item
    • Child
  • List Item
  • List Item
  • List Item

子选择器。与后代选择器X Y不同的是,子选择器只对X下的直接子级Y起作用。在上面的css和html例子中,div#container>ul仅对container中最近一级的ul起作用。从理论上来讲X > Y是值得提倡选择器,可惜IE6不支持。 兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
9. X ~ Y

ul ~ p {
color: red;
}

相邻选择器,与前面提到的X+Y不同的是,X~Y匹配与X相同级别的所有Y元素,而X+Y只匹配第一个。 兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
10. X[title]

a[title] {
color: green;
}

属性选择器。比如上述代码匹配的是带有title属性的链接元素。

兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
11. X[title=”foo”]

a[href=”http://css9.net”] {
color: #1f6053;
}

属性选择器。 上面的代码匹配所有拥有href属性,且href为http://css9.net的所有链接。

这个功能很好,但是多少又有些局限。如果我们希望匹配href包含css9.net的所有链接该怎么做呢?看下一个选择器。 兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
12. X[title*=”css9.net”]

a[href*=”css9.net”] {
color: #1f6053;
}

属性选择器。正如我们想要的,上面代码匹配的是href中包含”css9.net”的所有链接。

兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
13. X[href^=”http”]

a[href^=”http”] {
background: url(path/to/external/icon.png) no-repeat;
padding-left: 10px;
}

属性选择器。上面代码匹配的是href中所有以http开头的链接。 兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
13. X[href$=”.jpg”]

a[href^=”http”] {
background: url(path/to/external/icon.png) no-repeat;
padding-left: 10px;
}

属性选择器。在属性选择器中使用$,用于匹配结尾为特定字符串的元素。在上面代码中匹配的是所有链接到扩展名为.jpg图片的链接。(注意,这里仅仅是.jpg图片,如果要作用于所有图片链接该怎么做呢,看下一个选择器。)

兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
14. X[data-*=”foo”]

在上一个选择器中提到如何匹配所有图片链接。如果使用X[href$=”.jpg”]实现,需要这样做:

a[href$=”.jpg”],
a[href$=”.jpeg”],
a[href$=”.png”],
a[href$=”.gif”] {
color: red;
}

看上去比较麻烦。另一个解决办法是为所有的图片链接加一个特定的属性,例如‘data-file’

html代码

图片链接

css代码如下:

a[data-filetype=”image”] {
color: red;
}

这样所有链接到图片的链接字体颜色为红色。

兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
15. X[foo~=”bar”]

属性选择器。属性选择器中的波浪线符号可以让我们匹配属性值中用空格分隔的多个值中的一个。看下面例子:

html代码

Click Me, Fool

css代码

a[data-info~=”external”] {
color: red;
}
a[data-info~=”image”] {
border: 1px solid black;
}

在上面例子中,匹配data-info属性中包含“external”链接的字体颜色为红色。匹配data-info属性中包含“image”的链接设置黑色边框。

兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
17. X:checked

checked伪类用来匹配处于选定状态的界面元素,如radio、checkbox。

input[type=radio]:checked {
border: 1px solid black;
}

上面代码中匹配的是所有处于选定状态的单选radio,设置1px的黑色边框。

兼容浏览器:IE9+、Firefox、Chrome、Safari、Opera
18. X:after和X:before

这两个伪类与content结合用于在元素的前面或者后面追加内容,看一个简单的例子:

h1:after {content:url(/i/logo.gif)}

上面的代码实现了在h1标题的后面显示一张图片。

我们也经常用它来实现清除浮动,写法如下:

.clearfix:after {
content: “”;
display: block;
clear: both;
visibility: hidden;
font-size: 0;
height: 0;
}
.clearfix {
*display: inline-block;
_height: 1%;
}

19. X:hover

div:hover {
background: #e3e3e3;
}

:hover伪类设定当鼠标划过时元素的样式。上面代码中设定了div划过时的背景色。

需要注意的是,在ie 6中,:hover只能用于链接元素。

这里分享一个经验,在设定链接划过时出现下滑线时,使用border-bottom会比text-decoration显得更漂亮些。代码如下:

a:hover {
border-bottom: 1px solid black;
}

兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera
20. X:not(selector)

div:not(#container) {
color: blue;
}

否定伪类选择器用来在匹配元素时排除某些元素。在上面的例子中,设定除了id为container的div元素字体颜色为blue。

兼容浏览器:IE9+、Firefox、Chrome、Safari、Opera
21. X::pseudoElement

::伪类用于给元素片段添加样式。比如一个段落的第一个字母或者第一行。需要注意的是,这个::伪类只能用于块状元素。

下面的代码设定了段落中第一个字母的样式:

p::first-letter {
float: left;
font-size: 2em;
font-weight: bold;
font-family: cursive;
padding-right: 2px;
}

下面的代码中设定了段落中第一行的样式:

p::first-line {
font-weight: bold;
font-size: 1.2em;
}

兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera

(IE6竟然支持,有些意外啊。)
22. X:nth-child(n)

li:nth-child(3) {
color: red;
}

这个伪类用于设定一个序列元素(比如li、tr)中的第n个元素(从1开始算起)的样式。在上面例子中,设定第三个列表元素li的字体颜色为红色。

看一个更灵活的用法,在下面例子中设定第偶数个元素的样式,可以用它来实现隔行换色:

tr:nth-child(2n) {
background-color: gray;
}

兼容浏览器:IE9+、Firefox、Chrome、Safari
23. X:nth-last-child(n)

li:nth-last-child(2) {
color: red;
}

与X:nth-child(n)功能类似,不同的是它从一个序列的最后一个元素开始算起。上面例子中设定倒数第二个列表元素的字体颜色。

兼容浏览器:IE9+、Firefox、Chrome、Safari、Opera
24. X:nth-of-type(n)

ul:nth-of-type(3) {
border: 1px solid black;
}

与X:nth-child(n)功能类似,不同的是它匹配的不是某个序列元素,而是元素类型。例如上面的代码设置页面中出现的第三个无序列表ul的边框。

兼容浏览器:IE9+、Firefox、Chrome、Safari
25. X:nth-last-of-type(n)

ul:nth-last-of-type(3) { border: 1px solid black; }

与X:nth-of-type(n)功能类似,不同的是它从元素最后一次出现开始算起。上面例子中设定倒数第三个无序列表的边框

兼容浏览器:IE9+、Firefox、Chrome、Safari、Opera
26. X:first-child

:first-child伪类用于匹配一个序列的第一个元素。我们经常用它来实现一个序列的第一个元素或最后一个元素的上(下)边框,如:

ul:nth-last-of-type(3) {
border: 1px solid black;
}

兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera
27. X:last-child

ul > li:last-child {
border-bottom:none;
}

与:first-child类似,它匹配的是序列中的最后一个元素。

兼容浏览器:IE9+、Firefox、Chrome、Safari、Opera
28. X:only-child

div p:only-child {
color: red;
}

这个伪类用的比较少。在上面例子中匹配的是div下有且仅有一个的p,也就是说,如果div内有多个p,将不匹配。

My paragraph here.

Two paragraphs total.

Two paragraphs total.

在上面代码中第一个div中的段落p将会被匹配,而第二个div中的p则不会。

兼容浏览器:IE9+、Firefox、Chrome、Safari、Opera
29. X:only-of-type

li:only-of-type {
font-weight: bold;
}

这个伪类匹配的是,在它上级容器下只有它一个子元素,它没有邻居元素。例如上面代码匹配仅有一个列表项的列表元素。

兼容浏览器:IE9+、Firefox、Chrome、Safari、Opera
30. X:first-of-type

:first-of-type伪类与:nth-of-type(1)效果相同,匹配出现的第一个元素。我们来看个例子:

My paragraph here.

  • List Item 1
  • List Item 2
  • List Item 3
  • List Item 4

在上面的html代码中,如果我们希望仅匹配List Item 2列表项该如何做呢:

方案一:

ul:first-of-type > li:nth-child(2) {
font-weight: bold;
}

方案二:

p + ul li:last-child {
font-weight: bold;
}

方案三:

ul:first-of-type li:nth-last-child(1) {
font-weight: bold;
}

兼容浏览器:IE9+、Firefox、Chrome、Safari、Opera。
总结:

如果你正在使用老版本的浏览器,如IE 6,在使用上面css选择器时一定要注意它是否兼容。不过,这不应成为阻止我们学习使用它的理由。在设计时,你可以参考浏览器兼容性列表,也可以通过脚本手段让老版本的浏览器也支持它们。

另一点,我们在使用javascript类库的选择器时,例如jquery,要尽可能的使用这些原生的css3选择器,因为类库的选择器引擎会通过浏览器内置解析它们,这样会获得更快的速度。

原文:http://net.tutsplus.com/tutorials/html-css-techniques/the-30-css-selectors-you-must-memorize/