Quantcast
Channel: w3cplus
Viewing all 1557 articles
Browse latest View live

藤藤每日一练——CSS3 Animation Breadcrumbs

$
0
0
藤藤每日一练——CSS3 Animation Breadcrumbs

Breadcrumbs(面包屑),在网站上也是常见的一种UI效果,但这种效果大家看到的都是很普通普通的效果,使用CSS3制作的一些特殊效果,可能很少见吧。虽然早前在《CSS 制作Breadcrumbs》一文中搜集和制作了一些效果,但这些效果都没有运用动画效果。今天这个案例使用CSS3的几个属性制作了一个带有动画的Breadcrumbs效果,感兴趣的可以看看。

demodownload

HTML CODE

<ul class="nav_block clearfix item1">
  <li><a href="#" class="active"><i>Home</i></a></li>
  <li><a href="#"><i>Main Category</i></a></li>
  <li><a href="#"><i>Sub Category</i></a></li>
  <li><a href="#"><i>Item</i></a></li>
</ul>
<ul class="nav_block clearfix item2">
  <li><a href="#" class="active"><i>Home</i></a></li>
  <li><a href="#"><i>Main Category</i></a></li>
  <li><a href="#"><i>Sub Category</i></a></li>
  <li><a href="#"><i>Item</i></a></li>
</ul>

CSS CODE

.demo {
   width: 500px;
  margin: 0 auto;
}  
.nav_block {
  margin-top: 40px;
  float: left;
  border-width: 1px;
  border-style: solid;
  border-color: #dedede transparent #b5b4b0 #c6c6c5;
}
.nav_block li {
  float: left;
  text-shadow: 0 1px 0 #fff;
  background-color: #e6e6e6;
}
.nav_block li a {
  position: relative;
  display: block;
  color: #7d7c7c;
  padding: 0 25px;
  height: 40px;
  line-height: 40px;
} 
.nav_block li a:before {
  position: absolute;
  font-family: 'entypo';
  font-style: normal;
  speak: none;
  font-weight: normal;
  font-smoothing: antialiased;
  font-size: 22px;
  margin-right: 8px;
  text-indent: 8px;
  z-index: 3;
  transform: translateY(-60px);
}
.nav_block li a:after {
  position: absolute;
  top: 5px;
  right: -14px;
  content: "";
  width: 32px;
  height: 35px;
  box-shadow: 0 1px 0 #c6c6c5 inset,-1px 0 0 #c6c6c5 inset, 1px 0 0 #fff,0 -1px 0 #fff;
  background-color: #e6e6e6;
   clip: rect(-1px 31px 29px 1px);
  transform: rotate(45deg);
  z-index: 2;
}
.nav_block li a:hover,
  .nav_block li .active {  
  text-decoration: none;
  margin: -1px;
}
.item1 li a:hover,
  .item1 li .active {
  color: #aa1010;
  text-shadow: 0 1px 0 #f28383;
  border:1px solid #e00e0e;
  box-shadow: 0 1px 0 #f17a7a inset;
  background-color: #eb4141;
}
.item2 li a:hover,
  .item2 li .active {
  color: #825812;
  text-shadow: 0 1px 0 #fff9ee;
  border:1px solid #edb524;
  box-shadow: 0 1px 0 #ffd692 inset;
  background-color: #ffc15b;
}
.nav_block li a i {
  display: inline-block;
  font-style: normal;
}
.nav_block li a:not(.active):hover i {
  animation: moveText 300ms ease;
  padding-left: 45px;
  font-size: 18px;
}
.item1 li a:not(.active):hover:after,
  .item1 li .active:after {
  background-color: #eb4141;
  box-shadow: 0 1px 0 #e00e0e inset,-1px 0 0 #e00e0e inset, 1px 0 0 #d4aead,0 -1px 0 #d4aead;
}
.item2 li a:not(.active):hover:after,
  .item2 li .active:after {
  background-color: #ffbd51;
  box-shadow: 0 1px 0 #e6b42e inset,-1px 0 0 #e6b42e inset, 1px 0 0 #d4aead,0 -1px 0 #d4aead;
}
.nav_block li:nth-child(1) a:before {
  content: "\e00c";
}
.nav_block li:nth-child(2) a:hover:before {
  content: "\e02d";
}
.nav_block li:nth-child(3) a:hover:before {
  content: "\e01f";
}
.nav_block li:nth-child(4) a:hover:before {
  content: "\e036";
}
.nav_block li a:not(.active):hover:before {
  transform: translateY(0px);
  animation: moveIcon 300ms ease;
  font-size: 30px;
}
.nav_block li .active {
  font-size: 0;
}
.nav_block li .active:before {
  text-indent: -8px;
  transform: translateY(0px);
}
.nav_block li .active:after {
  right: -15px;
}
.nav_block li .active:hover:before,
  .nav_block li .active:hover i {
  animation: none;
}
@keyframes moveText {
   from {
      transform: translateY(80px);
      opacity: 0.1;
   }
   to {
      transform: translate(0);
      opacity: 1;
   }
}
@keyframes moveIcon {
   from {
      transform: translateY(-80px);
      opacity: 0.1;
   }
   to {
      transform: translate(0);
      opacity: 1;
   }
}
@font-face {
  font-family: 'entypo';
  src:url('fonts/entypo.eot');
  src:url('fonts/entypo.eot?#iefix') format('embedded-opentype'),
    url('fonts/entypo.svg#entypo') format('svg'),
    url('fonts/entypo.woff') format('woff'),
    url('fonts/entypo.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
}

demodownload

如需转载,烦请注明出处:http://www.w3cplus.com/demo/CSS3-Animation-Breadcrumbs.html


走向视网膜(Retina)的Web时代

$
0
0

维基百科将Retina译为“视网膜”。"Retina"一词,原意是“视网膜”的意思,指显示屏的分辨率极高,使得肉眼无法分辨单个像素。

苹果的“iPhone4”和"new iPad"以及“Macbook Pro”中已经使用了Retina(视网膜)技术。这是一种新的屏幕的显示技术。苹果表示,Retina屏幕是一种具备超高像素密度的液晶屏,它可以将960x640的分辨率压缩到一个3.5英寸的显示屏内。也就是说,该屏幕的像素密度达到326像素/英寸(ppi)。

苹果采用Retina屏幕技术得到了更多人的亲眯,因为Retina给画面带来了前所未有的清晰平滑效果。相比之下,互联网非常的庞大,从当初的普通屏幕过渡到Retina是件缓慢而又痛苦的事情。在缺少行业标准来简化这个过程,每个Web开发人员和设计者为了确保他们的用户得到最好的视觉体验,Retina还是给他们带来了些小麻烦。

为了解决这些麻烦,更好的从事Web开发和设计,做为一名紧跟时代前沿技术的Web前端人员是很有必要了解学习Retina。

在深入了解和学习Retina之前,我们需要了先学习一些基本概念,这些基本概念将更好的带领我们深入下去。

设备像素

Retina web

设备像素也被称为物理像素,他是显示设备中一个最微小的物理部件。每个像素可以根据操作系统设置自己的颜色和亮度。正是这些设备像素的微小距离欺骗了我们肉眼看到的图像效果。

屏幕密度

屏幕密度是指一个设备表面上存在的像素数量,它通常以每英寸有多少像素来计算(PPI)。苹果将这个营销出一个专业的术语“Retina”,将其称为双密度显示,声称人类的肉眼将无法区分单个像素。当一个显示屏像素密度超过300ppi时,人眼就无法区分出单独的像素。这也是讲:显示设备清晰度已达到人视网膜可分辨像素的极限。因此行动电话显示器的像素密度达到或高于300ppi就不会再出现颗粒感,而手持平板类电器显示器的像素密度达到或高于260ppi就不会再出现颗粒感,苹果行动电脑的Retina显示器像素密度只要超过200ppi就无法区分出单独的像素。

CSS像素

Retina web

CSS像素是一个抽象的单位,主要使用在浏览器上,用来精确的度量(确定)Web页面上的内容。一般情况下,CSS像素被称为与设备无关的像素(device-independent像素),简称为“DIPs”。在一个标准的显示密度下,一个CSS像素对应着一个设备像素。

<div height="200" width="300"></div>

上面的代码,将会在显示屏设备上绘制一个200x300像素的盒子。但是在Retina屏幕下,相同的div却使用了400x600设备像素,保持相同的物理尺寸显示,导致每个像素点实际上有4倍的普通像素点,如图所示:

Retina web

反过来说,一个CSS像素点实际分成了四个,这样就造成了颜色只能近似选取,于是,我们看上去就变得模糊了。那么在Web开发和设计中,我们可以通过"device-pixel-ratio"来解决。

device-pixel-ratio,
-o-device-pixel-ratio,
-moz-device-pixel-ratio,
-Webkit-device-pixel-ratio {
  …
}

或者你可以使用将来的写法:

device-pixel-ratio,
-o-min-device-pixel-ratio,
min--moz-device-pixel-ratio,
-Webkit-min-device-pixel-ratio {
  …
}

在javascript中,“window.devicePixelRatio”可以用来获得相同的比率,虽然目前浏览器支持还有限。但这种技术将会慢慢被支持。

"window.devicePixelRatio"其实指的就是“devicePixelRatio”,我们来看看“window.devicePixelRatio”是什么?简单点说“window.devicePixelRatio”是设备上物理像素和设备像素(device-independent pixels (dips))的比例。他有一个计算公式:window.devicePixelRatio = 物理像素/dips。

dip或dp,(device independent pixels,设备独立像素)与屏幕密度有关。dip可以用来辅助区分视网膜设备还是非视网膜设备。

所有非视网膜屏幕的iPhone在垂直屏幕显示的时候,他的宽度为320物理像素,当你通过“meta”改变“viewport”时:

<meta name="viewport" content="width=device-width">

这个时候,视窗布局宽度变成320px(不同于视觉区域宽度,不放大显示情况下,两者大小一致),这样视觉上,整个页面很自然的覆盖在屏幕上,如下图所示:

Retina web

这样,非视网膜屏幕的iphone上,屏幕物理像素320像素,独立像素也是320像素,因此window.devicePixelRatio等于1.

而对于视网膜屏幕的iphone,如iphone4s, 纵向显示的时候,屏幕物理像素640像素。同样,当用户设置

<meta name="viewport" content="width=device-width">

这个时候,其视区宽度并不是640像素,而是320像素,这是为了有更好的阅读体验 – 更合适的文字大小。

这样,在视网膜屏幕的iphone上,屏幕物理像素640像素,独立像素还是320像素,因此,window.devicePixelRatio等于2.

位图像素

Retina web

位图是由像素(Pixel)组成的,像素是位图最小的信息单元,存储在图像栅格中(PNG, JPG, GIF等等)。每个像素都具有特定的位置和颜色值。按从左到右、从上到下的顺序来记录图像中每一个像素的信息,如:像素在屏幕上的位置、像素的颜色等。位图图像质量是由单位长度内像素的多少来决定的。单位长度内像素越多,分辨率越高,图像的效果越好。

位图也称为“位图图像”“点阵图像”“数据图像”“数码图像”。

基于图像的栅格分辨率,图像在Web中是由CSS像素定义了一个抽象的大小。浏览器挤压或者拉伸图像都是基于其CSS高度或者宽度来进行呈现的一个过程。

当一个光栅图像在标准设备下全屏显示时,一位图像素对应的就是一设备像素,导致一个完全保真的显示。因为一个位置像素不能进一步分裂,当在Retina屏幕下时,他要放大四倍来保持相同的物理像素的大小,这样就会丢失很多细节,造成失真的情形。换句话说,每一位图像素被乘以四填补相同的物理表面在视网膜屏幕下显示。

Retina web

高分辨率屏幕与高像素密度屏幕

在 Retina 视网膜屏幕面世之前人们很少关注像素密度,尤其在 Windows 系统下,提高屏幕分辨率一般都是通过提高屏幕尺寸。而随着屏幕分辨率的提升,图像和文字显示目标会相应缩小,造成观看极其不便。因为系统并不会自动根据屏幕尺寸和分辨率关系相应的调整文字和图标的大小。(即使手动调整也会因为微软一直采用的点阵字体和大多数位图在提高分辨率后,因为多于出的像素点没有填充渲染会出现拉伸,进而会产生锯齿,这也是系统不会自动适配的原因之一)这也就给我们造成一种假象:显示器尺寸越大,分辨率就会越大。

所以当最近苹果的 Retina 视网膜屏幕令很多人困惑不已,为什么那么小的屏幕会有那么大的分辨率。为什么那么大的分辨率,非但没有使得文字和图像变小,反而更加清晰了呢?

高像素密度屏幕(高 ppi)

严格来说,高像素密度屏幕也是属于高分辨率屏幕,不同的是高像素密度屏幕在提升了分辨率的同时也提高了其像素密度,即相同的尺寸有着更大的分辨率。以评估的 Retina 视网膜屏幕为例,它并不是像普通显示器那样通过增大尺寸来增加分辨率,而是靠提升单位面积屏幕的像素数量,即像素密度来提升分辨率,这样就有了高像素密度屏幕。

同时操作系统也会自动采取相应的模式(如 Mac 下的 HiDPI)进行适配,将缩小后的字体(苹果一直采用矢量字体)和图标重新放大,这样苹果用了更多的像素数来显示同样的内容,显示尺寸仍然不变,但是多了更多细节,因此会有非常明显的视觉效果提升。

这样一来我们可以看一个简单的换算

iPhone/iPod Touch

普通屏幕分辨率 ====>  320px X 480px
Retion分辨率   ====>  640px X 960px

iPad,iPad2/New iPad

普通屏幕分辨率 ====>  768px X 1024px
Retion分辨率   ====>  1536px X 2048px

换算关系

普通屏幕分辨率 ====>  1点=1像素
Retion分辨率   ====>  1点=2像素

上面两段文字内容摘自于南宮瑞揚的《retina视网膜时代的页面》一文。

Retina设备

Retina是由苹果提出来的,根据苹果发布产品的定义:PPI高于210(笔记本电脑)、260(平板电脑)、300(手机)的屏幕都称为Retina屏幕

Retina web

通过上面的内容介绍,我们大致了解了Retina周边相关的术语,以及他们之间的关系和区别,如果你需要深入的了解Retina,我们就继续往下阅读。

尽管我们仍处理普通屏幕向Retina屏幕的转变中,但如何使用Retina来优化Web图形的方法还是如雨后春笋涌现,而且还有更多的人在关注和分享。

THML和CSS的标准

最直截了当的方法就是通过手动制图或以编程的方式制作两种不同的图形,一张是普通屏幕的图片,另外一种是Retina屏幕的图形,而且Retina屏幕下的图片是普通屏幕的两倍像素。看个实例,有一张200x300像素的图片(CSS像素),然后将一个位图的像素400x600上传到你的服务器上,通过CSS样式或HTML属性将其压缩50%,这个时候,在一个标签分辨率的显示器上,其呈现的图像是位图的四分之一像素。简单点理解,普通屏幕下的图像被压缩,减少像素取样(只是位图含像素的四分之一),这样就造成了资源浪费。同时把这个过程称为"Downsampled"。

Retina web

但在Retina屏幕下,相同的图像会使用四倍的物理像素显示,这样一来,每个物理像素最终完全匹配一位图像素,使用图像得到完全的呈现。

Retina web

有几种方法可以实现这样的效果。

1、使用HTML

最简单的方法就是通过“img”标签,设置“width”和“height”属性:

<img src="example@2x.png" width="200" height="300" />

这里注意了,即使指定的图片高度是可选的,但是在加载图片前,浏览器已经预留了所需的空间。这样就可以防址页面布局更改图片时,在加载一次。

2、使用JavaScript

同样的效果,我们可以通过JavaScript脚本对图像(为Retina屏幕准备的图像)进行减半。

$(window).load(function() {
  var images = $('img');
  images.each(function(i) {
    $(this).width($(this).width() / 2);
  });
});

3、使用CSS

另外一种方法就是通过CSS来实现。那么常见的方法就是给元素设置一个背景图像,比如说给“div”元素设置一个背景图像,最关键的是给这个背景图像设置"background-size",来指定背景图像的大小,你也可以给元素设置一个大小,然后给"background-size"设置一个“contain”属性值。不过可惜的是IE78不支持这个属性的运用。

.image {
  background-image: url(example@2x.png);
  background-size: 200px 300px;
  /*或者设置background-size: contain; */
  height: 300px;
  width: 200px;
}

你还可以使用元素的伪元素来代替

.image-container:before {
  background-image: url(example@2x.png);
  background-size: 200px 300px;
  content:'';
  display: block;
  height: 300px;
  width: 200px;
}

上面通过三种方法来实现,那么来看看他们的对比:

HTML和CSS方法的优点

  1. 很容易实现
  2. 能跨浏览器兼容

HTML和CSS方法的缺点

  1. 非Retina屏幕下必须下载更大的图片资源
  2. Downsampled图像在不同的分辨下可能会失去一定的清晰度
  3. background-size在IE9以下浏览器不能得到友好支持

来看一个张旭鑫大师的经验之谈《视网膜New iPad与普通分辨率iPad页面的兼容处理》。

有一张200x200像素的图片(CSS像素,也就是普通像素点或者说是标准像素点),我们给图片设置一个CSS样式:

img {
  width:200px;
  height:200px;
}

在iPad2或Mini iPad中就是很正常显示的图片;但是,在New iPad中,1个CSS像素点实际上有4个位图像素点,1个分成4个,显然不够分啊,只能颜色近似选取,于是,图片感觉就是模糊的。

因此,要想让视网膜屏幕下的图片高清晰显示,我们需要的图片的原始大小不能是200×200像素,而需要2倍高宽,即400×400像素,CSS像素限制依然是:

img {
  width:200px;
  height:200px;
}

此时,视网膜屏幕下图片就显示OK了(非视网膜屏幕图片被压缩-减少像素取样——资源浪费!)。

查询像素密度

为Retina屏幕下查询Web图像的像素密度,然后调用对应的图像。目前较为流行的方式是通过CSS或者JavaScript来实现。

1 、使用CSS Media Queries

可以通过“device-pixel-ratio”属性或者其扩展属性“min-device-pixel-ratio”和“max-device-pixel-ratio”。这几个Media Queries可以使用background-image为Retina准备高精密度像素的图片。

.icon {
  background-image: url(example.png);
  background-size: 200px 300px;
  height: 300px;
  width: 200px;
}

@media only screen and (-Webkit-min-device-pixel-ratio: 1.5),
only screen and (-moz-min-device-pixel-ratio: 1.5),
only screen and (-o-min-device-pixel-ratio: 3/2),
only screen and (min-device-pixel-ratio: 1.5) {
  .icon {
    background-image: url(example@2x.png);
  }
}

通过“window.devicePixelRatio”的比例“1.5”或"2"为不同的苹果设备做相对应的查询。

iPhone4

@media only screen and (-webkit-min-device-pixel-ratio : 1.5),only screen and (min-device-pixel-ratio : 1.5) {
	/* Styles */
}

Retian屏幕和普通屏幕

@media only screen and (min-width: 320px) {

  /* Small screen, non-retina */

}

@media
only screen and (-webkit-min-device-pixel-ratio: 2)      and (min-width: 320px),
only screen and (   min--moz-device-pixel-ratio: 2)      and (min-width: 320px),
only screen and (     -o-min-device-pixel-ratio: 2/1)    and (min-width: 320px),
only screen and (        min-device-pixel-ratio: 2)      and (min-width: 320px),
only screen and (                min-resolution: 192dpi) and (min-width: 320px),
only screen and (                min-resolution: 2dppx)  and (min-width: 320px) { 

  /* Small screen, retina, stuff to override above media query */

}

@media only screen and (min-width: 700px) {

  /* Medium screen, non-retina */

}

@media
only screen and (-webkit-min-device-pixel-ratio: 2)      and (min-width: 700px),
only screen and (   min--moz-device-pixel-ratio: 2)      and (min-width: 700px),
only screen and (     -o-min-device-pixel-ratio: 2/1)    and (min-width: 700px),
only screen and (        min-device-pixel-ratio: 2)      and (min-width: 700px),
only screen and (                min-resolution: 192dpi) and (min-width: 700px),
only screen and (                min-resolution: 2dppx)  and (min-width: 700px) { 

  /* Medium screen, retina, stuff to override above media query */

}

@media only screen and (min-width: 1300px) {

  /* Large screen, non-retina */

}

@media
only screen and (-webkit-min-device-pixel-ratio: 2)      and (min-width: 1300px),
only screen and (   min--moz-device-pixel-ratio: 2)      and (min-width: 1300px),
only screen and (     -o-min-device-pixel-ratio: 2/1)    and (min-width: 1300px),
only screen and (        min-device-pixel-ratio: 2)      and (min-width: 1300px),
only screen and (                min-resolution: 192dpi) and (min-width: 1300px),
only screen and (                min-resolution: 2dppx)  and (min-width: 1300px) { 

  /* Large screen, retina, stuff to override above media query */

}

当实没怎么搞懂上面的代码,今天可算是有明白了。更多的media queries可以点击CSS3 Media Queries模板

CSS Media Queries的优点

  1. 只有对应的目标元素才会下载图片资源
  2. 跨浏览器兼容
  3. 像素可以精确控制

CSS Media Queries的缺点

  1. 单调无味的实现过程,特别是大型项目中
  2. 只能通过HTML元素的背景图片来实现,无任何语义化可言

2、使用JavaScript

使用js对“window.devicePixelRatio”进行判断,然后根据对应的值给Retina屏幕选择图像。

$(document).ready(function(){
  if (window.devicePixelRatio > 1) {
    var lowresImages = $('img');

    images.each(function(i) {
      var lowres = $(this).attr('src');
      var highres = lowres.replace(".", "@2x.");
      $(this).attr('src', highres);
    });
  }
});

其中Retina.js是为Retina而生的,基本上实现了上面的所有功能。

前面也说过了,devicePixelRatio目前支持的浏览器并不多,但将来会有更多的浏览器支持这一技术。

Javascript查询的优点

  1. 易于实施
  2. 非Retina屏幕不用下载过大的资源
  3. 像素精确控制

Javascript查询的缺点

  1. Retina屏幕下必须下载标准备和高精密度的两个资源
  2. Retina屏幕下图像交互可见
  3. 浏览器兼容性不强

可缩放矢量图形

不管使用什么方法,光栅衅像仍然有自己固定的位图分辨率,也就是其缩放始终受限于其像素,也绝对无法无限制的伸缩。但是矢量图就不一样,他可以随意的进行伸缩,而无任何影响。这就是在Retina屏幕下的Web图形,矢量图形具有无法可比的优势。

到目前为止,基于XML的svg格式制作的矢量图得到了70&以上的浏览器支持,可以使用svg绘制各种图形,并且可以在Retina下任意的伸缩。

做为web设计人员,使用SVG最简单的方法是通过HTML的img标签、CSS的background属性或者伪元素的content中的url()。

HTML的img标签调用svg

<img src="example.svg" width="200" height="300" />

在这里一个svg图像可以做为普通显屏和Retina显屏的通用图像,可以做任何的伸缩,而不会像光栅位图一样失真,而且资源统一,节省带宽,方便维护。

CSS中调用svg图像

svg图像可以像普通图像一样,当作元素的背景图片来应用

.image {
  background-image: url(example.svg);
  background-size: 200px 300px;
  height: 200px;
  width: 300px;
}

除了当成元素的背景图片使用之外,还可以通过伪元素的“content”来调用

.image-container:before {
  content: url(example.svg);
}

如果你想在IE7-8和Android2.x上运用,那么使用使用png图片来代替svg图像

.image {
  background-image: url(example.png);
  background-size: 200px 300px;
}

.svg {
  .image {
    background-image: url(example.svg);
  }
}

在HTML标签中,给img标签自定义一个属性,给这个自定义属性设置一个png图片,以做备用,不过这种方法需要一定的脚本配合使用。

<img src="example.svg" data-png-fallback="example.png" />

需要的脚本

$(document).ready(function(){
  if(!Modernizr.svg) {
    var images = $('img[data-png-fallback]');
    images.each(function(i) {
      $(this).attr('src', $(this).data('png-fallback'));
    });
  }
});

SVG矢量图的优点

  1. 一个资源适合所有设备
  2. 易于维护
  3. 面向未来的:可伸缩向量图形

SVG矢量图的缺点

  1. 没有像素那样有精度
  2. 由于文件大小,不适合复杂的图形
  3. 不支持IE7-8和早期的安卓版本

零零散散的了解了Retina是个什么东东?那么有些同学肯会问,做为前端人员,如何做,网站才能适应Retina时代的产品呢?

mir.aculo.us的信息图会告诉你如何让网站适应Retina分辨率

Retina web

此图由南宮瑞揚根据mir.aculo.us的信息图所译。有关于更详细的介绍请点击这里

总结

Retina对于我来说也是一个新课题,边看边做笔记,但还是没有完全理解清楚。还需努力。花了几个晚上根据的《Towards A Retina Web》、张旭鑫的《视网膜New iPad与普通分辨率iPad页面的兼容处理》以及南宮瑞揚的《retina视网膜时代的页面》做了这篇笔记。希望对初次接触的朋友有所帮助。如果有说错的地方,还请同行朋友指正。谢谢。

如需转载,烦请注明出处:http://www.w3cplus.com/css/towards-retina-web.html

移动Web——CSS为Retian屏幕替换图片

$
0
0

特别声明:此篇文章根据的英文文章《The Mobile Web: CSS Image Replacement for Retina Display Devices》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://www.noupe.com/design/the-mobile-web-css-image-replacement-for-retina-display-devices.html以及作者相关信息

作者:

译者:大漠

有很多设备的“devicePixelRatio”都大于1.5或者等于2(window.devicePixelRatio = 物理像素/dips)。我的三星项目就是个最新的iPhone和iPad版本设置了“devicePixeRatio”等于“2”。Retian似乎是屏幕显示的一种趋势,这也是Web设计师面对的一个新挑战。

移动Web上CSS为Retian屏幕替换图片

移动应用程序的设计师们已经学会了如何为Retina屏幕设备显示更好质量的图片,用来提高用户的体验。他们为普通显屏和Retina屏幕提供两套图片,以及为Android设备创建了四套不同尺寸大小的图片。

iPhone5和New iPad已经开始采用了Retina屏幕显示技术。在本文中,你将看到如何使用CSS3技巧在Web应用中为Retina屏幕替换更高质量的图片。

代码背后的故事

这一切都始于为iPhone创建一个jQuery Mobile的应用程序。当时的想法是想使用一个完整的“HTML5 jQuery Mobile”应用程序,并使用“Phonegap”将其嵌入到“Native Shell”中。

对于这个应用程序,我在在底部创建了一个标签栏,在顶部放置了一个logo,以及模仿了一个ios的标签栏。"header"和“footer”部分都采用了图片替换文本的技术,在顶部显示了logo图标,在底部显示了对应的工具标签icon。

故事就这样发生了,当我在iPhone 4s的设备上进行测试时,我看见顶部的logo和底部的icon图标都被放大,并且看起来模糊,视觉效果非常的差。

DEMO

移动Web上CSS为Retian屏幕替换图片

为了更好说明问题,我在本机上创建了一个类似于iOS的应用程序,这样你就能搞清楚是怎么一回事。不管你有没有Retina设备,如果你要测试都可以用你的手机点击,同进你也可以点击下载源码。(如果你想模仿做一个简单的手机移动页面,这也是一个例子哟)。

正如我所说的,如果你在一个非视网膜装置上加载页面,看起来是一个不错的效果,但是你在一个Retina装置上加载页面,那么页面上的图片将会栅格化,看起来比较模糊。

由于像素比例(devicePixeRatio)是2,这个时候图片也将放大两倍,此时就造成了图片在设置中显示时被拉伸,呈现出来的时候就模糊不清。下面从iPad3中,iPhone4和”三星“设备中截取的一些被栅格化的图像截图。

三星(Galaxy Nexus)下的效果

移动Web上CSS为Retian屏幕替换图片

iPhone4下的效果

移动Web上CSS为Retian屏幕替换图片

iPad 3下的效果

移动Web上CSS为Retian屏幕替换图片

图片替换的技术

在这个案例中,为Retina替换图片,采用不同的技巧将会有不同的效果。

我们需要替换的第一张图片是顶部的logo。在此处确保只设置高度不设置宽度。

HTML 结构

<div class="ui-header">
  <h1> My logo </h1>
</div>

CSS代码

.ui-header h1{
  color:#fff;
  display: block;
  outline: 0 none !important;
  overflow: hidden;
  margin:0;
  text-align: center;
  text-overflow: ellipsis;
  white-space: nowrap;
  text-indent:-9999px;
  background:url(img/logo.png) no-repeat center center;
  height:33px;
}

请注意,在这里只设置高度不要设置宽度

第二个就是给删除按钮添加图片。我们保留了文本,只是使用“:before”伪类为按钮添加一个“icon”。

HTML 结构

<p><a href="#"> Delete item </a></p>

CSS代码

.delete:before{
  content: "";
  display:block;
  width:20px;
  height:20px;
  position:absolute;
  left:6px;
  background:url(img/delete.png) no-repeat;
}

此处,给元素同时设置了宽度和高度,但是没有设置内距。

接下来是给下载按钮添加图标。

HTML结构

<p><a href="#"> Download </a></p>

CSS 代码

.download {
  background:rgb(222, 227, 232) url(img/nuage.png) no-repeat 8px 6px;
  border:1px solid rgb(199, 206, 212);
  padding: 25px 0 25px 120px;
  font-size:20px;
  color:rgb(144, 160, 176);
  text-shadow: 0 1px 1px rgb(239, 242, 245);
}

这是调用图片的第三种方法,在这种方法里只设置了内距,并没有设置任何宽度和高度。

不过制作footer上的icon,我们还是设置了高度和宽度,而且还有内距。

HTML结构

<a class="bubble button" href="#"> bubble </a>

CSS代码

.ui-footer .button{
  background-color:rgba(187, 185, 185, 0.2);
  border:1px solid rgb(22, 22, 22);
  box-shadow: 0px 1px 2px rgba(22, 22, 22, 0.5) inset ;
  text-indent:-9999px;
  padding:10px 15px;
  width:40px;
  height:40px;
  background-position: center center;
  background-repeat:no-repeat;
  margin: 0 5px;
}
.bubble{
  background-image:url(img/bubble.png);
}

在非视网膜下,我们还有别的不同方案来制作图片替换的效果。

像素(Pixel-Ratio)查询解决方案

接下来是想办法让这些设置加载质量更好的图片。我想起了“device-pixel-ratio”媒体查询像素比。我从来没有使用过,但是我决定试一试,使用这个属性,你需要加上一些浏览器厂商的前缀。

这个想法非常简单,我决定为Retina屏幕设备加载一张两倍大的图片,当我为IOS应用程序时,我选择了@2x的方式为Retina设备加载了高质量的图片。我最终是这样操作的。

@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min--moz-device-pixel-ratio: 2),
only screen and (-o-min-device-pixel-ratio: 2/1),
only screen and (min-device-pixel-ratio: 2) {
  #myelement{
    background:url(myicon@2x.png) no-repeat;
  }
}

你肯定会认为这样做就好了,是的,Retina设备加载了高质量的图片,但是问题是这张图片像素是普通设备加载的图片两倍大小。这样一来仍然没有解决问题。下图是三星设备上显示效果,图片不在模糊了,但还不是完美的方案。

移动Web上CSS为Retian屏幕替换图片

借用background-size属性完成

现在我们加载了适合Retina设备的图片,但是我们需要解决图片显示的尺寸问题,让图片尺寸在Web中显示正确。为了实现这个效果,我们需要借用强大的background-size属性,根据需要调整背景图片的尺寸。你只需要使用“百分值”或“auto”值设置宽度。

在代码中是很简单就能实现,(注:在这里使用ID为“#retina”为这个案例设置了background-size,当然你可以根据你自己的需要进行编写代码)。

你不记得吗?我们在为头部的logo写样式时,就没有设置宽度,只设置了高度,这就是一个技巧,我们此时只需要给元素的background-size设置背景图片的高度和元素的高度一样,而其中宽度保留auto。

#retina .ui-header h1{
  background:url(img/logo@2x.png) no-repeat center center;
  background-size: auto 33px ;
}
  

对于删除按钮,就更容易了,我们给元素同时设置了宽度和高度,而没有设置任何内距,我们只需要给background-size设置两个值为100%;这样做的意思就是让图片百分之百的填充元素。

#retina .delete:before{
  background:url(img/delete@2x.png) no-repeat;
  background-size: 100%  100% ;
}
  

对于下载按钮的图片就显得有点麻烦了,没有给元素设置任何宽度和高度,这个时候只能按照非视网膜下的图片尺寸来设置background-size的值。

#retina .download {
  background:rgb(222, 227, 232) url(img/nuage@2x.png) no-repeat 8px 6px;
  background-size: 70px 68px ;
}
  

对于页脚的icon,虽然我们设置了元素的宽度和高度,但是我们还有一个内呀,这样一来我们不得不给background-size设置一个明确的值:

#retina .bubble{
  background-image:url(img/bubble@2x.png);
}
#retina .loupe{
  background-image:url(img/loupe@2x.png);
}
#retina .folder{
  background-image:url(img/folder@2x.png);
}
#retina .ui-footer .button{
  background-size: 40px auto ;
}

现在看起来就完美了

移动Web上CSS为Retian屏幕替换图片

HTML中的图片标签img怎么办?

上面介绍的只是样式中处理图片的方法,但是我们在HTML结构中也会有使用图片的。因为,你需要了解一些图片响应式的技巧。不过使用retina.js 也是一种很简单的方法,只需要在同一个文件目录下加载一张“@2x”的图片,然后同过js脚本来实现。除此之外还有一个Retina Images插件可以实现,不过这个插件需要一些其他设置。

限制与结论

通过上面的案例你也看到了,每个案例都使用了不同的方法,如果你想做得比较好,你就需要熟悉background-size属性的使用。当然你也可以hack来实现,为非视膜和视网膜设置加载不同的图片。我也不是专家,我也不清楚为不同的设备加载不同的图片有何影响。如果你有兴趣可以测试一下。

background-size是css3的一个属性,这样就受到浏览器的限制。就算不使用background-size属性,而是使用两张不同的图片,这样缺点也不少,不易于维护,而且还要有足够的空间来加载这些图片。所以你要考虑清楚使用哪种技术,就算你加载了两倍大的图片来进行缩放,你也要考虑一下性能的问题。

总之,这是解决Retina屏幕下图片清晰流畅的好办法,但具体在项目中是否使用,应该不应该使用,还需要取决于你的项目需求。所以说,这种技巧并不适合于每个人。

进一步探索

如果你想不加载两个文件,让你的图标又好看,感兴趣的话,你可以看看制作的ICON或SVG制作的图片。你可以看看这篇文章,只可惜的是这里面介绍的技术还没有得到广泛的支持。

译者手语:初次翻译前端技术博文,整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

如需转载烦请注明出处:

英文原文:http://www.noupe.com/design/the-mobile-web-css-image-replacement-for-retina-display-devices.html

中文译文:http://www.w3cplus.com/css/the-mobile-web-css-image-replacement-for-retina-display-devices.html

Web设计师如何制作Retina图像

$
0
0

特别声明:此篇文章根据Chris Spooner的英文文章《How to Create Retina Graphics for your Web Designs》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://line25.com/tutorials/how-to-create-retina-graphics-for-your-web-designs以及作者相关信息

作者:Chris Spooner

译者:大漠

苹果公司发布了更多的产品适应Retina屏幕。到目前为止,我们知道苹果设备中支持Retina屏幕技术的有“iPhone”、“iPod”、“iPad”和“Macbook Pro”,这些设备能为用户呈现更细腻、平滑和高质量的图片效果,提高了用户的视觉体验。做为一名Web设计师如何为你的网站创建这些适合Retina显屏设备的图片呢?这就是我们今天要学的一个东东。

为什么要支持Retina显示

Web设计师如何制作Retina图像

最初我并期望采用较大的图片来满足Retina屏幕显示采用巨大的图像,因为他毕竟是一个全新的技术。但后来我花了点时间做了一个统计,才意识到苹果的设置占据了很多移动端的份额,这些设备大多数是“iPhone”、“iPod”和"iPad",而且这些设备都支持Retina屏幕技术。大部分使用13、15寸Retina显示屏的用户都通过”Chrome“、”Firefox“、”Safari“和”IE“上网,如果你需要支持”Opera“浏览器,那是你在迎合一些小众用户。(我自己的网站统计数据,就是这样的一个情况)

如何创建Retina图像

Web设计师如何制作Retina图像

你可能为认为,Retina图像只需要使用高分辨率(PPI)来保存就可以,但事实并不是如此。所有你需要做的是为Retina显屏保存放大两倍的中图片,比如说你保存一张200x200像素(css像素)的图生,你需要将图片保存成400x400像素。这些超大型的图像显示成原始图像的大小尺寸,有助于在Retina屏幕上创建光滑和清爽的外观效果。

听起来很简单,那你要怎么获取双倍大小的图像呢?

使用Illustrator设计Logo和Icon图标

Web设计师如何制作Retina图像

矢量图是创建Retina图像的完美解决方案。如果你有一个Logo或ICON是EPS或者Ai文件,在导出或者复制图片到Photoshop时,矢量图它能够扩展到任何尺寸大小。粘贴的元素可以作为一个智能对象,经将保留其矢量路径,因此他可以翻一番,导了出来,作为适合Retina的一个特殊图像。

使用Photoshop的矢量特性

Web设计师如何制作Retina图像

Photoshop是一个像素图形的应用软件,但这并不意味着他不具有制作矢量图形的特性。每一个图形工具都可以创建一个矢量层,而不仅仅是像素层,这样一来所有图层样式效果依然可以伸缩的。如果你把元素都乘以2,所有的效果几乎都能精确的放大两倍大小。

扩大你的像素图像

Web设计师如何制作Retina图像

其中有一条规则,作为设计师的我们不想轻意的去扩大一个图像,但是如果想回去给已经你设计的网站添加Retina屏幕显示的图像,而且你也不想手动的去重新创建每个图像。通常扩展一个图像会层致一个模糊和锯齿点状,但是有一个小选项在Photoshop的图像有一个菜单选择"Neares Neighbor",这样就可以勉强帮你避免模糊的外观和大量的锯齿,这样图像就可以用了。在元素还没有加载完时,他不会加载进来,但是他提供了一个晳时的替换

设计在200%,然后是缩小?

Web设计师如何制作Retina图像

你可能会想,我为什么不能创建一个两倍大小的Web布局页面,这样我就可以缩小元素来创建需要的图标。在传统的印刷设计理论中是可行的,但是在Web设计中是不行的。因为Web设计是工作在一个像素的基础上,用来创造完美的形状和线条。就算是我们按一定的比例绽放图片,然后通过Photoshop软件导出来,那么导出来 的图片也是一个外表模糊的,特别是小图标的时候。

如何代码控制Retina图像

一旦你创建了一个标准图片的副本,而且这个副本是标准图片大小的两倍像素,那么你就可以使用不同的方法把他们加载到你的页面中。这里有一个快速对文件命名的方法,把标准图片和Retina屏幕下图片放在一个相同的文件目录下,并且Retina下图片命名的方式是在普通图像的文件名的末尾上加个”@2x“,比如说普通图像文件名是”snarf.jpg“,在Retina下我们就把图像另外命名为”snarf@2x.jpg“。

简单的javascript方法

<script src="js/retina.js"></script>

绝对简单的方法,就是使用retina.js脚本来控制调用Retina图像。简单点说,retina.js会自动检查你图片目录中的”@2x“图像,然后在Retina设备下替换普通的图片。

CSS修改方法

@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) {
  header h1 a {
    background-image: url(images/blogspoon-logo@2x.png);
    background-size: 164px 148px;
  }
}

或者,你可以通过手动修改css文件来控制Retina设备下调用Retina图像。通过媒体查询,如果媒体中条件含有”min-device-pixel-ration:2“,在目标元素上就调用适合Retina设备的图片”@2x“,但是不能忘了结对对应的元素设置”background-size“背景图片的尺寸和常规图片大小一样。

HTML的img标签

<img src="images/snarf@2x.jpg" width="300px" height="150px" />

CSS的方法是通过”media queries“来控制元素的背景图片,但是在HTML中可以使用”img“的图片标签,非常的简单,在"img"标签中加载”@2x“图像,然后通过”img“标签的”width“和”height“属性值来缩放图像,以达到普通图像的尺寸。

译者手语:初次翻译前端技术博文,整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

如需转载烦请注明出处:

英文原文:http://line25.com/tutorials/how-to-create-retina-graphics-for-your-web-designs

中文译文:http://www.w3cplus.com/css/how-to-create-retina-graphics-for-your-web-designs.html

使用css sprites来优化你的网站在Retina屏幕下显示

$
0
0

特别声明:此篇文章根据Maykel的英文文章《Using CSS Sprites to optimize your website for Retina Displays》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://miekd.com/articles/using-css-sprites-to-optimize-your-website-for-retina-displays/以及作者相关信息

作者:Maykel

译者:大漠

CSS sprites(CSS图片精灵)已经存在很久了。事实上,八年前就有CSS Sprites的详细介绍。CSS Sprites为一些大型的网站节约了带宽,让提高了用户的加载速度和用户体验,不需要加载更多的图片。

对于小型网站,CSS Sprites并没有带来很大的变化,或许这样使用并不理想。但在是高分辨率的显示屏幕下,比如说Retina屏幕下,CSS Sprites将会起来越重要。

优化高分辨的屏幕

优化高分辨率下的屏幕下效果,你需要通过“media queries”准备一张大的图片。所以在正常分辨率下加载的是“@1x”图像,在高分辨率下加载的是@2像素下的效果。这就意味着,你的图片数要增加两倍,而且CSS样式中也需要增加两倍。

是的,我们通过javascript可以解决,但是我们没有找到通过代码真正解决的方法。但是通过css sprites技术,我们只需要通过CSS的选择器来覆盖@1x的图片。

接下来的例子中,我们只通地四个选择器来控制不同的图片资源。首先会使用Retina技术,你可以为独立的元素使用不同的代码。然后在非视网膜屏幕下使用200x200px的的CSS Sprites图片。

使用css sprites来优化你的网站在Retina屏幕下显示

span.location {
  background: url(location.png) no-repeat 0 0;
}

span.success {
  background: url(success.png) no-repeat 0 0;
} 

a.delete {
  background: url(delete.png) no-repeat 0 -100px;
} 

.content a.fav-link {
  background: url(favorite.png) no-repeat 0 0;
}

@media only screen and (-webkit-min-device-pixel-ratio: 2), 
only screen and (min-device-pixel-ratio: 2) {
  span.location {
    background-image: url(location@2x.png);
    background-size: 16px 14px;
  }

  span.success {
    background-image: url(success@2x.png);
    background-size: 13px 14px;
  }

  a.delete {
    background: url(delete@2x.png) no-repeat 0 -100px;
  } 

.content a.fav-link {
  background-image: url(favorite@2x.png);
  background-size: 11px 13px;
  }
}
span.location {
  background: url(sprite.png) no-repeat 0 0;
}

span.success {
  background: url(sprite.png) no-repeat -100px 0;
} 

a.delete {
  background: url(sprite.png) no-repeat -100px -100px;
} 

.content a.fav-link {
  background: url(sprite.png) no-repeat 0 -100px;
}

@media only screen and (-webkit-min-device-pixel-ratio: 2), 
only screen and (min-device-pixel-ratio: 2) {
  span.location,
  span.success,
  a.delete,
  .content a.fav-link {
    /* Reference the @2x Sprite */
    background-image: url(sprite@2x.png);
    /* Translate the @2x sprite's dimensions back to 1x */
    background-size: 200px 200px; 
  }
}

注:记住上面的这个例子仅适用于Retina屏幕下的设备,目前仅在IOS的移动设备iPhone4s、iPhone5、iPad、iPod和Mackbook Pro。对于Android系统下,要取决于你的系统,采用不同的“min-device-pixel-ratio”。

总结

  1. 不应该将所有的资源引入一个文件中,应该使用CSS sprite来集成图片。
  2. 创建@2x的sprites图,这个图刚好是普通图的两倍,而且具有双向扩展
  3. 在Retina屏幕下,对应的元素上使用相同的Scripts图片
  4. 使用background-size属性来确保你的@2x Sprites图正确定位

注意,这只是一个简单的例子,里面对三个元素设置了背景图,你可以根据需要在你的站点上使用更多的图片,按这种方式。在Retina屏幕下,使用这种方法,不仅节约了http的请求,还让你的代码简洁易于维护,同时在Retina下也更高效。

译者手语:初次翻译前端技术博文,整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

如需转载烦请注明出处:

英文原文:http://miekd.com/articles/using-css-sprites-to-optimize-your-website-for-retina-displays

中文译文:http://www.w3cplus.com/css/using-css-sprites-to-optimize-your-website-for-retina-displays.html

image-set实现Retina屏幕下图片显示

$
0
0

最近一直在学习Retina屏幕下图片的处理方法,从《走向视网膜(Retina)的Web时代》一文中知道了Retina这个新名词,同时知道了他是什么东东,同时也继续在探讨Retina方面的知识点,随后在《移动Web——CSS为Retian屏幕替换图片》和《使用css sprites来优化你的网站在Retina屏幕下显示》中学习了Retina屏幕下图片的设置方法,或者说技巧吧,接下来《Web设计师如何制作Retina图像》学习了Retina屏幕下的图片制作技巧。其实可以说,这几篇文章可以让我知道如何在Retina屏幕下处理图片的技巧和细节了。因为这几篇文章从概念到制作Retina屏蔽下的图片,以及Coding实现,可以说是一条龙了。这些都是自以为事,为什么呢?除了这些方法,其实还有更先进的方法,这也就是我接下来要说的事情了。

就在昨天,对的,就是昨天晚上,在@前端的那点破事分享《使用css sprites来优化你的网站在Retina屏幕下显示》一文时,@耗子姐姐告诉我qq.com使用了一种新技术,实现Retina屏幕下图像的显示方法,还特别给我截取了一段代码:

.soso .logo .qqlogo {
  display: block;
  width: 134px;
  height: 44px;
  background-image: url(http://mat1.gtimg.com/www/images/qq2012/qqlogo_1x.png);
  background-image: -webkit-image-set(url(http://mat1.gtimg.com/www/images/qq2012/qqlogo_1x.png) 1x,url(http://mat1.gtimg.com/www/images/qq2012/qqlogo_2x.png) 2x);
  background-repeat: no-repeat;
}
  

这段代码让我吃惊了,真心佩服大公司前端开发人员的本事,膜拜呀。奉承的话不多说,我们一起先来看看qq.com使用的方法吧。

打开qq.com页面,在其logo的地方使用Firebug查看其源码(这个大家都懂的):

image-set实现Retina屏幕下图片显示

这个时候在源码中就能看到logo处是这样使用的:

image-set实现Retina屏幕下图片显示

这个时候直接让我膜拜了,我不知道他是什么意思?也不知道这样使用的原理?更是第一次看见,只有膜拜的份,没有别的,不知道你是不是也是这么想的。膜拜是膜拜,我们还是要搞清楚这个image-set是什么?此处我们暂且报搁置一下image-set是什么?我们通过工具先来了解源码中的图片相关信息:

image-set实现Retina屏幕下图片显示

使用同样的方法在浏览器中打开了“qqlogo_1x.png”和“qqlogo_2x.png”两张logo图片:

image-set实现Retina屏幕下图片显示

从面上我们仅知道两张图大小不一样,文件名不一样,别的我们都不知道了,为了了解的更详细,我们通过工具来查看图片相关信息:

image-set实现Retina屏幕下图片显示

这个时候,详细信息尽收眼底:

1、qqlogo_1x.pgn详细信息:

image-set实现Retina屏幕下图片显示

2、qqlogo_2x.pgn详细信息:

image-set实现Retina屏幕下图片显示

啰嗦这么多,只是想说明一点,图片源信息完全不同。新手可以通过这个步骤了解Web开发相关工具的使用,懂的同学可以直接忽略,继续下面的内容。

image-set对我来说,我也很陌生,于是借助G爸度娘海量的搜索image-set,才知道Webkit内核"safari6"和“chrome21”支持CSS4的background-image新规范草案image-set。通过Webkit内核的浏览器私有属性“-webkit”,image-set为Web前端人员提供了一种解决高分辨率图像的显示,用来解决苹果公司提出的Retian屏幕显示图片的技术问题。简而言之:这个属性用来支持Web前端人员解决不同分辨率下图片的显示,特别的(Retina屏幕)

qq.com就是采用了这种方法,对Logo图片进行了处理,在普通分辨率下,将调用“qqlogo_1x.png”图片,而在Retina屏幕下(比如iPhone4s,iPhone5,New iPad等IOS设备)下会调用“qqlogo_2x.png”图像,从而避免了Logo在Retina屏幕下显示不清晰的问题。如果这个还不够帮你不理解,你还可以看看在“Safari6”和“Chrome21”下使用“Webkite”内核浏览器的私有属性写了一个“测试页面”。

HTML 结构

<div id="test"></div>

CSS代码

#test {
  background-image: url(assets/no-image-set.png); 
  background-image: -webkit-image-set(url(assets/test.png) 1x,url(assets/test-hires.png) 2x);
  background-image: -moz-image-set(url(assets/test.png) 1x,url(assets/test-hires.png) 2x);
  background-image: -o-image-set(url(assets/test.png) 1x,url(assets/test-hires.png) 2x);
  background-image: -ms-image-set(url(assets/test.png) 1x,url(assets/test-hires.png) 2x);
  width:200px;
  height:75px;
}

记得在“HTML5中需要一个自适应的图像机制”讨论中,在《HTML5 adaptive images: end of round one》一文中对HTML中的图片自适应做了详细的介绍,以及在《Responsive images: what's the problem, and how do we fix it?》一文中对Responsive设计中的图片使用的讨论。随后这样的讨论也停下来了。如果你不知道我们为什么需要这样的一种机制,你可以阅读一下Matt “Grrr” Wilcox的《Responsive images: what’s the problem, and how do we fix it?》一文。

这个时候我们需要一个像这样的机制,Webkit实现了一个非标准的功能:-webkit-image-set,这个属性,前面说过了,他是CSS4中对background-image属性定义的一种新方法,image-set,接下来我们看看image-set的使用语法:

image-set的语法

selector {
  background-image: url(no-image-set.png);
  background: image-set(url(foo-lowres.png) 1x,url(foo-highres.png) 2x) center;
}

类似于不同的文本,图像也会显示成不同的:

  1. 不支持image-set:在不支持image-set的浏览器下,他会支持background-image图像,也就是说不支持image-set的浏览器下,他们解析background-image中的背景图像;
  2. 支持image-set:如果你的浏览器支持image-sete,而且是普通显屏下,此时浏览器会选择image-set中的@1x背景图像;
  3. Retina屏幕下的image-set:如果你的浏览器支持image-set,而且是在Retina屏幕下,此时浏览器会选择image-set中的@2x背景图像。

上面就是有关于“image-set”的简单介绍。

为什么要使用image-set而不使用Media Queries?

如果你有阅读有关于Retina的文章,你就会知道,在Retina屏幕下实现图像显示的方法有很多种,比如说“img”标签方法、javascript和方法,还有“Media Queries”方法,特别是“Media Queries”方法(如果你不清楚这些方法,可以点击)。既然有这么多种方法要以实现Retina屏幕下的图像显示,那么为什么还要使用“image-set”方法。这个问题问得非常的好。在“Safari 6 and Chrome 21 add image-set to support retina images”中把为什么要使用“image-set”而不使用CSS3的“Media Queries”实现Retina屏幕下图像方法做了两点描述。

不像Media Queries,image-set不需要告诉浏览器使用什么图像,而是直接提供了图像让浏览器选择。在未来,我希望有人在使用Retina设备浏览网页,但网速慢时,告诉设备采用低分辨率的图像。甚至会更好,他能根据网速智能的选择需要的图像。

使用“Media Queries”的问题是,在高分辨率显示器下他没有选择的权利。也就是说,浏览器分辨率等于1或2或者其他的时候,浏览器必须加载指定的图像。

image-set的好处是,在支持image-set的浏览器会在高分辨下匹配需要的图像,而没有其他额外的功能。但我相信,为浏览器提供不同的图像选择,这浏览器在不同的分辨下选择正确的图像。

image-set能让各种不同分辨下的图像都显示在CSS中的同一个地方。而使用media queries显示不同图像时,你可能会隔开很多行代码,难于寻找到对应的图像。

| August 14, 2012

image-set真的好强大,很可惜的是,他仅支持background-image属性,而不能使用在“<img>”标签中。

前面也说过了,目前image-set只能使用webkit浏览器的私有属性“-webkit”在“Safari6”和“Chrome21”下运行。现在在IOS 6得到支持。不过很遗憾的是,目前别的浏览器还是不支持image-set,现在他仅是CSS4的一个草案,希望将来能写到标准中,造福于苦逼的前端人员。

image-set虽然目前是一个全新的属性,没有几个浏览器支持,但这是一种新技术,我们需要用起来,只有用的人多了,将来才有机会写入标准的规范中,正所谓“世上本无路,走的人多了,路就出来了”。但话说回来,这种技术用来解决Retina屏幕下的图像显示,是一种绝佳的方法,如果你开会的项目中有汲及到Retina设备的,不仿大胆的使用起image-set,就像qq.com这大佬一样。

东一榔头西一棒的说完了image-set,如果你不知道他是怎么一回事,其实不要紧,你只要先知道这样使用能帮你解决问题就OK,因为有太多的为什么我们无能力现在解决,但随着时间的累积,我们终有一天能搞明白他的原理。最后希望这篇文章能帮到大家,如果你有更好的方法,记得与我们一起分享。

如需转载,烦请注明出处:http://www.w3cplus.com/css/safari-6-and-chrome-21-add-image-set-to-support-retina-images.html

CSS3 Glowing Text Effect

$
0
0
CSS3 Glowing Text Effect

好像没有写CSS3方面的Demo效果了,今天在邮件中看到一个有关于CSS3写的文字发光和动画的案例,觉得很有意思,也就动手一试了,真心的爽。这个效果中最关键的是使用了十个相同的标签,来模仿了一个3D立体的效果,同时设置一个抖动的效果,这个效果主要由transform的rotate3d来制作,在不同的时间段设置不同的效果,另外通过text-shadow制作了阴影颜色变化的效果。详细的看代码吧。

demodownload

HTML结构

<div class="textWrap">
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
  <h1>W3cplus</h1>
</div>

CSS CODE

body {
  background: #0a0a0a;
  text-align: center;
}
.demo {
  width: 960px;
  margin: 100px auto;
  position: relative;
}
.demo * {
  box-sizing: border-box;
}
.textWrap {
  animation:wobble 5s ease-in-out infinite;
  transform-origin:center center;
  transform-style:preserve-3d;
  width: 500px;
  margin: 0 auto;
}
	
@keyframes wobble {
  0%,100%{ transform:rotate3d(2,3,1,60deg); }
  25%{ transform:rotate3d(-2,3,1,60deg); }
  50%{ transform:rotate3d(-2,-3,1,60deg); }
  75%{ transform:rotate3d(2,-3,1,60deg); }
}

.textWrap h1 {
  display:block;
  width:100%;
  padding:40px;
  line-height:1.5;
  font:900 9em 'Concert One', sans-serif;
  text-transform:uppercase;
  position:absolute;
  color:#f6e6e6;
  animation:glow 10s ease-in-out infinite;
}

@keyframes glow {
  0%,100%{ text-shadow:0 0 35px #e22222; }
  25%{ text-shadow:0 0 35px #10145e; }
  50%{ text-shadow:0 0 35px #a9e56e; }
  75%{ text-shadow:0 0 35px #dd16da; }
}

.textWrap h1:nth-child(2){ transform:translateZ(5px); }
.textWrap h1:nth-child(3){ transform:translateZ(10px);}
.textWrap h1:nth-child(4){ transform:translateZ(15px); }
.textWrap h1:nth-child(5){ transform:translateZ(20px); }
.textWrap h1:nth-child(6){ transform:translateZ(25px); }
.textWrap h1:nth-child(7){ transform:translateZ(30px); }
.textWrap h1:nth-child(8){ transform:translateZ(35px); }
.textWrap h1:nth-child(9){ transform:translateZ(40px); }
.textWrap h1:nth-child(10){ transform:translateZ(45px); }

demodownload

如需转载,烦请注明出处:http://www.w3cplus.com/demo/css3-glowing-text-effect.html

你应该知道的一些事情——CSS权重

$
0
0

本文由99根据的《CSS Specificity: Things You Should Know 》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://coding.smashingmagazine.com/2007/07/27/css-specificity-things-you-should-know,以及作者相关信息

作者:

译者:99

除了浮动之外,css权重问题是你要了解的,最复杂的一个概念之一。css每条规则权重的不同,是你所期望的效果,没有通过css规则在元素上生效的主要原因。为了减少调试bug的时间,你需要了解浏览器是怎样解析你的代码的。为了完成这个目标,你需要对权重是如何工作的,有一个清楚的认识。很多Css出现问题的场景,都是某处定义了一个更高权重的规则,导致此处规则不生效。

Css权重问题并不简单,而且有很多或具体或抽象的理论来解释这个问题。本文也将探讨这个问题,我相信如果你喜欢星球大战的话你肯定会理解这些概念的~

我们将会讨论关于css权重的主要问题,包括例子,规则,原理,通用解决方案以及一些资源。

CSS权重:概述

  1. 权重决定了哪一条规则会被浏览器应用在元素上。
  2. 权重的不同,是你所期望的效果,没有通过css规则在元素上生效的主要原因。
  3. 权重的级别划分时包含了所有的css选择器
  4. 如果两个选择器作用在同一元素上,则权重高者生效。
  5. 权重的级别根据选择器被划分为四个分类:行内样式,id,类与属性,以及元素。
  6. 你可以通过CSS权重之争进一步了解CSS权重。
  7. 你也可以通过CSS Specificity for Poker Players进一步了解CSS权重。
  8. 如果两个选择器权重值相同,则最后定义的规则被计算到权重中(后面定度的CSS规则权重要更大,会取代前面的CSS规则)
  9. 如果两个选择器权重值不同,则权重大的规则被计算到权重中
  10. 如果一条规则包含了更高权重的选择器,那么这个规则权重更高
  11. 最后定义的规则会覆盖所有跟前面冲突的规则
  12. 内联样式表含有比别的规则更高的权重
  13. Id选择器的权重比属性选择器更高
  14. 你可以使用id来增大权重
  15. 类选择器比任意数量的元素选择器都高
  16. 通配符选择器跟继承来的样式,他们的权重以 0,0,0,0来计算
  17. 你可以用css权重计算器来计算权重。

什么是CSS权重?

  1. 权重决定了你css规则怎样被浏览器解析直到生效。“css权重关系到你的css规则是怎样显示的”。参考阅读【Understanding specificity
  2. 当很多的规则被应用到某一个元素上时,权重是一个决定哪种规则生效,或者是优先级的过程。参考阅读【Selector Specificity
  3. 每个选择器都有自己的权重。你的每条css规则,都包含一个权重级别。 这个级别是由不同的选择器加权计算的,通过权重,不同的样式最终会作用到你的网页中 。参考阅读【Understanding specificity
  4. 如果两个选择器同时作用到一个元素上,权重高者生效。

权重等级

每个选择器在权重级别中都有自己泾渭分明的位置。根据选择器种类的不同可以分为四类,也决定了四种不同等级的权重值。

1、行内样式,指的是html文档中定义的style

行内样式包含在你的html中 对你的元素产生直接作用,比如:

<h1 style="color: #fff;">header</h1>

2、ID选择器

Id也是元素的一种标识,比如#div

3、类,属性选择器和伪类选择器

这一类包括各种class,属性选择器,伪类选择器比如 :hover,:focus等等。

4、元素和伪元素

元素跟伪元素选择器,比如:before 与 :after.

这里我要补充的:伪元素选择器只包含以下几种:

  1. ::after
  2. ::before
  3. ::first-letter
  4. ::first-line
  5. ::selecton

详细请参阅【Pseudo-elements

伪元素跟伪类都是选择器的补充,但是,伪类表示的是一种“状态”比如hover,active等等,而伪元素表示文档的某个确定部分的表现,比如::first-line 伪元素只作用于你前面元素选择器确定的一个元素的第一行。

注意,伪元素选择器选择出来的“部分” 不在dom里,也不能对其绑定事件。如果你对伪元素前面的选择器定义的元素绑定了事件,伪元素同样会生效。 永远记得 伪元素生成的是“表现”。

扩展阅读:

  1. 如何给伪元素绑定事件
  2. w3c规范中的伪元素

99

如果您对CSS选择器还不太了解,或者说不太清楚CSS有哪些选择器,个人建议你先阅读以下几篇文章,这样更有助于帮助你阅读本文后面的内容:

  1. 《CSS3基本选择器》
  2. 《CSS3属性选择器》
  3. 《CSS3伪类选择器》
  4. 《CSS选择器优化》

大漠

如果你还分不清楚这些是怎么分类的,你可以看一下文章末尾的一个简短的分类。

怎么确定权重

权重记忆口诀。从0开始,一个行内样式+1000,一个id+100,一个属性选择器/class或者伪类+10,一个元素名,或者伪元素+1.比如

body #content .data img:hover

最终的权重值是0122;#content是一个id选择器加了100,.data是一个class类选择器加了10,:hover伪类选择器加了10, body和img是元素加了1 。详细参阅【CSS Specificity

另一种方法:计算有几个id选择器的数量为a ,计算其他属性跟class选择器的数量为b ,计算元素名跟伪元素名的数量为c ,然后结合起来就是权重。详细参阅【CSS Selector Specificity]

为了帮助我更好的理解权重的概念,我制作了一张西斯人物能量表(大家可以自动类比为各种赛亚人,奥特曼战斗力对照表)每个角色(选择器)都拥有西斯能量(权重值,就跟赛亚人的战斗力一样),这个决定了这个人在黑暗势力里有多牛逼,也决定了css规则在你的样式表里有多牛逼。详细参阅【CSS Specificity Wars – Cheat Sheet

oocss

权重计算测试

利用第一个规则可以很容易计算权重,你可以自己试试看看掌握了没

01. *{}                         ====》0
02. li{}                        ====》1(一个元素)
03. li:first-line{}             ====》2(一个元素,一个伪元素)
04. ul li {}                    ====》2(两个元素)
05. ul ol+li{}                  ====》3(三个元素)
06. h1+ *[rel=up] {}            ====》11(一个属性选择器,一个元素)
07. ul ol li.red{}              ====》13(一个类,一个元素)
08. li.red.level{}              ====》21(两个类,一个元素)
09. style=""                    ====》1000(一个行内样式)
10. p {}                        ====》1(一个元素)
11. div p {}                    ====》2(两个元素)
12. .sith {}                    ====》10(一个类)
13. div p.sith{}                ====》12(一个类,两个元素)
14. #sith{}                     ====》100(一个ID选择器)
15. body #darkside .sith p {}   ====》112(1+100+10+1,一个Id选择器,一个类,两个元素)

权重的基本规则

1、相同的权重:以后面出现的选择器为最后规则:

假如在外部样式表中,同一个CSS规则你写了两次,那么出现在前面的选择器权重低,你的样式会选择后面的样式:

#content h1 {
  padding: 5px;
}

#content h1 {
  padding: 10px;
}

两个选择器的权重都是0,1,0,1,最后那个规则生效。

2、不同的权重,权重值高则生效

选择器可能会包含一个或者多个与权重相关的计算点,若经过计算得到的权重值越大,则认为这个选择器的权重高。详细参阅【Understanding Specificity

CSS权重规则

1、包含更高权重选择器的一条规则拥有更高的权重。详细参阅【Understanding Specificity

2、Id选择器的权重比属性选择器高,比如下面的例子里 样式表中#p123的权重明显比[id=p123]的权重要高。

A:
a#a-02 { background-image : url(n.gif); }

and

B:
a[id="a-02"] { background-image : url(n.png); }

因此A规则比B规则的权重要高。详细参阅【W3C CSS 2.1 Specification

3、带有上下文关系的选择器比单纯的元素选择器权重要高。这条规则同样也适用于含有多个元素的选择器。详细参阅【Cascade Inheritance

4、与元素“挨得近”的规则生效,比如css中我们定义了以下的规则,

#content h1 {
  padding: 5px;
}

但html 中也定义了规则:

<style type="text/css">
  #content h1 {
    padding: 10px;
  }
</style>

Html中定义的规则因为跟元素挨得比较近,所以生效。详细参阅【Understanding Specificity

5、最后定义的这条规则会覆盖上面与之冲突的规则。比如下面的例子:

p { color: red; background: yellow }
p { color: green }

段落会呈现绿色的文字。当然也会出现黄色的背景,因为第一条规则只是被覆盖了color属性。详细参阅【BrainJar.com

6、无论多少个元素组成的选择器,都没有一个class选择器权重高。比如说“.introduction”高于“html body div div h2 p”。详细参阅【CSS Specificity for Poker Players

7、通配符选择器也有权重,权重被认为是 0,0,0,0。比如 *, body * 被继承的css属性也带有权重,权重是0,0,0,0。详细参阅【CSS Specificity Clarified

权重的例子

考虑三个代码片段:

A: h1

B: #content h1

C:
<div id="content">
  <h1 style="color: #fff">Headline</h1>
</div>

A的权重是0,0,0,1 (一个元素),B的权重是0,1,0,1(一个id选择器,一个元素),c的权重是1,0,0,0 ,这是一个行内样式。

因为0001 = 1 < 0101 = 101 < 1000,第三个规则权重最高,因此第三个规则将会生效。若去掉第三个规则,第二个规则将会生效。

权重实战

1、利用LVHA原理来给链接应用样式:如果你想展现不同状态的链接样式,一定要记住link-visited-hover-active的顺序,或者简写为LVHA。详细参阅【Link Specificity

2、永远都不要使用“!important”:“如果你遇到了权重问题,第一个解决方法肯定是去掉“!important”,“!important”会覆盖所有的样式规则,但“!important”根本没有结构与上下文可言,所以很少用到。详细参阅【Understanding SpecificitySelector Specificity

3、利用id增加选择器权重:利用ul#blogroll a.highlight代替a.highlight ,权重由0, 0, 1, 1 变成了0, 1, 1, 2。

4、减少选择器的个数:“在css规则中尽可能的使用较少的选择器”。详细阅读【Understanding Specificity

CSS权重计算工具及资源

1、扑克牌权重计算法

如果你之前没有编程经验,css让你看得比较晕,这个比喻可以帮你把一些概念弄得更清楚。把css规则作为你手中的牌,最好的一套牌决定了你最终的样式。

2、Css权重计算器

计算这个选择器的权重

3、Understanding Specificity Tutorial

在这个教程中,你会关注权重。css权重关系到你的css规则是怎样显示的。你样式表中的每条css规则都带有一个权重,这个权重级别是由不同的选择器加权计算的,通过权重,不同的样式最终会作用到你的网页中。

4、Cascade Inheritance: Specificity

这里会对权重问题进行一番讨论。这些规则不仅仅存在于一张样式表中,也有可能是多张样式表。首先要明白,一个元素可以被多个规则定义样式。

5、CSS 2.1 Selectors Explained

对css2.1选择器的一个全面的阐述。通过详尽的了解css2.1的选择器,可以很大程度上优化你的html,比如减少不必要的class属性,增加大量的div或者span标签等。

6、CSS Specificity Bugs in IE

Ie中权重bug的一个简短概述

7、CSS Structure and Rules

基本的css语法,伪类及伪元素,还有层叠规则。

8、Specificity

他看上去不怎么重要,你也可能一直用不上,但是在大的项目中,你的CSS文件变得越来越大,那么这个时候你的CSS就有可能会产生冲突。

什么是什么?

1、一个选择器给元素定义了一个独特的样式。

p { padding: 10px; }

2、一个类选择器利用类(在页面中可能会有多个)定义选择器

p.section { padding: 10px; }

3、一个id选择器利用页面中唯一一个id标识符定义一个选择器

CSS: #section { padding: 10px; }

(X)HTML: <p id="section">Text</>

4、上下文选择器可以定义一个带有层级关系顺序的规则

p span { font-style: italic; }

上面这一条,所有在p元素中的span元素将会被应用样式"font-style: italic;"。

5、一个属性选择器匹配了一个带有特殊属性或者属性的值的元素

p[title] { font-weight: bold; }

匹配所有带有title属性的元素

6、伪类,是一种特殊的class,用来定义html元素的行为。一般都是用来给一些html元素的特定状态定义特殊效果。当触发这个状态时,效果也会生效。

a:visited { text-decoration: underline; }

7、伪元素,让设计者可以给实际不存在于文档中的内容定义样式。伪元素属于特殊的元素,可以利用伪元素来“凭空”生成内容,列表项的数字等。

p:first-line { font-variant: small-caps; }
a:link:after { content: " (" attr(href) ")"; }

上面罗列的是CSS选择器中的七种,但实际上CSS的选择器是不只这些,特别是CSS3,在CSS2.1的基础上增加了些很有意思的选择器,在不需要类名的情况下都能帮你选择到需要的元素。感兴趣的话可以阅读下列的文章:

  1. 《CSS3基本选择器》
  2. 《CSS3属性选择器》
  3. 《CSS3伪类选择器》
  4. 《CSS选择器优化》

大漠

译者手语:初次翻译前端技术博文,整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

如需转载烦请注明出处:

英文原文:http://coding.smashingmagazine.com/2007/07/27/css-specificity-things-you-should-know

中文译文:http://www.w3cplus.com/css/css-specificity-things-you-should-know.html


CSS架构

$
0
0

特别声明:此篇文章由D姐根据Philip Walton的英文文章原名《CSS Architecture》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://engineering.appfolio.com/2012/11/16/css-architecture/以及作者相关信息

作者:Philip Walton

译者:D姐

对于许多web开发者,认为擅长css就是能把一个视觉设计图用代码完美的复现出来。你不使用table,而且很自信,自己可以使用尽可能少的图片。如果你确实很棒,就会使用最新最伟大的技术例如Media QueriesTtransformTransition。一个好的css开发人员确实是会这些,但是很少在评估一个人的水平时会将css作为完全独立的一面被提及。

有趣的是,我们通常不这样评判其他语言。一个Rails开发者不会因为他写的代码规范就认为他是一个好的开发者。因为这是最基本的。当然它必须是满足规范,除此以外还要考虑其他方面:代码是否有可读性?他是否容易修改或是拓展?他是否跟程序的其他部分解耦合?他是否可以扩展?

当评估代码其他部分时这些问题是自然的,所以css也不应该例外。如今的web应用程序比以往大很多,一个考虑不周的css架构足以阻碍web程序的发展。是时候像评价应用程序其他部分一样的方式评价css。他不是一个事后的产生的想法或不仅仅是设计师的问题。

优秀的CSS全局架构

在css社区,达成最佳实践的一个通用共识是非常难的。从纯粹Hacker News讨论开发者反映css lint判断CSS代码是否标准。很明显,许多人都不清楚,甚至css作者都认为自己的代码是可行还是不可行

所以不是制定我自己设定的最佳实践理由,我认为我们应该首先定义我们的目标。如果我们能达成一致的目标,我们就能识别不好的css代码,不是因为他打破了我们对于什么是好的css代码的设想,而是因为他确实阻碍了css的开发过程。

我认为好的css架构目标不应该有别于所有好的软件开发目标。我想要我的css是可预见的、可重用的、可维护的和可扩展的

CSS的可预见

可预见性的css意味着你的规则行为正如你所想,当你添加或更新一条规则,他不应该影响你网站上不想要受影响的部分。对于一个小型网站很少的修改,并不是很重要。但是对于一个有着几十或几百个页面的大型网站,可预见性的css就是一种必要。

CSS的可复用性

Css规范应该是足够抽象的和耦合的,这样你可以根据现有代码部分很快创建出新的组件,而不需要重新编写你已经处理过的样式和问题。

CSS的可维护性

当你的网站需要添加、更新或重新安排一些新的组件和特性,这样做不应该重构现有的css。给页面添加x组件不应该破坏已经存在的组件Y。

CSS的可扩展性

随着你的网站的规模和复杂程度的增长,它往往需要更多的开发人员来维护。可扩展的css意味着可以轻松的由有一个人或一个大型的技术团队管理你的网站。他也意味着你的网站的css架构容易掌握不需要很陡的学习曲线,仅仅因为你是如今唯一接触css的开发人员,但是并不意味着永远是这种情况。

常见的坏习惯

在我们寻找通往好的css架构的目标道路之前,我认为审视常见的不好习惯可以有助我们更好的实现目标。往往只有通过不断的重复出错,我们才能开始走上正确的道路。

下面的例子都是我曾经写过的具有通用性的代码,虽然实现了效果,但是每一个都曾是一个让人头疼的事情。尽管我有良好的意愿,并承诺这次会与众不同,但是这些模式总是让我陷入麻烦中。

基于父类修改组件

几乎所有的网站都会一个特定的视觉元素看起来跟每个元素完全一样,而且当遇到这种一次性情况,几乎每个新的css开发人员(甚至是有经验的开发人员)按照同样的方式处理它。你找出这个特定的父元素(或是你创建一个),而且你为他们写一个全新的规则处理他。

.widget {
  background: yellow;
  border: 1px solid black;
  color: black;
  width: 50%;
}

#sidebar .widget {
  width: 200px;
}

body.homepage .widget {
  background: white;
}

起初这看起来可能是很优秀的代码,但是让我们仔细看,这些都是为实现目标而写。

首先,这个例子中的小结构没有可预见性。创建了好几个这样的结构的开发者希望他是特定的外观,然而当把他用在侧栏或是主页,他将看起来不同,尽管结构是完全一样。

他的复用性扩展性也不是很好。当把他用在主页或是被要求用在其他页面会发生什么?不得不添加新的规则。

最后,他不是很容易维护,因为一旦这个结构重新设计了,那么他必须修改css中的好几个地方,不符合前面提出的CSS架构的要求,需要一个接一个的来修改。

想象一下,如果这种代码被用在其他语言。你本来用一个类定义,然后在代码的其他部分引入这个类定义,为了其他的用途改变他,这直接违背了软件开发过程中打开/关闭的原则。

Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.

在本文的后面,我们将看看如何不依赖父选择器修改组件。

过于复杂的选择器

有时一篇文章使得在互联网里展现css选择器的力量,并声称你可以给整个网站定义样式而不需要使用任何类名或是id。

尽管技术上是可行的,随着开发css的深入,我越来越远离复杂选择器。选择器越复杂,他跟html的结合越紧密。依赖于html标签和关系选择器虽然使你的html看起来很干净,但是它使你的css很糟糕。

#main-nav ul li ul li div { }
#content article h1:first-child { }
#sidebar > div > h3 + p { }
  

所有以上例子就是逻辑。第一个可能是一个下拉菜单样式,第二个是说文章的主要标题跟其他h1元素看起来不一样,最后一个例子好像是给侧栏部分的第一个段落添加一些额外的间距。

如果这个html永远不会改变,这个理由也许可以作为他的一个优点,但是假设html永远不会改变是多么不现实的事情。过于复杂的选择器可以令人印象深刻,他们可以使html摆脱所有表现的钩子,但是他们却很少能帮助我们实现良好的css结构的目标。

上面的例子并不是所有的都可以复用。因为选择器指向一个非常特别的标签位置,怎么能够让另一个有着不同结构的组件重用那些样式呢?以第一个例子(下拉菜单)作为例子,如果在其他页面需要添加一个看上去类似的下来菜单,但是他里面没有#main-nav的元素,你要做什么?你将不得不重新创建一整套样式。

如果html结构需要改变这些选择器也是不可预测的。想象一下一个开发人员想要把第三个例子中的div改成html5的section标签,那么整个规则就破坏了。

最后,因为这些选择器只有当html保持不变才能工作,所以他们的定义是不可维护的也是不可扩展的。

在大型的应用程序中你不得不做出权衡和妥协。复杂选择器的脆弱性是在维护你的html干净命名中起到很微小的作用。

过于通用的类名

当创建可重用的设计组件时,一种很常见的情况,就是用组件类名的里面包含组件子元素的类名表示范围,例如

<div class="widget">
  <h3 class="title">...</h3>
  <div class="contents">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    In condimentum justo et est dapibus sit amet euismod ligula ornare.
    Vivamus elementum accumsan dignissim.
    <button class="action">Click Me!</button>
  </div>
</div>
.widget {}
.widget .title {}
.widget .contents {}
.widget .action {}

这个想法是.title, .contents, 和 .action类名的子元素定义安全的样式,不用担心会影响其他那些具有相同类名的元素样式。这是真的,但是这并不能防止其他同类名的样式会影响这个组件的样式。

在一个大型项目很可能有个像.title的类名被用到另一个环境中或甚至他本身,如果这种情况发生的话,这个widget’s title会突然看起来跟预期的不一样。

过于通用的类名会导致非常不可预知的css。

定制过多的规则

有时候,你做了一个视觉组件需要他距离你的网站某个部分左边上边分别有20px的偏移:

.widget {
  position: absolute;
  top: 20px;
  left: 20px;
  background-color: red;
  font-size: 1.5em;
  text-transform: uppercase;
}

一段时间后你需要在不同的地方使用这个完全一样的组件,然而以上的css代码不起作用,因为在不同的环境中不能复用。

问题是,你让这个选择器做了太多的事情。你在同一个规则中既定义的外观,又定义了布局和定位。外观是可以复用的,但是布局和定位是不能复用的。因为你把他们都混在一起使用,所以整个规则就都不能复用了。

然而这个起初看起来可能无害,但是他往往导致懂行的css开发人员复制和粘帖。如果一个新团队成员想要做一个看起来类似的组件,如一个.infobox。他们可能通过尝试开始用那个类名。但是因为一个新的infobox以一种不想要的方式定位,而不起作用。那么他们可能会做什么?以我的经验,多数新的开发人员不会破坏复用部分的规则。相反他们只是简单复制需要的代码行,然后把他粘帖到一个新的选择器里,这就造成了不必要的重复代码。

分析原因

上述所有糟糕的实践有一个类似的地方,他们给css添加太多的负担。

这似乎是一个奇怪的问题,毕竟一个样式表,他难道不应该承担大多数(如果不是全部样式)的样式吗?这个不是我们想要的吗?

这个简单问题的回答是yes,但是,像往常一样,事情并不总是那么简单,将内容与表现分离是件好事,但是不能因为仅仅你的css代码跟你的html代码分离,就意味着你的内容与你的表现分离了。换句话说,从你的html中分离出来的所有表现代码,并不能满足这个目标,如果为了工作要求你的css跟html有个密切的联系。

此外,html很少仅仅是内容,他多是用来表示结构的。而且通常这种结构是由没有意义的容器元素组成,不同于容许css隔离某组特定元素。甚至没有表现的类名,这仍然把表现混到html中,但是这是否就是有必要将表现跟内容混合呢?

我相信,介于html和css的目前状况,有必要也是明智的把html和css混合一起作为一个表现层。内容层仍旧可以通过模版和局部模版抽象出来。

解决方案

如果你的html和css准备一起作为一个web应用程序的表现层,那么他们需要一种方式来促进良好css架构的所有原则的形成。

我发现最好的办法,是css包含尽可能少的html结构。Css应该定义如何设置一个视觉元素的外观(为的是跟html有最小化的耦合度)这些元素应该看上去如他定义的一样,而不管他出现在html中的什么地方。如果一个特定的组件需要在不同的情况下看上去不同,那他应该称为不同的东西,这就是html的职责了。

作为一个例子,css可能通过.button类名定义一个按钮组件。如果某个html元素想要看起来像个按钮,他应该使用那个类名。如果在某种情况,这个按钮需要看起来不同(可能大点或全屏),然后css需要定义看上去好像用一个新的类名,html包含这个新类名使用新外观。

Css定义你的组件长什么样,html掌管在页面上用什么元素呈现。知道越少关于html结构的css越好。

在html中明确声明你想要的是什么有很大的意义,他容许其他开发人员在看到标签就清楚的知道这个元素是长什么样。这样的意图是很明显的。没有这种实践是不可能分辨一个元素的外观是否有误,这样就造成了团队之间的混乱。

通常反对在html标签里写多个类名,认为那样做是多余的。一个css规则可能作用于一个组件中的1千个实例。那么仅仅是为了在标签里显示声明,他确实值得把这些类名写1千次吗?

虽然这个问题显然是有效的,但也可能误导人。这意味着要么你在css中用父类选择器,要么你手动在html中写1000次类名,但是很明显还有其他的解决途径。Rails或其他框架的表现层抽象,在保持html中显示效果,同时又避免将同一个类名重复写了一遍又一遍的实践中,有了丰富的经验。

最佳实战

在一次又一次犯上面的错误,并付出了一定代价之后,我总结出了如下的一些建议。尽管不是很全面的,但是我的经验表明坚持这些原则是能帮助你更好的实现好的css架构的目标

有意的

确保你的选择器不给不想要的元素添加样式的最好办法是不给他们机会。类似于#main-nav ul li ul li div这样的选择器,可能当你的标签过段时间修改的时候很容易最终运用到不必要的元素上。另一方面,像.Subnav这样的选择器就绝对不可能意外的运用到一个不必要的元素上。把样式直接加在你想要有样式的元素上的最好的方式,就是保持你的css是可预测的:

/* Grenade */
#main-nav ul li ul { }

/* Sniper Rifle */
.subnav { }

给出上面两个例子,第一个像一个手榴弹,第二个像一个狙击步枪。手榴弹也许今天工作的很好,但是你无法知道一个无辜平民是否移动到爆炸的范围里。

分担你的忧愁

我已经提到过一个组织良好的组件层,能帮助降低在css中的对于html结构的耦合度。此外,你的css组件本身应该是模块化的。组件应该知道如何定义他自己的样式并把工作做好,但是不应该让他们负责他们的布局或是定位,也不应该让他们过多假设如何与周围元素设置间隔。

通常,组件应该定义他们的外观如何,而不定义他们的布局或定位如何。所以当你在一条规则里面同时看到background,color,font,还有position,width,height,margin时,你就要小心咯。

布局和定位应该要么由一个分离的布局类或是一个分离的容器元素处理(记住,为了高效地分离内容和表现,经常必不可少的将内容和他的容器分离)。

空间类名称

我们已经检查了为什么父类选择器不能100%高效的阻止样式的交叉污染。一个更好的办法是给类名本身应用命名空间。如果你r的元素是可视组件的一员,那么他的每一个子元素类都应该用组件的基类名作为他的命名空间

/* High risk of style cross-contamination */
.widget { }
.widget .title { }

/* Low risk of style cross-contamination */
.widget { }
.widget-title { }

你的类名有命名空间,可以保持你的组件独立和模块化。它减少了现有类之间的冲突,降低了特殊性对子元素样式的要求。

扩展组件与修改类

当一个现有组件需要在一定的环境里看起来有点不同,创建一个修改类扩展他:

/* Bad */
.widget { }
#sidebar .widget { }

/* Good */
.widget { }
.widget-sidebar { }

我们已经看到基于其中之一的父元素修改组件的缺点,但是需要重申一点:修改类可以应用到任何地方。基于本地的可以覆盖只用于特殊地方的样式。修改类也可以如你所需复用多次。最后,修改类可以在html里面准确的表达开发人员的意图。另一方面,基于本地对于一个开发人员只通过html是完全不可见的,这样大大提高了被忽略的概率。

把你的CSS组织成逻辑结构

Jonathan Snook在他写的一本很棒的书SMACSS中,提出可以把你的css分为4个不同的类别来组织,他们是基础样式,布局样式,模块样式以及状态样式。基础样式是由重置元素规则和元素默认样式组成。布局样式是定位站内元素以及通用布局就像网格系统。模块样式是可以复用的视觉元素,状态样式就是通过javascript涉及到开启或关闭。

在SMACSS体系中,模块(如同我说的组件)在所有的css规则中占据绝大多数,所以我时常认为有必要把他们进一步分解为抽象的模版。

组件是可以独立的视觉元素。模版从另一方面来说是由块组成的。模版本身不能独立应用而且很少描述外观和感觉。相反,他们可以是单一的,可重复的模式,放在一起形成一个组件。

提供一个具体的例子,一个组件可能是一个模态对话框。这个对话框可能头部是站内通用的渐变背景色。并且周围有阴影,右上角也许有一个关闭按钮,他估计是水平垂直居中定位的。这四个模式中的每一个在全站中可能一次次的使用,所以每次你都不必重新编写他们的模式。因为他们全是模版,可以一起组成一个模态对话框组件。

通常我在html中不使用模板类,除非我有个很好的理由。相反,我在组件定义中使用一个包含模版样式的预处理器。下面我将详细讲解这些以及我这么做的合理性。

只用类名作为样式而且只做样式

任何参与过大型项目的人都会遇到一个问题,就是一个html元素有个完全不知道干什么用的类名。你想要删除他,但是你犹豫了,因为他可能有一些你不知道的用途。这样的情况一次次的发生,久而久之,你的html充满了各种不知任何用途类名,只因为团队成员害怕删除它们。

问题是类名在前端开发中通常赋予了太多的责任。他们用来定义html元素样式,作为javascript的钩子,添加到html中用作功能检测和自动化测试等等。

当一个类名在应用程序中的太多地方使用,这是一个问题。那么把她从html中删除就成了一个非常可怕的事情。

然而,随着建立一个约定,这个问题是可以完全避免的。当你在一个html中看到一个类名,应该立刻明白他是用来什么的。我的建议是给所有不用于定义样式的类名加一个前缀。我使用.js作为javascript的钩子,用.supports作为Modernizr 类名。所有仅仅是定义样式的类名没有前缀。

这使得发现没用的类名并删除它们如同在样式表目录搜索一样容易。你甚至可以用javascript将这个过程自动化,通过检查在html中的类名是不是在document.styleSheets对象里面来判断。如果不在document.styleSheets里面的类名,就可以安全的删除了。

一般来说,分离你的内容与你的表现是一个最佳实践,同样重要的还有将你的表现与功能分离。使用定义样式的类名作为javascript钩子,会把你的css与javascript紧紧绑在一起,在某种程度上,在不破坏功能的前提下,更新一些元素的外观是很难的或是不可能的。

命名有逻辑结构的类名

如今很多人写css用连字符作为词的分隔符。但是仅仅连字符是不足以区分不同种类的类名的。

Nicolas Gallagher最近写的关于这个问题的解决方案。我也采用了(只需要轻微的修改)并取得了很大的成功。为了说明需要有如下命名的约定。

/* A component */
.button-group { }

/* A component modifier (modifying .button) */
.button-primary { }

/* A component sub-object (lives within .button) */
.button-icon { }

/* Is this a component class or a layout class? */
.header { }

从上面的类名,不可能知道他们要应用什么类型的规则。这不仅增加开发过程中困扰,也加大用自动化方式测试css和html的难度。一个结构化命名约定可以让你看到一个类名,就准确的知道跟他有关的其他类名,以及他应该出现在html中的哪些地方。命名和测试变得容易可行,这在以前是不可能的。

/* Templates Rules (using Sass placeholders) */
%template-name
%template-name--modifier-name
%template-name__sub-object
%template-name__sub-object--modifier-name

/* Component Rules */
.component-name
.component-name--modifier-name
.component-name__sub-object
.component-name__sub-object--modifier-name

/* Layout Rules */
.l-layout-method
.grid

/* State Rules */
.is-state-type

/* Non-styled JavaScript Hooks */
.js-action-name

重做第一个例子

/* A component */
.button-group { }

/* A component modifier (modifying .button) */
.button--primary { }

/* A component sub-object (lives within .button) */
.button__icon { }

/* A layout class */
.l-header { }

工具

维护一个有效的并且有序的css架构是很困难的,尤其是在一个大型项目中。这里那里一点不好的规则可以像滚雪球一样变成一个难以控制的混乱局面。一旦你的应用程序中的css进入一个特殊领域和有!important王牌的混战中,他几乎不可能重新开始去恢复。关键是从一开始就避免这些问题。

幸运的是,这里有一些工具可以容易的控制你的网站的css架构。

预处理程序

如今谈到css工具就不可避免的要提及预处理程序。所以本文也不例外。但是在我赞美他们的用处之前,我应该说一些他的注意事项。

预处理程序可以帮你更快但不是更好的书写css。最后演变成纯粹的css和同一个规则的应用。如果一个预处理程序可以让你写css更快,那么也可以让你更快的写出糟糕的css。所以在让预处理程序解决你的问题之前,应该理解一下好的css架构就显得尤为重要。

许多所谓的预处理程序的特性实际上对于css架构是很糟糕的。以下是一些我不惜一切代价避免的特性(尽管这些普遍思想应用于所有的预处理程序语言,这些准则特别是在sass中应用)。

  1. 代码组织上从不嵌套规则。当输出的css是你想要的
  2. 如果你不传参数的话从不使用混入类。没有参数的混入类可以更好的作为模版使用,这样的模版可以扩展
  3. 从不在选择器上使用@extend,他不是一个单独的类。从设计角度他没有意义,而且会加大css编译后的体积
  4. 从不使用@extend为ui组件在组件修改器,因为你丢失了继承链(这一点)

预处理程序中最好的部分是像@extend%placeholder的函数。这两者容许你轻松管理抽象出来的css,而没有增加你的css,或是在html中添加一大串很难管理的基础类名.

因为有时你想在你的html中使用这些类名@extend应该小心使用。例如,当你第一次了解@extend,你可能会在你的所有的修改类里面尝试的使用它,就像这样:

.button {
  /* button styles */
}

/* Bad */
.button--primary {
  @extend .button;
  /* modification styles */
}

这样做的问题是在html中你丢失了继承链。现在用javascript很难选中所有的按钮实例。

作为一般的规则,我从来不扩展ui组件,或是以后我可能想要了解的类型。这是从另一个方面帮助区别模版与组件的方式。模版是一些在你的应用程序逻辑中不需要考虑的目标,所以可以安全的用预处理程序扩展。

下面是他如何使用上面模态例子引用

.modal {
  @extend %dialog;
  @extend %drop-shadow;
  @extend %statically-centered;
  /* other modal styles */
}

.modal__close {
  @extend %dialog__close;
  /* other close button styles */
}

.modal__header {
  @extend %background-gradient;
  /* other modal header styles */
}

CSS Lint

Nicole SullivanNicholas Zakas创建了 CSS Lint作为一个工具,用来帮助开发人员在他们的css中检查不好的实践。他们的网站上这样描述:

Css lint指出你的css代码的问题。他有基础语法检查,也应用一组代码规则,查找问题模式或低效率迹象。规则都是可以插入的,所以你可以容易的书写自己的或是省略你不想要的规则

尽管通用规则可能不适用大多数项目,css lint最好的特性是它可以定制成你想要的。这意味着你可以从他们默认的列表里选择你想要的样式,也可以编写自己的样式。

对于任何一个大型团队像css lint这样的工具是必要的,用以确保基本的一致性和符合约定。就像我前面暗示的一样,一个约定的主要原因是像css lint这样的工具所以可以容易的识别破坏他们的规则。

基于上面我提出的约定,书写特定的反模式规则变得很容易。这里有一些我使用的建议

  1. 在你的选择器里不容许使用id
  2. 在任何由多个部分组成的规则里不要使用类型选择器(如div,span)
  3. 在一个选择器里不要使用多于两个关系选择器
  4. 不容许任何类名以‘js-’开头
  5. 如果经常在布局和定位中使用没有‘l-’前缀的规则出现警告
  6. 如果一个类名定义本身,之后作为其他元素的子元素重新定义出现警告

这些明显只是建议,但是可以促进你思考如何在你的项目中执行标准。

HTML校检

早期我建议可以搜索你的html中类名和所有链接的样式表,如果在html中出现的类名,但是在任何一个样式表里面没有定义,就会出警告。我现在在开发一个叫HTML Inspector的工具(我将很快放源)使得这个过程更容易。

Html Inspector遍历你的html代码(像css lint)容许你写自己的规则,当一些约定规则破坏时候抛出错误和警告。我目前使用以下规则:

  1. 如果相同的id不止一次出现在一个页面上,就会有警告
  2. 不使用任何在任何样式表或是通过的白名单里没有提到的类名(像“js-”前缀的类名)
  3. 没有基类名不应该使用modifer类
  4. 没有祖先元素包含基类子元素类名不应该使用
  5. 普通的旧div或是span元素,没有附加类,不应该用于html

总结

Css并不只是视觉设计。不要仅仅因为你在写css就扔掉编程中的最佳实践。像面向对象,dry概念,开闭原则,关注点分离等等,仍然适用于css。

底线是任何可以组织你的代码的东西,确保你判断你的方法是否有效帮助你开发容易,长期更易维护。

译者手语:初次翻译前端技术博文,整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

如需转载烦请注明出处:

英文原文:http://engineering.appfolio.com/2012/11/16/css-architecture

中文译文:http://www.w3cplus.com/css/css-architecture.html

藤藤每日一练——Pure CSS3 Circle Menu

$
0
0
藤藤每日一练——Pure CSS3 Circle Menu

由于藤藤忙于考试,所以好久没有和大家分享CSS3的案例了,今天藤藤特意整理了一个DEMO与大家分享。这个案例是一个圆形转盘导航,初看效果可能很多人都会认为不可思议,CSS3能做出这样的效果,是的,真的是CSS3做的。在整个效果中有几个关键之处,扇形形是通过clip、border-radius和transfrom来实现,其中使用gradient和box-shadow制作了不同的颜色块。对于icon就不用说了,@font-face来完成的。如果你感兴趣,不仿自己先思考一下。

demodownload

HTML 结构

<ul>
  <li class="deg_1">
   <a href="#" title="" class="pie"></a>
  </li>
  <li class="deg_2">
   <a href="#" title="" class="pie"></a>
  </li>
  <li class="deg_3">
   <a href="#" title="" class="pie"></a>
  </li>
  <li class="deg_4">
   <a href="#" title="" class="pie"></a>
  </li>
  <li class="deg_5">
   <a href="#" title="" class="pie"></a>
  </li>
  <a href="#" title="" class="dot"></a>
</ul>

CSS Code

body {
  background: -*-radial-gradient(#fff 10%,#fefefe 20%,#d7d7d7); 
}
.demo {
  text-align: left;
}
.demo ul {
  position: relative;
  width: 200px;
  height: 200px;
  margin: 40px auto 0;
}  
.pie {
  position: absolute; 
  width: 200px; 
  height: 200px; 
  border-radius: 100px;
  clip: rect(0px,100px,200px,0px);
  transform:rotate(18deg) translateZ(0);
  box-shadow: 0 0 10px 3px rgba(255,255,255,.85) inset;
}
.demo li {
  position: absolute; 
  width: 200px; 
  height: 200px; 
  clip: rect(100px,200px,200px,0px);
}
.deg_1{
  transform:rotate(162deg);
}
.deg_2{
  transform:rotate(234deg);
}
.deg_3{
  transform:rotate(306deg);
}
.deg_4{
  transform:rotate(378deg);
}
.deg_5{
  transform:rotate(450deg);
}
.deg_1 .pie {
  background-image: -*-linear-gradient(top,#f16d4b,#e15f3d);
}
.deg_2 .pie {
  background-image: -*-linear-gradient(top,#a2be5f,#98b454);
}
.deg_3 .pie {
  background-image: -*-linear-gradient(top,#f7b71b,#fec332);
}
.deg_4 .pie {
  background-image: -*-linear-gradient(top,#edeeef,#e7ecef);
}
.deg_5 .pie {
  background-image: -*-linear-gradient(top,#a1d5dd,#77bcc7);
}
.pie:after {
  position: absolute;
  top: 120px;
  left: 45px;
  font-family: 'brankic1979';
  font-style: normal;
  speak: none;
  font-weight: normal;
  -webkit-font-smoothing: antialiased;
  font-size: 36px; 
  color: rgba(0,0,0,.25);
}
.deg_1 .pie:after {
  content:"\e041";
  transform: rotate(180deg);
}
.deg_2 .pie:after {
  content:"\e04b";
  transform: rotate(180deg);
}
.deg_3 .pie:after {
  content:"\e09b";
  transform: rotate(34deg);
}
.deg_4 .pie:after {
  content:"\e098";
  transform: rotate(322deg);
}
.deg_5 .pie:after {
  content:"\e081";
  transform: rotate(250deg);
}
.dot {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 30px;
  height: 30px;
  margin: -15px 0 0 -15px;
  border-radius: 15px 15px 15px 0;
  border: 1px solid #eee;
  box-shadow: 0 0 8px rgba(0,0,0,.37);
  background-image: -*-linear-gradient(top,#fcfcfd,#e1e6e9);
  transform: rotate(28deg);
}
.dot:after {
  position: absolute;
  top: 18px;
  left: 5px;
  color: #fff;
  content: "";
  width: 0;
  height: 10px;
  border-left: 1px solid #adadad;
  box-shadow: 1px 0 0 rgba(255,255,255,.5);
  transform: rotate(45deg);
}
@font-face {
  font-family: 'brankic1979';
  src:url('fonts/brankic1979.eot');
  src:url('fonts/brankic1979.eot?#iefix') format('embedded-opentype'),
    url('fonts/brankic1979.svg#brankic1979') format('svg'),
    url('fonts/brankic1979.woff') format('woff'),
    url('fonts/brankic1979.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
}  

demodownload

如需转载,烦请注明出处:http://www.w3cplus.com/demo/pure-css3-circle-menu.html

iPads和iPones的Media Queries

$
0
0

CSS3 Media Queries是一个强大的媒体查询功能,他的出现使用我们的站点可以随着不同的设备展现出不同的样多风格。紧随着Responsive设计的出现,Media Queries的功能是越来越得到前端人员的亲眯。

我也不另外,跟着这股时尚流行风,从接触到学习,紧接的到应用,对这个属性有了基本上的了解和实战经验。为了大家方便使用Media Queries,W3cplus通过互联网的搜集整理了一份CSS3 Media Queries模板。随着移动端上的应用越来越多,特别是苹果公司的系列产品型号的增加,给前端人员对Media Queries的运用带些许的麻烦。为了解决这个麻烦,在互联网上搜集了相关的资料,专门针对苹果的iPads和iPhones的Media Queries模板,希望这些模板能帮助大家减少在网上查找的时间。

iPad Media Queries

1、iPad Media Queries (所有版本,包括iPad mini)

iPads从第一代到至今,总共有五代,也就是iPad1~iPad5,以及Mini iPad。而且每一代iPad都具有相应的CSS Media Queries。这些代码能让你在的代码在iPads下更完美。

iPad (landscape和portrait)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px)  { 
  /* 样式写在这里 */
}

iPad (landscape)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (orientation : landscape) {
   /* 样式写在这里 */
}

iPad (portrait)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (orientation : portrait) { 
  /* 样式写在这里 */ 
}

2、iPad3和iPad4

iPad3和iPad4具有Retina屏幕技术,如果你想针对Retina屏幕使用@2x的图像,来区别普通屏幕下的显示,那么使用下面的Media Queries会让你很轻松实现。

Retina iPad (portrait 和 landscape)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px)
and (-webkit-min-device-pixel-ratio: 2) { 
  /* 样式写在这里 */
}

Retina iPad (landscape)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (orientation : landscape)
and (-webkit-min-device-pixel-ratio: 2) { 
  /* 样式写在这里 */
}

Retina iPad (portrait)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (orientation : portrait)
and (-webkit-min-device-pixel-ratio: 2) { 
  /* 样式写在这里 */ 
}

3、iPad 1 和 iPad 2 Media Queries

上面的满足了高版本,可能你对细节追求的比较高,想让你的Web在低版本的iPad下也能展示的很完美,那么下面的这几段代码能帮助你。

iPad 1 有 iPad 2 (portrait 和landscape)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (-webkit-min-device-pixel-ratio: 1){ 
  /* 样式写在这里 */
}

iPad 1 有 iPad 2 (landscape)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (orientation : landscape)
and (-webkit-min-device-pixel-ratio: 1)  { 
  /* 样式写在这里 */
}

iPad 1 有 iPad 2 (portrait)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (orientation : portrait) 
and (-webkit-min-device-pixel-ratio: 1) { 
  /* 样式写在这里 */ 
}

iPad mini Media Queries

使用Media Queries还能帮助我们区分iPad和iPad mini,具体的看下面的代码

iPad mini (portrait 和 landscape)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px)
and (-webkit-min-device-pixel-ratio: 1)  { 
  /* 样式写在这里 */
}

iPad mini (landscape)

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (orientation : landscape)
and (-webkit-min-device-pixel-ratio: 1)  { 
  /* 样式写在这里 */
}

iPad mini Resolution

@media only screen 
and (min-device-width : 768px) 
and (max-device-width : 1024px) 
and (orientation : portrait)
and (-webkit-min-device-pixel-ratio: 1)  { 
  /* 样式写在这里 */ 
}

iPad mini (portrait)

Screen Width = 768px (CSS Pixels)
Screen Height = 1024px (CSS Pixels)

Screen Width = 768px (Actual Pixels)
Screen Height = 1024px (Actual Pixels)

Device-pixel-ratio: 1

iPhone Media Queries

1、iPhone 5 Media Queries

iPhone 5 (portrait 和 landscape)

@media only screen 
and (min-device-width : 320px) 
and (max-device-width : 568px) { 
  /* 样式写在这里 */
}

iPhone 5 (landscape)

@media only screen 
and (min-device-width : 320px) 
and (max-device-width : 568px) 
and (orientation : landscape) { 
  /* 样式写在这里 */
}

iPhone 5 (portrait)

@media only screen 
and (min-device-width : 320px) 
and (max-device-width : 568px) 
and (orientation : portrait) { 
  /* 样式写在这里 */
}

2、iPhone 2G, 3G, 4, 4S Media Queries

iPhone 2G-4S (portrait 和 landscape)

@media only screen 
and (min-device-width : 320px) 
and (max-device-width : 480px) { 
  /* 样式写在这里 */
}

iPhone 2G-4S (landscape)

@media only screen 
and (min-device-width : 320px) 
and (max-device-width : 480px) 
and (orientation : landscape) { 
  /* 样式写这里 */
}

iPhone 2G-4S (portrait)

@media only screen 
and (min-device-width : 320px) 
and (max-device-width : 480px) 
and (orientation : portrait) { 
  /* 样式写这里 */ 
}

iPhone 5 Resolution

Screen Width = 320px (CSS Pixels)
Screen Height = 568px (CSS Pixels)

Screen Width = 640px (Actual Pixels)
Screen Height = 1136px (Actual Pixels)

Device-pixel-ratio: 2

iPhone 4/4S Resolution

Screen Width = 320px (CSS Pixels)
Screen Height = 480px (CSS Pixels)

Screen Width = 640px (Actual Pixels)
Screen Height = 960px (Actual Pixels)

Device-pixel-ratio: 2

iPhone 2G/3G/3GS Resolution

Screen Width = 320px (CSS Pixels)
Screen Height = 480px (CSS Pixels)

Screen Width = 320px (Actual Pixels)
Screen Height = 480px (Actual Pixels)

Device-pixel-ratio: 1

上面Media Queries主要是针对于苹果中的iPad和iPhone设备,而且使用的是px为计算单位,大家也可以将上面的px代码转换成em,详细的可以看看使用em单位创建CSS3的Media Queries

特别声明:本文中展示的代码是由@stephentgilbert搜集与整理,详细可以点击CSS Media Queries for iPads & iPhones

如需转载,烦请注明出处:http://www.w3cplus.com/css3/css-media-queries-for-iPads-and-iPhones.html

藤藤每日一练——CSS3制作下拉菜单

$
0
0
藤藤每日一练——CSS3制作下拉菜单

下拉菜单如果不需要兼容IE6的话,完全可以不依赖于任何js脚本实现,今天这个案例也是有关于CSS下拉菜单,但有别于以往的,主要区别是子菜单是固定显示在那,而不是默认隐藏,鼠标悬浮显示的那种,另外还通过CSS3添加了一个滑动块的效果,以前这种滑动块效果也是需要js来实现,今天看到的是没有使用任何脚本代码,感兴趣的不仿一看。

demodownload

HTML CODE

<ul class="nav_block clearfix item1">
  <li><a href="" title="">Home</a></li>
  <li><a href="" title="">About Us</a></li>
  <li>
    <a href="" title="">Services</a>
    <ul class="item_sub">
      <li><a href="" title="" class="active">Design Integration</a></li>
      <li><a href="" title="">Web Templates</a></li>
      <li><a href="" title="">Design creations</a></li>
      <li><a href="" title="">Design Integration</a></li>
      <li><a href="" title="">Web</a></li>
    </ul><!-- / item_sub-->
  </li>
  <li><a href="" title="">Solutions</a></li>
  <li><a href="" title="">Clients</a></li>
  <li><a href="" title="">Portfolio</a></li>
  <li><a href="" title="">Contact Us</a></li>
  <div class="item_selected"><i></i></div>
</ul>

<ul class="nav_block clearfix item2">
  <li><a href="" title="">Home</a></li>
  <li><a href="" title="">About Us</a></li>
  <li><a href="" title="">Services</a></li>
  <li><a href="" title="">Solutions</a></li>
  <li>
    <a href="" title="">Clients</a>
    <ul class="item_sub">
    <li><a href="" title="">Design Integration</a></li>
    <li><a href="" title="">Web Templates</a></li>
    <li><a href="" title=""  class="active">Design creations</a></li>
    <li><a href="" title="">Design Integration</a></li>
    <li><a href="" title="">Web</a></li>
    </ul><!-- /item_sub -->
  </li>
  <li><a href="" title="">Portfolio</a></li>
  <li><a href="" title="">Contact Us</a></li>
  <div class="item_selected"><i></i></div>
</ul>
<ul class="nav_block clearfix item3">
  <li><a href="" title="">Home</a></li>
  <li><a href="" title="">About Us</a></li>
  <li><a href="" title="">Services</a></li>
  <li>
    <a href="" title="">Solutions</a>
    <ul class="item_sub">
    <li><a href="" title="">Design Integration</a></li>
    <li><a href="" title="">Web Templates</a></li>
    <li><a href="" title="">Design creations</a></li>
    <li><a href="" title=""  class="active">Design Integration</a></li>
    <li><a href="" title="">Web</a></li>
    </ul><!-- /item_sub -->
  </li>
  <li><a href="" title="">Clients</a></li>
  <li><a href="" title="">Portfolio</a></li>
  <li><a href="" title="">Contact Us</a></li>
  <div class="item_selected"><i></i></div>
</ul>

CSS Code

.demo {
  width: 700px;
  margin: 40px auto 0;
}
.nav_block {
  position: relative;
  margin-top: 80px;
}
.nav_block:before {
  position: absolute;
  top: 20px;
  left: -20px;
  content: "";
  border: 10px solid #1a1d1e;
  border-color: #1a1d1e #1a1d1e transparent transparent;
}
.nav_block li {
  float: left;
  text-align: center;
  line-height: 40px;
}
.nav_block > li {
  width: 100px;
}
.nav_block li a {
  position: relative;
  z-index: 3;
  display: block;
  color: #fff;
  text-shadow: 0 1px 3px rgba(0,0,0,.5);
}
.nav_block li a:hover {
  text-decoration: none;
}
.nav_block li:nth-child(1):hover ~ .item_selected {
  left: 15px;
}
.nav_block li:nth-child(2):hover ~ .item_selected {
  left: 115px;
}
.nav_block li:nth-child(3):hover ~ .item_selected {
  left: 215px;
}
.nav_block li:nth-child(4):hover ~ .item_selected {
  left: 315px;
}
.nav_block li:nth-child(5):hover ~ .item_selected {
  left: 415px;
}
.nav_block li:nth-child(6):hover ~ .item_selected {
  left: 515px;
}
.nav_block li:nth-child(7):hover ~ .item_selected {
  left: 615px;
}
.item1 {
  position: relative;
  background-image: -*-linear-gradient(top,#e50000,#8c0000);
}
.item2 {
  position: relative;
  background-image: -*-linear-gradient(top,#01e851,#07880e);
}
.item3 {
  position: relative;
  background-image: -*-linear-gradient(top,#474fe7,#212989);
}
.item_selected {
  position: absolute;
  top: -8px;
  left: 215px;
  z-index: 2;
  background-image: -*-linear-gradient(top,#f3b743,#a06211);
  height: 43px;
  width: 70px;
  transition: all .3s ease-out;
}
.item_selected:before,
  .item_selected:after, 
  .item_selected i:before,
  .item_selected i:after {
  position: absolute;
  content: "";
  z-index: -2;
  border: 3px solid #1a1d1e;
  border-color: transparent #1a1d1e #1a1d1e transparent;
}
.item_selected:before {
  top: 0px;
  left: -8px;
  border: 4px solid #f0b441;
  border-color: transparent #f0b441 #f0b441 transparent;
}
.item_selected:after {
  top: 2px;
  left: -6px;
}
.item_selected i:before {
  top: 0px;
  right: -8px;
  border: 4px solid #f0b441;
  border-color: transparent transparent #f0b441 #f0b441;
}
.item_selected i:after {
  top: 2px;
  right: -6px;
  border-color: transparent transparent #1a1d1e #1a1d1e;
}
.item_sub {
  position: absolute;
  left: 0;
  width: 700px;
  background-image: -*-linear-gradient(top,#f8e1e2,rgba(255,255,255,0));
}
.item_sub li {
  border-right: 1px solid #333;
  margin: 10px 5px;
  padding-right: 10px;
  line-height: 15px;
}
.item_sub li:last-child {
  border-right: none;
}
.item_sub li a {
  display: block;
  color: #333;
  text-shadow: none;
  border-bottom: 5px solid rgba(255,255,255,0);
  transition: border .2s linear;
}
.item_sub li a:hover,
  .item_sub li .active {
  text-decoration: none;
  border-bottom: 2px solid #d50000;
}
.item1 .item_sub li a:hover,
  .item1 .item_sub li .active {
  border-color:  #d50000;
}
.item2 .item_sub li a:hover,
  .item2 .item_sub li .active {
  border-color:  #05a321;
}
.item3 .item_sub li a:hover,
  .item3 .item_sub li .active {
  border-color:  #3b43b5;
}

demodownload

如需转载,烦请注明出处:http://www.w3cplus.com/demo/coloful-dropline-menu.html

Retina Images

$
0
0

特别声明:Retina Image是Jeremy Worboys创建,版权归于:

Creative Commons Attribution 3.0 Unported License

,如需转载此文,需在明显位置注明Retina Images官网地址:http://retina-images.complexcompulsions.com以及作者相关信息

 

作者:Jeremy Worboys

译者:大漠

GitHub查看下载Retina Images

关于Retina Images

Retina Images是为不同设备提供不同的的图像,换句话说“Retina Images是为不同分辨率设备查看,提供不同的图像”。

一旦安装在你的网站上(非常简单!)。你只需要为Retina屏幕设备创建高分辨率的图像,其他的Retina Images会帮你实现。你甚至不需要修改任何“<img>”标签(在img中设置他们的宽度和高度)。

Retina Images的工作原理

  1. 当服务器加载你的页面,通过“JavaScript”或者CSS(JavaScript禁用时),给“cookie”设置一个“devicePixlRatio”值。
  2. 当服务器接收到图像的加载请求时,“.htaccess”文件会告诉“retinaimages.php”加载服务器上的图像。
  3. “retinaimages.php”会按以下四个条件进行查询检查:
    • “cookie”中是否存在“devicePixelRatio”。
    • “cookie”中“devicePixelRatio”的值大于1。
    • 高分辨率图像是否存在。
  4. 上面任何一条不符合,将会发送普通分辨率图像。否则将给设备提供高分辨率的图像。

服务器的设置

安装Retina Images非常简单

1、将“retinaimages.php”和“.htaccess”文件安装在你服务器的根目录下(通常是在“public_html”文件目录)。

注意:如果你的项目中存在“.htaccess”文件,千万不要直接覆盖他,你只需要将文件中的内容复制后粘贴到你项目中的“.htaccess”文件中。

2、在每个页面的“<head>”区域中,在所有CSS文件前放置下面的JavaScript代码:

<script>
  (function(w){
    var dpr=((w.devicePixelRatio===undefined)?1:w.devicePixelRatio);
		if(!!w.navigator.standalone){
		  var r=new XMLHttpRequest();r.open('GET','/retinaimages.php?devicePixelRatio='+dpr,false);r.send()
		}else{
		  document.cookie='devicePixelRatio='+dpr+'; path=/'
		}
	})(window)
</script>

3、在“<body>”标签内插入下面的CSS:

<noscript>
  <style id="devicePixelRatio" media="only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2)">
	  #devicePixelRatio{
		  background-image:url("/retinaimages.php?devicePixelRatio=2")
		}
	</style>
</noscript>

注意:上面这段代码一定要放置在“<body>”和“</body>”之间。

4、为高分辨率创建翻倍像素的图像,并以“@2x”关皱键词结尾保存高分辨率的图像。参考实例

HTML图像

HTML图像是最简单的,你只需要设置“<img>”标签,可能工作起来没有任何变化。

你所担心的是,针对高分辨率图像,你必须在“<img>”标签中设置“width”和“height”属性值。

<img src="my-image.png" alt="My awesome image" width="300" height="90">

CSS图像

CSS图像通常需要做一下工作,使用CSS图像,必须配合“background-size”属性才能正常工作。下面是Retina屏幕下通过background-size来控制图像适应的三种简单方法:

CSS背景图像

使用像素“px”固定值,这个值等于非Retina下图像的尺寸大小:

.some-selector {
  background-image: url("my-image.png");
  background-size: 300px 90px;
}

图像替换

如果标准图像大小和容器大小一样,那么你可以通过下面的方法简单的实现:

.some-selector {
  background-image: url("my-image.png");
  background-size: 100% 100%;
}
.some-selector {
  background-image: url("my-image.png");
  background-size: cover;
}

注:有关于background-size的详细介绍,可以点击这里

图像示例

普通显屏下图像(非Retina屏幕下)

Retina Images

settings.png

59px × 59px

Retina显屏下图像

Retina Images

settings@2x.png

118px × 118px

优点

  1. 用户只需下载一张图像;
  2. 支持所有图像格式;
  3. 如果高分辨率图像不能使用,会返回普通图像
  4. 如果“JavaScript”和“CSS”或者“Cookies”禁用,也将返回普通图像

缺点

  1. "<img>"标签心需设置明确的“width”和“height”属性值(属性值大小和普通图像大小一致)
  2. CSS背景图像必须使用“background-size”属性。

插件

Jordy Meow为Wordpress写了一个WP Retina 2x插件

让你的网站在Retina屏幕设备下图像看起清晰细腻。

特别声明:Retina Image由Jeremy Worboys创建,版权Creative Commons Attribution 3.0 Unported License。W3cplus仅根据Retina Images官网所译,为广在中国前端人员服务。如需转载需要在明显位置注官网地址: http://retina-images.complexcompulsions.com

GitHub查看下载Retina Images

如需转载,烦请注明:http://www.w3cplus.com/css/retina-images.html

使用CSS3的background-size优化苹果的Retina屏幕的图像显示

$
0
0

特别声明:此篇文章根据About Josh Byers的英文文章《Optimizing Graphics for Apple’s Retina Display Using the CSS Background Size》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://www.studiopress.com/design/css-background-size-graphics.htm以及作者相关信息

作者:About Josh Byers

译者:大漠

前面我写过如何优化Retina屏幕下的图像

如何优化Retina屏幕下的图像一文中从CSS3的background-size切入,介绍了background-size的属性使用方法,然后转入正题,介绍了Retina屏幕下的图像优化。如果你对background-size属性不太了解,建议你先了解一下。不管是上一篇还是今天要介绍的这篇文章,background-size都是非常重要的一个属性。或者说,Retina屏幕下对图像的显示处理,background-size起着很重要的作用。

大漠

如何优化Retina屏幕下的图像一文中,介绍了一个实例,在这个实例中,说:“你可以通过CSS3 Media Queries为Retina屏幕设备提供一个高分辨率的图像”。

虽然这种方法通过多张图像来显示,增加了工作量,但我相信,为最终用户服务这是最好的选择。因为只有给Retian屏幕设备用户提供一个高质量的图像。

为了做到这一点,我们需要一种新的技术支持,这种新的技术就是CSS3的background-size属性。我没有详细介绍这个属性的来龙去脉,只是通过一些练习简单介绍了一下。

作为奖励,这篇文章我向大家介绍如何使用background-size让高分辨率的图片精灵(sprites)在Retina屏幕下完美显示。

什么是background-size属性?

background-size属性是CSS3新增加一个背景属性,正如他的名称一样,你可以通过这个属性来控制背景图片的尺寸大小。

background-size有几个属性值,可以设置背景图片的尺寸大小:

你可以使用像素(px)值,第一个值设置背景图像的宽度,第二个值设置背景图像的高度,如果你只设置了一个值,那么另个值默认为“auto”值。

div { 
  background: url(logo.png) no-repeat;
  background-size: 150px 150px;
  height: 200px;
  width: 400px;
}

css background-size graphics

你也可以使用百分比值(%),当你使用百分比值时,background的尺寸是相对于容器的宽度计算。如下面的例子所示,我们容器的宽度是“400px”,当我们设置“background-size”的值为“25%”时,背景图像的宽度就变成了“100px”。

div { 
  background: url(logo.png) no-repeat;
  background-size: 25% auto;
  height: 200px;
  width: 400px;
}

css background-size graphics

"cover"值,可以让背景图像等比例放大到填满整个容器。

div { 
  background: url(logo.png) no-repeat;
  background-size: cover;
  height: 200px;
  width: 400px;
}

css background-size graphics

"contain"值可以让你的背景图像缩放到最大宽度和高度,并且让整个背景图像保持在容器内。

div { 
  background: url(logo.png) no-repeat;
  background-size: contain;
  height: 200px;
  width: 400px;
}

css background-size graphics

background-size取值为“contain”理解起来有点歧义,他让背景图像能进行缩放,那是根据容器的大小进来进行缩放的,此时会有两种情形,当背景图像放到最大宽度时,背景图像达到容器宽度,但未达到容器高度时,会以容器的宽度为相对物,其高度不会在继续放大;另一种情形就是当背景图像放大到最大宽度时,背景图像的高度与容器高度相同时,那么会以容器的高度为相对物,其宽度不会在继续放大。

有关于CSS3的background-size属性的详细使用,大家可以点击这里

大漠

Retina屏幕下使用background-size属性

正如我所说的,苹果推出Retina屏幕显示技术,他们不希望让普通显屏下的相同物理尺寸在Retina屏幕下显示更小。在iPhone4屏幕下显示的icon尺寸要和3G S下的相同。

为了完成这种效果,在Retina屏幕下图像的尺寸都会翻倍。这样一来,如果图像的像素不翻倍,那么图像在Retina屏幕设备下就会变得模糊不清。

为了抵消这个现像,我们需要制作图像的像素大小也翻倍,然后通过background-size属性来控制他的大小,让其在Retina屏幕显示达到一致的效果。

例如我想创建一个LOGO,填充在一个“100px x 100px”的容器中,那么我就需要制作并上传一个至少翻两倍的像素的图像。

在我们的实例中,LOGO的实际大小是“500px x 500px”。如果我将logo图像做为背景填充在一个容器中,并且没使用“background-size”来设置背景图像的尺寸大小,此时容器就会对背景图像进行裁剪。

div { 
  background: url(logo.png) no-repeat;
  height: 100px;
  width: 100px;
}

css background-size graphics

很显然,我们可以使用“Media Queries”查询设备的“pixel rotio”是不是“2”,把这张背景图像只使用在Retina屏幕设备下。

我们还将设置“background-size”的值为“100px 100px”。实际上我们在Retina屏幕设备下使用的图像是“500px x 500px”这张,但上通过css让他在浏览器显示出来却是“100px x 100px”。

@media screen and (-webkit-min-device-pixel-ratio: 2), 
screen and (max--moz-device-pixel-ratio: 2) {
  div { 
    background: url(logo.png) no-repeat;
    background-size: 100px 100px;
    height: 100px;
    width: 100px;
  }
}

css background-size graphics

现在,如果你的图形中有小于1px的线,你做缩小尺寸会有一些的问题。这个你需要视具体情况试验一下。

Sprites呢?

我是不是可以创建一张Sprites图,这张图既有普通分辨率图像,又有高分辨率下的图像?

你可以,但你还是要面对,你的用户在一个较慢的带宽下下载一个大图的烦恼。你也要同时面对IE9以下的浏览器不支持background-size的麻烦问题。

你最好还是分别为高分辨率和普通分辨率创建不同的两张Sprites图。这个时候又有不同的声音了,这不是增加工作量吗?但这真的不是,在我的工作流中,我会先创建一张高分辨率的Sprites图像,然后制一份,并把尺寸缩放一半。当图像需要更新时,只需要再一次处理高分辨率下的图像,然后复制,重置一半的尺寸保存。

当我的Sprites图像是300px,如何指定background-size为32px呢?其实不难,只需要一点点数学计算,这是一个很初级的过程。

在我们的实例中,我们使用媒体社交图标.我想让他们都按16px x 16px的大小显示。我们将创建一个适合Retina屏幕设备的Sprites 图像,将图像尺寸翻倍(32px x 32px),并且保存他。为了保证普通显屏设备的图像显示,在这个图像的基础上做了一半的缩小。

css background-size graphics

在最初的CSS样式中,background-position的属性值都不需要进行任何设置,因为他们的默认值都是“0”,如下所示:

#social-icons .facebook {
  background: url(images/social-sprite.png); 
  background-position-x: 0px; 
  background-position-y: 0px;
  height: 16px;
  width: 16px;
}
 
#social-icons .facebook:hover {
  background-position-y: -16px;
}

对于我们的Retina屏幕显示,我们必须声明一个Media Queries,该Media Queries专门针对Retina屏幕设备显示器。我们同时改变背景大小而不是宽度和高度。

因此,最关键的问题是,我们怎么知道background-size属性值要设置为多少?

这里有一个公式

高分辨率图像宽度 / 目标图像宽度 = X

原始Sprites图像宽度 / x = background-size的宽度值

实例说话

我们高分辨率下的图标是32px x 32px;

我们目标图像的宽度是“16px”;

我们Sprites图像的总宽度是“96px”

根据前面的公式 可以得知

32/16 = 2

96/2 = 48

最后的一件事情。我们只计算了背景图像的宽度值,为了确保背景图像缩放比例正常,我们将“height”值设置为“auto”。当然你也可以设置相的的值(设置background-sizer的宽度为auto,高度为具体值),但我发现设置宽度会比较容易。

@media screen and (-webkit-min-device-pixel-ratio: 2), 
screen and (max-moz-device-pixel-ratio: 2) {
  #social-icons .facebook {
    background: url(images/social-sprite2x.png); 
    background-position-x: 0px; 
    background-position-y: 0px;
    background-size: 48px auto;
  }
 
 #social-icons .facebook:hover {
   background: url(images/social-sprite2x.png); 
   background-position-x: 0px; 
   background-position-y: -32px;
 }
}

当然,实现本文演示的效果有多种方法,他们各自有自己有优点和缺点。我个人认为,到目前为止,使用Media Queries和高分辨率的Sprites是最好的选择。

最后希望这篇教程对您有所帮助。如果您有更好好的方法希望能与我们一起分享。

译者手语:初次翻译前端技术博文,整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

如需转载烦请注明出处:

英文原文:http://www.studiopress.com/design/css-background-size-graphics.htm

中文译文:http://www.w3cplus.com/css/css-background-size-graphics.html

20个免费下载PSD设计网站

$
0
0
20个免费下载PSD设计网站

优秀的设计让人爽心悦目,这也是每个前端设计人员追求的,因为每一位都想让自己的作品尽量的完美,但往往有时候是心有余而力不足。有足够的想像力,但没有实际的动手能力,有足够的构思,但无法展现出来。苦逼的挣扎之中.......

不过古人教导我们“树挪死,人挪活”,虽然自己不具备这样的能力,但寻找相同的资源总是会的吧,这样就有了《16+国外优秀的UI设计资源库》,虽然标题是16,但实际里面已经搜集了20多个国外优秀的UI设计库网站,大家可以在上面浏览或下载自己需要的资源,当然这些设计还能给大家带来自己的灵感,扩大自己的视野。

作为一个Web前端从业人员,我想和你分享一些不同的东西。今天为大家转译了整理的《25 Great Websites to Download Free PSD Files》。这里为大家搜集了国外20个免费下载PSD文件的大网站(文中内容和标题有所出入(^_^))。您可以从这些网站上下载psd文件,让他们做为你使用。我希望这些资源能真正的帮上大家,同时更希望大家有类似的相关资源可以在下面的评论中跟贴,这样让更多的同学分享您的资源。

1、Download PSD

best_websites_to_download_free_psd_files_downloadpsd

展示的是Web网站的设计,可以在上面下载各种Web网站设计图的PSD文件。而且这些设计都具有创造性。

2、FreePSD

best_websites_to_download_free_psd_files_freepsd

FreePSD是另一个大型免费下载PSD设计图的资源网站,在这个网站上能找到你想要的资源。

3、Tutorial9

best_websites_to_download_free_psd_files_tutorial9

一个优秀的设计类教程博客网站,里面具有初级、中级和高级的各种教程,而且他们还分享了各种设计文件,这些文件都可以直接下载。

4、deviantART

best_websites_to_download_free_psd_files_deviantart

deviantART绝对最大的PSD文件收集网站。所有的文件都是由DA社区成员提供。

5、GraphicsFuel

best_websites_to_download_free_psd_files_graphicsfuel

设计博客,分享了许多独特的和不寻常的但是很有用的PSD文件。

6、365psd

best_websites_to_download_free_psd_files_365psd

365psd.com是一个最好的免费PSD文件分享网站。他们每天分享一个高质量的PSD文件。

7、Free PSD Files

best_websites_to_download_free_psd_files_freepsdfiles

另一个专业提供PSD文件分享的网站。真的值得一看。

8、Design Instruct

best_websites_to_download_free_psd_files_designinstruct

Design Instruct主要是分享有创意的教程,但他们让你下载所有的教程,这意味着你可以文件下载本教程所示的最终效果。

9、psdGraphics

best_websites_to_download_free_psd_files_psdgraphics

psdGraphics分享了非常好的PSD文件、模板,甚至教程。具有很多非常干净和优雅的网站设计,可以帮助你找到一切所需的。

10、Official PSDs

best_websites_to_download_free_psd_files_official_psds

很多PSD文件可供免费下载。不过你必须注册才能下载他们的文件。

11、Photoshop Files

best_websites_to_download_free_psd_files_photoshopfiles

Photoshop Files是一个PSD文件分享社区,在那里您可以下载文件或上传你自己的分享。

12、Abduzeedo

best_websites_to_download_free_psd_files_abduzeedo

大多数人知道Abduzeedo提供了很多有关于设计类的文章,但他们同时也提供高质量的,可供下载的免费PSD文件。

13、DeviseFunction

best_websites_to_download_free_psd_files_devisefunction

专业的Web设计师博客,在教程中分享他的知识。您可以下载免费教程。

14、PSDhome

best_websites_to_download_free_psd_files_psdhome

PSDhome收集自世界各地设计师提供的psd文件的一个网站。PSDhome提供日常使用的psd文件,如如说按钮、图标、文字效果、主题、图形等等。

15、FreebiesPress

best_websites_to_download_free_psd_files_freebiespress

简约风格设计的博客。可以从这个站上下载字体、图标、等PSD文件。

16、PSD Collector

best_websites_to_download_free_psd_files_psdcollector

很多有用的资源和自由设计师提供的PSD文件下载。

17、FreePSDTheme

best_websites_to_download_free_psd_files_freepsdtheme

Dany Duchaine提供的Web网站主题设计的PSD文件。

18、web3mantra

best_websites_to_download_free_psd_files_web3mantra

非常不错的PSD文件集中地,由web3mantra团队搜集提供。

19、Net-Kit.com

best_websites_to_download_free_psd_files_net

Net-Kit.com提供了免费的PSD文件,主要是web相关的设计。

20、Aaron Ovadia

best_websites_to_download_free_psd_files_aaronovadia

所有PSD文件是免费的,可用于个人项目或商业项目。由Aaron Ovadia大师提供。

上面是搜集的资源,希望这些资源对大家今后的工作有所帮助。如果您有更好的资源可以在下面的评论中跟贴,与大家分享。

特别声明:以上资源由搜集提供,如需转载此文,需注明原文地址:http://www.tutsgeek.com/25-great-websites-to-download-free-psd-files

如需转载此文,烦请注明出处:http://www.w3cplus.com/source/20-great-websites-to-download-free-psd-files.html


我们的js世界

$
0
0

从事前端这个职位已经有近两年的时间了,在这段时间里从写第一行js代码,到现在可以说是比较熟练的运用js,从那些乐于分享的人的文章中受益匪浅。今天终于可以分享一点自己的心得,希望能对正在学习js的人能有所帮助。本文主要是面向那些初学者,文中仅为自己的思考,主要论述浏览器环境中的js,所有情况也都是基于浏览器进行的分析。大神们可跳过,若有兴趣也欢迎拍砖,以便更正文中可能的错误。

Js是一种脚本语言,一般工作环境是浏览器(当然也有其他情况,如nodejs,不过咱们这里只谈应用于浏览器中的js)。

我们可以把使用js的结果即一段或很多js代码看做是一个程序。程序的本质可以看做是对数据的处理。在计算机的世界里可以把一切都看做是数据,数据流入程序,经过程序的处理然后流出程序。对js来说就是数据流入程序然后经过处理流出传给浏览器。

数据即信息的载体。对js来说就是用户与浏览器进行的各种交互,如输入一段内容,进行一次点击等等,所有这些行为都被浏览器转化为数据。而我们写的js就是规范哪些数据要流入,要做什么处理。让我们充分的发挥想象,把他想象成一个世界。因为在你写出来之前他们是不存在的,是你创造了他,就像上帝创造世界一样。那么这个世界是一个什么样的世界呢。首先他肯定不是我们生活的现实世界,当然如果你要是曾经看过黑客帝国并对他有更多的思考的话,请稍候联想。这个世界首先并不是完全的虚无,而且我们也不需要创造的像现实世界这么丰富多彩,所以我们的任务要比上帝轻松多了。这个世界本身有一定的规则,就像现实世界存在这基本的物理等法则。当我们打开浏览器,载入一张网页的时候就已经创造了一个js世界,不管这张网页有没有存在js脚本。我们添加的js脚本只是用来完善和塑造这个世界而已。

那么这个世界的基本规则都有什么呢。我们只有首先了解了这些规则并遵循才能继续我们的创造。就想我们必须遵循现实世界的规则一样。这个虚拟的世界是为数据准备的,所以我们首先得让数据在这个世界呈现出来。规则将这些数据分为了六种:布尔(boolean)、字符串(string)、数字(number)、未发现(undefined),不存在(null),以及对象(object),对象比较复杂我们会在后面解释。这些就是这个世界最基本的组成结构,他们以及他们组合而成的更加复杂的,作为数据载体用来存储数据的表现形式就是所谓的数据结构。对于这个虚拟的世界来说,当数据流入的时候会转换为这些形式存在,如果没有这些数据结构的存在,那么数据将永远存在于虚无,不能被我们操作,程序也就失去了存在的意义。流入的数据可以用这些数据结构来表现,同样的我们自己创造的数据也是使用这些数据结构。在js中我们只需 var name = value; 这样就创造了一个数据,稍微正式一点的说法叫做变量声明。var就是规则,表明我们要创建一个数据,而名字(name)代表了这个数据,值(value)是数据本身。就像是一个人必须有一个名字一样,名字代表了这个人,如果没有名字你是无法找到这个人的。这个value可以是上面提到的六种数据类型之中的任意一种。

当有了数据结构之后,不管是流入的数据还是我们自己创造的数据现在都已经以各自的数据结构出现在了这个虚拟的世界中,不过如果只是这样的话这只是一个死寂的世界,没有一点活力。现在我们要了解的另外的一下规则,即控制结构。他们控制这数据的流动。数据通过他们流动,并在流动的过程中发生了变化,即被处理。主要的控制规则有1.自上而下执行,2.条件判断(if、 if else if、 switch),3.循环 (for、for in、 while、 do while)这三个控制结构可以说是所有的程序语言都提供的,也是最基本的,是我们自然思考的抽象化。这里就不做详细的解释了,不懂的同学可以去问下度娘。有了控制规则还需要一些比较规则,用来比较各种数据之间的关系( ==、 ===、!=、!==、 <、 <=、 >、 >= 等),以及用来变化的规则(+、-、 *、 /、 % 等)。只需要这些我们的虚拟世界就可以运转起来。如果只有这些简单的控制结构那么这个世界还是一个很低级的世界,就像是35亿年前的地球一样,没有一丝生命的痕迹。那么对于我们的虚拟世界要如何才能更好的演进呢,那就是函数和对象。函数可以看做是一段包装起来的代码,实现特定的功能。函数本身就在程序的演化史上有很重要的作用。函数将特定的操作封装在了一起。可以在需要的地方重复使用。而对象则更进一步提高了我们这个虚拟世界的进化程度,就像是这世界进化出了高级生命一样。在js中对象其实就是一组名值对。不过一般情况下的对象是指数据和功能的组合。是数据和函数的集合体。是不是很像世界的演化。其实我们提的很多的设计模式,mvc等思想根本上还是为了让这个世界更加体系清晰,更容易管理。

目前为止我们只提到过在js中如果创造自己的数据,没有提及如果让外部的数据流入进来,也没有提及如果将处理后的数据流出去。脚本语言 是一种用于操作,自定义,自动化现有系统工具的编程语言。故js的虚拟世界和其他的世界有一些联系通道。不是浏览器接收转化的全部数据都会传入到js中。通过一定的接口,js会告诉浏览器它需要什么样的数据,然后当浏览器产生这些数据的时候就会将这些数据流入js。然后数据在js的世界里进行一番变化后通过一定的接口流出js世界流入浏览器。这些接口根据类型不同又分为浏览器对象和文档对象。现在已经完整的构建了整个的js虚拟世界。然后让我们从这个比较玄的想象中脱离出来。用另一种思路来理解js。对于一般的交互来说,其实我们所做的如果抽象一下可以概括为两步。第一:找到对应的元素,第二:进行相应的操作。找到元素是通过页面加载完 js环境就拥有的文档对象(DOM)。具体的方法可以去向度娘等询问更多。进行相应的操作又可以细分为绑定事件,以及事件处理函数。所谓绑定事件就是将用户在浏览器上的操作和具体的元素对应起来。当这些操作发生的时候,对应的元素接收到并执行绑定的事件处理函数。所以从这个角度可以把js的运行看做是由事件驱动的。也就是说我们的这个世界的运转是由这些用户和浏览器交互的事件所驱动的。就像地球绕着太阳转是引力作用的一样。

上面我们已经将js的世界大略而完整的介绍一遍。这些只是让我们对js有个整体的认知。仅凭这些就去构造js程序是远远不够的。大学有言 格物致知,还需要我们对js的规则进行更加详细的了解。

如需转载,烦请注明出处:http://www.w3cplus.com/js/my-javascript.html

CSS团队精神:CSS最佳实践团队开发

$
0
0

特别声明:此篇文章由D姐根据Emily Lewis的英文文章原名《Be a CSS Team Player: CSS Best Practices for Team-Based Development》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://msdn.microsoft.com/en-us/magazine/ff679957.aspx以及作者相关信息

作者:Emily Lewis

译者:D姐

你有过多少次接手别人开发过的项目,却发现作者的代码思路一团糟吗?或是你跟几个团队成员合作开发,他们每个人都有自己书写代码的方式吗?或是你重新回顾你多年前开发的项目,不记得当初是怎么想的?

我总是遇到这种事情。事实上,我最近在修复供应商提供facepalm-inducing的css上花费了将近300个小时。这300个小时,使我充满了挫败感,不仅是因为我自己,还有我的团队成员的原因。而且他占用了本应该花费在新项目上的宝贵时间和资源

如果供应商在他的css中已经遵循了一些基本的指导方针。那么将会为他节省宝贵的时间和金钱,更不用说我会已更好的状态去对待他。在本文中,你将学习书写CSS的最佳实践来帮助你避免不一致和冗余;实际上,这样制定标准,简化了团队开发的工作。

结构化

书写好的css的基础是有良好的结构。这样的css可以帮助我以及任何将来要更新这段代码的人,更好的理解并快速定位到要找的样式上。

在开始写样式前,我先定义了一个css文件结构,根据页面中不同内容部分划分的区块。通常,这些结构是每个网站通用的:

  1. Header
  2. Navigation
  3. Main content
  4. Sidebar
  5. Footer

在我的样式文件里,我添加了必要的注释,以标明每个部分的样式从哪里开始

/*---GLOBAL---*/
/*---HEADER---*/
/*---NAV---*/
/*---CONTENT---*/
/*---SIDEBAR---*/
/*---FOOTER---*/

注意第一个注释global的部分,他不是针对于网站的特定内容,而是针对网站上的通用样式,例如布局结构,以及标题、段落、列表和链接等基础样式。

在样式头部设置通用的样式,有助于全站更好的继续共有样式,并在需要时覆盖即可。

越多的css就需要越多的组织

在创建超大型的网站,处理相当多的css时,我就会给每个区块里添加二级注释。例如,在global里我定义这样的二级结构分类:

/*---GLOBAL---*/
  /*--Structure--*/
  /*--Typographic--*/
  /*--Forms--*/
  /*--Tables--*/
/*---HEADER---*/
/*---NAV---*/
  /*--Primary--*/       
  /*--Secondary--*/  
  /*---CONTENT---*/  
/*---SIDEBAR---*/  
/*---FOOTER---*/

同样你也看到了我给NAV也添加了二级注释,分别为主导航和次导航。

事实上,对于很少css的小型网站,我通常是不使用二级注释的。但是对于大型的css文件,二级注释被证实是很管用的。

自由格式化

你使用的注释格式完全取决于你。以上你看到的例子是我和我的团队很钟爱的方式。也有些人喜欢用两行定义他们的注释格式:

/*   HEADER      
------------------------------*/

另一些人使用特殊字符如‘=’,作为搜索字符的标记:

/*   =Header      
------------------------------*/

一些人不使用二级注释,他们用一种完全不同的结构,不是根据页面内容划分,而是用元素的类型划分如:headers,images,lists等等。关键是用你喜欢的格式去定义并一直这么使用。

想根据内容元素划分?没问题。想要小写注释,那就去做。不想使用二级注释缩进?那就不用.不喜欢连字符想用时间?ok。你只需要做对于你和你的团队最有意义的事情就好。

交流注释用法

我们已经了解了注释的结构,但是你应该就这如何使用注释的问题跟你团队的同事交流一下。

什么时间,谁做了什么

作为团队成员的一份子,很有必要在团队成员之间交流已经写好的css文件的相关细节。在我的团队里,我们在css文件的头部添加了一些css文件创建和更新信息的摘要注释。

/*----TITLE: Main screen styles | AUTHOR: EPL | UPDATED: 03/23/10 by EPL----*/

在处理多个样式表时,头部的信息是有用的。如一个屏幕,一个用于打印,一个用于移动甚至是关于ie的hack写法。作者的信息让团队成员知道一旦css出了问题应该去找谁。而更新信息让团队了解谁最后做的更新以及更新时间。

至于你的摘要注释,仅需要包含对你团队有用的信息。如果你不需要作者信息,跳过。如果想要版权声明加上。我甚至见过摘要里面有地址和联系信息的。

/*---- IE6 screen styles (ie6.css)  Company ABC 1234 Avenue of the Americas New York, NY 10020 http://companyabc.com  Updated: 03/23/10 by EPL ----*/

颜色值

我遇到过的最有用的css注释之一是网站用到的颜色值。

/*---COLORS: Green #b3d88c | Blue #0075b2 | Light Gray #eee | Dark Gray #9b9e9e | Orange #f26522 | Teal #00a99d | Yellow #fbc112---*/

颜色值在开发阶段很有用,节省你测试颜色和从其他样式里查找的时间。你不需要知道这个十六进制值是不是蓝色,你只需要找到这个颜色值,然后复制粘贴即可。

在我的团队里,我们在css文件头部添加通用的颜色值,要在所有样式声明和注释前,摘要注释后面添加。我们也尝试保持关键字尽可能简单方便维护,但是他到底有多复杂完全取决于你。

格式也全取决于你。你可以让所有定义的颜色值放在一行显示,也可以把他们分成多行显示:

/*---COLORS      
Green #b3d88c      
Blue #0075b2      
Light Gray #eee      
Dark Gray #9b9e9e      
Orange #f26522      
Teal #00a99d      
Yellow #fbc112 
---*/

同样,找到一个最好的有利于你需要的格式,一旦定义好就要保持他的一致性。

开发和调试

有时候在我开发的过程中,不得不徘徊在我的css 和团队其他成员之间。而这时注释就派上用场了。当我有时冥思苦想为什么css在ie下会有这样的bug,我就只需要走开即可。

你或是你的同事做个笔记,包括可能的样式,和没有解决的困惑:

/*--//--Styling for link states is pending new changes from designer, please don't edit | EPL 03/23/10--\\--*/ 
a, a:link, a:visited {    
  color:#0075b2;     
  text-decoration:none;
}  
 
a:hover, a:focus, a:active {    
  color:#b3d88c;
}

为了让他们与众不同,我通常用一种不同于其他注释的格式,同时让他们尽可能的详细。还是使用最适合你的格式。

不过记住,一旦你完成开发和调试工作,这些注释就没有用了。他们既不跟你的工作有关,也不跟你的css有关,他们的存在只会增大你的文件体积。

样式重置

样式重置已经很流行。他们出现在样式文件的头部,用来设置html元素在跨浏览器显示的基本样式:

/*---RESET---*/ 
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {    
  margin: 0;    
  padding: 0;    
  border: 0;    
  outline: 0;    
  font-weight: inherit;    
  font-style: inherit;    
  font-size: 100%;    
  font-family: inherit;    
  vertical-align: baseline; 
}

以上的例子摘自Eric Meyer的重置文档,这个我也经常用。但是我倾向于去掉我用不到的标签,我也建议你这样做。比如我的团队构建的网站里面几乎没有<kbd>,也没有<iframe>,<applet>或是包含以上的一些元素。

所以,我去掉这些元素选择器。虽然在页面加载或是文件体积上只有很小的不同,但是我感觉这样有助于,避免团队成员间对于不使用的标签的困扰。

如果我不想要覆盖浏览器的内置样式,我也可以编辑重置样式表,例如如何处理无序列表。在这种情况下,我确保这些元素不包含在样式表声明里。

不过,我应该澄清一下,css重置并不适用于所有人。你有很多不使用他的理由,这由你决定。如果你要重置样式,要保持你的重置样式表尽量干净和特殊。

命名约定

最头疼的事情之一是,遇到其他人写的css,而且是定义的类名和id名毫无意义的那种。例如像下面这样:

.f23 {    
  background: #fff;    
  border: 1px solid #ff0;    
  font-weight: bold;    
  padding: 10px; 
}

我根本不知道.f23是什么意思。甚至更糟的是都没有任何形式的注释。我不知道.f23代表什么内容。是标题?主要内容?还是导航?

这种情况,尤其是对于大型网站,就可能浪费大量的时间去查找出现这个类名的标签位置。如果作者用一个约定好的名字命名,如那些有意义的,那些基于内容的样式的:

.alert {    
  background: #fff;    
  border: 1px solid #ff0;    
  font-weight: bold;    
  padding: 10px;
}

如你所见,类名.alert提供的上下文信息要比用一个随机数组成的类名提供的信息多。

不仅仅是上下文,有语意的命名还可以节约时间。考虑到一个公司品牌的频繁更换,如果你开发的css使用表现的类名而不是语义化的类名和id名,那么在寻找、维护css时,你将比预期花费更多的时间。

例如,如果你给网站上一块内容,定义一个bluebox的类名,使用了公司logo的蓝色基调。然后公司重组了,他们现在用红色基调的logo,这时你的.blueBox就没有意义啦。所以你不仅需要更新样式表的十六进制颜色值,还需要修改标签中的所有引用到blueBox的地方。

相反如果你用callOut作为类名(或是同样有意义的名字),你会省去手头的很多工作量。

类名滥用

在css 的使用中,我倾向于能少则少的原则。不能因为你可以给每个元素指定类名,就意味着你就应该给每个元素指定类名。

在我修复供应商糟糕的css过程中,发现类名被滥用了,出现在许多本来不需要的地方。例如每一个lable标签就定义一个lable类名,每一个form就定义一个form。但是我们的设计和结构中只需要给一个form元素设置样式,它里面也只包含一个label元素。

form.form {    
  float: right;    
  margin: 0;    
  padding: 5px; 
} 
 
label.label {    
  clear: both;    
  float: left;    
  text-align: right;    
  width: 145px;
}

由此产生的css本身和他造成的冗余并不可怕,可怕的是他造成的困惑。作为一个设计师看到了这个form类,可能猜想是不是其他样式表里也定义了叫form的类名,然后去查找根本不存在的样式,这就是我时间浪费的原因。

类名不等于特异性

上面只是一个简单的例子。一个我遇到的有关类名更疯狂的例子是渴望给予元素特殊性

<div id="feature" class="tabs">  
  <ul class="tabs">     
    <li class="tabs"><a href="#newServices">New Services</a></li>     
    <li class="tabs"><a href="#newProducts">New Products</a></li>  
  </ul> 
</div>

注意到tabs的类名应用到了上面结构中的每一个标记?导致如下的css目录列表:

div.tabs ul.tabs li.tabs {    
  float: left;    
  font-weight: bold;    
  padding: 3px; 
}

对于li最简便的解决方法应该是这样:

#feature li {    
  float: left;    
  font-weight: bold;    
  padding: 3px;
}

如果你的元素定义样式不需要类名,那就不要用。用的太多类名,不仅使你的结构和css很臃肿,也失去了他们在css 中的意义。

你也许注意到了在最后的例子中,我仅使用了# feature作为选择器而不是div#feature。只有在为了区别其他选择器的情况下,添加div才合适,否则只会给你的团队带来负担。而且尽量少用特殊的声明,也为日后覆盖任何样式提供方便。

多类

最后一点,我不喜欢多类,你也许还有印象。虽然我不提倡使用不必要,多余的类名,但是对于通过多类保持元素表现的共用,我可是一个忠实的粉丝,然而可能有一些理解的不同之处:

.announcement {    
  background: #eee;    
  border: 1px solid #007b52;
  color: #007b52;    
  font-weight: bold;    
  padding: 10px;
}  
 
.newsAnnouncement {    
  background: #eee;    
  border: 1px solid #007b52;
  color: #007b52;    
  float: right;    
  font-weight: bold;    
  padding: 10px; 
}

上面的两个声明,除了.newsAnnouncement多了一个浮动外,都完全一样。所以我大可像下面这样而不是重复写相同的样式:

.announcement {    
  background: #eee;    
  border: 1px solid #007b52;
  color: #007b52;    
  font-weight: bold;    
  padding: 10px;
}  
 
.floatR {    
  float:right; 
}

然后给我的新闻内容添加两个类名

<div class="announcement floatR">

但是且慢,我不是说过要根据约定好的名字而不是根据表现命名吗?没错,但是凡事总有个例外。

是的,.floatR是一个表现类名,但是他适用于这种情况,而且可以用于其他需要多类的情况,所以这是我的团队经常使用的方法。

分组选择器

在我的300个小时的折磨里,遇到的另一个问题是完全相同的样式出现在多个样式表里,而唯一的区别就是声明他们的选择器不同:

#productFeature {    
  background: #fff;    
  border: 1px solid #00752b;    
  float: left;    
  padding: 10px; 
}  
 
#contactFeature {    
  background: #fff;    
  border: 1px solid #00752b;    
  float: left;    
  padding: 10px; 
}
 
#serviceFeature {    
  background: #fff;    
  border: 1px solid #00752b;    
  float: left;    
  padding: 10px; 
}

这不仅使得css文件体积过于臃肿,也使维护成了噩梦。解决方法就是合并他们成一个样式声明:

#productFeature, #contactFeature, #serviceFeature {    
  background: #fff;    
  border: 1px solid #00752b;    
  float: left;    
  padding: 10px; 
}

现在如果要更新样式只需要修改一个声明而不是三个。

一行还是多行书写?

本文中出现的所有css实例都是用的多行的格式,每一对属性和值占单独一行。这个是广泛使用的约定,不仅是在css文件中,也多出现在书里和文章里。许多人认为他的可读性很好,这也就是什么我在本文使用他的原因。

然而在和团队的工作中,尤其是大型的css文件,我是将样式写成一行:

.alert {background: #fff; border: 1px solid #ff0; font-weight: bold; padding: 10px;}

就我个人和我的团队而言,觉得单行的可读性更好。当你查找css时多行样式就变得很麻烦,相比较而言单行查找更容易。

对于你和你的团队,选择最合适你的团队的格式,并一直使用他。

需要依照字母顺序排列吗?

一些人建议将每个声明按照字母表的顺序排列,方便快速查找一个属性。以前我对这样的事情并不在意,但是经过处理供应商混乱的css之后,我意识到将一些思想应用到样式声明的组织中是个很好的主意。

尽管我发现按照字母表排序很有用,但是我还是会根据上下文来组织哪些属性放在一起。比如,我喜欢将所有的盒模型属性放在一起。如果我使用了绝对定位,我就把这些属性放在一起:

#logo {    
  border: 1px solid #000;    
  margin: 0;    
  padding: 0;    
  position: absolute;    
  top: 5px;    
  right: 3px; 
}

这里没有对错之分,仅仅是决定用哪种属性的排序并一直用它就好了。

使用简写

使用css简写一直是认为可以提高你的css水平的方法。他同时也适用于团队,它不仅可以有助于浏览,而且可以方便设置大家遵守的标准。这样就减少了花费在思考和书写样式的时间。

0值

如果你使用0值,没有必要给他指定单位:

margin: 2px 3px 0px 4px

变成

margin: 2px 3px 0 4px

颜色模式

十六进制颜色值如果是由三对数组成,可以从每组中抽出一个数组成该颜色值的简写:

color: #ff0000

写成

color: #f00

盒模型属性

盒模型中的margin,padding,border如果四边值相同,可以合并:

padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px

合并成

padding: 5px

如果上下,左右值一样,你只需要写两个就够了:

padding: 5px 10px 5px 10px

合并成

padding: 5px 10px

字体属性

多条字体属性可以合并成一条

font-style:italic; font-weight:bold; font-size: 90%; font-family: Arial, Helvetica, sans-serif;

合并成

font: italic bold 90% Arial, Helvetica sans-serif

背景色属性

背景属性也是可以合并的

background-color:#fff; background-image: url(logo.png); background-repeat: no-repeat; background-position: 0 10%;

合半成

background: #f00 url(logo.png) no-repeat 0 10%

请注意最后两个例子,字体和背景属性。属性值的声明顺序要按照w3c的标准来。

验证,验证,再验证

虽然一些人认为验证css需要指定一个很好的验证规则,这一点我不强求但是他绝对是有要求的。验证能够确保你的工作,是否准备好分享给团队的其他成员,所以他应该满足下面要求:

  1. 容易开发和故障排除
  2. 保证现在和未来的浏览器显示一致
  3. 保证页面的快速加载
  4. 作为可访问性的一部分
  5. 把他正确的写出来

我建议使用W3C CSS验证服务

压缩工具

如果你的团队关心文件大小,页面加载和带宽的话,你应该考虑使用一个压缩工具。它主要是用来去除不必要的注释,空格。这里有一些压缩工具可以考虑:

  1. CSS Compressor
  2. CSS Optimizer
  3. Code Beautifer
  4. CSS Tidy

我不建议在开发的过程中压缩文件,因为压缩可以减小你的文件大小,同时也削弱了你和团队之间协同开发和处理css 的能力。因为他去掉了具有可读性的所有注释和空格,所以应该把压缩作为产品上线的最后一道工序。

冰山一角

本文中提到的只是少数基础实践,他们可以帮助你和团队高效的工作。遵循这些准则可以进一步完善你的css。如果你很感兴趣的话,我推荐你阅读下面的文章:

  1. Different Ways to Format CSS
  2. Unique Pages, Unique CSS Files
  3. Single-line vs. Multi-line CSS
  4. CSS Property Order Convention
  5. On HTTP: Page Load Times, Multiple File Requests and Deferred JavaScript
  6. Don't Use @import
  7. Efficient CSS with shorthand properties
  8. CSS Sprites: What They Are, Why They’re Cool, and How To Use Them
  9. Object Oriented CSS

遵守黄金定律

不管你是工作在一个团队中,还是作为外包或是作为团队的唯一成员,这些css准则将为你日后成为一个优秀的团队成员打好坚实的基础,它不仅节约你的开发时间,也避免了不必要的沮丧情绪。

译者手语:初次翻译前端技术博文,整个翻译依照原文线路进行,并在翻译过程略加了个人对技术的理解。如果翻译有不对之处,还烦请同行朋友指点。谢谢!

如需转载烦请注明出处:

英文原文:http://msdn.microsoft.com/en-us/magazine/ff679957.aspx

中文译文:http://www.w3cplus.com/css/CSS-best-practices-for-team-based-development.html

藤藤每日一练——Toolbar Menu

$
0
0
藤藤每日一练——Toolbar Menu

辞岁迎新,在2012年w3cplus为大家提供了116个案例,其中案例有原创,也有仿制,同时也有转载,但这些案例都是最新,最有创意的,也是我们精心挑选的,让我从中获益不浅。从藤藤加入w3cplus后,我们开辟了一个藤藤每日一练 栏目,她经过自己的努力和大有分享了近四十个有关于CSS3的案例,这些案例有的是独立创造的,有的是根据国上知名的设计图,将设计转换为CSS3的code。我想有很多同学从中学到了自己想学的知识。我们将在2013年会为大家推出更多的、更有意义的案例。今天藤藤为大家提供新年来第一个案例。希望大家喜欢,更希望大家能支持我们w3cplus的发展。

demodownload

HTML Code:

<div class="page-menu-wrapper clearfix">
  <ul class="menu-function">
    <li>
      <a href="" title="">CATEGORIES</a>
      <ul class="dropdown-menu categories">
        <li><a href="" title="">Design</a></li>
        <li><a href="" title="">Freebies</a></li>
        <li><a href="" title="">Tutorials</a></li>
        <li><a href="" title="">Coding</a></li>
        <li><a href="" title="">Inspiration</a></li>
        <li><a href="" title="">WordPress</a></li>
        <li><a href="" title="">Resources</a></li>
      </ul>
    </li>
    <li><a href="" title="">SHOP</a></li>
    <li id="search">
      <a href="#search" title="">SEARCH</a>
    </li>
    <li id="search-hidden">
      <input type="text" name="" id=""><a href="#search-hidden" title=""></a>
    </li>	
  </ul>
  <ul class="menu-share">
    <li>
      <a href="" title="">FOLLOW US</a>
      <ul class="dropdown-menu follow">
        <li><a href="" title="">RSS</a></li>
        <li><a href="" title="">Twitter</a></li>
        <li><a href="" title="">Facebook</a></li>
        <li><a href="" title="">Google+</a></li>
        <li><a href="" title="">Dribbble</a></li>
      </ul>
    </li>
    <li>
      <a href="" title="">SHARE</a>
      <ul class="dropdown-menu share">
        <li><a href="" title="">Facebook</a></li>
        <li><a href="" title="">Twitter</a></li>
        <li><a href="" title="">Google+</a></li> 
      </ul>
    </li>
  </ul>	
</div>

CSS CODE

body {
  background-color: #F6F8F8;
}
a {
  color: #fff;
}
a:hover {
  color: #3d61a2;
  text-decoration: none;
}
.demo {
  margin-top: 40px;
  min-height: 300px;
}
.page-menu-wrapper {
  width: 960px;
  line-height: 45px;
  margin: 0 auto;
  background-color: #446cb3;
}
.page-menu-wrapper > ul > li {
  position: relative;
  float: left;
  border-left: 1px solid #3d61a2;
  border-right: 1px solid #3d61a2;
  margin-right: -1px;
}
.menu-function {
  float: left;
}
.menu-share {
  float: right;
}
.page-menu-wrapper > .menu-function > li:first-child {
  border-left: none;
}
.page-menu-wrapper > .menu-share > li:last-child {
  border-right: none;
}
.page-menu-wrapper a {
  position: relative;
  display: block;
  padding: 0 15px;
  transition: all .3s ease-out;
}
.page-menu-wrapper > ul > li:hover > a {
  color: #3d61a2;
  background-color: #fff;
}
.page-menu-wrapper > ul > li:hover .dropdown-menu {
  display: block;
}
.dropdown-menu {
  display: none;
  position: absolute;
  width: 260px;
  font-size: 18px;
  font-weight: bold;
  text-align: left;
  background-color: #fff;
}
.dropdown-menu.categories a {
  color: #000;
}
.dropdown-menu.categories a:hover {
  color: #5bc4be;
  margin-left: 10px;
}
#search:target a[href="#search"] {
  display: none;
}
#search:target ~ #search-hidden {
  display: block;
}
#search-hidden {
  display: none;
  padding: 0 5px;
  background-color: #fff;
}
#search-hidden input {
  border: none;
  line-height: 24px;
  width: 180px;
}
#search-hidden a {
  float: right;
  padding: 0;
  width: 20px;
  height: 45px;
}
#search-hidden a:before {
  content: "\7d";
  left: 0;
  color: #446cb3;
}
.menu-function > li > a,.menu-share > li > a {
  padding-left: 40px;
}
.page-menu-wrapper a:before {
  position: absolute;
  left: 15px;
  font-family: 'icomoon';
  font-style: normal;
  speak: none;
  font-weight: normal;
  font-smoothing: antialiased;
  font-size: 18px;
  vertical-align: middle;
}
.menu-function > li:nth-child(1) > a:before {
  content: "\e048";
}
.menu-function > li:nth-child(2) > a:before {
  content: "\3b";
}
.menu-function > li:nth-child(3) > a:before {
  content: "\7d";
}
.menu-share > li:nth-child(1) > a:before {
  content: "\e0a2";
}
.menu-share > li:nth-child(2) > a:before {
  content: "\e05b";
}
/*follow*/
.dropdown-menu.follow {
  width: 223px;
}
.dropdown-menu.follow a {
  padding-left: 35px;
  font-size: 14px;
}
.dropdown-menu.follow a:before {
  left: 10px;
}
.dropdown-menu.follow li:nth-child(1) a:before {
  content: "\e0a5";
}
.dropdown-menu.follow li:nth-child(2) a:before {
  content: "\e0a2";
}
.dropdown-menu.follow li:nth-child(3) a:before {
  content: "\e04c";
}
.dropdown-menu.follow li:nth-child(4) a:before {
  content: "\e022";
}
.dropdown-menu.follow li:nth-child(5) a:before {
  content: "\e03d";
}
.dropdown-menu.follow li:nth-child(1) a {
  color: #ffaa31;
}
.dropdown-menu.follow li:nth-child(2) a {
  color: #07beed;
}
.dropdown-menu.follow li:nth-child(3) a {
  color: #314d91;
}
.dropdown-menu.follow li:nth-child(4) a {
  color: #2d2d2d;
}
.dropdown-menu.follow li:nth-child(5) a {
  color: #e84788;
}
.dropdown-menu.follow li:nth-child(1):hover {
  background-color: #ffaa31;
} 
.dropdown-menu.follow li:nth-child(2):hover {
  background-color: #07beed;
} 
.dropdown-menu.follow li:nth-child(3):hover {
  background-color: #314d91;
} 
.dropdown-menu.follow li:nth-child(4):hover {
  background-color: #2d2d2d;
} 
.dropdown-menu.follow li:nth-child(5):hover {
  background-color: #e84788;
} 
.dropdown-menu.follow li:hover a {
  color: #fff;
  margin-left: 10px;
} 
.dropdown-menu.share {
  width: 120px;  
  right:0;
}
.dropdown-menu.share a {
  margin: 10px;
  line-height: 26px;
  font-size: 12px;
  padding-left: 20px;
  border: 1px solid #cbcbcb;
  border-radius: 2px;
  color: #4c4c4c;
  background-color: #efefef;
}
.dropdown-menu.share a:hover {
  background-color: #fff;
}
.dropdown-menu.share li a:before {
  font-size: 12px;
  left: 5px;
}
.dropdown-menu.share li:nth-child(1) a:before {
  content: "\e04c";
  color: #314d91;
}
.dropdown-menu.share li:nth-child(2) a:before {
  content: "\e0a2";
  color: #07beed;
}
.dropdown-menu.share li:nth-child(3) a:before {
  content: "\e022";
  color: #2d2d2d;
}
@font-face {
  font-family: 'icomoon';
  src:url('fonts/icomoon.eot');
  src:url('fonts/icomoon.eot?#iefix') format('embedded-opentype'),
    url('fonts/icomoon.svg#icomoon') format('svg'),
    url('fonts/icomoon.woff') format('woff'),
    url('fonts/icomoon.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
}

demodownload

如需转载,烦请注明出处:http://www.w3cplus.com/demo/toolbar-menu.html

2012年国外优秀前端网站

$
0
0
2012年国外优秀前端网站

2012年已经过去了,我们迎来了暂新的一年2013年,早就想做一些总结与大家分享,却碍于时间的问题与自己的懒惰,没有动手。今天特意抽空整理了一下我在2012年经常逛的国外网站。这也是很多同学经常问我的问题,说我的资料来自于哪里,为什么都是一些全新的。是的,我喜欢国外网站,他代表我们行业的前瞻性,引领我们学习的方向。所以今天整理的这篇博文希望大家今后能一直观注,因为我从中获益良多,我也希望大家和我一样,能从中得到自己需要的东西。

1、Codrops

Codrops

Cordrops是一个Web设计和开发的博客,提供很多有用的技巧和案例。

2、Nettuts+

Nettuts+

Nettuts +是一个主要针对Web开发人员和设计师的网站,涵盖了HTML、CSS和其他编码语言。

3、Six Revisions

Six Revisions

Six Revisions是专门为Web开发人员、设计人员、维护人员发布一些实际可用的文章。

4、Onextrapixel

Onextrapixel

Onextrapixel是一个为Web设计人员、开发人员提供领先的we技术和资源的一个网站。

5、David Walsh Blog

David Walsh Blog

David Walsh的个人网站,在这个网站中为Web设计和开发者提供最新的Web前沿技术类博文。

6、Tutorialzine

Tutorialzine

Tzine是一个很棒的web开发网站,提供很多优秀教程和资源。

7、CSS Tricks

CSS Tricks

CSS Tricks是一个前端人员都知道的网站,里面提供很多CSS技巧代码,当然还有很多javascript、jQuery、HTML和PHP方面的技巧博文。

8、1st Web Designer

1st Web Designer

1st Web Designer是一个Web前端者的家园,里面提供各种有关于Web前端设计与开发的优秀博文。

9、Noupe

Noupe

Noupe提供各种各样前端Web开发的资源网站。

10、Joshua Hibbert

Joshua Hibbert

Joshua Hibbert是一个优秀的个人前端博客网站,里面整理了一些Web方面优秀的博文。

11、Design Your Way

Design Your Way

Design Your Way主要是针对于Web设计人员提供的一个资源网站,在这个网站上你有找到你的设计灵感。

12、Real World CSS3

Real World CSS3

这是一个CSS3的世界,里面提供了些有关于Web开发中最前沿的技术。这些技术可能不适合你或者你的客户。

13、Speckyboy

Speckyboy

Speckyboy是一个优秀的资源类网站,为Web设计和开发人员提供各种优秀的前端资源。

14、Snipplr

Snipplr

Snipplr是一个强大代码片段的存储库。

15、Stack Overflow

Stack Overflow

Stack Overflow是一个问与答的网站,里面能找到你需要了解的问题。

16、Smashingmagazine

Smashingmagazine

Smashingmagazine是一个非常的强大的Web前端网站,里面汇聚了行内顶尖人物的各种技术分享。

17、A List Apart

A List Apart

A List Apart是大家熟悉的一个Web前端网站,网站中提供了行内开发的优秀技术分享,汇聚行内各种各样的高手。

18、Nicolas Gallagher

Nicolas Gallagher

Nicolas Gallagher这个令你熟悉而又陌生的名字,如果你不知道他,那你或许有些out了。Nicolas Gallagher是一个人的名字,也是一个网站,详细不用介绍。Nicolas Gallagher上有一些很有价值的文章,虽然更新不是很多,但可以说每一篇文章绝对是行业内数一数二的。

19、csswizardry

csswizardry

csswizardry是一个全心关注CSS领域的一个网站,站中分享了很多具有份量的CSS文章.

20、LEA VEROU

LEA VEROU

LEA VEROU应该也有很多同学知道她,她也是行内的名人,在她的站上分享了许多前尚性的技术文章。

21、Web Design & Development

Web Design & Development

Web Design & Development是Web设计和开发人员的圣堂,每天都有不同的技术文章分享,而且这些优秀的文章都是来自于最具实力最具前尚的文章,随时让你掌握最新的技术。

22、treehouse blog

treehouse blog

treehouse blog是我每周必须去一两次的前端网站,里面涉及了Web各方面的开发技术文档分享,同时提供各种代码库,而且人有移动端的开发分享,是一个值得留恋的网站。

23、paulirish

paulirish

paulirishWeb开发的一位名人,在他的个人博客中提供了Web前端开发的优秀技术文章。观注名人的博客,让你随时掌握Web前端最前尚的技术。

24、impressivewebs

impressivewebs

impressivewebs是一个综合性很强的前端网站,里面提供了Web开发和设计的各种技术文档分享,有开发工具、CSS、Js等各种教程和案例。

25、red-team-design

red-team-design

red-team-design是catain rosu的个人博客,虽然是一个个人博客,但自从我发现有这么一个博客后就从未忘记去看这里的每一篇文章,里面都是Web最前尚的技术文档分享。

26、Dev Opera

Dev Opera

Dev Opera应该有很多人知道,里面的技术文档权威性与好坏,我想你都知道,如果你从未进入过,那是你以后的损失。

27、Mozilla.org

Mozilla.org

Mozilla.org和Dev Opera网站性质是一样的,里面具有很多优秀的技术文档,参考手册。

28、Html5 Rocks

Html5 Rocks

Html5 Rocks其实里不只是介绍HTML5方面的知识,里面还涉及了CSS、CSS3和javascript方面的分享,是一个很不错的技术分享网站。

29、Sitepoint

Sitepoint

Sitepoint是一个Web资源很丰富的大型网站,里面包括了PHP、CSS、javascript等各方面的技术分享。

30、HTML Drive

HTML Drive

HTML Drive是一个资源共享类网站,里面提供各式各样式的DEMO效果,而且还提供免费的源码下载。

31、Nuefolio

Nuefolio

Nuefolio也是一个资源搜集网站,在这个站点上你可以找到很多你需要Web资源。

32、tutorialzine

tutorialzine

tutorialzine是一个大型的Web资源网站,里面提供各式各样的教程与案例分析。还提供源码下载。

33、HAKIM

HAKIM

HAKIM里面有很优秀的CSS3和javascript案例分析文章。

34、Web Design Weekly

Web Design Weekly

Web Design Weekly每周为大家搜集Web行内最新消息与技术。

35、webdesign.tutsplus

webdesign.tutsplus

webdesign.tutsplus是Web前端人员的一个乐园,里面的技术分享值得我们慢慢去学习与研究。

36、webdesignerwall

webdesignerwall

webdesignerwall也是一个我常去的网站,里面提供的教程简短精悍,易懂。

37、web Appers

web Appers

web Appers也是Web技术分享的一个大型网站,里面提供Web相关的各种技术文档分享。

38、Devsnippets

Devsnippets

Devsnippets是一个设计和代码片段库,也有现成的CSS代码。

39、awwwards

awwwards

awwwards为Web设计人员提供大量的资源。

40、psd.tutsplus

psd.tutsplus

psd.tutsplus提供大量Web设计教程与资源下载。

41、webresourcesdepot

webresourcesdepot

webresourcesdepot是一个资源类网站设计。

42、Tutorialblog

Tutorialblog

Tutorialblog是一个Web前端教程类网站。

43、Snook.ca

Snook.ca

Tutorialblog是一个Web前端教程类网站。

以搜集近了43个前端类优秀的网站,涵盖Web的制作、设计与开发各种教程、资源、代码库。是值得大家观注的网站。如果有时间去细细品读这里面的教程与资源,你将获益不少。最后希望这篇文章对大家有所帮助。如果您有更好的资源,也欢迎在下面的评论中留言与我们一起分享。

除了上面的优秀网站之外,下面这几个个人博客也是非常不错的:

  1. desandro
  2. dropshado
  3. szafranek
  4. rmurphey
  5. darcyclarke
  6. daverupert

如需转载,烦请注明出处:http://www.w3cplus.com/source/2012-foreign-best-front-end-web-design-and-development-blogs.html

hover的transition

$
0
0

相信对于很多初学者,对于css3的transition到底是直接写在选择器上,还是写在选择器的hover上表示疑惑,下面给出两个实例,希望可以为您解惑。

<div id="demo1" class="demo">demo1</div>
<div id="demo2" class="demo">demo2</div>
.demo{
	width: 100px;
	height: 100px;
	text-align: center;
	line-height: 100px;
	border: 10px solid #ccc;
	border-radius: 60px;
	font-size: 20px;
	-webkit-backface-visibility: hidden;
}
#demo1{
	-webkit-transition:border-color 0.3s ease;
	-moz-transition:border-color 0.3s ease;
	-ms-transition:border-color 0.3s ease;
	-o-transition:border-color 0.3s ease;
	transition:border-color 0.3s ease;
}
#demo1:hover{
	border-color: #A3D7FF;
}
#demo2{
	-webkit-transition:all 1s ease;
	-moz-transition:all 1s ease;
	-ms-transition:all 1s ease;
	-o-transition:all 1s ease;
	transition:all 1s ease;
}
#demo2:hover{
	background-color:#A3D7FF;
	-webkit-transform:rotate(360deg);
	-moz-transform:rotate(360deg);
	-ms-transform:rotate(360deg);
	-o-transform:rotate(360deg);
	transform:rotate(360deg);
	-webkit-transition:background-color 0.3s ease;
	-moz-transition:background-color 0.3s ease;
	-ms-transition:background-color 0.3s ease;
	-o-transition:background-color 0.3s ease;
	transition:background-color 0.3s ease;
}

demo

Viewing all 1557 articles
Browse latest View live