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

css3制作日历风格登陆表单

$
0
0
css3制作日历风格登陆表单

好久没有发布案例了,今天发布一个@白牙同学制作的登录表单,这个表单风格类似于日历。其中较为复杂的是登录表单的中链环效果。通过五个span标签,配合CSS3的伪类来制作。详细制作请查看Demo制作过程。

demodownload

HTML结构

<div class="content">
  <!-- ===用来制作纸张层叠==== -->
  <div class="form-wrapper">
    <!-- ====制作链条效果=== -->
    <div class="linker"> 
      <!-- ==== 每个链条 ==== -->
      <span class="ring"></span>
      <span class="ring"></span>
      <span class="ring"></span>
      <span class="ring"></span>
      <span class="ring"></span>
    </div>
    <!-- ==== 登录表单 ==== -->
    <form class="login-form" action="#" method="post">
      <input type="text" name="username" placeholder="username" />
      <input type="password" name="password" placeholder="password" />
      <button type="submit">Log in</button>
    </form>
  </div>
</div>

这样的结构,对大家来说都很简单,基中“div.form-wrapper”主要用来实现表单纸张层叠效果。其中最为关键的是链条效果,这里使用了一个div加上5个span实现:

<!-- ====制作链条效果=== -->
    <div class="linker"> 
      <!-- ==== 每个链条 ==== -->
      <span class="ring"></span>
      <span class="ring"></span>
      <span class="ring"></span>
      <span class="ring"></span>
      <span class="ring"></span>
    </div>

CSS样式

下面分步来看实现的样式代码:

/*基本布局样式*/
body {
  background-image:url(bg.jpg);
}
.content {
  width:680px;
  height:320px;    
  margin:50px auto;
}
/*表单容器样式,类似于日历风格*/
.form-wrapper {
  margin:32px auto;
  width:264px;
  height:253px;
  position:relative;
  border:1px solid rgb(197,200,204);
  background-color:rgb(248,249,250);
  text-align:center;
  border-radius:5px;/*圆角*/
  box-shadow:0 1px 0 rgb(255,255,255), 0 2px 0 rgb(197,200,204), 0 3px 0 rgb(255,255,255), 0 4px 0 rgb(197,200,204);/*纸张层叠效果*/
}
/*制作链条顶部背景区域*/
.form-wrapper:before {
  content:"";
  display:block;
  height:37px;
  border-bottom:1px solid rgb(197,200,204);
  border-radius:5px 5px 0 0;
  box-shadow:inset 2px 2px 0 rgb(255,255,255);
}

上面代码是一个关键之处,使用box-shadow的多阴影模仿制作多张纸层叠效果。

/*表单元素样式制作*/
.form-wrapper .login-form {
  padding-top:40px;
  box-shadow:inset 2px 0 0 rgb(255,255,255);/*内阴影*/
}
/*登录框样式*/
.form-wrapper input[name="username"],
.form-wrapper input[name="password"] {
  height:40px;
  width: 200px;
  margin:0 auto;
  padding-left:15px;
  display:block;
  border:1px solid rgb(197,200,204);
  background-color:rgb(228,230,233);
}
.form-wrapper input[name="username"]{
  border-bottom:none;
  border-radius:5px 5px 0 0;
  box-shadow:inset 0 1px 0 rgb(212,214,217);
}
.form-wrapper input[name="password"] {
  border-radius:0 0 5px 5px;
}
/*按钮效果*/
.form-wrapper button[type="submit"] {
    margin-top:25px;
    width:215px;
    height:44px;
    color:#fff;
    font-size:20px;
    border:none;
    border-top:1px solid rgb(190,143,48);
    position:relative;
    /*利用双背景制作垂直渐变色边框*/
    background:-*-linear-gradient(top,rgb(228,182,88),rgb(218,149,78)) 1px 1px no-repeat,
               -*-linear-gradient(top,rgb(190,143,48),rgb(160,106,32)) left top no-repeat;
    background-size:213px 41px,215px 43px;
    border-radius:5px;
    box-shadow:inset 0 1px 0 rgb(242,220,175);
    text-shadow:1px 1px 0 rgb(138,100,50);
    transition:color 300ms linear;
}
.form-wrapper button[type="submit"]:hover {
    color:rgb(195,188,81);
    background:-*-linear-gradient(top,rgb(195,99,81),rgb(196,84,64)) 1px 1px no-repeat,
               -*-linear-gradient(top,rgb(190,143,48),rgb(160,106,32)) left top no-repeat;
}

上面这段代码主要是用来制作表单元素的样式。

/*日历链条和环的制作*/
.form-wrapper .linker {
  position:absolute;
  width:240px;
  height:40px;
  top:18px;
  left:10px;
}
/*上环*/
.linker .ring {
  position:relative;
  display:inline-block;
  border:1px solid rgb(163,164,167);
  background-color:rgb(220,222,225);
  height:12px;
  width:12px;
  border-radius: 6px;
  margin-right:33px;
}
.linker .ring:last-child {
  margin-right:0;
}
/*下环*/
.linker .ring:before {
  content:"";
  position:absolute;
  bottom:-25px;
  left:-1px;
  border:1px solid rgb(163,164,167);
  background-color:rgb(220,222,225);
  height:12px;
  width:12px;
  border-radius: 6px;
}
/*中间链条*/
.linker .ring:after{
  content:"";
  position:absolute;
  top:2px;
  left:2px;
  width:6px;
  height:30px;
  border:1px solid rgb(202,202,202);
  background-color:rgb(255,255,255);
  border-radius: 3px;
}

这段代码是用来制作链条的效果,也是这个案例中最为关键,也是难度稍大一点的地方,灵活运用好“:before”和“:after”就可以轻意实现。到此这个效果就算是制作完成了。不知道你学会了?

demodownload

如需转载,烦请注昨出处:http://www.w3cplus.com/demo/create-login-form-like-the-calendar.html


CSS3制作登录表单

$
0
0
CSS3制作登录表单

这个表单效果是很普通,但其制作采用的方法却很有创新,其中用到老技术的是@font-face制作icon、box-shadow制作阴影等,最亮点是使用了calc()函数来计算定位的值。这可是一种新玩法,虽然前面有介绍过这个属性的使用方法,后期的制作中却很少使用他,这个案例让我再次领略了calc()函数的功能。如果你喜欢,也可以尝试一下,自己动手丰衣足食。

demodownload

HTML结构

表单的结构层出不穷,但我更喜欢Bootstrap中表单的结构,当然这个例子中白牙同学是没使用那种结构,但也是很清晰,也很简单:

<form action="" method="post" class="login-form">
  <div class="username">
    <input type="text" name="username" placeholder="emma.watson@gmail.com" autocomplete="on" />
    <span class="user-icon icon">u</span>
  </div>
  <div class="password">
    <input type="password" name="password" placeholder="*******" />
    <span class="password-icon icon">p</span>
  </div>
  <div class="account-control">
    <input type="checkbox" name="Remember me" id="Remember me" value="Remember me" checked="checked" />
    <label for="Remember me" data-on="c" class="check"></label>
    <label for="Remember me" class="info">Remember me</label>
    <button type="submit">Login</button>
  </div>
  <p class="not-registered">Not a registered user yet?<a>Sign up now!</a></p>
</form>

CSS代码

常用到的样式代码就不另外单独介绍了,具体的可以参考样式代码中的注解:

/*基本样式*/
body {
  background: url(bg.jpg) no-repeat center fixed;
  background-size: 100% 100%;/*让背景图全屏显示,常用来制作全屏背景*/
}
.content {
  width:600px;
  height:420px;
  margin:50px auto;
}
/*登录表单form样式*/
.login-form {
  width:400px;
  height:177px;
  margin:70px auto 0;
  padding-top:73px;
  position:relative;/*为用户头像定位做一个参照点*/
  background-image:-*-linear-gradient(top,rgb(255,255,255),rgb(242,242,242));/*渐变效果制作*/
  box-shadow:0 3px 3px rgba(21,62,78,0.8);/*阴影效果实现*/
}
/*使用伪类制作用户头像效果*/
.login-form:before {
  content:"";
  position:absolute;
  top:-50px;
  left:150px;
  width:102px;
  height:102px;
  padding:2px;
  border:1px solid rgb(216,216,219);
  background:#fff url("profilepicture.jpg") no-repeat 2px 2px;/*加载用户头像*/
}
/*注册提示信息*/
.not-registered {
  position:absolute;
  color:rgb(153,153,153);
  font-weight:bold;
  top:calc(100% + 20px);/*相当于bottom:-66px(div.not-registered自身的高度46px加上向下移动的20px)*/
  background-color:rgb(255,255,255);
  width:400px;
  height:46px;
  margin:0 auto;
  line-height:46px;
  text-align: center;
  box-shadow:0 3px 3px rgba(21,62,78,0.8);
}
.not-registered a {
  margin-left:5px;
  text-decoration: none;
  color:rgb(52,119,182);
  cursor: pointer;
}
/*表单内部元素样式设置*/
.login-form div {
  width:216px;
  height:28px;
  margin:20px auto;
  position:relative;
  line-height:28px;
  border:none;
}
/*用户和密码的icon制作*/
.login-form .user-icon, 
.login-form .password-icon {
  display:inline-block;
  font-family: 'loginform-icon';
  font-size:15px;
  text-align:center;
  line-height:28px;
  color:rgb(153,153,153);
  position:absolute;
  left:1px;
  top:1px;
  background-color:rgb(255,255,255);
  border:none;
  border-right:1px solid rgb(229,229,232);
  width:30px;
  height:28px;
  transition: all 300ms linear;
}
/*表单input的样式*/
.login-form .username input, .login-form .password input {
  height:100%;
  width:calc(100% - 40px);/*使用calc计算表单的宽度(其中40px是用来放icon的空间)*/
  padding-left:40px;
  border-radius:2px;
  border:1px solid;
  border-color:rgb(229,229,232) rgb(220,220,221) rgb(213,213,213) rgb(220,220,221);
  display:block;
  transition: all 300ms linear;
}
/*使用伪类制作三角效果*/
.login-form .icon:before, .login-form .icon:after {
  content:"";
  position:absolute;
  top:10px;
  left:30px;
  width:0;
  height:0;
  border:4px solid transparent;
  border-left-color:rgb(255,255,255);
}
.login-form .icon:before {
  top:9px;
  border:5px solid transparent;
  border-left-color:rgb(229,229,232);
}
/*表单焦点状态下效果*/
.login-form .username input:focus, .login-form .password input:focus {
  border-color:rgb(69,153,228);
  box-shadow:0 0 2px 1px rgb(200,223,244);
}
.login-form .username input:focus + span, .login-form .password input:focus + span {
  background:-*-linear-gradient(top,rgb(255,255,255),rgb(245,245,245));
  color:rgb(51,51,51);
}
.login-form .username input:focus + span:after, .login-form .password input:focus + span:after {
  border-left-color:rgb(250,250,250);
}

.login-form .account-control label {
  margin-left:24px;
  font-size:12px;
  font-family: Arial, Helvetica, sans-serif;
  cursor:pointer;
}
/*按钮效果*/
.login-form button[type="submit"] {
  color:#fff;
  font-weight:bold;
  float:right;
  width:68px;
  height:30px;
  position:relative;
  background:-*-linear-gradient(top,rgb(74,162,241),rgb(52,119,182)) 1px 0 no-repeat,
       -*-linear-gradient(top,rgb(52,118,181),rgb(36,90,141)) left top no-repeat;
  background-size:66px 28px,68px 29px;
  border:none;
  border-top:1px solid rgb(52,118,181);
  border-radius:2px;
  box-shadow:inset 0 1px 0 rgb(86,174,251);
  text-shadow:0 1px 1px rgb(51,113,173);
  transition: all 200ms linear;
}
.login-form button[type="submit"]:hover {
  text-shadow:0 0 2px rgb(255,255,255);
  box-shadow:inset 0 1px 0 rgb(86,174,251),0 0 10px 3px rgba(74,162,241,0.5);
}
.login-form button[type="submit"]:active {
  background:-*-linear-gradient(top,rgb(52,119,182),rgb(74,162,241)) 1px 0 no-repeat,
       -*-linear-gradient(top,rgb(52,118,181),rgb(36,90,141)) left top no-repeat;
}
/*自定义复选框效果*/
.login-form .account-control input {
  width:0px;
  height:0px;
}
.login-form label.check {
  position:absolute;
  left:0;
  top:50%;
  margin:-8px 0;
  display:inline-block;
  width:16px;
  height:16px;
  line-height: 16px;
  text-align:center;
  border-radius:2px;
  background:-*-linear-gradient(top,rgb(255,255,255),rgb(246,246,246)) 1px 1px no-repeat,
       -*-linear-gradient(top,rgb(227,227,230),rgb(165,165,165)) left top no-repeat;
  background-size:14px 14px,16px 16px;
}
.login-form .account-control input:checked + label.check:before {
  content:attr(data-on);
  font-family:loginform-icon;
}
/*调用服务器字体*/
@font-face {
  font-family: 'loginform-icon';
  src: url("font/loginform-icon.eot");
  src: url("font/loginform-icon.eot?#iefix") format('embedded-opentype'),
    url("font/loginform-icon.woff") format('woff'),
    url("font/loginform-icon.ttf") format('truetype'),
    url("font/loginform-icon.svg#loginform-icon") format('svg');
  font-weight: normal;
  font-style: normal;
}

demodownload

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

2013年优秀jQuery插件连载(二期)

$
0
0
2013年优秀jQuery插件连载(二期)

第一期中向大家推荐了有关于响应式的网格布局插件、图片放大插件、表单元素中自定义select插件,google 地图插件、文件拖放上传插件、tooltip提示插件、3D旋转菜单等十款jQuery插件,今天继续第二期的插件推荐,在这一期中主要涵盖了:回到页面顶部、文本语音、图片旋转、图片预加载、SVG制作与动画等十款优秀的jQuery插件,希望这些插件能帮大家解决一时之需。

1、scrollUp jQuery plugin

scrollUp jQuery plugin

一款制作回到顶部按钮的jQuery插件。

2、jQuery plugin for Text to Speech

scrollUp jQuery plugin

一款文本转语音的jQuery插件。

3、Toolbar.Js

Toolbar.Js

在Web页面或应用程序中快速帮助创建提示工具的一款jQuery插件。

4、Threesixty-slider

Threesixty-slider

图片360度旋转插件。

5、Anima.js

Anima.js

类似于easings动画功能的插件。

6、Fathom.js

Fathom.js

Fathom Js可以用来制作网页版本的幻灯片播放效果。

7、Nivo Zoom

Nivo Zoom

一款图片放大的jQuery插件。

8、ScrollNav.js

ScrollNav.js

一款制作滚动页面,导航项目随之变化的jQuery插件。

9、SVG.js

SVG.js

一款操纵和实现SVG动画的轻量级js库。

10、IMAGELOADER.JS

IMAGELOADER.JS

一个预加载图片的JQUERY插件。

2013年优秀jQuery插件:

  1. 2013年优秀jQuery插件连载(一期)

如需转载,烦请注明出处:http://www.w3cplus.com/source/best-jquery-plus-2013-part2.html

js 设置 cookie

$
0
0

此函数用来设置一个cookie的值,同时提供一个可选的max-age属性:

// 以名/值的形式储存cookie
// 同时采用encodeURIComponet()函数进行编码,来转义分号、逗号和空白符
// 如果daysToLive是一个数字,设置max-age属性为该数值表示cookie知道指定的天数
// 到了才会过期。如果daysToLive是0就表示删除cookie
function setCookie(name, value, daysToLive) {
  var cookie =  name + "=" + encodeURIComponent(value);
  if (typeof daysToLive === "number") {
    cookie += "; max-age=" + (daysToLive*60*60*24);
  }
  document.cookie = cookie;
}

HTML和CSS高级指南之二——定位详解

$
0
0

本文由大漠根据Shay Howe的《An Adavnced Guide to HTML & CSS》第二课《Detailed Positioning》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://learn.shayhowe.com/advanced-html-css/detailed-css-positioning,以及作者相关信息

作者:Shay Howe

译者:大漠

当在这一个页面上实现布局和定位有几种不同的技术。使用哪种技术,很大程序上取决于内容和目标页面,因为有很多技术比别人的更牛。

例如,浮动可以让页面元素并排显示,而且还可以制作一个干净的布局。然而,有时候需要一些严格的定位,这时需要使用其他的技术,包括“relative”和“absolute”定位。

在这节课中,我们先来介绍一下浮动的使用,接下来详细介绍定位的技巧,包括如何准确的给元素在X轴、Y轴和Z轴定位。

包含浮动

创建一全页面的布局时,浮动是一种常用的方法,也是页面元素定位的一种基本功能。浮动可以让元素一个挨着一个。浮动可以创建一个自然流布局,同时充许元素设置自身尺寸和其父元素容器的尺寸大小。

当元素浮动时,一个元素的位置依赖于放置在他周边的其他元素。那么围绕在他周边的是哪个元素呢?这个元素会换行吗?这一切都取决于围绕于他的元素的DOM(文档对象模型)。

DOM是什么?

DOM是Document Object Model的简称,被译为文档对象模型。是HTML或者XML文档结构的API。在我们的例子中,我们说的是HTML的文档,因此DOM就是代表所有元素以及这些元素之间的关系。

可以考虑树形的表现方式,展元素元素之间的关系。元素嵌套时他们存在父子关系,相同级别的还存在兄弟关系。

虽然 浮动相当的给力,但他们自己还是存在一定的问题。最典型的问题就是一个父元素包含了多个浮动的子元素。页面的内容设置了一个宽度,子元素的浮动确定了他们的位置,但浮动元素不会影响父元素的宽度。这样做会让父元素塌陷,从而使父元素的高度为“0”,以及忽略其他的属性。很多时候,这种现像都被忽略,特别是在父元素没有任何样式,以及其子元素看起来都正确的对齐。

嵌套的元素不会正确的排列,也会有错误的样式出现。来看看下面的演示,在“.box-set”的div应该有一个高亮的灰色背景,因为所有的子元素浮动后,这个灰色的背景色并不看到。仔细检查后,“.box-set”的高度变成了“0”。

HTML

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

CSS

.box-set {
  background: #e8eae9;
}
.box {
  background: #8ec63f;
  height: 100px;
  float: left;
  margin: 10px;
  width: 200px;
}	

DEMO效果

包含浮动

有一种方法,在容器的结束标签前添加一个空标签,在空标签上直接设置样式“clear:both”。用这种方法来清除浮动,在大多数情况下是有效的,但这不太适合语义化。这取决于一个页面有多少浮动需要清除,这样造成页面上的空标签迅速堆积,而且在页面中没有上下文内容。

幸运的是有几种不同方法可以用来清除浮动,而其中用得最多的是“overflow”技巧和"clearfix"技巧。

Overflow技巧

一种清除浮动的技巧是使用“overflow”属性。在具有浮动元素的父容器中设置“overflow”的属性值为“auto”,这样父容器就会有一个高度存在,在我们例子中的灰色背景也就能看得到了。

在IE6里面,父容器是需要设置一个“width”和“height”。因为高度可能是一个变量,宽度为100%,他们将能正常的工作。使用“overflow:auto;”,在IE浏览器中会给元素添加滚动条,这样一来,最好是直接使用“overflow:hidden;”来清除浮动。

.box-set {
  background: #404853;
  overflow: auto;
}	

清除浮动后效果

包含浮动

使用“overflow”技巧清除浮动,确实存在一些缺点。例如:当你添加样式,或者将嵌套在里面的“span”元素移动到父容器的外面,或者你想给元素添加一个盒子阴影和制作一个下拉菜单。在下面的演示例子中,你可以看到元素的盒子阴影被切断在父元素之内。

不同的浏览器对“overflow”属性解析不一样,在浏览器的显示风格也不一样。看看下面的例子,注意列在不同浏览器的显示效果。

包含浮动

clearfix技巧

根据上下文,清除浮动更好的方法是clearfix技巧。“clearfix”清除浮动的技术是有点复杂,但有有比使用“overflow”技巧清除浮动更好的方法?

“clearfix”技巧是基于在父元素上使用“:before”和“:after”两个伪类。使用这些伪类,我们可以在浮动元素的父容器前面和后面创建隐藏元素。“:before”伪类是用来防止子元素顶部的外边距塌陷,使用“display: table”创建一个匿名的“table-cell”元素。这也确保在IE6和IE7下具有一致性。“:after”伪类是用来防止子元素的底部的外边距塌陷,以及用来清除元素的浮动。

在IE6和7的浏览器中,加上“*zoom”属性来触发父元素的hasLayout的机制。决定了元素怎样渲染内容,以及元素与元素之间的相互影响。

采取上面同样的例子,你可以看到容器也清除了浮动,元素也可以移到父容器外面:

.box-set:before,
.box-set:after {
  content: "";
  display: table;
}
.box-set:after {
  clear: both;
}
.box-set {
  *zoom: 1;
}	

清除浮动后效果

包含浮动

有效的包含浮动

使用哪种技巧来清除浮动,终究要看你自己喜好。有些人坚持使用“clearfix”来清除浮动,因为这种方法可以贯穿整个项目。有些人认为“clearfix”技巧使用的代码太多,他还是喜欢简单点的。至于使用什么技巧由您来决定,只要在运用了浮动的元素的父容器需要清除浮动。

一个常见的方法是将定义一个类名,把这个类名加到需要清除浮动的容器上。例如使用“clearfix”清除浮动,Dan Cederholm为容器设置了一个类名“group”。在需要清除浮动的容器上添加这个类名“group”。

.group:before,
.group:after {
  content: "";
  display: table;
}
.group:after {
  clear: both;
}
.group {
  *zoom: 1;
}	

单个伪类

值得注意的是,目前每个元素只有一个“:before”和“:after”伪类。当你尝试使用其他的“:before”和“:after”的clearfix技巧,你的内容可能无法达到想要的效果。

在上面的例子中,clearfix的样式不应该直接插入到“.box-set”类中,应该是给需要清除浮动的元素中添加类名“group”。

定位属性

很多情况下,你需要控制更多元素的位置,而且超过了浮动所能提供的范围,这个时候我们就需要发挥“position”属性的作用。“position”属性提供五个不同的属性值,每种不同的方式可以给元素提供不同的位置

Position static

元素都有position属性,其默认值是“static”,这也意味着,他们没有也不接受位置属性设置(top、right、bottom、left属性值设置)。另外元素设置了position属性,将会覆盖元素的默认值“static”。

在下面的演示中,所有的盒子都是静态的,每个盒子都在相邻盒子顶部,因为他们都是块元素,而且没有进行浮动设置。

HTML

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

CSS

.box-set {
  background: #e8eae9;
}
.box {
  background: #8ec63f;
  height: 80px;
  width: 80px;
}	

效果

包含浮动

Position relative

“relative”是“position”的另一个属性值,他和“static”属性值非常的相似。主要的区别是“relative”可以给元素设置位移(offset)“top、right、bottom和left”属性。通过这些位移属性设置可以给元素进行精确的定位。

盒子位移属性是如何工作?

盒子的位移属性有四个“top、right、bottom和left”,用来指定元素的定位位置和方向。这些属性只能在元素的“position”属性设置了“relative、absolute和fixed”属性值,才生效。

对于相对定位元素,这些属性的设置让元素从默认位置移动。例如,top设置一个值“20px”在一个相对定位的元素上,这个元素会在原来位置向下移动“20px”。反之,“top”设置一个“-20px”,这个元素会在原来的位置向上移动“20px”。

对于绝对定位和固定定位鲜红,这些属性指定了元素与父元素边缘之间的距离,例如,绝对定位的元素设置一个“top”值为“20px”,将使绝对定位元素相对于其设置了相对定位的祖先元素顶部边缘向下移动“20px”,反之,如果设置一个“top”值为“20px”,将使绝对定位元素相对于其设置了相对定位的祖先元素顶部边缘向上移动“20px”。(绝对定位的参考点是其祖先元素设置了“relative”或者“absolute”值)。

设置了位移属性的相对定位元素,他在页面中仍然是正常的、静态的,仍属于自然流。在这种情况下,其他元素不会占用相对定们元素当初的位置。此外,其他元素没有进行位置移动时,相对定伴元素可能会和其他元素重叠。

在下面的演示中,每个元素还是在另一个元素顶部,然后他们根据自己移位属性,从默认位置进行移动,由于他们移向方向不一样,这些值使元素重叠在一起。当元素设置了相对定时,周边的元素也能看到相对定位元素的默认位置。(也就是说,相对定位元素的默认位置还是被元素自身占用,别的元素是无法占用的。也就是说相对定位元素的位移是相对于元素自身的边缘进行位移)。

HTML

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

CSS

.box-set {
  background: #e8eae9;
}
.box {
  background: #8ec63f;
  height: 80px;
  position: relative;
  width: 80px;
}
.box-1 {
    top: 20px;
  }
.box-2 {
  left: 40px;
}
.box-3 {
  bottom: -10px;
  right: 20px;
}	

效果:

相对定位

事实上,一个相对定位元素同时设置了“top”和“bottom”位移属性值,实际上“top”优先级高于“bottom”。然而,一个相对定位元素同时设置了“left”和“right”位移属性,他们的优先级取决于页面使用的是哪种语言,例如,如果你的页面是英文页面,那么“left”位移属性优先级高,如果你的页面是阿拉伯语,那么“right”的位移属性优先级高。

Position absolute

绝对定位元素也具有盒子位移属性,然而,绝对定位元素会脱离文档流。绝对定位元素直接从文档流中移出,绝对定位元素的位置直接和父容器是否设置了相对定位(绝对定位)有直接关系。绝对定位元素需要至少一个祖先元素设置了相对定位(绝对定位),不然元素定位会相对于页面的主体进行定位。

使用绝对定位的元素可以指定垂直和水平的位移属性,使绝对定位元素相对于设置了相对定们的祖先元素边缘进行移位。例如,一个绝对定位的元素设置了“top”值为“50px”和一个“right”值为“100px”,绝对定位元素会相对于其设置了相对定位的父元素的顶边向下移动50px;向左移动100px。

然而,使用了绝对定位的元素并没有进行任何盒子位移属性设置,那么绝对定位元素的顶部和左部会和设置了相对定位的父元素的顶边和左边重合。如果设置了一个盒子位移属性,比如说“top”,那么绝对定位元素垂直方向会进行移动,而水平位置默认还是左边对齐。

在下面的演示中,你可以看到所有的盒子都相对于div的父元素进行绝对定位,每个元素都从特定的面使用定位值进行移动,而且使用了负值的,元素移动到盒子的外面。

HTML

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

CSS

.box-set {
  background: #e8eae9;
  height: 200px;
  position: relative;
}
.box {
  background: #8ec63f;
  height: 80px;
  position: absolute;
  width: 80px;
}
.box-1 {
  top: 6%;
  left: 2%;
}
.box-2 {
  top: 0;
  right: -40px;
}
.box-3 {
  bottom: -10px;
  right: 20px;
}
.box-4 {
  bottom: 0;
}	

效果

绝对定位

当一个绝对定位的元素有固定的高度和宽度,并且盒子位移同时设置了“top”和“bottom”时,“top”更具优先组,另外和相对定位元素一样,当同时设置了“left”和“right”时,优先级取决于他的页面使用的语言。

当一个绝对定位的元素没有明确指定高度和宽度,同时使用盒子位移的“top”和“bottom”属性时,会使整个元素的高度跨越整个容器。同样的,当这个元素同时使用位移“left”和“right”属性值,会使整个元素的宽度跨越整个容器。如果同时使用位移四个属性,可以指定一个宽度和高度显示元素。(这个时候绝对定位元素的宽度和高度都是100%。)

Position fixed

固定定位和绝对定位很类似,但是他定位是相对于浏览器窗口,并且不会随滚动条进行滚动。也就是说,不管用户停留在页面那个地方,固定定位的元素将始终停留在页面的一个地方。“position”属性值中,仅有“fixed”属性值不能在IE6浏览器下运行,如果你想在IE6正常使用固定定位,那么你就需要为他写一些Hacks。

固定定位元素的盒子位移属性的使用和绝对定位的一样。

保持前面盒子移位,可以看到盒子固定定位是相对于浏览器窗口而不是设置了相对定位的父元素。

HTML

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>	

CSS

.box {
  background: #8ec63f;
  height: 80px;
  position: fixed;
  width: 80px;
}
.box-1 {
  top: 6%;
  left: 2%;
}
.box-2 {
  top: 0;
  right: -40px;
}
.box-3 {
  bottom: -10px;
  right: 20px;
}
.box-4 {
  bottom: 0;
}	

效果

绝对定位

固定页头和页脚

固定定位最常见的一种用途就是在页面中创建一个固定头部、或者脚部、或者固定页面的一个侧面。就算是用户移动浏览器的滚动条,还是固定在页现与用户交流。

下面的示例代码能实现。注意如何设置“left”和“right”两个盒子位移,这使得“页脚”跨越了页面的整个宽度,而不需使用margin、border和padding来破坏盒模形就做了收缩自如。

HTML

< footer >Fixed Footer </footer>	

CSS

footer {
  bottom: 0;
  left: 0;
  position: fixed;
  right: 0;
}	

固定定位

z-index属性

通常都认为Web页面是二维页面,显示的元素都在X轴和Y轴上。当你的元素有定位时,他们有时候会放置在另一个元素的顶部。要改变这些元素是一个 怎么样的层叠顺序,要知道z轴,z轴是用“z-index”属性来控制的。

一般来说,在DOM中,元素出现的时候就放置在z轴上。在Dom中,元素在顶部的要低于底部的。改变这种层叠顺序可以直接使用“z-index”来控制。元素的“z-index”值越高将会出现在越上面,不管元素在Dom哪个位置上。

给元素设置“z-index”属性,首先要在这个元素上设置了“position”属性值为“relatvie”、“absolute”或者“fixed”之一。同样的,你要使用盒子位移属性,你也要先确认元素设置了“positions”属性值为“relative”、“absolute”或者“fixed”之一。

在下面的登例子中,如果每个盒子都不设置“z-index”,那么第一个box在第二个下面,第二个在第三个下面,第三个在第四个下面。如果在盒子中指定“z-index”的值,第二个盒子在第一个和第三个上面,第三个盒子在第四个上面。

HTML

<div class="box-set">
  <div class="box">Box 1</div>
  <div class="box">Box 2</div>
  <div class="box">Box 3</div>
</div>  

CSS

 .box-set {
  background: #e8eae9;
  height: 160px;
  position: relative;
}
.box {
  background: #8ec63f;
  border: 3px solid #f7941d;
  position: absolute;
}
.box-1 {
  left: 10px;
  top: 10px;
}
.box-2 {
  bottom: 10px;
  left: 70px;
  z-index: 3;
}
.box-3 {
  left: 130px;
  top: 10px;
  z-index: 2;
}
.box-4 {
  bottom: 10px;
  left: 190px;
  z-index: 1;
} 

不设置z-index效果

固定定位

设置z-index效果

固定定位

扩展阅读

  1. CSS的Float之一
  2. CSS的Float之二
  3. CSS Float Theory: Things You Should Know
  4. All About Floats
  5. Methods for Containing Floats
  6. CSS Floats 101
  7. Everything You Never Knew About CSS Floats
  8. SIMPLE TIPS ON CONTAINING FLOATS
  9. Clear Float
  10. Clearing floats nowadays
  11. CSS Hackz Series: Clearing Floats with the Clearfix Hack
  12. 十步图解CSS的position
  13. A New Micro Clearfix Hack
  14. CSS Positioning 101
  15. On Having layout
  16. A Detailed Look at the z-index CSS Property
  17. The Z-Index CSS Property: A Comprehensive Look

上一课下一课

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

如需转载烦请注明出处:

英文原文:http://learn.shayhowe.com/advanced-html-css/detailed-css-positioning

中文译文:http://www.w3cplus.com/css/advanced-html-css-lesson2-detailed-css-positioning.html

HTML和CSS高级指南之一——性能与架构

$
0
0

本文由99根据Shay Howe的《An Adavnced Guide to HTML & CSS》第一课《Performance & Organization》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://learn.shayhowe.com/advanced-html-css/performance-organization,以及作者相关信息

作者:Shay Howe

译者:99

会书写html和css,且对他们有深刻的理解,是非常难得的。随着网站代码和流量的增长,迫切需要掌握一套新的技能,这对开发时间和用户体验來讲都是极其重要的。 了解网站性能与架构的基本原理,对之后的发展非常有帮助。

对代码进行组织与架构,不仅可以提高开发速度,还会提升页面的加载速度。这两个因素对于开发者和用户来言都是极大关注的。投入时间去设计网站适合的代码架构,同时确保不同组件之间如何共同作用,会加速开发进程,带来更好的用户体验。

此外,只需要几个小步骤提升网站的性能,你就会得到回报。网站性能也遵循80/20原则,只需要做20%的优化就可以提升网站80%的速度。

本课主要内容:

HTML

CSS

技巧与结构

提高网站性能和组织的最基本一点,就是探索出一套开发代码基础的良好战略和结构。具体来讲,就是建立完备的目录结构,勾勒设计模式,以及对公用代码的有效重用。

样式风格

如何正确的组织样式表呢?这与具体网站跟个人偏好都有关系。不过,一般而言我们也可以遵循一些最佳实践。其中一个就是有目的的切分你的样式表,并为这些样式表建立目录,包括基础样式、界面相关的组件,以及商业需求模块。

# Base
  – normalize.css
  – layout.css
  – typography.css
# Components
  – alerts.css
  – buttons.css
  – forms.css
  – list.css
  – nav.css
  – tables.css
# Modules
  – aside.css
  – footer.css
  – header.css	

以上的代码组织结构包含三个目录,都对样式表做了独立的分类。这里要把站点认为是一个“系统”,而不是很多单独的页面,同时,代码要体现这个思路。要留意以上的组织结构没有针对“某页面”的样式表存在。

Base目录用来存放公用样式,以及全站通用的样式如布局字体等。Components目录用来存放特定用户界面相关的样式,这些样式按照界面组件被拆分为多个文件,比如警告及按钮。Modules目录用来存放页面的不同部分,这些部分是由商业需求决定的。

组件样式是与网站核心的商业逻辑无关的,纯粹由界面驱动的样式。模块则根据特定的商业逻辑呈现不同的样式。当我们建立一个模块时,里面使用的用户界面组件通常是不同的。举例来说,一个页面的侧边栏可能会包含列表及按钮,这些样式是定义在组件样式中的。而其他的样式需要从侧边栏样式中继承而来,这些样式是从模块样式中定义的。这种样式分离的原则鼓励我们对样式预先进行仔细的规划,以及样式表的共享与重用性。

组织样式表的策略不是什么新鲜事物。在之前不同的css理论如面向对象的css OOCSS, 可拓展模块化的CSS, SMACSS 中均提到过这方面的要求。 这些方法论包含他们自身独特的代码组织方式,以及样式表的使用。

面向对象的CSS

面向对象的css是Nicole Sullivan所倡导的,她撰写大型网站样式表的一种方法。面向对象的css认为,两种原则可以帮助构建可扩展的,拥有强劲架构及合理的代码量的网站。

  • 表现与结构分离
  • 内容与容器分离

从一个网站的主题中完全把皮肤包括元素的布局结构整体分离。一个模块的结构是透明的,他可以继承任何样式和不会造成样式冲突。最常见的就是使用一个网格系统和布局结构,再结过加工设计成为一个经典模块。

内容从容器中分离出来,包括父元素与子元素的嵌套。一个标题应该是一样的,无论它的父元素是谁。为了做到这一点,元素需要一些默认的样式,然后通过多个类名来扩展其样式是有必要的。

HTML

<div class="alert alert-error">
  <p class="msg">...</p>
</div>

CSS

.alert {...}
.alert-error {...}
.msg {...}	

OOCSS提倡建立组件库,保持样式表的灵活性,以及利用网格来布局。这是非常有效的基本法则,当你要向站点添加页面或者新需求时,遵循这些原则可以避免添加额外的样式表。

可扩展和模块化CSS

与OOCSS不谋而合的理论是Jonathan Snook提出的:构建可扩展的,模块化的css架构。如何构建可扩展的,模块化的css呢?这个理论要求css要拆分为五个核心类别,包含:

  • 基础
  • 布局
  • 模块
  • 声明
  • 主题

基础部分包含一些核心元素的样式及全局样式。布局部分规定了不同元素的尺寸与网格样式,定义了他们的排列规则。模块部分更加针对页面某个独立的部分的特定样式,比如导航条等。状态部分定义了一些在某种情况下用来覆盖现有模块表现的样式,比如一个选定状态下的tab主题部分可能添加一些样式比如皮肤,视觉与体验,不同的模块等。

HTML

<div class="alert is-error">
  <p>...</p>
</div>	

CSS

.alert {...}
.alert.is-error {...}
.alert p {...}
.alert.is-error p {...}	

以上的例子里,alert 这个class的样式被划分到模块类别中,同时 is-error这个class的样式被划分到状态 类别中。之后就可以按照需求来继承某个类别中的样式了。

选择一种方法

选择什么样的方法去组织代码,完全决定于你。你认为这个方法是对某个网站最适合的,那么他就是管用的。一般而言适当的混合使用两种方法是有效的,对于每种方法你可以按照自己的意愿取其精华。

高性能选择器

Css一个经常被滥用而没有意识到的功能是选择器。对于css,人们把注意力都集中在属性与值上了。他们认为,只要这些样式作用到该作用的元素上,元素表现正常就行了。 这是一个非常狭隘的认识。元素在Css中是怎样被选择的,与性能息息相关。页面渲染多快,样式表结构对于全站来说是否实用,是否模块化都与css选择器有关系。

保证简短的选择器

保证选择器尽可能简短是有一些好处的。这些好处包括降低选择器的权重,提供更好的继承与可移植性,以及提高效率。冗长且限制过多的选择器会降低性能,因为这会强迫浏览器从右到左的去解析每个独立的选择器。把选择器更具体化。

<!-- Bad -->
header nav ul li a {...}
<!-- Good -->
.primary-link {...}
<!-- Bad -->
button strong span {...}
button strong span .callout {...}
<!-- Good -->
button span {...}
button .callout {...}	

上面的代码中,第一个选择器过分冗余,若使用class,会让元素的识别跟解析变得更快。另外在这个场景里使用class就不需要判断元素的父元素了,这样可以任意移动元素的位置,而不需要改动任何样式。

相比第一个例子而言,第二个例子包含一个更短的选择器,他为同级选择器提供了特殊样式。避免使用权重过高的选择器,因为当元素次序变化的时候,这类选择器会解析出不同的结果。切分一些独立的选择器单元,然后给予他们相同的权重,可以让选择器之间更好配合。

我们使用简短的选择器的原因是降低选择器的权重,书写一份干净且可维护性强的代码。

倾向于使用class

Class类名是很赞的,渲染速度快,重用性高,已经被广泛应用于网站建设中。不过我们在使用class的时候,同样要权衡一些问题。

由于选择器是从右到左解析的,所以一定要注意 关键字选择器。 关键字选择器位于选择器单元的尾端,在最右边。这个选择器是非常重要的,因为他标识了浏览器要首先查找的元素。一个效率低下的选择器会给浏览器带来很多无谓的查找工作。不用担心使用一个特殊的类名会影响性能。

另外一点,在给元素定义样式时,不要用另外的选择器来修饰class选择器。当你用额外的选择器来限制class选择器时,你就失去了应用此选择器到其他元素的机会,同时增加了整个选择器的权重。

<!-- Bad -->
#container header nav {...}
<!-- Good -->
.primary-nav {...}
<!-- Bad -->
article.feat-post {...}
<!-- Good -->
.feat-post {...}	

同样要留意的是,远离id选择器,他们的权重太高,不存在任何可重用性。对于我们来说使用id与使用!Important没有什么明显区别。

可重用代码

不断膨胀的无用代码是造成性能缺陷最大的原因之一。而一个有效降低css文件尺寸的方法是尽可能的重用样式。任何重复定义的样式或者接口模式都需要合并,从而使代码可被他人使用。如果两个模块拥有同样的背景,圆角,以及盒子阴影,毫无疑问你不能写两遍同样的样式。因此这些样式可以被合并在一个class中来定义。这样样式在书写一次后就可以再次使用。

重用代码不会造成语义问题。我们可以通过组合多个选择器的方式,用逗号分割选择器,让同样的样式通过两个选择器来定义并继承。另外一种方法就是遵循上述oocss及smacss所提到的方法,把样式绑定在一个class类名上,之后可以用多个class定义原本那个元素。

<!-- Bad -->
.news {
  background: #eee;
  border-radius: 5px;
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25);
}
.social {
  background: #eee;
  border-radius: 5px;
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25);
}
<!-- Good -->
.news, .social {
  background: #eee;
  border-radius: 5px;
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25);
}
<!-- Even Better -->
.modal {
  background: #eee;
  border-radius: 5px;
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.25);
}	

采取哪种方法区别不大,当你的代码被重用后,整个文件的尺寸就会下降。

减小和压缩文件

降低文件大小最好的方式是去掉重复与无用的代码。不过对此还有其他方式可用。其中就包括压缩html,css与javascript文件。此外,通过去掉无用的信息与颜色配置,图片也可以被压缩。

开启gzip压缩

Gzip是最流行的文件压缩方式之一。Gzip压缩对通常如html,css javascript等类型的文件进行分析,之后对其字符串进行分析,从而压缩。Gzip处理过的字符串越多,压缩后的文件尺寸越小,因此服务器端可以传输更小的文件到浏览器端。

设置gzip几乎不需要任何代价,HTML5 Boilerplate已经对此做了非常好的处理。如果你要对文件进行gzip处理, .htaccess文件需要放到网站服务器根目录下面,同时将你需要gzip压缩的特定文件列出来。注意这个文件前面的点号(这是个隐藏文件)。

HTML5 Boilerplate给.htaccess文件单独开辟了一个部分用来处理gzip压缩。对于你自己的服务器来说,你可以重用或者使用一部分文件内的设置,来帮助你开启gzip压缩。不过值得注意的是.htaccess文件只能工作在apache web服务器上,而且要开启下列模块。

  • mod_setenvif.c
  • mod_headers.c
  • mod_deflate.c
  • mod_filter.c
  • mod_expires.c
  • mod_rewrite.c

通常来讲这不是什么问题,而且有些web服务器为你已经开启了压缩,毕竟压缩文件也是web服务器最关注的几个方面之一。

衡量压缩效果

Chrome浏览器开发者工具提供了非常多的数据来度量性能,尤其是network面板。此外也有一些第三方网站可以帮你确保gzip压缩是否开启。

衡量压缩效果

Network面板检视了每个被浏览器加载的文件,且展示了文件大小及加载时间。注意gzip压缩把文件大小降低了大约60%。

衡量压缩效果

点击某个文件,观察这个文件的请求与响应消息。在这里可以确认浏览器支持怎样的方式来压缩编码。注意请求头中的accept-encoding 表示在请求头中,浏览器支持了gzip, deflate 与 sdch注意响应头中的content-encoding 表示文件是使用gzip压缩编码来传输的。

http协议及请求响应头的详细介绍可以参考深入理解HTTP协议、HTTP协议原理分析(转)一文

译者:99

压缩图片

降低文本文件的大小是有效的,如果你对图像进行压缩将会取得更好的效果。网站所有图片的大小轻易就会猛涨,因此对文件进行压缩将会极大程度的帮助你控制文件尺寸。

很多人对压缩图片敬而远之,原因是他们担心压缩图片会降低图片质量。在大多数情况下这是不正确的。图片可以以无损的方式压缩,在压缩时去除无用的颜色配置及图片信息,一点都不会影响图片自身质量。

有一些工具来帮助压缩图片,在Mac下的ImageOptim和Window下的PNGGauntlet。这两种是最常用来压缩图像,特别是JPG和PNG文件。

图片压缩的示例

未压缩前:455kb

图片压缩

压缩后,401kb

图片压缩

图片压缩

使用ImageOptim 上面的图片尺寸减小了14%,但图片质量没有下降。

同样要注意的是,在html中设置图片的宽高也会帮助页面更快的渲染,设置合适的宽高来为图片留出空间。需要明白的是,这些属性只是为了确保图片以准确大小渲染,而不会让图片收缩。如果你用一张较大的图片,但通过width height属性来缩放这张图片,这是很糟糕的方式,会加载更多的数据。

<img src="ocean.jpg" height="440" width="660" alt="Oceanview">

减少HTTP请求

与文件大小类似,一个网站的http请求数可能是网站最大的性能缺陷。每当页面与服务器建立了一个请求,页面就会加载的更慢。有些请求必须在其他请求完成后才能建立,过多的请求甚至能当掉服务器。

合并同样类型的文件

合并同类型的文件可能是一种最简单的减少http请求的方法。特别是把所有的js文件,css文件各合并成一个文件。 合并这些文件之后,压缩合并后的文件,可以成功降低http请求。

<!-- Bad -->
<link href="css/reset.css" rel="stylesheet">
<link href="css/base.css" rel="stylesheet">
<link href="css/site.css" rel="stylesheet">
<!-- Good -->
<link href="css/styles.css" rel="stylesheet">	

通常,页面中的css文件应该优先加载,可以放到head标签里面。而js文件应该最后加载,放到body的闭合标签之前。这样做的原因是当页面剩余部分正在加载时,css可以并行加载。而js刚好相反,加载时只能解析一个文件。这样,在js加载的时候就会阻止其他部分的加载。这里有两个例外:一是当js文件在页面渲染后以异步方式加载,二是有些js文件与页面渲染有关系,比如 html5 shiv( 让ie浏览器支持html5标签及设置样式)。

使用Image Sprites(css精灵/雪碧图)

ss精灵是指单张图片,利用css控制作为多个元素背景的技术。这个举措,会减少使用多张图片作为背景图所造成的http请求。

为了创建包含一些背景图片的精灵图,常见的做法是把这些背景图片排列到一张图片里。之后利用css设置这张精灵图为图片背景,之后利用background-position属性来移动图片,从而显示应该显示的部分。

with the rest of the background image being hidden. 考虑情景:一个在元素下面不断滑动的图片,只会露出这个元素所圈定的部分。比如一个元素宽高16像素,若一张图片在下面,仅仅会显示一个16*16的区域,而区域外的图片部分则不会显示。

图片精灵

这是一个文本编辑器的精灵图,其外围蓝色轮廓显示出图片背景的參考位置。

我们创建一个菜单,利用上面的精灵图作为span元素的背景图片。之后利用class类名来改变精灵图的位置,相应的图片便会显示出来。

HTML

<ul>
  <li><a href="#"><span class="bold">Bold Text</span></a></li>
  <li><a href="#"><span class="italic">Italicize Text</span></a></li>
  <li><a href="#"><span class="underline">Underline Text</span></a></li>
  <li><a href="#"><span class="size">Size Text</span></a></li>
  <li><a href="#"><span class="bullet">Bullet Text</span></a></li>
  <li><a href="#"><span class="number">Number Text</span></a></li>
  <li><a href="#"><span class="quote">Quote Text</span></a></li>
  <li><a href="#"><span class="left">Left Align Text</span></a></li>
  <li><a href="#"><span class="center">Center Align Text</span></a></li>
  <li><a href="#"><span class="right">Right Align Text</span></a></li>
</ul>	

CSS

li {
  float: left;
  list-style: none;
  margin: 0 2px;
}
li a {
  background: linear-gradient(#fff, #eee);
  border: 1px solid #ccc;
  border-radius: 3px;
  display: block;
  padding: 3px;
}
li a:hover {
  border-color: #999;
}
li span {
  background: url("sprite.png") 0 0 no-repeat;
  color: transparent;
  display: block;
  font: 0/0 a;
  height: 16px;
  width: 16px;
}
.italic {
  background-position: -16px 0;
}
.underline {
  background-position: -32px 0;
}
.size {
  background-position: -48px 0;
}
.bullet {
  background-position: -64px 0;
}
.number {
  background-position: -80px 0;
}
.quote {
  background-position: -96px 0;
}
.left {
  background-position: -112px 0;
}
.center {
  background-position: -128px 0;
}
.right {
  background-position: -144px 0;
}	

效果

图片精灵

Image Data URI

此外,利用datauri的方法可以代替css sprite雪碧图,通过datauri,图片可以被编码,从而包含在html与css内,直接被加载,消除了图片的http请求。对于一些不会更新的小图片来说Data URI非常有效,特别是html与css被缓存的时候。当然,datauri也会造成很多问题。由于更新图片需要重新编码,这种方式非常难以维护。并且在老的浏览器里,比如ie7以下,这种方式是无效的。

如果利用data uris可以减少一些http请求,而html与css可以得到有效的缓存的话,这个措施是利大于弊的。可以利用 converters pattern generators等工具来根据图片创建datauris。在使用datauris前一定要再三确保生成的datauri代码尺寸要比原图小。

HTML

<img height="100" width="660" alt="Rigged Pattern" 
  src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA
    +m62AAAAPUlEQVQYV2NkQAN9x+z/F1kdZEQXRxGAKcKmGK4QXRKdD1aIyzpkcUZcimB
    uhMljOBrdEzAbiVIIUky0QgBkMCabd5DVAwAAAABJRU5ErkJggg==">	

CSS

div {
  background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA
    +m62AAAAPUlEQVQYV2NkQAN9x+z/F1kdZEQXRxGAKcKmGK4QXRKdD1aIyzpkcUZcimB
    uhMljOBrdEzAbiVIIUky0QgBkMCabd5DVAwAAAABJRU5ErkJggg==") repeat;
}	

效果

Image Data URI

文件缓存

缓存特定文件也可以减少http请求,让页面加载的更快。当页面第一次加载后,一些特定的文件会被缓存住。之后一段时间内,重复访问这个页面时,浏览器不需要再次请求相同的文件。这段时间取决于你,是根据你想让特定类型的文件在客户端保存的时间长短来决定的。

对于gzip压缩过的文件来说,可以通过htaccess文件 来设置expires头(过期时间)用以缓存文件。 HTML5 Boilerplate再次走在了前列,他们的对.htaccess文件划分出专门一块区域来设置expires头

图片,视频,网络字体,以及一些常见的媒体类型一般都会缓存一个月,而css与js文件一般会缓存一年。Css或者其他文件如果更新频率超过一年一次的话,最好通过更改文件名进行版本控制,从而重新加载文件。此外,expires头可以改成更小的时段。

ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"

把"access plus 1 year"换成 "access plus 1 week",对于那些每周更新,但没有利用文件名做版本控制的css与js文件是更适合的。关于有效的expires头的资料可以参考 mod_expires 语法

扩展阅读:

  1. Best Practices for Speeding Up Your Web Site via Yahoo! Developer Network
  2. Rules for Faster-Loading Web Sites via Steve Sounders
  3. CSS Strategy Square-off via Viget Labs
  4. Writing Efficient CSS Selectors via Harry Roberts
  5. Minifying and Optimizing Files via Scott Hanselman
  6. HTML5 Boilerplate
  7. Data URIs via CSS-Tricks
  8. CSS DIY Organization
  9. Efficiently Rendering CSS
  10. 70 Expert Ideas For Better CSS Coding
  11. OOCSS——概念篇
  12. OOCSS——核心篇
  13. 面向对象的CSS(OOCSS)
  14. CSS架构

下一课

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

关于玖玖

某创业团队前端负责人,关注javascript应用与数据可视化。个人博客新浪微博Github,欢迎与同学一起共勉。

如需转载烦请注明出处:

英文原文:http://learn.shayhowe.com/advanced-html-css/performance-organization

中文译文:http://www.w3cplus.com/css/advanced-html-css-lesson1-performance-organization.html

HTML和CSS高级指南之五——预处理器

$
0
0

本文由大漠根据Shay Howe的《An Adavnced Guide to HTML & CSS》第五课《Preprocessors》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://learn.shayhowe.com/advanced-html-css/preprocessors,以及作者相关信息

作者:Shay Howe

译者:大漠

很多时候感觉写HTML和CSS很费力,因为我们要一遍一遍的写一些重复的东西。例如一些HTML的关闭标签和一些十六进制的CSS颜色值。

这些相同的任务,看起来是小,但加起来效率就低了。幸运的是,这些效率低下的工作,预处理器可以解决.

预处理器是一种程序,需要将一种程序的数据转换成另一种程序的数据。对于HTML和CSS,有一些流行的预处器语言,比如 HamlSass。Haml是生成HTML的,Sass是生成CSS的。

在着手解决一些常见的问题时,发现Haml和Sass使用HTML和CSS解决效率低的问题,还创建了一些方法,使创建网站更容易也更合乎逻辑。预处理器的普及也带了一些支持我们的框架要,其中最爱欢迎的是 Compass

Haml

Haml被称为 Html的抽象语言,以提供漂亮标记为目标,是一种标记语言。作为自己的一种标记语言,代码写成Haml,然后转译成HTML。Haml促进结构标记良好,提供一个令人愉快的体验,让每个人都能写或能读它。

安装

Haml需要安装Ruby才能转译成HTML,所以你要使用他,首先要确保你已安装了Ruby。对天使用Mac OSX是幸运的,因为他已预安装了Ruby,对于使用Window的用户来说,需要阅读 Windows下安装来安装Ruby。确认安装Ruby后,在你的命令终端运行"gem install haml"来安装Haml。

gem install haml		

Haml模板文件需要保存为扩展名为“.haml”文件。然后需要在命令终端中为每个文件运行编译命令,才能将haml转译成HTML。

haml index.haml index.html	

在上面的例子中,同一目录下的“index.haml”将转译成HTML结构,并将文件保存为“index.html”。这个命令必须在同一个目录下运行。在任何时候,你都可以输入命令"haml -- help"来查看haml命令列表项。

查看一个文件或目录

不幸的是Haml不提供查看一个文件或者目录的方法,因此需要依赖另一个选项来进行改变。

在Rails应用程序中,Haml依赖于Gemfile,这样Haml的改动就可以自动转译到HTML文件中。有一些桌面应用无法使用Rails,一个比较流行的是 CodeKit

另外Haml CodeKit还支持其他的预处理器,也比较好入手。

文档类型

第一部分要在Haml中写一个文档,知道在使用什么文档类型。当在使用HTML文档时,常用的一种文档类型是"HTML5"文档类型。定义haml文档类型是使用三个感叹号(!!!),随后可以紧跟一些必要的参数设置.

在Haml中默认的文档类型是HTML1.0过渡形,如果需要使用HTML5的文档类型,需要使用三个感叹号,后面紧跟一个参数5。

HAML

!!! 5	

转译成HTML

<!DOCTYPE html>	

声明元素

Haml最显著的特征是他的语法,以及如何 声明和嵌套元素。HTML元素通常都有开始和闭合标签,然而在Haml中元素只有一个开始标签。元素都是使用百分号(%)定义开始和使用缩进来识别元素的嵌套。Haml的缩进可以是一个或者多个空格组成,但重要的是缩进需要保持一致。Tab和空格不能混合在一起使用,并且在相同的文件中,相同数量的tab或者空格必须是相同的。

删除开如和闭合标签,而且根据大纲制作一个匹配的结构,这样在任何时间浏览或修改都不会造成冲突。

HAML

%body
  %header
    %h1 Hello World
  %section
    %p Lorem ipsum dolor sit amet.	

转译成HTML

<body>
  <header>
    <h1>Hello World</h1>
  <header>
  <section>
    <p>Lorem ipsum dolor sit amet.</p>
  </section>
</body>	

处理文本

在Haml文本可以放在元素的同一行进行声明,也可以元素后面断行缩进进行声明。文本不能同时在声明元素或嵌套元素的同一行,上面的例子可以将代码重新写成:

%body
  %header
    %h1
      Hello World
  %section
    %p
      Lorem ipsum dolor sit amet.		

属性

在Haml中,属性的声明与元素的声明有些不一样。属性的声明直接在元素的后面跟上{}或者(),但在Ruby和HTL语法中不一样。在Ruby中属性样式使用的是hash语法,都放在{}里,在HTML中属性样式使用的是标准的HTML语法,放在()里。

HAML

%img{:src => "shay.jpg", :alt => "Shay Howe"}
%img{src: "shay.jpg", alt: "Shay Howe"}
%img(src="shay.jpg" alt="Shay Howe")		

转译出来的HTML

<img src="shay.jpg" alt="Shay Howe">	

Classes和IDs

Class和ID属性声明和其他属性的声明一样,但他们有时也有点不一样。类名的列表与ID是直接跟在元素的后面而不需要使用{}和()。在元素的后面紧跟"."来定义类名和使用“#”来定义ID。

然而,使用一定的格式可以把属性混合在一起匹配。类名使用“.”来匹配,而其他属性使用之前所说的格式来匹配。

HAML

%section.feature
%section.feature.special
%section#hello
%section#hello.feature(role="region")	

转译成HTML

<section class="feature"></section>
<section class="feature special"></section>
<section id="hello"></section>
<section class="feature" id="hello" role="region"></section>

Div的类名和IDs

事实上,如果一个类名或者ID用在“div”上,那么“%”符号可以省略,并且类名和ID或者ID可以直接使用。同样类名用“.”来定义,ID用“#”来定义。

HAML

.awesome
.awesome.lesson
#getting-started.lesson	

转译成HTML

<div class="awesome"></div>
<div class="awesome lesson"></div>
<div class="lesson" id="getting-started"></div>

布尔属性

在Ruby或者HTML中布尔属性处理方式都取决于所使用的语法。

HAML

%input{:type => "checkbox", :checked => true}
%input(type="checkbox" checked=true)
%input(type="checkbox" checked)	

转译出来的HTML

<input type="radio" checked >	

转译文本

Haml另一个好处是可以求值和运行Ruby,便这并不总是理想的。文本和代码行数可以使用反斜杠“\”避开,使用文本没有明显的执行。

在下面的例子中,第一行语句“= @author”在Ruby中执行,从应用程序中调用作者的名字,第二行语句使用了反斜杠“\”避开调用程序,只显示文本。

HAML

.author
  = @author
  \= @author	

转译成HTML

<div class="author">
  Shay Howe
  = @author
</div>	

文本转译的替代方案

有时候文本的转译不是工作的需要,Ruby需要打印出所需要的内容。一个典型的例子就是,一个段落需要输入一个链接,而不是链接的文本。把一个句号放在新的一行是不会接受,他会认为定义一个空的类名,这样将会引起一个错误。在句号前使用一个反斜杠“\”,可以转译这个字符,但最后一句和句号之间只会产生一个空白。再一次不会直接输出。

在这些情况下,Ruby的帮助能派上用场。在下面的例子中,帮助助手用于放置一个句号,后面直接跟上最后一句话,但仍然输出锚文本。

HAML

%p
  Shay is
  = succeed "." do
    %a{:href => "#"} awesome	

转译成HTML

<p>Shay is <a href="#">awesome</a>.

注释

在Haml中注解和元素与属性的处理方式有点不一样。最简单的,可以使用斜杠(/)来注解掉代码。一行代码的注释,可以在代码行开始之处使得一个斜杠(/),块注释掉的代码,斜杠(/)放在嵌套代码前面。

HAML

%div
  / Commented line
  Actual line
/
  %div
    Commented block	

转译成HTML

<div>
  <!-- Commented line -->
  Actual line
</div>
<!--
  <div>
    Commented block
  </div>
-->

条件注释

在Haml中条件注释处理方式也不一样。创建条件注释需要使用到方括号[],在里面放上条件。这些方框号要直接放在反斜杠(\)后面。

HAML

/[if lt IE 9]
  %script{:src  => "html5shiv.js"}	

转译成HTML

<!--[if lt IE 9]>
  <script src="html5shiv.js"></script>
<![endif]-->

无记载的注释

Haml也可以提供Haml具体的注释和无记载的注释。无记载的注释不同于一般的Haml注释,页面输出是不会有任何注释内容,也不会显示出来。无记载的注释使用一个破折号和一个井号(-#)来声明。与其他注释相比,无记载注释还可以删除一行或多行的嵌套。

HAML

%div
  -# Removed line
  Actual line	

转译成HTML

<div>
  Actual line
</div>	

过滤器

Haml提供了少量的过滤器,允许在Haml内输出一些不同类型。过滤器的定义是使用冒号(:),后面紧跟一个过滤器名,例如“:markdown”,所有过滤内容嵌套在他下面。

常见的过滤器

下面是一些常用的过滤器名,其中“:css”和“:javascript”是使用最多的。

  • :cdata
  • :coffee
  • :css
  • :erb
  • :escaped
  • :javascript
  • :less
  • :markdown
  • :maruku
  • :plain
  • :preserve
  • :ruby
  • :sass
  • :scss
  • :textile

Javascript过滤器

:javascript
  $('button').on('click', function(event) {
    $('p').hide('slow');
  });	

转译出来的HTML

<script>
  $('button').on('click', function(event) {
    $('p').hide('slow');
  }); 
</script>	

CSS和Sass过滤器

请注意":sass"或者其他CSS预处理器,不能使用内部的“:css”过滤器。过滤器是一个严格声明的,不能在一个过滤器内嵌套另一个过滤器。

HAML

:css
  .container {
    margin: 0 auto;
    width: 960px;
  }
%style
  :sass
    .container
      margin: 0 auto
      width: 960px	

转译成HTML

<style>
  .container {
    margin: 0 auto;
    width: 960px;
  }
</style>	

Ruby的插入值

正如前面所言,Haml可以使用Ruby的变量,有时候会使用Ruby来调用变量生成文本。事实上,Ruby有一个内插值功能,Ruby的变量值写在#{}内。

下面是一个例子,Ruby插入类名的一部分

HAML

%div{:class => "student-#{@student.name}"}	

转译成HTML

<div class="student-shay">	

Sass & Scss

SCSS和Sass是CSS预处理器语言,可以将代码转译成CSS,他们和Haml非常相似,可以让我们编写代码简单,也提供一些特些服务。其实SCSS和Sass源自一起,只是他们的语法略有不同。

Sass是 很优秀的样式语言,最重要的,需要遵守严格的缩进嵌套。SCSS,时髦的CSS,和Sass极其相似,但提供更灵活的语法,类似于CSS的语法。

安装

和Haml一样,SCSS和Sass的 转译要使用Ruby,因盯Ruby需要创建CSS文件。在确保安装了Ruby,请按照说明进行安装。

一旦Ruby安装好了,可以在命令行中输入“gem install sass”命令来安装SCSS和Sass。

 gem install sass 

SCSS或者Sass文件需要以“.scss”或者“.sass”扩展名定义。可以通过下面的命令将这两种文件转译成".css"文件。

 sass styles.sass styles.css 

上面的命令将“style.sass”转译成“style.css”文件。与Haml一样,这些文件同样要放在一个文件路径下。

也可以通过watch命令,可以看到sass文件转变为css文件。

 sass --watch styles.sass:styles.css 

此外,而不是编译或者看个人文件,Sass能够编译和观看完整的文件目录。例如,查看Sass文件整个目录或者通过下面的Sass命令,可以将Sass文件转译成css文件。

sass --watch assets/sass:public/css  

将SCSS文件转换成Sass或者Sass转换成SCSS

上面介绍了将Sass和SCSS转译成CSS文件,也可以将SCSS转成Sass,反之也可以将Sass转成SCSS。

# Convert Sass to SCSS
sass-convert styles.sass styles.scss
# Convert SCSS to Sass
sass-convert styles.scss styles.sass   

语法

正如前面提到的,Sass和SCSS的主要共别就是他们的语法不同。SCSS的语法和常规的CSS并没有太大的不同。事实上,SCSS像CSS一样在内部使用。Sass需要严格的语法,任何缩进和字符的错误都会造成样式的编译错误。Sass可以省略花括号{}和分号(;),完全依靠严格的缩进和格式化代码。

SCSS

.new {
  color: #f60;
  font-weight: bold;
  span {
    text-transform: uppercase;
  }
} 

SASS

.new
  color: #f60
  font-weight: bold
  span
    text-transform: uppercase  

转译成CSS

.new {
  color: #f60;
  font-weight: bold;
}
.new span {
  text-transform: uppercase;
}  

SCSS VS Sass

决定是否使用SCSS还是Sass归结为个人的爱好和一个团队和项目更适合哪个。另外每个语法都有其自己的优点和却点。

事实上,我更喜欢Sass的语法,因为不用提供更多的字符,我也深信,这是一个简洁的语法。Sass不允许像SCSS一样直接输入CSS,而且不会容忍任何的错误。Sass还有着更多值得我们去学习的曲线。

下面的例子我们主要使用Sass,当然也可以使用SCSS。

嵌套

从上面语法的例子中,你就会注意到,选择器可以嵌套在另一个选择器中,创建一个复合选择器。嵌套还可以快速识别选择器,但不要嵌套的太深。不要模糊的嵌套或者在同一个选择器上嵌套太深。在不提高特殊性情况下使用一个特定的选择器是最生要的。

SASS

.portfolio
  border: 1px solid #ccc
  ul
    list-style: none
  li
    float: left 

转译成CSS

.portfolio {
  border: 1px solid #ccc;
}
.portfolio ul {
  list-style: none;
}
.portfolio li {
  float: left;
}  

属性的嵌套

上面介绍的是选择器的嵌套,他还可以属性嵌套。常用的属性嵌套主要是“font”、“margin”、“padding”和“border”。SCSS和Sass一样,都具有这些特性。有些人认为属性缩写比较好,也有人认为缩写没必要,至于怎么选择还是取决于你的爱好。

SASS

 div
  font:
    family: Baskerville, Palatino, serif
    style: italic
    weight: normal 

转译成CSS

div {
  font-family: Baskerville, Palatino, serif;
  font-style: italic;
  font-weight: normal;
}  

Media Queries嵌套

Media Queries也可以嵌套在一个选择器,根据媒体的条件来改变属性值。

SASS

.container
  width: 960px
  @media screen and (max-width: 960px)
    width: 100%  

转译成CSS

.container {
  width: 960px;
}
@media screen and (max-width: 960px) {
  .container {
    width: 100%;
  }
}  

父选择器

Sass提供一种方法,父选择嘎嘎到前一个选择器添加样式,主要通过&实现。最常见的父选择器是用于关联一个伪类,例如:“:hover”,然而这并不是必须的。另外父选择器可以用来绑定附加选择器,这也是&的特色。

SASS

 a
  color: #8ec63f
  &:hover
    color: #f7941d 

转译成CSS

a {
  color: #8ec63f;
}
 a:hover {
  color: #f7941d;
}  

父关键选择器

就是说 parent selector 也可以用作关键字选择器,把具有某种特性的元素集合起来作为一个选择集合。 有很多场景可以这么应用parent selector(来作为关键字选择器),不过最通常,最有用的情形是特征检测。

SASS

.btn
  background: linear-gradient(#eee, #ccc)
  .no-cssgradients &
    background: url("gradient.png") 0 0 repeat-x  

转译成

.btn {
  background: linear-gradient(#eee, #ccc);
}
.no-cssgradients .btn {
  background: url("gradient.png") 0 0 repeat-x;
}  

注释

Sass的注释和Haml非常的相似。和标签的CSS注释语法一样,/*...*/,然而Sass还有另一种注释,可以方便的注释一行代码或者注释一行注解。

Sass另一种注释是使用两个斜杠“//”,任何行内容或者嵌套都可以方便的注释掉,但转译出来的CSS会忽略这种注释的内容。注意下面的示例演示在转译出来的CSS中忽略了双斜杠的注释。

SASS

/* Normal comment */
div
  background: #333
// Omitted comment
strong
  display: block  

转译出来的CSS

/* Normal comment */
div {
  background: #333;
}
strong {
  display: block;
}  

变量

变量是Sass提供的另一个特性。在Sass中你可以定义变量,然后在调用这个变量。

Sass中定义变量使用美元符号“$”,紧随其后的是变量名,变量值与变量名之间是一个冒号和空格,例如“$font-base: 1em”。至于变量值可以是数字、字符串、颜色、布尔值或者空,如果变量值有一系列,那么一系列值由空格或逗号分开。

SASS

$font-base: 1em
$serif: "Helvetica Neue", Arial, "Lucida Grande", sans-serif
p
  font: $font-base $serif 

转译成CSS

p {
  font: 1em "Helvetica Neue", Arial, "Lucida Grande", sans-serif;
}  

替换变量

在Sass的一个文档内,大部分变量可以在任何地方使用。然而,有时候需要使用“#{}”插入进去。有些时候,变量需要插入进去当作类名,属性值,或者一串文本。

SASS

$location: chicago
$offset: left
.#{$location}
  #{$offset}: 20px  

转译成CSS

.chicago {
  left: 20px;
}  

运算

Sass在很多情况也可以做运算,运算可以处理大部分的问题,例如加、减、乘、除和四舍五入。

除了使用加号“+”做加法运算,还可以做有没有单位的运算。当有单位的计算,第一个方程的单位将用于计算。例如,10px像素加上1英寸将等于106px像素。减法的处理方式和加法的相同,只是把加号换成减号。

乘法使用的是“*”符号,然后在任何时候都只使用数字,包括有度量单位的时候。除法使用是百分比符号“%”,和乘法一样,在任何时候只使用数字,包括有度量单位的时候。

SASS

width: 40px + 6
width: 40px - 6
width: 40px * 6
width: 40px % 6  

转译成CSS

width: 46px;
width: 34px;
width: 240px;
width: 4px;  

除法

在Sass中用于处理一些CSS属性,除法使用斜杠“/”会有点棘手。一般来说,如果CSS值中包含了变量(值包裹在括号内,或者作为另一个等式的一部分),那么斜杠就会作为除法来生效。

当除法中只有一个单位时,会保留单位,当除法中有两个单位时,结果将会没有单位。

SASS

width: 100px / 10
width: (100px / 10)
width: (100px / 10px)
$width: 100px
width: $width / 10
width: 5px - 100px / 10  

转译成CSS

width: 100px/10;
width: 10px;
width: 10;
width: 10px;
width: -5px;  

数学运算

你可能希望Sass可以结合多个数学运算,在Sass中也遵循数学运算符的顺序,先算括号内的,在算乘除,在算加减。

SASS

$grid: 16
$column: 40px
$gutter: 20px
$container: ($column * $grid) + ($gutter * $grid)
width: $container  

转译成CSS

width: 960px;  

数值型函数

默认情况下,Sass包括少量的内部函数,其中许多都是用来操纵数字的。

percentage()函数将值转换为百分数,round()函数将一值转换为整数(四舍五入),ceil()函数将一小数转换一个整数(向上入),floor()函数将一个值转换为整数(向下舍),abs()取一个值的绝对值。

  1. percentage()
  2. round()
  3. ceil()
  4. floor()
  5. abs()

SASS

width: percentage(2.5)
width: round(2.5px)
width: ceil(2.5px)
width: floor(2.5px)
width: abs(-2.5px)  

转译成CSS

width: 250%;
width: 3px;
width: 3px;
width: 2px;
width: 2.5px; 

颜色

Sass在处理颜色方面提供了相当多的帮助,提供了处理和管理颜色的不同的特性。在Sass中一个常用的特征是能够改变一个十六进制的颜色,或者变量,或者是将其转换成一个Rgba颜色。

SASS

color: rgba(#8ec63f, .25)
$green: #8ec63f
color: rgba($green, .25)  

转换成CSS

color: rgba(142, 198, 63, .25);  

颜色运算

可以通过加减乘除计算颜色。如我们想像的,可以对红色、绿色和蓝色进行一些数学方面的计算。

SASS

color: #8ec63f + #666
color: #8ec63f * 2
color: rgba(142, 198, 63, 0.75) / rgba(255, 255, 255, 0.75)  

转译成CSS

color: #f4ffa5;
color: #ffff7e;
color: rgba(0, 0, 0, 0.75);  

改变颜色

使得颜色运算是非常有用的,但有一些挑战性。在这种情况下,颜色变化可能是一个更好的选择。改变颜色提供了反相、互补、混合色和灰度等几种函数。

  1. invert()
  2. complement()
  3. mix()
  4. grayscale()

SASS

color: invert(#8ec63f)
color: complement(#8ec63f)
color: mix(#8ec63f, #fff)
color: mix(#8ec63f, #fff, 10%)
color: grayscale(#8ec63f)  

转译成CSS

color: #7139c0;
color: #773fc6;
color: #c6e29f;
color: #f3f9eb;
color: #838383;  

改变HSLA颜色

改变HSLA颜色更进一步的添加了一些改变函数,常见改变HSLA的函数包括有:lighten()、darken()、saturate()和desaturate()。

  1. lighten()
  2. darken()
  3. saturate()
  4. desaturate()
  5. adjust-hue()
  6. fade-in()
  7. fage-out()

SASS

color: lighten(#8ec63f, 50%)
color: darken(#8ec63f, 30%)
color: saturate(#8ec63f, 75%)
color: desaturate(#8ec63f, 25%)
color: adjust-hue(#8ec63f, 30)
color: adjust-hue(#8ec63f, -30)
color: fade-in(rgba(142, 198, 63, 0), .4)
color: fade-out(#8ec63f, .4)  

转译成CSS

color: white;
color: #3b5319;
color: #98ff06;
color: #89a75e;
color: #4ac63f;
color: #c6bb3f;
color: rgba(142, 198, 63, 0.4);
color: rgba(142, 198, 63, 0.6);  

颜色操作

Sass的颜色也可以直接操作,操作颜色提供了如何更好控制颜色的特性。当然这个控制也是十分复杂,这种操作也前面所讲的颜色改变操作方法有些不一样。

change-color():设置任何一颜色的属性
$color,[$red],[$green],[$blue],[$hue],[$saturation],[$lightness],[$alpha]
adjust-color():递增一个颜色任何属性
$color,[$red],[$green],[$blue],[$hue],[$saturation],[$lightness],[$alpha]
scale-color():基于颜色属性上流动划分百分值
$color,[$red],[$green],[$blue],[$hue],[$saturation],[$lightness],[$alpha]

SASS

color: change-color(#8ec63f, $red: 60, $green: 255)
color: adjust-color(#8ec63f, $hue: 300, $lightness: 50%)
color: scale-color(#8ec63f, $lightness: 25%, $alpha: 30%)  

转译成CSS

color: #3cff3f;
color: white;
color: #aad46f;  

继承

继承可以不需要重写代码或者添加任何类名共享一些相同的样式,提供了一个完美的方式来操持模块化。元素和类选择器两者都可以被用作一个扩展,或者一个点位符选择器也可以用于创建继承。

使用“@extend”紧跟选择器来创建继承,而不是复制属性和值,最初的选择器和额外选择器都可以被用作于其他选择器的继承。

总之,这提供了一种方法来快速的重用代码而没有增加代码。此外继承很好的配合了OOCSS和SMACSS创建。

SASS

.alert
  border-radius: 10px
  padding: 10px 20px
.alert-error
  @extend .alert
  background: #f2dede
  color: #b94a48  

转译成CSS

.alert,
.alert-error {
  border-radius: 10px;
  padding: 10px 20px;
}
.alert-error {
  background: #f2dede;
  color: #b94a48;
}  

占位符选择器继承

为了避免用于继承而创建一些闲置的类,我们可以使用所谓的占位符选择器。占位符选择器是使用百分号(%)来初始化(这在CSS中是从未使用过,来直接编写CSS的),他是用来代替继承中的选择器。在下面的一个例子中“.alert”选择器是将不会被转译到CSS代码中的。

SASS

%alert
  border-radius: 10px
  padding: 10px 20px
.alert-error
  @extend %alert
  background: #f2dede
  color: #b94a48  

转译成CSS

.alert-error {
  border-radius: 10px;
  padding: 10px 20px;
}
.alert-error {
  background: #f2dede;
  color: #b94a48;
}  

元素选择器继承

和类选择器一样,元素选择器也可以用于继承中。

SASS

h2
  color: #9c6
  span
    text-decoration: underline
.sub-heading
  @extend h2  

转译成CSS

h2, .sub-heading  {
  color: #9c6;
}
h2 span, .sub-heading span {
  text-decoration: underline;
}  

混合

混合提供了一种简单的模板(包括属性和值),然后可以在不同的选择器共用这个模块。混合和继承不同在于混合允许参数一起继承到基本个地方。

混合使用“@mixin”来进行声明,里面可以设置任何参数,然后任何风格都在规则上描述。调用混合,需要在选择器使得“+”号,同时可以在混合中设置任意参数。

有一点需要注意,在SCSS中调用混合有点不一样,在SCSS中调用混合是使用“@include”来代替“+”号。

SASS

@mixin btn($color, $color-hover)
  color: $color
  &:hover
    color: $color-hover
.btn
  +btn($color: #fff, $color-hover: #ccc)  

转译成CSS

.btn {
  color: #fff;
}
.btn:hover {
  color: #ccc;
}  

默认参数

使用上面相同的例子,如果你想要,可以在混合中写入默认参数

SASS

@mixin btn($color: #fff, $color-hover: #ddd)
  color: $color
  &:hover
    color: $color-hover
.btn
  +btn($color-hover: #ccc)  

转译成CSS

.btn {
  color: #fff;
}
.btn:hover {
  color: #ccc;
}  

变量参数

当一个名多个值需要被传递时,参数的变量名可能以带“...”结束,如下面阴影的例子,我们可以通过给阴影每个值用逗号分隔

SASS

@mixin box-shadow($shadows...)
  -moz-box-shadow: $shadows
  -webkit-box-shadow: $shadows
  box-shadow: $shadows
.shadows
  +box-shadow(0 1px 2px #eee, inset 0 0 5px #eee)  

转译成CSS

.shadows {
  -moz-box-shadow: 0 1px 2px #eee, inset 0 0 5px #eee;
  -webkit-box-shadow: 0 1px 2px #eee, inset 0 0 5px #eee;
  box-shadow: 0 1px 2px #eee, inset 0 0 5px #eee;
}  

导入

SASS最好的一个特征是在一个单独的文件中可以导入多个“.scss”或者“.sass”文件。集成所有文件到一个样式表中使用,易于管理,而且不会有其他的HTTP请求。

在HTML文档中只引用一个导入了所有样式表的Sass文件,而不是引用所有不同的样式表。

在下面的例子中,三个文件“_normalize.sass”、“_grid.sass”和“_typography.sass”都引入到一个文件中。事实上只style.sass文件导入了其他的样式文件,然后编译成style.csss。所以在HTML文档中最终只调用了一个style.css文件。

SASS

@import "normalize"
@import "grid", "typography"

转译成CSS

<link href="styles.css" rel="stylesheet">

循环和条件语句

对于更复杂的Sass样式,支持不同控制命令。其重要的理解这些命令,并不用于日常样式,而是创建详细的混合。这些命令看起来很熟悉,因为和其他的编程语言很相似。

运算符

一些循环和条件需要运算符来决定,这些运算符可以分为关系和比较运算符。关系运算符用来决定两个实体之关的关系,而比较运算符用来确定不同实体之间的平等关系。

  1. <:小于
  2. >:大于
  3. ==:等于
  4. <=:小于或等于
  5. >=:大于或等于
  6. !=:不等于
// Relational Operators
6 < 10    // true
4 >= 60   // true
8 > 2     // true
10 >= 10  // true

// Comparison Operators
#fff == white   // true
10 + 30 == 40   // true
normal != bold  // true  

if语句

@if规则测试表达式,然后加载对应的样式,而表达式把返回的是真假或null。@if语句是加载最初样式规则,也可以使用@else if或@else来判断,一旦某个投机条件就会加载对应条件中的样式。

SASS

$shay: awesome
.shay
  @if $shay == awesome
    background: #f60
  @else if $shay == cool
    background: #404853
  @else
    background: #000  

转译成CSS

.shay {
  background: #f60; 
}  

for循环

@for规则基于一个计算器,输出不同的样式,有两种不同的循环形式。例如,“@for $i from 1 to 3”将输出1和1,但不包括3。另外一种方式“@for $i from 1 through 3”将输出1至3,包括3。

SASS

@for $col from 1 to 6
  .col-#{$col}
    width: 40px * $col  

转译成CSS

.col-1 {
  width: 40px;
}
.col-2 {
  width: 80px;
}
.col-3 {
  width: 120px;
}
.col-4 {
  width: 160px;
}
.col-5 {
  width: 200px;
}  

each循环

非常简单,@each规则为每个列表项把回样式,列表可以包含多个列表项,这些列表项用逗号隔开。

SASS

@each $class in uxd, rails, html, css
  .#{$class}-logo
    background: url('/img/#{$class}.jpg')  

转译成CSS

.uxd-logo {
  background: url("/img/uxd.jpg");
}
.rails-logo {
  background: url("/img/rails.jpg");
}
.html-logo {
  background: url("/img/html.jpg");
}
.css-logo {
  background: url("/img/css.jpg");
}  

while循环

@while规则不断返回样式,直到条件不成立。这个规则可以接受不同的运算和计数器变量,能够精确控制循环输出

SASS

$heading: 1
@while $heading <= 6
  h#{$heading}
    font-size: 2em - ($heading * .25em)
  $heading: $heading + 1  

转译成CSS

h1 {
  font-size: 1.75em;
}
h2 {
  font-size: 1.5em;
}
h3 {
  font-size: 1.25em;
}
h4 {
  font-size: 1em;
}
h5 {
  font-size: 0.75em;
}
h6 {
  font-size: 0.5em;
}  

其他预处理器

Haml和Sass远非是唯一的预处理器,包括JavaScript预处理器一样。一些流行的预处理器包括:JadeSlimLESSStylusCoffeeScript

在这一节课程只覆盖了Haml和Sass两个预处理器。选中他们,是因为它们适合在Ruby和在Rails的Ruby应用程序运行。而且他们还得到了巨大的社区的支持。

当谈到选择,使用哪个预处理器最生要的考虑是你的团队和项目适合哪个。项目建立在Node.js上可能Jade和Stylus更适合。不过最重要的考虑还是要考虑你的团队习惯使用哪个。

上一课下一课(正在整理之中,静请期待)

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

如需转载烦请注明出处:

英文原文:http://learn.shayhowe.com/advanced-html-css/preprocessors

中文译文:http://www.w3cplus.com/css/advanced-html-css-lesson5-preprocessors.html

HTML和CSS高级指南之四——响应式设计

$
0
0

本文由D姐根据Shay Howe的《An Adavnced Guide to HTML & CSS》第四课《Responsive Web Design》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://learn.shayhowe.com/advanced-html-css/responsive-web-design,以及作者相关信息

作者:Shay Howe

译者:D姐

互联网发展的速度超乎所有人的想象,甚至可以说是疯狂。在过去几年里,移动互联网的发展已经开始崭露头角。而他的发展速度也远远超过了传统互联网。

如今很难找到一个人既没有移动设备,也没有多个可以上网的设备。在英国 移动电话的数量已远远超过人口数,保持这样的 增长势头,今年移动互联网的使用应该就有望超过桌面互联网。

随着移动互联网的兴起,也带来了一个问题,就是如何搭建一个网站,可以适合所有用户访问。行业对于这个问题的回答是响应式设计,也就是熟知的RWD。

第四课所涉及的主要内容

HTML

CSS

响应式设计概述

响应式设计是一个网站搭建的实践尝试,他使得每种设备和屏幕尺寸都能很好的工作,而不论是大屏还是小屏,手机或是pc。响应式设计关注于提供每个人一个直观的感受和满足。使得pc和手机用户都能够从中受益。

响应式设计本身的很多术语是由Ethan Marcotte提出的。他们第一次出现在Ethan在线访谈和他的书中,而且响应式这本书也是很值得一读的。

响应式设计

Food Sense是个很漂亮的网站,他响应所有不同的设备尺寸。不管设备尺寸大小如何,食物感官网站都可以轻松适应,给用户一个很自然的用户体验。(如上图所示)

响应式、自适应、移动的区别

响应式中的一些术语可能并不是新的,而其他术语又跟自适应或是移动有点像。那么你也许会困惑,他们之间的区别到底是什么?

响应式和自适应的关系很密切,经常二者是互通的。响应式通常意味着对待任何变化,反应更积极更快。而自适应往往是应对一个新需求或是情况的被动反应,例如变化。响应式设计应对不同因素的变化,都会很流畅自如,例如设备宽度。而自适应设计会基于一定的因素搭建。将二者结合是一种理想化,提供一个完美功能模式的网站,这个术语不会产生很大的歧义。

另一方面,移动设备,通常意味着需要为移动用户,专门搭建一个移动网站。然而这样做可能有些作用,却不是很好的主意。移动网站要求必须非常轻巧,然而他又很依赖一个新的代码库和浏览器的嗅探。所有的这些都是摆在开发者和用户面前的一个障碍。

目前在响应式设计中最流行的技术,就是对于不同浏览器和设备的动态布局设计,他会根据不同的浏览器和设备尺寸的变化,动态改变网页的布局和内容。这个解决方案充分发挥了响应式,自适应和移动设备的三方优势。

扩展阅读

  1. Responsive Web Design
  2. Responsive设计的十个基本技巧
  3. Responsive设计的关键三步
  4. 了解Responsive网页设计的三个特性
  5. Responsive列布局
  6. 响应式导航菜单在移动端的制作方法与解决方案
  7. 基于CSS搭建一个响应式网站
  8. Responsive教程集(W3cplus提供)
  9. Responsive资源集(W3cplus提供)
  10. Responsive Web Design
  11. Viewport Percentage Lengths
  12. CSS Media Queries
  13. Mobile First Presentation via Luke Wroblewski
  14. An Introduction to Meta Viewport and @viewport

大漠

流式布局

响应式设计主要有三部分组成:流式布局,媒体查询和灵活的媒体类型。第一部分,流式布局,就是用灵活的网格搭建一个网站布局,它可以动态的调整以适应于任何宽度。网格布局使用相对长度单位,通常是百分比或是em。这些相对长度多用于网格,诸如宽度,间距或是留白等属性。

相对视窗长度

Css3中引入一些新的相对长度,他们是针对浏览器或是设备视窗尺寸的,这些新单位包括vw,wh,vmin和vmax。目前支持他们的设备或是浏览器并不多,但是支持他们的数量在不断增长。他们在搭建响应式网站发挥很大的作用。

  • vw:视窗宽度;
  • vh:视窗高度;
  • vmin:视窗最小尺寸;
  • vmax:视窗最大尺寸;

相对视窗长度扩展阅读:

  1. Combining meta viewport and media queries
  2. A tale of two viewports — part two
  3. Learning to Love the Boring Bits of CSS
  4. An introduction to meta viewport and @viewport
  5. SIZING WITH CSS3'S VW AND VH UNITS
  6. CSS Length
  7. New Viewport-relative Units
  8. @-ms-viewport rule
  9. CSS Values and Units Module Level 3

大漠

流式布局不推荐使用固定单位,如px或是英寸。因为屏幕的宽高会随着设备的不同而改变。网站布局需要适应这种变化,而固定单位有太多的限制。幸运的是,Ethan指出用一个简单的公式,就可以在流式布局中使用相对值。

公式是用目标元素的宽度除以他父元素的宽度,结果就是目标元素的相对宽度:

target ÷ context = result	

灵活网格

让我们看看这个公式在两列布局中是如何运用的。一个container的div,包裹着section和aside两个元素。Section在左aside在右,他们之间是相等的间距。这样布局的结构和样式大致如下:

HTML

<div class="container">
  <section>...</section>
  <aside>...</aside>
</div>	

CSS

.container {
  width: 660px;
}
section {
  float: left;
  margin: 10px;
  width: 420px;
}
aside {
  float: right;
  margin: 10px;
  width: 200px;
}	

效果:

灵活网格

使用网格公式我们可以把固定长度换算成相对单位长度。这个例子中我们将使用百分比,他跟em有相同的效果。注意,不管容器变的多宽,section和aside之间的间距和宽度都会按照比例变化。

.container {
  max-width: 660px;
}
section {
  float: left;
  margin: 1.51515151%;   /*  10px ÷ 660px = .01515151 */
  width: 63.63636363%;   /* 420px ÷ 660px = .63636363 */   
}
aside {
  float: right;
  margin: 1.51515151%;   /*  10px ÷ 660px = .01515151 */
  width: 30.30303030%;   /* 200px ÷ 660px = .30303030 */
}	

效果

灵活网格

采用流式布局概念和公式,把他们运用到网格的所有部分,就可以创建一个完全动态的网站了,它可以适应各种尺寸的设备。为了更好的控制流式布局,你也可以使用最小宽度(min-width),最大宽度(max-width),最小高度(min-height)和最大高度(max-height),把他们应用到容器元素(container)上。

仅仅有流式布局是不够的。有时浏览器的显示窗口宽度可能很小,以至于按照缩放比例得到的布局,创建出来的列太小不能有效的显示内容。具体说,就是当布局太小或是太大,内容可能难以辨认,布局也可能遭到破坏。在这种情况下,媒体查询就用来辅助建立一个更好的用户体验。

灵活网格扩展阅读

  1. CREATE A FLEXIBLE LAYOUT
  2. FLEXIBLE WEB DESIGN
  3. Writing a Flexible Grid Script for Photoshop
  4. Don’t Overthink It Grids
  5. Blankwork:Simple, Flexible and Semantic
  6. 5grid
  7. Responsive设计的十个基本技巧
  8. Mobile Responsive Design: The Flexible Grid
  9. Flexibility: A Foundation for Responsive Design
  10. Going From Adaptive To Fully Responsive
  11. Responsive Web Design
  12. Gridpak: The Responsive Grid Generator
  13. Five steps to gettin’ flexy in responsive web design
  14. 30+ CSS Grid System
  15. 8个实用的响应式设计框架

大漠

媒体查询

媒体查询是对媒体类型的一个扩展,因为经常发现目标设备自带样式,他为特定的浏览器和设备提供特殊的样式。能够为目标设备提供有针对性的样式,在响应式设计中发挥作用。

初始化媒体查询

有好几种方式使用媒体查询,在现有样式表中使用@media规则,或是在一个新样式表里使用@import规则,或是用link标签给html文档引用一个单独的样式表。通常推荐在现有样式表中使用@media规则,以避免多次发送http请求:

HTML

<!-- Separate CSS File -->
<link href="styles.css" rel="stylesheet" media="all and (max-width: 1024px)">

CSS

/* @media Rule */
@media all and (max-width: 1024px) {...}
/* @import Rule */
@import url(styles.css) all and (max-width: 1024px) {...}	

每个媒体查询可以包含一个或多个媒体类型。常见的媒体类型有所有(all),屏幕(screen),打印(print),电视(tv)和盲文(braille)。Html5中又添加了新的媒体类型,甚至包含3d眼镜(3d-glasses)。一个没有特别声明媒体类型的媒体查询,默认媒体类型是屏幕(screen)。

媒体查询表达式可能包含不同的媒体属性和属性值,然后分配是真还是假。当一个媒体属性和值都为真时,应用样式,否则忽略样式。

媒体查询中的逻辑运算符

媒体查询中的逻辑运算符,帮助建立强大的表达式。在媒体查询中有三个不同的逻辑运算符,分别是与(and),非(not)和唯一(only)。

在媒体查询中使用与逻辑运算符,容许添加额外的条件,以确保浏览器或是设备同时满足a,b,c条件等等。多个媒体查询可以用逗号分开,作为一个筛选条件。下面的例子就是选择满足宽度在800到1024之间的所有设备。

@media all and (min-width: 800px) and (max-width: 1024px) {...}	

在查询中的非逻辑运算符,表示除了满足查询条件设备的所有设备都适用。在这个例子表达式,就是应用于任何设备除了彩屏的,黑白屏或是单色屏幕都适用。

@media not screen and (color) {...}	

唯一的逻辑运算符是一个新运算符,不识别html4算法的用户代理,所以隐藏设备或是浏览器不支持的媒体查询样式。下面表达式只匹配屏幕方向是竖屏,能够渲染的媒体查询的用户代理。

@media only screen and (orientation: portrait) {...}	

忽略一个媒体类型

当同时使用非和唯一逻辑运算符,媒体类型就会失效,这种情况下媒体类型是默认的所有设备。

在媒体查询中的媒体特性

了解媒体查询的语法和逻辑运算符如何工作,对于媒体查询而言是个了不起的事情,但是真正工作的却是媒体特性。媒体属性可以识别出在媒体查询表达式中,有针对的属性是什么?

媒体特性中的宽高

最常见的一种媒体特性围绕设备或浏览器视窗的宽高。这些尺寸可以使用媒体特性中的height,width,device-height和 device-width获取到,并且这些特性均可以用min或max作为前缀,建立例如min-width 或 max-device-width的特性。

宽高基于视窗渲染区域的宽高而定,以浏览器窗口为例。另一方面,设备高度和设备宽度特性,是基于输出设备的宽高,他们也许大于实际的渲染区域。这些宽高媒体特性可以使用任何相对或绝对的长度单位。

@media all and (min-width: 320px) and (max-width: 780px) {...}	

在响应式设计中使用最多的特性是最小宽度和最大宽度,它有助于在台式机和移动设备搭建同样的响应式网站,避免与设备特性的混淆。

使用最大最小前缀

最大最小前缀在媒体特性中有相当多的地方使用。最小前缀表示一个值大于或是等于,而最大前缀表示一个值小于或是等于。使用最大最小前缀避免与html普通语法冲突,尤其不用使用<和>符号

屏幕方向媒体特性

屏幕方向媒体特性决定一个设备是处于横屏还是竖屏。横屏模式显示宽大于高,而竖屏模式触发高大于宽。这个媒体特性在移动设备上发挥很大的作用。

@media all and (orientation: landscape) {...}	

长宽比媒体特性

长宽比与设备长宽比,均是指目标呈现区域或输出设备的宽高像素比。min和max前缀可以适用不同长宽比特性。用于确定当前状态是一个比率高还是低。

长宽比是包括两个正数由斜杠分隔。第一个整数表示像数宽度,第二个整数表示像数高度。

@media all and (min-device-pixel-ratio: 16/9) {...}	

像素比特性

除了长度比外还有像素比媒体特性。这些特性包含设备像素比也有min和max前缀。具体来说,像素比功能非常时候高清设备,包括视网膜屏幕。这样的媒体查询要如下这样写。

@media only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3) {
...
}	

分辨率媒体特性

这个媒体特性是指在输出设备上的像素密度,也就是常说的每英寸的像素点数或是DPI。这个媒体特性也接受min和max前缀。此外,这个媒体特性可以表示,每像素多少点数(如1.3 dppx,表示每像素1.3个像素点),每厘米多少点数(如118 dpcm表示每厘米118个像素点),和其他长度单位的分辨率。

@media print and (min-resolution: 300dpi) {...}	

其他媒体特性

其他媒体特性包括识别使用颜色的可输出颜色,颜色指数,单色特性,带有网格特性的识别位图设备,识别具有扫描功能的电视。这些特性虽不常用,但在需要的时候很有用。

媒体查询浏览器支持

不幸的是,媒体查询在ie8及其以下的浏览器不能支持。不过,幸好有一些插件对它们进行处理兼容。

Respond.js是一个轻量级的插件,只是查找媒体查询中的min/max-width,在那些只使用媒体查询中完美的适用。CSS3-MediaQueries.js是一个更复杂,功能更强大的插件,支持更复杂的媒体查询。不过,记住一点,就是任何插件都会有性能问题,也就是放缓网站的访问速度。所以在使用插件前要确保这个性能的损失是值得的。

媒体查询demo

现在我们使用媒体查询重新写一下之前写的流式布局。现在demo面临的一个问题是,在一个小屏幕设备上侧栏变得无限小。用媒体查询为尺寸在420以下的设备改变布局,去掉section和aside的宽度和浮动。

@media all and (max-width: 420px) {
  section, aside {
    float: none;
    width: auto;
  }
}	

媒体查询

上图是没有媒体查询的section和aside会变的很小。而太小可能不能装下真正的内容。

媒体查询

上图运用媒体查询去掉section和aside的宽度和浮动,使他们能够全屏显示,容许他们的内容占据所有空间。

断点识别

你的直觉可能告诉你在写媒体查询时,要根据常见的视窗尺寸设置断点,用以判断不同的分辨率,例如320px,480px,768px, 1024px, 1224px等等。但这是个坏主意。

在搭建响应式网站时,应该可以适应各种不同视窗尺寸,而不需要考虑设备的分辨率。设置断点只是在网站布局被破坏,看起来很怪或是内容无法显示的时候才需要设置。

此外,每时每刻都会有新设备和新分辨率在发布。而试图跟上这些变化可能是个无止境的过程。

扩展阅读

  1. CSS3 Media Queries
  2. CSS3 Media Queries模板
  3. Responsive设计和CSS3 Media Queries的结合
  4. CSS3 Media Queries在iPhone4和iPad上的运用
  5. iPads和iPones的Media Queries
  6. CSS3 Media Queries案例——Hicksdesign
  7. CSS3 Media Queries案例——A List Apart
  8. CSS3 Media Queries案例——Tee Gallery
  9. W3CPLUS上Media Queries教程集合
  10. media query ie8- 兼容实现总结
  11. CSS Media Queries & Using Available Space
  12. Introduction to media queries – Part 1: What are media queries?
  13. http://www.adobe.com/devnet/dreamweaver/articles/introducing-media-queries-pt2.html
  14. Media Queries (Windows)
  15. CSS Media Queries
  16. Media Queries Tutorial – Convert Burnstudio into a Responsive Website
  17. Breaking Down Media Queries for Responsive Web Design
  18. Media Query splitting
  19. Techniques For Gracefully Degrading Media Queries

大漠

移动第一

使用媒体查询中的一个先进技术,就是移动优先。移动优先方法是指,先在小视窗加载网站默认样式,然后再添加用媒体查询设置的视窗样式。

移动优先背后的操作理念就是,一个移动设备的用户,通常使用小视窗的设备,不应该加载pc机上面的所有样式,之后又加载为移动设备写的样式。如此一来浪费了带宽,而带宽对于任何搜索漂亮网站的用户来说,都是很宝贵的。

移动优先方法也提出为移动用户设置一定的限制。在不久的将来,大多数的网络消费将在移动设备上进行。所以理应为他们设计相应的移动体验。

移动优先的媒体查询可能如下:

/* Default styles first then media queries */
@media screen and (min-width: 400px)  {...}
@media screen and (min-width: 600px)  {...}
@media screen and (min-width: 1000px) {...}
@media screen and (min-width: 1400px) {...}	

此外,下载不需要的媒体资源可以用媒体查询停止。通常来说,避免css3的阴影,渐变,动画,移动的过度使用,否则会造成加载过慢,甚至有损电池的寿命。

/* Default media */
body {
  background: #ddd;
}
/* Media for larger devices */
@media screen and (min-width: 800px) {
  body {
    background-image: url("bg.png") 50% 50% no-repeat;
  }
}	

移动第一案例

给我们前面的例子添加媒体查询,之前重写的样式是为了,尺寸小于420像素宽度的视窗下有个不错的布局。这次首先重写默认的手机样式,然后添加媒体查询,为了适应视窗尺寸大于420像素宽度。

查看代码如下:

section, aside {
  margin: 1.51515151%;
}
@media all and (min-width: 420px) {
  .container {
    max-width: 660px;
  }
  section {
    float: left;
    width: 63.63636363%;
  }
  aside {
    float: right;
    width: 30.30303030%;
  }
}	

注意,这部分代码跟以前一样,唯一的区别就是,移动设备只需要渲染一个css声明。只不过在大视窗设备所有其他样式延迟加载,并没有覆盖最初的样式。

视窗

如今用移动设备显示网站是一个很cool的事情。虽然有时辅助帮助有点不到位,特别是视窗的尺寸规模,对网站的处理。为了解决这些问题,苹果发明了视窗meta标签。

视窗

尽管这个demo里面有媒体查询,但是许多移动设备仍然不知道网站的初始宽度或是规模,所以也就无法解析媒体查询。

视窗宽高

使用视窗meta标签,那么视窗的宽高需要分别定义。每个值可以是正值或是关键字。高度属性用device-height表示,相应的宽度属性用device-width表示。这些关键字继承设备默认的宽高。

一个看上去很棒的网站的最好的处理方式,建议你使用设备高度和设备宽度作为设备默认值。

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

视窗

让设备知道网站的预定宽度,在这种情况的设备宽度,容许应用媒体查询对网站的尺寸,做出适当调整。

视窗比例

如何控制一个网站在手机设备上的显示比例,可以通过minimum-scale, maximum-scale, initial-scale,和 user-scalable 四个属性来控制。

一个网站的初始比例应该设置为1,这样定义的比例是在设备高度和视窗高度之间,而竖屏时候,初始比例就是视窗尺寸。同样横屏的初始比例应该是在设备宽度和视窗宽度之间。视窗比例应该始终是0到10之间的正数。

<meta name="viewport" content="initial-scale=2">	

视窗

如果使用一个大于1的整数比例,使得缩放出的网站比默认比例还大,一般来讲,这个值就应该设置为1。

最大最小范围值是确定视窗可以缩放到多大或是多小。最小范围值是指一个小于等于初始比例的值,同理,最大范围值是指一个大于等于初始比例的值。但这两个值都应该是在0到10 之间。

<meta name="viewport" content="minimum-scale=0">	

一般来讲,这些值不必设置为相同的初始值。这将禁用缩放,所以完全可以用用户比例代替。设置用户比例不会禁用缩放,相反会自动开启缩放功能。

关闭一个网站的缩放功能是一个坏主意。他不利于残疾人按照他们的意愿浏览一个网站。

<meta name="viewport" content="user-scalable=yes">	

视窗分辨率

让浏览器决定如何缩放,一个基于任何视窗比例的网站,往往是奏效的。当需要更多的控制时,特别是在解决一个设备的分辨率,目标分辨率就派上用场了。这个目标分辨率接受如下值,他们是device-dpi, high-dpi, medium-dpi, low-dpi,或是一个实际的 DPI大小。

目标分辨率(target-densitydpi)值很少使用,但是在需要控制像素尤其有用。

<meta name="viewport" content="target-densitydpi=device-dpi">	

组合视窗值

视窗meta标签接受单独值也接受多个值,容许一次设置多个视窗属性。设置多个值要求他们之间用逗号分割。一个推荐的视窗值设置描述如下,同时使用设备宽度和初始比例属性。

<meta name="viewport" content="width=device-width, initial-scale=1">	

视窗

设备宽度和初始比例为1的组合视窗属性,就是提供一个初始尺寸和普遍的缩放比例要求。

Css视窗规则

因为视窗meta标签需要设置一个网站样式如何渲染,感觉头太重,所以推荐把他从html的meta标签中,移动到使用css样式中定义。这样有助于样式与内容分离,可以提供更多的定义。

目前一些浏览器已经实现了@viewport规则,可是并没有得到广泛的支持。前面推荐的视窗meta标签,在css中也许像下面@viewport这样定义

@viewport {
  width: device-width;
  zoom: 1;
}	

扩展阅读

  1. 视窗meta标签的理解
  2. 此像素非彼像素
  3. 响应式新首页设备适配(Device Adaptation)小结
  4. Configuring the Viewport
  5. Supported Meta Tags
  6. Using the viewport meta tag to control layout on mobile browsers
  7. Combining meta viewport and media queries
  8. A tale of two viewports — part two
  9. Vexing Viewports
  10. Viewport.
  11. VIEWPORT RESIZER
  12. The Mobile Viewport and Orientation
  13. The viewport metatag (Mobile web part 1)
  14. Responsive Viewport
  15. Media Queries, Viewports, and Responsive Layouts – oh my!
  16. Viewport Meta Tag For Mobile Devices
  17. Metatag viewport tutorial and examples
  18. CSS @viewport or Meta Tag?
  19. Elegantly Resize Your Page With the @-viewport CSS Declaration
  20. Quick Tip: Don’t Forget the Viewport Meta Tag

大漠

流式媒体

最后,流式的媒体对于响应式设计也是同等重要的部分。当视窗开始改变尺寸时,媒体大小并不总是做适当改变的。所以图片,视频以及其他媒体类型需要在视窗改变的情况下,按照比例改变大小。

通过使用最大宽度值为100%,是一个快速实现媒体按照比例缩放的方法。这样做可以确保在视窗变小的情况下,任何媒体可以根据他的容器宽度,按照比例缩放 。

img, video, canvas {
  max-width: 100%;
}	

效果

流式媒体

流式嵌入媒体

不幸的是最大宽度属性,并不是在所有的媒体上都运行良好,尤其是对于iframe和嵌入媒体。当涉及到第三方的网站,例如YouTube,那些使用iframe来嵌入媒体的,都会因为不起作用而失望。幸好,有个解决办法。

为了让嵌入媒体充分响应,嵌入元素需要在父元素中绝对定位。父元素需要宽度100%,这样缩放才能基于视窗宽度。父元素还需要一个为0的高度,是为了在ie下面触发haslayout。

在父元素底部设置留白,这个值也是依赖于视频的宽高比。他容许父元素的高度跟宽度使用相同的比例。还记得前面提到的响应式设计公式吗?如果一个视频的宽高比是16比9,9除以16等于56.25%,所以底部需要一个56.25%的留白。底部留白而不是头部留白,这是专门用于处理ie5.5的bug,还有父元素是绝对定位的情况。

HTML

<figure>
  <iframe src="https://www.youtube.com/embed/4Fqg43ozz7A"></iframe>
</figure>

CSS

figure {
  height: 0;
  padding-bottom: 56.25%; /* 16:9 */
  position: relative;
  width: 100%;
}
iframe {
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 100%;
}	

效果

流式媒体

扩展阅读

  1. Rundown of Handling Flexible Media
  2. Responsive Images: How they Almost Worked and What We Need
  3. FLUID IMAGES
  4. How To Create Flexible Images And Media In CSS Layouts
  5. How to style flexible images for RWD
  6. Flexible, dynamically resizing images with CSS
  7. CSS: Elastic Videos

大漠

上一课下一课

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

关于D姐

网名different,前端攻城师一名,现居北京,对css3、javascript、前端UI等前端开发有浓厚兴趣,请关注我:新浪微博

如需转载烦请注明出处:

英文原文:http://learn.shayhowe.com/advanced-html-css/responsive-web-design

中文译文:http://www.w3cplus.com/css/advanced-html-css-lesson4-responsive-web-design.html


HTML和CSS高级指南之三——丰富多彩的选择器

$
0
0

本文由99根据Shay Howe的《An Adavnced Guide to HTML & CSS》第三课《Complex Selectors》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://learn.shayhowe.com/advanced-html-css/complex-selectors,以及作者相关信息

作者:Shay Howe

译者:99

选择器是css最重要的部分。选择器搭建了css的层叠大厦,决定了样式如何应用到页面元素上来。

直到最近人们关注CSS的焦点也未真正触及选择器。选择器规范内的偶尔有一些增量更新,但从来没有任何真正的突破性的改进。幸运的是,选择器在最近被赋予了越来越多的关注,焦点集中在选择不同类型的元素,及选择元素不同的使用状态。

Css3带来了很多新的选择器,为旧的秩序打开了一扇新的大门。这篇文章中,我们将会讨论新旧 选择器以及应用他们的最佳实践。

这一课中主要包括下面几个部分内容:

常见选择器

在深入探讨css3带来的更加复杂的选择器之前,我们简单回顾一下在现在看来很普通的那些选择器,比如 元素类型,class类名,id选择器

类型选择器选择根据其类型来选择元素,尤其是该元素在HTML中的声明。Class选择器根据元素class属性的值来选择元素,当为了共用一个常用样式时,这个值可以重用在多个元素上。ID选择器根据元素ID属性的值来选择元素,这个属性是独一无二的,在每个页面中同样的ID属性值只能被使用一次。

CSS

h1 {...}
.tagline {...}
#intro {...}	

HTML

<section id="intro">
  <h1>...</h1>
  <h2 class="tagline">...</h2>
</section>	

普通选择器简表

例子类别解释
h1类型选择器选择元素的一个类型
.tagline类选择器以class属性的值来选择元素,可以在一个页面中出现多个
#intro ID选择器以id属性的值来选择元素,在页面中是唯一的,只能出现一次

子选择器

子选择器提供了一个选择从属关系元素的方式,将某元素作为父元素的“后代”来处理。可以创建两类元素集合:后代元素或者只包含子元素

后代选择器

最常用的子选择器为后代选择器,可以匹配指定祖先元素的所有后代元素。后代元素不需要如父母与子女的关系一样,直接跟随于祖先元素的文档树后,而是在祖先元素内部的任何地方。当你利用空格分割两个元素时可以创建一个后代选择器,可以为每个元素创建新的层级关系。

article h2选择器是一个后代选择器,可以选择article元素内的h2元素。注意,不论这个h2元素是否“存在”,只要他是在article元素内部,就会被选择。此外,在article元素外面的h2元素则不会被选择。

下面代码中第三行与第五行的标题元素被选中,因此被应用加粗的样式:

CSS

article h2 {...}	

HTML

<h2>...</h2>
<article>
  <h2>...</h2><div>
    <h2>...</h2></div>
</article>	

子元素选择器

有些时候后代选择器的功能过于强大,与我们想要的结果相比他匹配的更多。有时我们只需要选择父元素的直接子元素而不是一个祖先元素内部嵌套的所有元素。这时候子选择器闪亮登场,可以使用>代替空白符号来放在父元素与子元素之间,就可以创建一个子选择器。

举例来讲,article > p 选择器是一个子选择器,只会选择artical元素内紧跟的p子元素。Artical元素外面的p元素,及artical元素内部嵌套更深的p元素则不会被选择

下面第三段的p元素为父元素的直接子元素,因此被选择,应用样式加粗

CSS

article > p {...}	

HTML

<p>...</p>
<article>
  <p>...</p><div>
    <p>...</p>
  </div>
</article>	

子选择器概览

例子类别解释
article h2后代选择器选择指定祖先元素内的后代元素
article > h2子元素选择器选择指定父元素内的直接子元素

兄弟选择器

学习如何选择子元素是很有用的,也很常用。而当兄弟元素拥有一个共同的父元素时,也需要被选择。兄弟选择器可以通过普通兄弟选择器与相邻兄弟选择器两种方式创建

普通兄弟选择器

普通兄弟选择器可以根据拥有共同父元素的兄弟元素,来让元素被选择。当你在两个元素间使用~符号时即创建了一个兄弟选择器。这表示第二个元素是第一个元素的兄弟元素,两个元素拥有共同的父元素。

h2~p 选择器是一个普通兄弟选择器,查询h2元素后面的拥有共同父元素的兄弟元素p。因此若p元素要被选择,必须跟在h2元素后面。

第5行跟第9行的段落会被选择,因为他们相对文档流在h2元素的后面,同时拥有相同的父元素,因此元素被选择,应用样式加粗。

CSS

h2 ~ p {...}	

HTML

<p>...</p>
<section>
  <p>...</p>
  <h2>...</h2>
  <p>...</p><div>
    <p>...</p>
  </div>
  <p>...</p></section>	

相邻兄弟选择器

有时我们想对兄弟元素的选择结果做控制,这时候可以使用相邻兄弟选择器。相邻兄弟选择器只会选择紧跟着一个元素的另一个元素。在两个元素间你可以用+符号替代~符号就可以创建相邻兄弟选择器。同样,第二个元素应该直接紧跟第一个元素并且拥有相同父元素。

比如h2+p这个相邻兄弟选择器,它只会选择紧接着h2元素,同时拥有相同父元素的p元素。

第5行段落会被选择,因为他紧挨着h2元素的后面,同时拥有相同的父元素,因此元素被选择,应用样式加粗。

CSS

h2 + p {...}	

HTML

<p>...</p>
<section>
  <p>...</p>
  <h2>...</h2>
  <p>...</p><div>
    <p>...</p>
  </div>
  <p>...</p>
</section>	

兄弟选择器示例

HTML

<input type="checkbox" id="toggle">
<label for="toggle">☰</label>
<nav>
  <ul>
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Services</a></li>
    <li><a href="#">Contact</a></li>
  </ul>
</nav>	

CSS

input {
  display: none;
}
label {
  background: #f5f5f5;
  background: linear-gradient(#fff, #eee);
  border: 1px solid #ccc;
  border-radius: 6px;
  cursor: pointer;
}
label:hover {
  color: #f7941d;
}
input:checked + label {
  background: #f5f5f5;
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
  color: #8c9198;
}
nav {
  max-height: 0;
  overflow: hidden;
  transition: all .2s linear;
}
input:checked ~ nav {
  max-height: 500px;
}	

效果

兄弟选择器示例

兄弟选择器概览

例子类别解释
h2 ~ p相邻兄弟选择器选择第一个元素后的兄弟元素,两者拥有相同的父元素
h2 + p子元素选择器选择第一个元素后紧跟的元素,两者拥有相同的父元素

属性选择器

先前讲的一些常见的选择器也可以被定义为属性选择器,因为他们是根据元素的class或者id属性来选择的。Class与id选择器很有用,使用广泛,但这仅仅是个开始。其他属性的选择器多年来不断出现,特别是在css3规范中,属性选择器迎来了一个大的飞跃。现在,元素不仅可以根据属性是否存在,而且可以根据属性的值来被选择。

目前属性选择器

首先要介绍的一个属性选择器通过识别元素是否包含某种属性来选择元素,而不管这属性的值具体是多少。选择器可以将属性名放在方括号内[] 来判断属性是否存在。方括号可以跟随或者不跟随任何元素类型或者class,这取决于你所要求的选择器权重。

CSS

a[target] {...}	

HTML

<a href="#" target="_blank">...</a>	

属性均等选择器

为了识别一个特定且完全匹配的值,我们可以使用上面用过的属性选择器,而这时候要把要求匹配的值写在方括号内。方括号内以属性名开头,紧跟着等号=与引号””,引号内则是你需要匹配的属性值。

CSS

a[href="http://google.com/"] {...}	

HTML

<a href="http://google.com/">...</a>	

属性包含选择器

当我们需要寻找一个属性值包含某特定值,但不一定完全匹配时,属性选择器的方括号内可以使用*通配符。通配符需要紧跟着属性名字,后面跟等号。这样书写,表示所要求匹配的值只需要出现,或者被包含于属性值中即可。

CSS

a[href*="login"] {...}	

HTML

<a href="/login.php">...</a>	

属性开头选择器

为了进一步选择一个属性值包含某特定值的元素,也可以根据属性开头包含的值来选择元素。在方括号内,属性名与等号间使用抑扬音符(^)表示属性值以某个特定值开头。

CSS

a[href^="https://"] {...}	

HTML

<a href="https://chase.com">...</a>	

属性结尾选择器

与属性开头选择器相反,我们也可以使用属性结尾选择器。这里在方括号内利用$符号替换刚才的^,放在属性名与等号之间。$符号表示属性值以一个特定的值结尾。

CSS

a[href$=".pdf"] {...}	

HTML

<a href="/docs/menu.pdf">...</a>	

属性间隔选择器

有时属性名可能是空格分隔的多个单词组成的,而我们需要匹配其中的一个单词来选择元素。这种情况下可以在方括号内,属性名与等号之间使用波浪线~,这表示属性值可能被空格分割为多个单词,而其中一个单词匹配特定值。

CSS

a[rel~="tag"] {...}	

HTML

<a href="#" rel="tag nofollow">...</a>	

属性连字符选择器

当属性值包含连字符而不是空白时,竖线|可以写在方括号里,放在属性名与等号之间。这表示属性值可能由连字符分割,而连字符分割的几个单词必须匹配一个特定值。

CSS

a[lang|="en"] {...}	

HTML

<a href="#" lang="en-US">...</a>	

属性选择器示例

HTML:

<ul>
  <li><a href="#.pdf" title="PDF Document">PDF Document</a></li>
  <li><a href="#.doc" title="Word Document">Word Document</a></li>
  <li><a href="#.jpg" title="Image File">Image File</a></li>
  <li><a href="#.mp3" title="Audio File">Audio File</a></li>
  <li><a href="#.mp4" title="Video File">Video File</a></li>
</ul>	

CSS

ul {
  list-style: none;
}
ul a {
  padding-left: 22px;
}
ul a[href$=".pdf"] {
  background: url("images/pdf.png") 0 50% no-repeat;
}
ul a[href$=".doc"] {
  background: url("images/doc.png") 0 50% no-repeat;
}
ul a[href$=".jpg"] {
  background: url("images/image.png") 0 50% no-repeat;
}
ul a[href$=".mp3"] {
  background: url("images/audio.png") 0 50% no-repeat;
}
ul a[href$=".mp4"] {
  background: url("images/video.png") 0 50% no-repeat;
}	

效果

属性选择器示例

属性选择器概览

例子类别解释
a[target]目标属性选择器选择一个存在某属性的元素
a[href="http://google.com/"]属性均等选择器选择一个属性值匹配特定值的元素
a[href*="login"]属性包含选择器选择一个属性值包含特定值的元素
a[href^="https://"]属性开头选择器选择一个属性值以特定值开头的元素
a[href$=".pdf"]属性结尾选择器选择一个属性值以特定值结尾的元素
a[rel~="tag"]属性间隔选择器选择一个属性值被空白分割成多个单词,且其中一个单词匹配给定值的元素
a[lang|="en"]属性连接符选择器选择一个属性值被连接符分割成多个单词,且其中一个单词匹配给定值的元素

伪类

伪类类似通常HTML中的类,但是它们不会直接以html标记的形式定义,而是一个动态的,作为用户交互的等行为的结果填充到文档结构中。

最常见的,你肯定见过的一个伪类是:hover.注意这个伪类是由一个冒号开头的,其他伪类也一样。

链接性伪类

一些很基本的伪类都是围绕链接来展开的。:link与:visited伪类一个定义未访问过,另一个定义访问过的链接样式。 当定义一个未访问过的样式时,:link伪类派上用场,而:visited伪类根据浏览器历史记录来判断用户访问过的链接,从而定义样式。

a:link {...}
a:visited {...}	

用户行为性伪类

根据用户行为,伪类可以动态添加到一个元素上,包括:hover,:activem:focus 伪类。当用户把光标挪动到元素上面时:hover伪类所定义的样式被应用到元素上。当用户激活一个元素时,比如点击一个元素,:active伪类所定义的样式被应用到元素上。当用户使一个元素获得焦点时,也包括利用键盘切换焦点,:focus伪类所定义的样式被应用到元素上。

a:hover {...}
a:active {...}
a:focus {...}	

用户界面状态性伪类

与link相关的伪类相类似,也有很多伪类与用户界面上的元素状态相关,特别是表单元素。这些与用户界面状态相关的伪类包括 :enabled,:disabled:checked :indeterminate.

:enabled伪类选择一个处于默认状态下,可用的input元素,而:disabled伪类正好相反。 很多浏览器会使disabled的input元素变淡,来告知用户此input不可用于交互。不过这一类的样式可以通过:disabled伪类来调整。

input:enabled {...}
input:disabled {...}	

另外两个用户界面相关的伪类,:checked与:inderterminate都围绕单选与多选按钮展开。 :checked伪类选择那些被选中的单选或多选按钮。当一个单选或多选按钮既未被选中,又不处于非选中状态,这个元素为 indeterminate状态(未决定状态).我们可以用:indeterminate伪类来定义处于此类状态的元素。

input:checked {...}
input:indeterminate {...}	

结构性伪类

一部分伪类是结构性的和基于位置的,这是由元素处于文档树中的什么地方决定的。这些结构性伪类看起来非常类似,不过每种都提供了他们自己独特的功能。一些伪类算是历史悠久,但CSS3带来了整个一套新的伪类,来弥补先前的不足。

:first-child, :last-child, & :only-child

首先与大家见面的结构性伪类是:first-child, :last-child, 以及:only-child伪类。:first-child伪类会选择父元素下的第一个子元素,而:last-child伪类会选择父元素下的最后一个子元素。这些伪类对于选择列表中的首项或末项极其有用。此外,若父元素下面只有一个子元素,这个元素将会被:only-child伪类选择。因此这个伪类也可以写成:first-child:last-child ,不过:only-child的写法权重要低些。

选择器 li:first-child 标记了列表中的第一个元素而li:last-child标记了列表中的最后一个元素。因此第二行与第十行代码里的li被应用样式加粗。选择器 div:only-child寻找一个div元素,而这个div元素的父元素只含有一个子元素。因此第四行代码的div被选中 应用样式加粗,因为他是相对应的列表元素仅有的一个子元素。

CSS

li:first-child {...}
li:last-child {...}
div:only-child {...}	

HTML

<ul>
  <p>...</p><li>
    <div>...</div></li>
  <li>
    <div>...</div>
    <div>...</div>
  </li>
  <li>...</li></ul>	

:first-of-type, :last-of-type, & :only-of-type

寻找到特定父元素的首个子元素,最后一个子元素,以及仅有的子元素是很有用的,而且很多时候这也是需求。不过有时对于某元素,你只想找到特定类型的子元素。比如我只想得到文章的第一段或者最后一段,或者文章中唯一的图片。很幸运的是我们可以利用first-of-type, :last-of-type, 与 :only-of-type 三个伪类来完成。

:first-of-type伪类会选择父元素下某种子元素的第一个,而 :last-of-type伪类会选择父元素下某种子元素的最后一个。若元素是父元素的子元素,且只有一个这种类型的子元素,那这个元素会被 :only-of-type伪类选择。

下面的例子中,:first-of-type伪类与 :last-of-type伪类分别选择了文章的第一段与最后一段,而不会管段落是否是文章元素的第一个子元素或最后一个子元素。第三行与第六行被选中,应用样式加粗。img:only-of-type识别出了文章中仅有的图像,也应用了样式加粗。

CSS

p:first-of-type {...}
p:last-of-type {...}
img:only-of-type {...}	

HTML

<article>
  <h1>...</h1>
  <p>...</p><p>...</p>
  <img src="#">
  <p>...</p><h6>...</h6>
</article>	

最后这里有一些基于代数表达式来选择元素的伪类。这些伪类包括:nth-child(n), :nth-last-child(n), :nth-of-type(n)与 :nth-last-of-type(n)。这些独特的伪类均以nth前缀开头,括号内接收一个以n作为参数的代数表达式。

括号内以数字作为表达式,可以直接决定哪个元素被选择。直接使用数字可以从文档树开头或结尾算起,计入单独的元素。而利用n作为参数的代数表达式,可以同样从从文档树开头或结尾算起,批量选择一组元素。

使用伪类数字或表达式

刚才也提到了,括号内以数字作为表达式,可以从文档树开头或结尾算起,计入单独的元素。举例来讲,li:nth-child(4)会选择列表项中第四个元素。从列表第一个元素开始计算,每次计数增加1,对应每一个列表元素,直到找到第四个列表元素。当直接使用数字时,数字必须为正数

伪类表达式为这些格式:an, an+b, an-b, n+b, -n+b, -an+b.这些都会被解释并阅读为(a×n)±b。变量a代表乘数,表示每a的倍数个元素,而b变量表示从a的倍数个元素开始,加减计数的个数,从而选择元素。

比如li:nth-child(3n)选择器,会选择列表内每3的倍数个列表元素。利用表达式计算的结果:3×0, 3×1, 3×2,等等。你可以看到结果是3 6这些3的倍数,即第3 6个元素被选择。

此外 与奇数偶数相关的关键字作为值也可以。如预期结果,两个值分别可以选择第奇数个与偶数个元素。其中关键词也可以用表达式来表示,其中“2n+1”将选择所有奇数(odd),而“2n”将选择所有偶数(en)。

使用li:nth-child(4n+7) 选择器,可以从第4的倍数个元素开始计算,直到识别第七个元素。使用这个表达式计算出的值等同于 (4×0)+7, (4×1)+7, (4×2)+7,结果是第7个,第11个,第15个等,选择出4的倍数加7。

当n参数前面不加数字前缀时,等同于a变量被解释为1.比如使用i:nth-child(n+5),那么每个列表元素都会做为计算起点,之后计算第五个元素。结果就是前四个元素不会被选择,因为表达式计算出的结果是(1×0)+5, (1×1)+5, (1×2)+5 等。

更复杂一点也可以使用负数。举例来讲 li:nth-child(6n-4) 选择器会帝从6的倍数个列表元素开始计算,之后往前面计算4个,结果就是第2个,第8个,第14个等。li:nth-child(6n-4)也可以写成li:nth-child(6n+2),这样就不用使用负数了。

若参数a,或者n为负数,那么紧跟着的b参数,必须为正数。当a为负数时,或者n为负数时,b实际上标志了被计算的“最大数”。举例来讲 li:nth-child(-3n+12) 选择器的范围在前12个列表元素之内(因为最大只能是12了),li:nth-child(-n+9) 只能选择前九个元素,这时候n前面没有系数a,可以被认为是-1。

:nth-child(n) & :nth-last-child(n)

当我们对伪类的数字与代数表达式如何计算做了一个大概了解后,我们来看看实际应用中如何使用这些数字与代数表达式。首先以:nth-child(n)和:nth-last-child(n) 开始。这两个伪类的表现很类似:first-child 与:last-child伪类,因为他们都会寻找父元素下的子元素,然后只选择一个匹配给定值的元素。:nth-child(n) 伪类从文档树开头开始计算,而:nth-last-child(n) 则从文档树尾部开始计算。

我们以 li:nth-child(3n)作为例子。这个选择器会识别第3的倍数个元素,因此第四行代码与第七行代码的元素被选择,应用样式加粗

CSS

li:nth-child(3n) {...}	

HTML

<ul>
  <li>...</li>
  <li>...</li>
  <li>...</li><li>...</li>
  <li>...</li>
  <li>...</li></ul>	

在:nth-child伪类中使用一个不同的表达式会产生一个不同的选择元素集合。举例来说,li:nth-child(2n+3)选择器将会每两个元素一组,计算这组的第三个元素,之后选择。结果,下面列表元素中,第四行与第六行代码代表的元素被选择,应用样式加粗

CSS

li:nth-child(2n+3) {...}	

HTML

<ul>
  <li>...</li>
  <li>...</li>
  <li>...</li><li>...</li>
  <li>...</li><li>...</li>
</ul>	

我们再次改变表达式,这次使用负值,产生了一个新的选择元素集合。li:nth-child(-n+4)选择器识别了列表中最开始的四个元素,其余列表元素不被选择。第二行至第五行四个元素被选中,应用加粗样式。

CSS

li:nth-child(-n+4) {...}	

HTML

<ul>
  <li>...</li>
  <li>...</li>
  <li>...</li>
  <li>...</li><li>...</li>
  <li>...</li>
</ul>	

我们再次改变表达式,在n前面添加一个负整数作为系数。li:nth-child(-2n+5)选择器从前五个元素中寻找,识别了第2的倍数个元素,因此第2,4,6行代码的元素被选中,应用样式加粗

CSS

li:nth-child(-2n+5) {...}	

HTML

<ul>
  <li>...</li><li>...</li>
  <li>...</li><li>...</li>
  <li>...</li><li>...</li>
</ul>	

用 :nth-last-child(n) 伪类替换:nth-child(n) 改变了计数的方向,当你从文档树末尾开始计算时,请使用:nth-last-child(n) 伪类。如li:nth-last-child(3n+2) 这个会从列表末尾开始,选择列表中每三个一组,之后数两个元素,朝着列表开头去计数。这里第三行与第六行的代码被选择,应用样式加粗。

CSS

li:nth-last-child(3n+2) {...}	

HTML

<ul>
  <li>...</li>
  <li>...</li><li>...</li>
  <li>...</li>
  <li>...</li><li>...</li>
</ul>	

:nth-of-type(n) & :nth-last-of-type(n)

:nth-of-type(n) 与:nth-last-of-type(n)伪类与 :nth-child(n) 和:nth-last-child(n) 伪类很类似。而与后者不同的是,nth-of-type伪类只会选择那些指定类型(type)的元素。举例来讲,当计算文章中有几段时, :nth-of-type(n) 与:nth-last-of-type(n)伪类会忽略标题元素(h1之类),块元素(div)这些不是段落元素p的元素。而 :nth-child(n) 和:nth-last-child(n) 伪类则会计入所有的元素,而不考虑元素的类型,只需要元素匹配即可。另外所有可以用在:nth-child(n) 和:nth-last-child(n) 伪类中的n表达式,在 :nth-of-type(n) 与:nth-last-of-type(n)伪类中也是可用的。

我们使用p:nth-of-type(3n) 选择器,父元素相同的每三个p元素会被我们选择一个,而会忽略同级的其他类型的元素。这里第五行与第九行的元素会被选择,应用加粗的样式

CSS

p:nth-of-type(3n) {...}	

HTML

<article>
  <h1>...</h1>
  <p>...</p>
  <p>...</p>
  <p>...</p><h2>...</h2>
  <p>...</p>
  <p>...</p>
  <p>...</p></article>	

与:nth-child(n)跟 :nth-last-child(n)的关系类似,:nth-of-type(n) 与:nth-last-of-type(n)两个伪类,前者是从文档树开头开始计算,后者是从文档树尾部开始计算。

利用p:nth-last-of-type(2n+1) 这个选择器,从最后一段往前计算,每两个段落可以被标记选中。这里代码4,7,9行的段落元素被选中,应用样式加粗。

CSS

p:nth-last-of-type(2n+1) {...}	

HTML

<article>
  <h1>...</h1>
  <p>...</p>
  <p>...</p><p>...</p>
  <h2>...</h2>
  <p>...</p><p>...</p>
  <p>...</p></article>	

目标伪类

URI片段标识可以认为是 哈希符号 # 后面紧跟的字符。比如url http://example.com/index.html#hello哈希符号后面跟着hello这个标识符。当这个标识符与页面中某元素的id属性相匹配时,如 <section id=”hello”>,通过使用目标位类,这个元素会被识别并应用样式。片段标识符最常用在页面链接及链接到页面的其他地方。

看以下的代码。当用户访问一个页面时,如果他的URI片段标识符为hello,与section的id属性相同,通过使用:target伪类,section就会被应用样式。如果URI片段标识符变更,且匹配某元素的id属性,通过使用:target伪类,这个元素就会被应用样式

CSS

section:target {...}	

HTML

<section id="hello">...</section>	

空伪类

“:empty”伪类将选择不包含子元素或者文本的元素。当然,注解、处理指令和空的文本节点并不属于这个范围内。

使用“div:empty”伪类选择器,将选择没有任何子元素或者文本内容为空的“div”元素。以下的示例将选择标记2和标记3,因为他们是完全空的。尽管第二个标签中包含了一个注解标签,但注解标签并不会当作“div”的子元素,因此也属于空的标签。第一个div标签内包含了一个文本,第三个div标签包含了一空白文本空间,最后一个div里包含了一个strong标签,因此这三个标签都被排除未被选择。

CSS

div:empty {...}	

HTML

<div>Hello</div>
<div><!-- Coming soon. --></div>
<div></div><div> </div>
<div><strong></strong></div>	

否定伪类

否定伪类 :not(x) 在选择的元素集合中,通过一个声明来过滤掉符合某种条件的元素。p:not(.intro)选择器利用否定伪类,来匹配所有类名不包含intro的段落元素。通过选择器开头的p来匹配段落元素,之后通过否定伪类括号内的内容来过滤元素,在这里是一个类名.intro。

下面的div:not(.awesome) 与 :not(div)均使用了否定伪类。div:not(.awesome) 选择器识别了不包含awesome类名的div元素。而:not(div) {...} 选择器识别了不是div元素的元素。结果第一行的div元素被匹配,第三行的section元素也被匹配,这些元素被应用样式加粗。唯一未被选中的元素是一个拥有类名awesome的div元素,他被两个否定伪类排除在外。

CSS

div:not(.awesome) {...}
:not(div) {...}	

HTML

<div>...</div><div class="awesome">...</div>
<section>...</section>
<section class="awesome">...</section>	

伪类示例

HTML

<table>
  <thead>
    <tr>
      <th>Number</th>
      <th>Player</th>
      <th>Position</th>
      <th>Height</th>
      <th>Weight</th>
      <th>Birthday</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>8</td>
      <td>Marco Belinelli</td>
      <td>G</td>
      <td>6-5</td>
      <td>195</td>
      <td>03/25/1986</td>
    </tr>
    <tr>
      <td>5</td>
      <td>Carlos Boozer</td>
      <td>F</td>
      <td>6-9</td>
      <td>266</td>
      <td>11/20/1981</td>
    </tr>
    <tr>
      <td>21</td>
      <td>Jimmy Butler</td>
      <td>G-F</td>
      <td>6-7</td>
      <td>220</td>
      <td>09/14/1989</td>
    </tr>
    ...
  </tbody>
</table>	

CSS

table {
  border-spacing: 0;
  width: 100%;
}
th {
  background: #404853;
  background: linear-gradient(#687587, #404853);
  border-left: 1px solid rgba(0, 0, 0, 0.2);
  border-right: 1px solid rgba(255, 255, 255, 0.1);
  color: #fff;
  padding: 8px;
  text-align: left;
  text-transform: uppercase;
}
th:first-child {
  border-top-left-radius: 4px;
  border-left: 0;
}
th:last-child {
  border-top-right-radius: 4px;
  border-right: 0;
}
td {
  border-right: 1px solid #c6c9cc;
  border-bottom: 1px solid #c6c9cc;
  padding: 8px;
}
td:first-child {
  border-left: 1px solid #c6c9cc;
}
tr:first-child td {
  border-top: 0;
}
tr:nth-child(even) td {
  background: #e8eae9;
}
tr:last-child td:first-child {
  border-bottom-left-radius: 4px;
}
tr:last-child td:last-child {
  border-bottom-right-radius: 4px;
}	

效果

伪类示例

伪类概览

例子类别解释
a:link链接(link)伪类选择一个用户没有访问过的链接
a:visited链接(link)伪类选择一个用户访问过的链接
a:hover行为性伪类选择一个用户将鼠标指针悬浮在上方的元素
a:active行为性伪类选择一个用户使用中的元素
a:focus行为性伪类选择一个拥有用户焦点的元素
input:enabled状态性伪类选择一个处于可编辑状态(默认)下的元素
input:disabled状态性伪类选择一个通过设置disabled属性而处于不可编辑状态下的元素
input:checked状态性伪类选择一个被选中的单选或者复选按钮
input:indeterminate状态性伪类选择一个处于不确定状态下的单选或者复选按钮(可能被选中或者不被选中)
li:first-child结构性伪类选择父元素下的第一个子元素
li:last-child结构性伪类选择父元素下的最后一个子元素
div:only-child结构性伪类如果某个元素是它父元素中惟一的子元素,那么将会被匹配
p:first-of-type结构性伪类选择父元素中同类型的第1个子元素
p:last-of-type结构性伪类选择父元素中同类型的最后一个子元素
img:only-of-type结构性伪类若元素为父元素中同类型的唯一元素,则会被匹配
li:nth-child(2n+3)结构性伪类当父元素中子元素的序列匹配所给数字时会被选中,会以文档树开头作为起点,来计算所有元素
li:nth-last-child(3n+2)结构性伪类当父元素中子元素的序列匹配所给数字时会被选中,会以文档树开头作为起点,来计算所有元素
p:nth-of-type(3n)结构性伪类当父元素中子元素的序列匹配所给数字时会被选中,会以文档树开头作为起点,只计算文档树中给定类型的元素
p:nth-last-of-type(2n+1)结构性伪类当父元素中子元素的序列匹配所给数字时会被选中,会以文档树开头作为起点,只计算文档树中给定类型的元素
section:target目标伪类选择URI片段标示符的值指向的元素
div:empty空伪类选择没有任何子元素或者文本的元素
div:not(.awesome)否定伪类选择不匹配某个状态标示符的元素

伪元素

伪元素并不存在于dom树中,是一种动态元素。通过选择器操纵伪元素,可以给页面的一些特殊部分应用样式。有个要点需要注意,一个选择器只能给一个伪元素,比如:“.el:before”,但不能同时存在多个,比如:“.el:before:after”。

文本伪元素

首先发布的两个伪元素是:first-letter 与:first-line 文本伪元素。:first-letter 会匹配一个元素内文字的第一个字母,:first-line 则会匹配第一行。

下面的例子中,段落的第一个字符被alpha 这个class类名设置为较大的字体以及橙色,而bravo这个类名则将段落的第一行也设置成这样。这两个部分分别使用了:first-letter 与:first-line 文本伪元素来得到效果。

CSS

.alpha:first-letter,
.bravo:first-line {
  color: #dfa054;
  font-size: 18px;
}	

HTML

<p class="alpha">Lorem ipsum dolor...</p>
<p class="bravo">Integer eget enim...</p>	

效果

文本伪元素

生成内容伪元素

:before与:after生成内容伪元素向被选择的元素内部追加新的行内伪元素。这一类伪元素最普遍的用法,是配合content属性,向页面内添加一些不太重要的内容,但并不常常如此。伪元素不需要使用额外的元素标签,就可以向页面添加一些用户界面相关的内容。

:BEFORE 伪元素可以在被选择元素前创建伪元素,而:AFTER伪元素可以被选择元素后面创建伪元素。这些伪元素嵌入被选择元素内,而不是外面。下面的:after伪类用来在链接内利用括号显示a标签的href属性。这里的信息是有帮助的,但最终,不需要所有浏览器支持这些伪元素。

CSS

a:after {
  color: #8c9198;
  content: " (" attr(href) ")";
  font-size: 11px;
}	

HTML

<a href="http://google.com/">Search the Web</a>
<a href="http://learn.shayhowe.com/">Learn How to Build Websites</a>	

效果

生成内容伪元素

片段伪元素

::selection片段伪元素选择通过用户操作所选定或者高亮的部分,选定的部分会被应用样式,不过只能使用color,background,background-color,text-shadow属性。值得注意的是background-image属性会被忽略。当利用缩写的background属性来定义样式时,只有背景色会生效,任何图片都会被忽略。

单个冒号(:)和双冒号(::)

片段伪元素是css3新增加的内容,为了与伪类所区别,伪元素前前面用双冒号表示。很幸运的是大部分浏览器都支持单引号与双引号两种方式,不过 ::selection伪元素前面必须以双引号开头。

在 ::selection片段伪元素的帮助下,选择下面的示例文字后,背景会变橙色(orange),且文字阴影会去掉。同时注意使用 ::-moz-selection,增加火狐的浏览器前缀来确保这特性在所有浏览器下都支持完美。

::-moz-selection,
::selection {
  background: #dfa054;
  text-shadow: none;
}	

效果

片段伪元素

伪元素举例

HTML

<a class="arrow" href="#">Continue Reading</a>	

CSS

.arrow {
  background: #8ec63f;
  color: #fff;
  display: inline-block;
  height: 30px;
  line-height: 30px;
  padding: 0 12px;
  position: relative;
}
.arrow:before,
.arrow:after {
  content: "";
  height: 0;
  position: absolute;
  width: 0;
}
.arrow:before {
  border-bottom: 15px solid #8ec63f;
  border-left: 15px solid transparent;
  border-top: 15px solid #8ec63f;
  left: -15px;
}
.arrow:after {
  border-bottom: 15px solid transparent;
  border-left: 15px solid #8ec63f;
  border-top: 15px solid transparent;
  right: -15px;
}
.arrow:hover {
  background: #f7941d;
  color: #fff;
}
.arrow:hover:before {
  border-bottom: 15px solid #f7941d;
  border-top: 15px solid #f7941d;
}
.arrow:hover:after {
  border-left: 15px solid #f7941d;
}	

效果

伪元素举例

伪元素概览

例子类别解释
.alpha:first-letter文本伪元素选择元素内文本的第一个字母
.bravo:first-line文本伪元素选择元素内文本的第一行
div:before生成的内容在被选择元素前创建伪元素
a:after生成的内容在被选择元素末尾创建伪元素
::selection片段伪元素选择通过用户操作所选定或者高亮的部分

选择器浏览器兼容性

虽然这些选择器为css提供了丰富多彩的能力,让其可以做到一些难以置信的事情,但我们仍然不断地为一些老浏览器的兼容性而困扰。判断这些选择器在你网站访问者常使用的浏览器上的可用性,之后决定他们是否适合你的网站。

CSS3.info提供了一个选择器测试工具,可以提示你使用的选择器是否被浏览器所支持。 而从浏览器提供商那里参考浏览器兼容性也比较适合。

此外你也可以使用一个js库 Selectivizr来给ie6-8提供对选择器的良好的兼容性,也可以用jquery选择器。

选择器的速度与性能

关注选择器的速度与性能是很重要的,因为使用过分复杂的选择器可以降低你的页面渲染速度。保持一丝不苟,当你使用一个选择器时,站在局外人的角度去审视他,考虑是否可以找到更好的解决方案。

扩展阅读

  1. 《CSS3基本选择器》
  2. 《CSS3属性选择器》
  3. 《CSS3伪类选择器》
  4. 选择符类型查看
  5. 《CSS选择器优化》
  6. 《你应该知道的一些事情——CSS权重》
  7. The 30 CSS Selectors you Must Memorize
  8. Child and Sibling Selectors
  9. CSS3 Substring Matching Attribute Selectors
  10. How To Use CSS3 Pseudo-Classes
  11. Understanding :nth-child Pseudo-class Expressions
  12. Taming Advanced CSS Selectors
  13. CSS 3 selectors explained
  14. Awesome New CSS3 Selectors
  15. CSS3 Selectors
  16. CSS3 Selectors & Browser Support
  17. Browser Support for CSS3 Selectors
  18. The Lowdown on :Before and :After in CSS
  19. CSS ::Selection

上一课下一课

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

如需转载烦请注明出处:

英文原文:http://learn.shayhowe.com/advanced-html-css/complex-selectors

中文译文:http://www.w3cplus.com/css/advanced-html-css-lesson3-complex-selectors.html

负margin用法权威指南

$
0
0

本文由陈陆扬根据的《The Definitive Guide to Using Negative Margins》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://coding.smashingmagazine.com/2009/07/27/the-definitive-guide-to-using-negative-margins,以及作者相关信息

——作者:

——译者:陈陆扬

早在1998年CSS2的建议中,table就渐渐淡出了舞台,逐渐被载入史册。也因为如此,CSS布局也变成了编码优雅的代名词。

在设计者用过的所有CSS概念中,负margin应当是最少被谈及的定位方法,这就像一种禁忌,每个人都使用它,但没人去讨论它。

1、为负margin“平反”

我们在CSS中都会使用margin,但将margin设置成负数,那可能就不大好处理了。在网页设计中,人们对负margin用法的态度大相径庭,有的人非常喜欢,而有的人则认为这是魔鬼的工作。

一个负margin应该是这样设置的:

#content {margin-left:-100px;}	

通常人们很少使用负margin但随后你会了解到,它能做的其实有很多。以下是几条有关负margin需要注意的地方:

A、负margin是绝对标准的CSS
这不是开玩笑。W3C甚至标注过:对于margin属性来说,负值是被允许的。这是Nuff说的,查看这篇文章会有更多详细内容。
B、负maring不是一种hack方法
千真万确,不能因为缺乏对负marign的理解,或者因为它长得像hack,就认为它是一种hack方法。除非你是用来修复自己在其他地方造成的错误。
C、不脱离文档流
不使用float的话,负margin元素是不会破坏页面的文档流。所以如果你使用负margin上移一个元素,所有跟随的元素都会被上移。
D、完全兼容
所有现代浏览器都完全支持负margin(IE6在大多数情况下也支持)。
E、浮动会影响负margin的使用
负margin不是你每天都用的CSS属性,应用时应小心谨慎。
F、Dreamweaver不解析负margin
DW的设计视图不会解析负margin。但问题是你为什么要在设计视图中检查你的网站呢?

2、使用负margin

如果使用得当,负margin是非常强大的属性,以下是2种(负margin占主导位置)的场景。

作用于static元素上的负margin属性

deodesign

Static元素是没有设定成浮动的元素,下图说明了负margin对static元素的作用

当static元素的margin-top/margin-left被赋予负值时,元素将被拉进指定的方向。例如:

/* 元素向上移10px*/

#mydiv1 {margin-top:-10px;}	

但如果你设置margin-bottom/right为负数,元素并不会如你所想的那样向下/右移动,而是将后续的元素拖拉进来,覆盖本来的元素。

/* 
* #mydiv1后续元素向上移10px, #mydiv1 本身不移动
*/

#mydiv1 {margin-bottom:-10px;}	

如果没有设定width属性,设定负margin-left/right会将元素拖向对应的方向,并增加宽度,此时的margin的作用就像padding一样。

3、浮动元素上的负margin

考虑下以下这种情况

HTML

<div id="mydiv1">First</div>
<div id="mydiv2">Second</div>

如果给一个浮动元素加上相反方向的负margin,则会使行间距为0且内容重叠。这对于创建1列是100%宽度而其他列是固定宽度(比如100px)的自适应布局来说是非常有用的方法。

/* 应用在与浮动相反方向的负margin */
#mydiv1 {float:left; margin-right:-100px;}	

若两个元素都为浮动,且#mydiv1的元素设定margin-right为20px。这样#mydiv2会认为#mydiv1的宽度比原来宽度缩短了20px(因此会导致重叠)。但有意思的是,#mydiv1的内容不受影响,保持原有的宽度。

如果负margin等于实际宽度,则元素会被完全覆盖。这是因为元素的完全宽度等于margin,padding,border,width相加而成,所以如果负margin等于余下三者的和,那元素的实际宽度也就变成了0px。

3、实用技巧

自从知道使用负margin是符合CSS2标准的代码后,我们利用这个特性创建了一些有趣的CSS技术。

制作包含3列的单个<ul>

deodesign

如果你有一列项目太长而无法垂直显示时,为什么不试试用分列的方式来代替它?负margin可以让你在不添加任何浮动元素或标签的情况下达到这种效果。如下,如此简单的操作就可以把集合分成三列,真是太令人惊叹了!

HTML

<ul> 
  <li class="col1">Eggs</li> 
  <li class="col1">Ham</li> 
  <li class="col2 top">Bread</li> 
  <li class="col2">Butter</li> 
  <li class="col3 top">Flour</li> 
  <li class="col3">Cream</li> 
</ul>	

CSS

ul {list-style:none;}
li {line-height:1.3em;}
.col2 {margin-left:100px;}
.col3 {margin-left:200px;}
.top {margin-top:-2.6em;} /* the clincher */	

通过在类top中设置margin-top:-2.6em(<li>标签的2倍行高),所有元素都完美的对齐了。你只需要将负margin应用到每列的第一个标签上,而不是设置每个<li>的相对位置,这样用起来会合适很多,很酷吧?

使用重叠产生强调

deodesign

刻意重叠元素也是一种很好的设计比喻,这样能产生一种深度错觉,从而突出特定的元素。Phlashers.com的评论模块就是一个很好的例子,使用了重叠技术突出了评论数目。利用负margin和z-index 属性,外加一点点创意,你也可以做到。

优秀的3D文字特效

deodesign

这是一种创建类似于Safari字体的巧妙方法:使用2种颜色创建两版相同,略微倾斜的文字,然后使用负margin将一版文字覆盖到另一版上,并留出1-2像素的差异。这样你就获得了具有可选性,而且对机器人爬虫友好的文字!从此再也不需要那臃肿又消耗带宽的jpeg和gif了。

简单2列布局

负margin也是一种创建简单2列自适应布局的好方法。2列自适应布局是一种拥有一个自适应宽度(liquid width)为100%的内容列和一个固定宽度侧边栏的布局。

HTML

<div id="content"> <p>Main content in here</p> </div> 
<div id="sidebar"> <p>I’m the Sidebar! </p> </div>	

CSS

#content {width:100%; float:left; margin-right:-200px;}
#sidebar {width:200px; float:left;}	

这样你就拥有了一个简单的两列布局,即使在IE6下也能无错的运行。现在,为了避免#sidebar被#content中的文字覆盖,加上

/* 防止文本被重叠 */

#content p {margin-right:210px;}

/* 它是 200px + 10px, 10px是他们的间距*/	

如果运用得当,负margin也可以完全代替table标签,来构成灵活文档结构。这种结构是一种具有可访问性的SEO技术,可以完全按照你的意愿按几乎任何顺序来排列标记。Tom写了一篇文章,专门讨论用负margin来实现多列布局。

微调元素位置

这是负margin最常用,也是最简单的方法。如果你在9个div中插入第十个div,有时候可能因为某些原因无法对齐,使用负margin可以仅对第十个进行微调,而不用必须去修改其他9个元素。

4、Bug修复

文字和链接的问题

当浮动元素使用负margin时,在一些旧的浏览器中可能会出现问题,问题现象包括:

  1. 链接无法点击;
  2. 文字难以选中;
  3. 失去焦点后,tab任何链接都会消失;

解决方法:给元素添加position:relative,便能正常运行!

图片被截断

如果你不幸在办公室使用IE6的话,有时候会发现重叠和浮动的元素中内容会被突然截断。

解决方法:同样,给浮动元素加上position:relative,一切将会恢复正常。

5、总结

负margin因其自身不添加额外标记就能定位元素的能力在现代网页设计中占有一席之地。随着更多的用户升级浏览器(包括IE8), 这项技术的前途看起来会非常光明,更多的网站也会依赖于它。

如果你对负margin有任何独到的经历,欢迎留言告诉我。

6、扩展阅读

  1. The Positive Side of Negative Margins
  2. CSS Negative Margins Algebra
  3. Get Refreshed: Liquid Layouts With Simpler CSS and Without A Semantic Mess
  4. Creating Liquid Layouts with Negative Margins
  5. Margin Properties
  6. Using Negative Margins
  7. Swapping Column Positions in Web Page Layouts with Negative Margins
  8. Exceptionally Negative
  9. CSS Negative Margins
  10. Horizontal Negative Margins
  11. Negative CSS Margins Are Not Cool
  12. Centering: Negative Margin
  13. css margin的相关属性,问题及应用
  14. 你是否彻底了解margin属性?
  15. 由浅入深漫谈margin属性
  16. 不要告诉我你懂margin
  17. 负值之美:负margin在页面布局中的应用
  18. 重新认识margin和负margin的实际应用
  19. margin负值5种应用
  20. 关于负margin在微博的应用
  21. Web布局连载——两栏固定布局(三)
  22. Web布局连载——两栏固定布局(四)
  23. Grids Layout Demo

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

关于陈陆扬

毕业于东北大学,从事前端开发,目前主要关注无线方面。对前端技术有强烈的兴趣,希望有机会和大家交流。新浪微博

如需转载烦请注明出处:

英文原文:http://coding.smashingmagazine.com/2009/07/27/the-definitive-guide-to-using-negative-margins

中文译文:http://www.w3cplus.com/css/the-definitive-guide-to-using-negative-margins.html

实现基于 cookie 的储存 API

$
0
0
/*
 * CookieStorage.js
 * 本类实现像localStorage和sessionStorage一样的存储API,不同的是,它是基于HTTP Cookies实现的.
 */
function CookieStorage(maxage, path) {  // 两个参数分别代表储存有效期和作用域
  // 获取一个储存全部cookies的对象
  var cookies = (function() { // 类型之前介绍的getCookies函数
    var cookies = {};           // 该对象最终会返回
    var all = document.cookie;  // 以大字符串的形式获取所有cookies的信息
    if (all === "")             // 如果该属性为空白符
      return cookies;         // 返回一个空对象
    var list = all.split("; "); // 分离出名/值对
    for(var i = 0; i < list.length; i++) {  // 遍历每个cookie
      var cookie = list[i];
      var p = cookie.indexOf("=");        // 找到第一个“=”符号
      var name = cookie.substring(0,p);   // 获取cookie的名字
      var value = cookie.substring(p+1);  // 获取cookie对应的值
      value = decodeURIComponent(value);  // 对其值进行解码
      cookies[name] = value;              // 将名值对存储到对象中
    }
    return cookies;
  }());
  // 将所有cookie的名字存储到一个数组中
  var keys = [];
  for(var key in cookies) keys.push(key);
  // 现在定义储存API公共的属性和方法
  // 储存的cookies的个数
  this.length = keys.length;
  // 返回第n个cookie的名字,如果n越界则返回null
  this.key = function(n) {
    if (n < 0 || n >= keys.length) return null;
    return keys[n];
  };
  // 返回指定名字的cookie值,如果不存在则返回null
  this.getItem = function(name) { return cookies[name] || null; };
  // 储存cookie值
  this.setItem = function(key, value) {
    if (!(key in cookies)) { // 如果要促成的cookie还不存在
      keys.push(key);      // 将指定的名字加入到储存所有cookie名的数组中
      this.length++;       // cookies个数加一
    }
    // 将该名/值对数据存储到cookie对象中.
    cookies[key] = value;
    // 开始正式设置cookie.
    // 首先将要储存的cookie的值进行编码,同时创建一个“名称=编码后的值”形式的字符串
    var cookie = key + "=" + encodeURIComponent(value);
    // 将cookie的属性也加入到该字符串中
    if (maxage) cookie += "; max-age=" + maxage;
    if (path) cookie += "; path=" + path;
    // 通过document.cookie属性来设置cookie
    document.cookie = cookie;
  };
  // 删除指定的cookie
  this.removeItem = function(key) {
    if (!(key in cookies)) return;  // 如果cookie不存在,则什么也不做
    // 从内部维护的cookies组删除指定的cookie
    delete cookies[key];
    // 同时将cookie中的名字也在内部的数组中删除.
    // 如果使用ES5定义的数组indexOf()方法会更加简单.
    for(var i = 0; i < keys.length; i++) {  // 遍历所有的名字
      if (keys[i] === key) {              // 当我们找到了要找的那个
        keys.splice(i,1);               // 将它从数组中删除.
        break;
      }
    }
    this.length--;                          // cookies个数减一
    // 最终通过将该cookie的值设置为空字符串以及将有效期设置为0来删除指定的cookie.
    document.cookie = key + "=; max-age=0";
  };
  // 删除所有的cookies
  this.clear = function() {
    // 循环所有的cookies的名字,并将cookies删除
    for(var i = 0; i < keys.length; i++)
      document.cookie = keys[i] + "=; max-age=0";
    // 重置所有的内部状态
    cookies = {};
    keys = [];
    this.length = 0;
  };
}

关于w3cplus文章版权的申明

$
0
0

最近因为文章版权问题闹得沸沸扬扬,在此给被打扰的各位说声抱歉。

w3cplus是个非盈利性组织,也没有花费太多的精力在SEO优化上,主要凭借大漠的点滴推广,厚实的文章和大家的厚爱在前端行业慢慢前行,有了自己的一席之地,所以一般被转载出去的文章在搜索里面的权重比w3cplus本身的还高,故此我们才这般注重请注明转载,因为所有的文章都是w3cplus成员的点滴汗水所成,他们没有任何报酬,把本该花在或泡妞或陪老婆或教孩子的时间用在了coding上,这种精神应该值得我们去尊重。如果是w3cplus的任何文章需要花费你的积分或者你的钱财,你这样不注明的转载或什么,我们也懒得去理睬,因为我们总算获得了利益,但是我们现在所有文章资源完全开放,没有得到任何实际效益,文章版权就被剥夺了,叫人怎不心寒。

年前,大漠在微博上号召了一些翻译者,打算把国外的一些优秀资源翻译过来,好方便那些英语比较薄弱的人,以促进整个前端行业的进步。这些翻译者本着对w3cplus的信任和为前端行业贡献自己一份微薄之力的热情而加入。他们中的大多数其实英文也不好,借助于google或字典,翻译一篇文章得花费很多时间;他们默默无闻自愿无偿,凭着热情和毅力慢慢进步。w3cplus既然给予不了物质的资助,就应该给他们一份成长的机会,所以所有的翻译文章都会注明作者的联系方式,说不定就可以结识些志同道合的朋友。现在他们的文章直接被进行第二次加工而出现,而他们的个人信息则被删得一干二净,你让w3cplus如何对他们交代。在此特别申明,对于翻译的文章,w3cplus始终坚持拥护翻译者,如果w3cplus最后连这个都做不到,那么译文这个专栏将会取消,因为我们愧对翻译者的热情奉献。所以烦请转载的人洁身自爱,为自己的同时也请先尊重翻译者。

当然有很多人在理解的同时,也在说别小气计较,就那点破事。在此我可以郑重申明,w3cplus绝对绝对的宽宏大量,如果真是那么小气计较也成不了现在这个气候。如果小气点我不会把数年经验所得全部分享;如果小气点我们可以搞点会员制下载;如果小气点大漠完全可以多接点私单而不用天天折腾这个。相反总有些转载的人太计较,他们有的直接搬走有的进行第二次加工不留下原文链接,大家都是做技术的,肯定下别人的汗水会死啊。

总的来说,w3cplus希望为前端行业的发展贡献自己的光和热,并且以一种开源分享的精神去进行。我们想把更多的精力放在打造精品文章以造福于更多同行,而不是天天在这破版权上纠结徘徊不前,闹得大家都不愉快。如果你不理解不支持,那么也请不要来搞破坏。当然对于您的理解与支持,我们表示非常的感谢!

最后,w3cplus的所有文章都欢迎转载分享,但是请注明好转载链接。不要因为自己一些个人的小利益,而影响整个行业圈的前行,所有的站点都应该是为整个行业的前行而贡献自己的热量,把更多的时间用于创造上!w3cplus热烈欢迎优质文章的投稿,也欢迎热情人士加盟!

——为之亲笔,2013-03-02

版权声明

W3CPLUS是一个致力于推广国内前端行业的技术博客。它以探索为己任,不断活跃在行业技术最前沿,努力提供高质量前端技术博文。本站和其他技术博客一样,热衷与互联网共享的所有的知识与经验,更希望越来越多的人能从本站学习到自己想学的相关新技术。因此W3CPLUS愿意基于《CC创作共用协议》来发布我们的内容,如果你对本站进行复制或转载本网站的内容,你必须遵守以下约定:

  1. 保留所有的用户界面和图标的版权。
  2. 本站文章的版权由本站、文章作者、外文原作者、译者共同所有,您可以在自己的文章中引用本站的内容,也可以复制/转载,但均不得用于商业用途。
  3. 任何复制/转载、引用本站内容的行为,都必须在尊重本站的前提下进行,注明来自于W3CPLUS,并附上相关文章的链接。
  4. 对于部分特别声明不能转载的文章,请不要复制/转载,本站及相关作者保留其所有权利。
  5. 用户在本网站进行的评论,只能与相关技术相对应,不可发布任何攻击国家、政府、个人人身的言论等,如发布违反国家法律的言论。w3cplus不负责在本网站上所表达的意见。
  6. 对于本网站的注册用户,只发布与w3cplus内容有关的话题。并且发表的内容不违反国家或政府的法律。

尊重版权是一个人的最基本的道底线,也是一种美德,也是一个人的良好品德与素质的体现,更是作者或译者应得到的权益与精神上的鼓励。我们严重鄙视擅自或恶意抄袭、盗版的行为,这种不尊重别人劳动成果的行为是不道德、可耻的。

W3CPLUS具有的所有解释和修改的权利,如果有任何问题可以随时 联系我们

知识共享许可协议本作品采用知识共享署名 3.0 未本地化版本许可协议进行许可。

Metrostyle Web UI

$
0
0
Metrostyle Web UI

Metro风格成了一种新的设计风潮,久违的了藤藤根据国外友人提供的Metro设计图,把整个Metrostyle设计转换成CSS代码,其中一些效果使用了CSS3来制作,比如说自定义时间动画、加载进度长,复选框自定义、tooltip提示框等效果。在整套Metrostyle UI中包括了:导航(含下拉导航效果)、登录表单、下拉控件、搜索表单、自定义选择框、时钟、加载进度条、日历、icon图标、视图按钮、分享按钮、复选框、色板、功能按钮、垂直手风琴、视频播放器面板、选项卡、按钮和价格区块等20个Web中常见的UI效果。

demodownload

接下来,我们一起来简单的通过代码展示各个UI控件的制作方法,下面每个控件,先例出其结构,随后跟上对应的样式代码以及效果图展示,为了更好的说明,先将页面中使用到的基本样式列出,如下:

基本样式

body {
  background-color: #dbdbdb;
}
/*定义本地字体*/
[class^="icon-"]:before {
  font-family: 'icomoon';
  speak: none;
  font-weight: normal;
  -webkit-font-smoothing: antialiased;
  font-size: 18px;
  color: #fff;
}
/*加载服务器字体文件*/
@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;
}
/*定义margin top的值*/
.mt-20 {
  margin-top: 20px;
}
.mt-40 {
  margin-top: 40px;
}
.mt-60 {
  margin-top: 60px;
}
.mr-10 {
  margin-right: 10px;
}
/*定义浮动类名*/
.fl {
  float: left;
}
.fr {
  float: right;
}
.inline {
  display: inline-block;
}
/*设置字号*/
.fsize20 {
  font-size: 20px;
}
.fsize10 {
  font-size: 10px;
}
.demo {
  width: 950px;
  margin: 40px auto 0;
}
.demo a,
.demo a:hover {
  color: #fff;
  text-decoration: none;
}  
/*设置容器宽度*/
.span-1 {
  width: 320px;
}
.span-2 {
  width: 350px;
  margin: 0 40px;
}
.span-3 {
  width: 200px;
}
.span-4 {
  width: 588px;
  margin-left: 40px;
}
::-webkit-input-placeholder,:-moz-placeholder {
  font-size: 14px;
  font-style: italic;
}		

一、导航

HTML

<div class="nav">
  <ul class="nav-item clearfix">
    <li><a href="#">Home</a></li>
    <li><a href="#">Services</a></li>
    <li><a href="#">Products</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Contact</a></li>
    <li><a href="#">Blog</a></li>
    <li>
      <a href="#">Shop On-line</a>
      <ul class="nav-sub-item">
      	<li><a href="#">Videogames</a></li>
      	<li><a href="#">Software</a></li>
      	<li><a href="#">Electronics</a></li>
      	<li><a href="#">Music</a></li>
      	<li><a href="#">Books</a></li>
      </ul>
    </li>
  </ul>
</div>	

导航的结构,大家经常可见,至于制作二级导航,建议使用ul > ol结构会更佳方便。

CSS代码

.nav-item {
  line-height: 60px;
  background-color: #00aec7;
}
.nav-item > li {
  position: relative;
  float: left;
}
.nav-item > li a {
  display: block;
}
.nav-item > li > a {
  font-size: 19px;
  font-weight: bold;
  padding: 0 31px;
  border-left: 1px solid #3bc1d4;
}
.nav-item > li:first-child > a {
  border-left: none;
} 
.nav-item li a:hover,.nav-item > li:hover > a {
  background-color: #006675;
}
/*绝对定位子菜单*/
.nav-item > li .nav-sub-item {
  display: none;
  position: absolute;
  left: 1px;
  font-size: 14px;
  width: 100%;
  line-height: 40px;
  background-color: #00aec7;
}
.nav-sub-item li a{
  padding-left: 31px;
}
/*控制下拉菜单显示*/
.nav-item > li:hover .nav-sub-item {
  display: block;
  
}	

效果

导航

二、搜索框与选择框

HTML

< form action="" method="get" accept-charset="utf-8"> 
  < !--搜索框--> 
  < div class="form-item search"> 
     < input type="search" name="search" id="search" placeholder="Search">  
     < button type="button" class="icon-search"> < /button> 
  < /div> 
  < !--选择框--> 
  < div class="select mt-20"> 
     < select name="select" class="icon-select"> 
       < option value=""> United States< /option> 
       < option value=""> Europe< /option> 
       < option value=""> Asia Pacific< /option> 
       < option value=""> Africa, Middle East, India< /option> 
     < /select> 
  < /div> 
  < div class="select"> 
     < div class="select-item"> 
       < ul class="select-value"> 
        < li> < a href="" title=""> United States< /a> < /li> 
        < li> < a href="" title=""> Europe< /a> < /li> 
        < li> < a href="" title=""> Asia Pacific< /a> < /li> 
        < li> < a href="" title=""> Africa, Middle East, India< /a> < /li> 
       < /ul> 
     < /div> 
  < /div> 
< /form> 	

CSS

/*==下拉控件==*/
.controls-drop-down {
  height: 362px;
}
.controls-drop-down .form-item {
  position: relative;
  font-size: 14px;
}
/*搜索框*/
.search input[type="search"] {
  width: 298px;
  height: 40px;
  border: 10px solid #00aec7;
  text-indent: 5px;
}
/*搜索按钮*/
.search .icon-search {
  position: absolute;
  top: 15px;
  right: 15px;
  width: 32px;
  height: 32px;
  border: none;
  background-color: #00aec7;
}
.icon-search:before {
  content: "\7d";
}
/*选择框*/
.select {
  position: relative;
}
.select:after {
  position: absolute;
  top: 25px;
  right: 15px;
  content: "";
  border: 8px solid transparent;
  border-top-color: #00aec7;
}
.select select {
  appearance: none;
  width: 320px;
  height: 60px;
  border: 10px solid #00aec7;
  text-indent: 5px;
}
.select .select-item {
  margin-top: 20px;
  width: 300px;
  height: 40px;
  border: 10px solid #00aec7;
}
.select .select-value {
  line-height: 40px;
  box-shadow: 0 0 5px 1px rgba(0,0,0,.2); 
  background-color: #fff;
}
.select-value li {
  margin-bottom: 10px;
}
.select-value a,.select-value a:hover {
  display: block;
  color: #444;
  padding-left: 10px;
}
.select-value li:not(:first-child) a:hover {
  color: #fff;
  background-color: #00aec7;
}
.select-value li:not(:first-child) {
  display: none;
}
.select-value:hover li {
  display: block;
}	

效果

导航

三、登录表单

HTML

<div class="controls-login">
  <div class="form-login">
  	<h3>LOGIN</h3>
  	<form action="" method="get" accept-charset="utf-8" class="mt-20">
      <div class="form-item">
       	<input type="text" name="username" id="username" placeholder="Username">
      </div>
      <div class="form-item">
       	<input type="password" name="pwd" id="pwd" placeholder="Password">
      </div>
      <div class="form-item info-list">
       	<input type="checkbox" name="showpwd" value="" id="showpwd" checked="checked">
       	<label for="showpwd">Show password</label>
	    <a href="#" class="fr">Forgot password?</a>
      </div>
      <div class="form-item">
	    <button type="button">Sign In</button>
	  </div>
  	</form>	
  </div>
</div>	

CSS

/*登录框*/
.controls-login {
  color: #fff;
  background-color: #323232;
}
.form-login {
  padding: 20px;
  line-height: 60px;
}
.form-login h3 {
  font-size: 24px;
  font-weight: normal;
  text-align: center;
}
/*文本框*/
.form-login input[type="text"],
.form-login input[type="password"] {
  width: 100%;
  height: 40px;
  border: none;
  text-indent: 5px;
  border-radius: 1px;
  transition: all 300ms;
}
.info-list {
  line-height: 20px;
  color: #808080;
}
/*复选框*/
.info-list  input[type='checkbox'] {
  vertical-align: middle;
  margin-right: 3px;
}
.form-login input:focus {
    outline: 0 none; 
   box-shadow: 0 0 0 5px #00aec7; 
}
/*按钮*/
.form-login button[type="button"] {
  font-size: 24px;
  color: #fff;
  width: 100%;
  height: 70px;
  margin: 38px 0 30px;
  border: none;
  background-color: #00aec7;
}	

效果

导航

四、日历

HTML

<div class="controls-calendar-dayview mt-40">
  <div class="calendar-header">
    <h2 class="clearfix">
      <div class="arrow fr">
        <a href="#" class="prev-month"></a>
        <a href="#" class="next-month"></a>
      </div>
      <a href="#" class="icon-calendar years-mode-button fl"></a>
      DECEMBER, 2012
    </h2>
    <ul class="week-days clearfix">
      <li>MON</li>
      <li>TUE</li>
      <li>WED</li>
      <li>THU</li>
      <li>FRI</li>
      <li>SAT</li>
      <li>SUN</li>
    </ul>
  </div>
  <div class="calendar-body">
    <ul class="days clearfix">
      <li><a href="#" title="29" class="dull">29</a></li>
      <li><a href="#" title="30" class="dull">30</a></li>
      <li><a href="#" title="31" class="dull">31</a></li>
      <li><a href="#" title="1">1</a></li>
      <li><a href="#" title="2">2</a></li>
      <li><a href="#" title="3">3</a></li>
      <li><a href="#" title="4">4</a></li>
      <li><a href="#" title="5">5</a></li>
      <li><a href="#" title="6">6</a></li>
      <li><a href="#" title="7">7</a></li>
      <li><a href="#" title="8">8</a></li>
      <li><a href="#" title="9" class="highlighted-day">9</a></li>
      <li><a href="#" title="10">10</a></li>
      <li><a href="#" title="11">11</a></li>
      <li><a href="#" title="12">12</a></li>
      <li><a href="#" title="13">13</a></li>
      <li><a href="#" title="14">14</a></li>
      <li><a href="#" title="15">15</a></li>
      <li><a href="#" title="16">16</a></li>
      <li><a href="#" title="17">17</a></li>
      <li><a href="#" title="18">18</a></li>
      <li><a href="#" title="19">19</a></li>
      <li><a href="#" title="20" class="current-day">20</a></li>
      <li><a href="#" title="21">21</a></li>
      <li><a href="#" title="22">22</a></li>
      <li><a href="#" title="23">23</a></li>
      <li><a href="#" title="24">24</a></li>
      <li><a href="#" title="25">25</a></li>
      <li><a href="#" title="26">26</a></li>
      <li><a href="#" title="27">27</a></li>
      <li><a href="#" title="28">28</a></li>
      <li><a href="#" title="29">29</a></li>
      <li><a href="#" title="30">30</a></li>
      <li><a href="#" title="1" class="dull">1</a></li>
      <li><a href="#" title="2" class="dull">2</a></li>
    </ul>
  </div>
</div>
<!--日历-月视图-->
<div class="controls-calendar-monthview mt-40">
  <div class="calendar-header">
    <h2 class="clearfix">
      <div class="arrow fr">
        <a href="#" class="prev-month"></a>
        <a href="#" class="next-month"></a>
      </div>
      <a href="#" class="icon-calendar years-mode-button fl"></a>
      2012
    </h2>
  </div>
  <div class="calendar-body">
    <ul class="months clearfix">             
      <li><a href="#" title="JAN" class="highlighted-months">JAN</a></li>
      <li><a href="#" title="FEB">FEB</a></li>
      <li><a href="#" title="MAR">MAR</a></li>
      <li><a href="#" title="APR">APR</a></li>
      <li><a href="#" title="MAY">MAY</a></li>
      <li><a href="#" title="JUN" class="highlighted-months">JUN</a></li>
      <li><a href="#" title="JUL" class="current-months">JUL</a></li>
      <li><a href="#" title="AUG">AUG</a></li>
      <li><a href="#" title="SEP" class="highlighted-months">SEP</a></li>
      <li><a href="#" title="OCT" class="highlighted-months">OCT</a></li>
      <li><a href="#" title="NOV">NOV</a></li>
      <li><a href="#" title="DEC" class="highlighted-months">DEC</a></li> 
    </ul>
  </div>
</div>	

CSS

/*日历*/
[class^="controls-calendar"] {
  background-color: #00aec7;
}
.calendar-header {
  color: #fff;
  background-color: #323232;
}
/*日历图标*/
.icon-calendar:before {
  display: inline-block;
  width: 30px;
  height: 30px;
  content: "\46";
}
.calendar-header h2 {
  font-size: 18px;
  font-weight: normal;
  text-align: center;
  line-height: 35px;
  padding: 10px 10px 0;
}
/*日历箭头*/
.calendar-header .arrow a {
  position: relative;
  display: inline-block;
  width: 15px;
  height: 30px;
}
.calendar-header .arrow a:after {
  position: absolute;
  top: 7px;
  left: 0;
  content: "";
  width: 1px;
  height: 1px;
  border: 7px solid transparent;
}
.calendar-header a.prev-month:after {
  border-right-color: #fff;
}
.calendar-header a.next-month:after {
  border-left-color: #fff;
}
.controls-calendar-dayview li {
  float: left;
  width: 50px;
  text-align: center;
  line-height: 50px;
}
.week-days li {
  color: #a7a7a7;
  line-height: 22px;
}
.calendar-body {  
  overflow: hidden;
}
.days a {
  display: block;
  font-size: 18px;
  font-weight: bold;
  border-right: 1px solid #fff;
  border-bottom: 1px solid #fff;
}
.days li:nth-child(7n) a{
  border-right: none; 
}
.days li:nth-last-child(-n+7) a{
  border-bottom: none; 
}
.dull {
  color: #c5c5c5;
}
.highlighted-day {
  background-color: #f00;
}
.current-day,.current-months,.calendar-body a:hover {
  background-color: #006675;
}
.months li {
  float: left;
  width: 25%;
  text-align: center;
  line-height: 90px;
}
.months a {
  display: block;
  font-size: 18px;
  font-weight: bold;
  height: 90px;
  line-height: 85px;
  border-right: 1px solid #fff;
  border-bottom: 1px solid #fff;
}
.months li:nth-child(4n) a{
  border-right: none; 
}
.months li:nth-last-child(-n+4) a{
  border-bottom: none; 
}
.highlighted-months {
  position: relative;
}
.highlighted-months:after {
  position: absolute;
  bottom: 10px;
  left: 7%;
  content: "";
  width: 86%;
  height: 2px;
  background-color: #f00;
}	

效果

导航

五、视频按钮和分享按钮

HTML

<!--视图按钮 and 分享按钮-->
<div class="views-item clearfix">
  <a href="#" title="" class="icon-paragraph-justify"></a>
  <a href="#" title="" class="icon-paragraph-left"></a>
  <a href="#" title="" class="icon-paragraph-center"></a>
  <a href="#" title="" class="icon-paragraph-right"></a>
</div>
<div class="like-it-item mt-40 share-btn">
  <a href="" class="icon-thumbs-up like-it">
    Like It
    <span class="labe">5720</span>
  </a>
</div>
<div class="twitter-item mt-20 share-btn">
  <a href="" class="icon-twitter twitter">
    Tweet
    <span class="labe">2035</span>
  </a>
</div>	

CSS

/*视图按钮*/
.views-item a {
  float: left;
  width: 40px;
  line-height: 40px;
  text-align: center;
  border-right: 1px solid #5acbdb;
  background-color: #00aec7;
}
.views-item a:hover {
  background-color: #006675;
}
/*两端对齐图标*/
.icon-paragraph-justify:before {
  content: "\e048";
}
/*左端对齐图标*/
.icon-paragraph-left:before {
  content: "\e031";
}
/*中间对齐图标*/
.icon-paragraph-center:before {
  content: "\e03a";
}
/*右端对齐图标*/
.icon-paragraph-right:before {
  content: "\e03f";
}
/*分享按钮*/
.share-btn {
  position: relative;
  display: block;
  width: 100px;  
  line-height: 30px;
  padding-right: 30px;
  text-align: center;
  background-color: #00aec7;
}
.share-btn a:before {
  position: absolute;
  top: 0;
  right: 0;
  width: 30px;
  height: 30px;
  border-left: 1px solid #87d9e5;
}
.icon-thumbs-up:before {
  content: "\e071";
}
.icon-twitter:before {
  content: "\e0a2";
}
/*tool tip效果*/
.share-btn span {
  display: none;
  position: absolute;
  top: 0;
  right: -70px;
  width: 60px;
  line-height: 30px;
  text-align: center;
  background-color: #323223;
}
.share-btn span:after {
  position: absolute;
  top: 10px;
  left: -10px;
  content: "";
  border: 5px solid transparent;
  border-right-color: #323223;
}
.share-btn:hover {
  background-color: #006675;
}
.share-btn:hover span {
  display: block;
}	

效果

导航

六、自定义复选框

HTML

<form action="" method="get" accept-charset="utf-8">
  <div class="form-item fsize20">
    <div class="checkbox-item mr-10">
      <input type="checkbox" name="" id="checkbox-1">
      <label for="checkbox-1" data-off="Off" data-on="On" class="radius"></label>
    </div>
    <div class="checkbox-item">
      <input type="checkbox" name="" id="checkbox-2" checked="checked">
      <label for="checkbox-2" data-off="Off" data-on="On" class="radius"></label>
    </div>
  </div>
  <div class="form-item fsize10 mt-20">
    <div class="checkbox-item mr-10">
      <input type="checkbox" name="" id="checkbox-3">
      <label for="checkbox-3" data-off="Off" data-on="On" class="radius"></label>
    </div>
    <div class="checkbox-item">
      <input type="checkbox" name="" id="checkbox-4" checked="checked">
      <label for="checkbox-4" data-off="Off" data-on="On" class="radius"></label>
    </div>
  </div>
  <div class="form-item fsize20 mt-40">
    <div class="checkbox-item mr-10">
      <input type="checkbox" name="" id="checkbox-5">
      <label for="checkbox-5" data-off="Off" data-on="On"></label>
    </div>
    <div class="checkbox-item">
      <input type="checkbox" name="" id="checkbox-6" checked="checked">
      <label for="checkbox-6" data-off="Off" data-on="On"></label>
    </div>
  </div>
  <div class="form-item fsize10 mt-20">
    <div class="checkbox-item mr-10">
      <input type="checkbox" name="" id="checkbox-7">
      <label for="checkbox-7" data-off="Off" data-on="On"></label>
    </div>
    <div class="checkbox-item">
      <input type="checkbox" name="" id="checkbox-8" checked="checked">
      <label for="checkbox-8" data-off="Off" data-on="On"></label>
    </div>
  </div>
</form>	

CSS

/*复选框*/
.controls-checkboxs .checkbox-item {
  display: inline-block;
}
.controls-checkboxs input[type="checkbox"] {
  display: none;
}
label.radius {
  border-radius: 1em;
}
label.radius:before {
  border-radius: 50%;
}
.controls-checkboxs label {
  position: relative;
  display: inline-block;
  color: #fff;
  width: 4.5em;
  height: 2em;
  background-color: #323232;
}
.controls-checkboxs label:before,
.controls-checkboxs label:after {
  position: absolute;
  content: "";
}
.controls-checkboxs label:before {
  margin: .25em;
  width: 1.5em;
  height: 1.5em;
  background-color: #fff;
  transition: margin-left .3s; 
}
.controls-checkboxs label:after {
  margin-top: .25em;
  margin-left: 2.25em;
  content: attr(data-off);
  transition: margin-left .5s;
}
.controls-checkboxs input:checked + label {
  background-color: #00aec7;
}
.controls-checkboxs input:checked + label:before {
  margin-left: 2.7em;
}
.controls-checkboxs input:checked + label:after {
  content: attr(data-on);
  margin-left: .5em;
}	

效果

导航

七、色板和功能按钮

HTML

<!--色板-->
<div class="color-wheel">
  <img src="img/color-wheel.png" alt="">
</div>
<!--功能按钮-->
<div class="function-buttons mt-40">
  <ul class="icon-items clearfix">
    <li><a href="#" title="" class="checked"><i class="icon-checked"></i></a></li>
    <li><a href="#" title=""><i class="icon-checked"></i></a></li>
    <li><a href="#" title=""><i class="icon-close"></i></a></li>
    <li><a href="#" title=""><i class="icon-menu"></i></a></li>
    <li><a href="#" title=""><i class="icon-plus"></i></a></li>
    <li><a href="#" title=""><i class="icon-minus"></i></a></li>
    <li><a href="#" title=""><i class="icon-radio-checked"></i></a></li>
    <li><a href="#" title=""><i class="icon-radio-unchecked"></i></a></li>
  </ul>
</div>
<div class="social-buttons mt-40">
  <ul class="social-items">
    <li><a href="" title=""><i class="icon-tumblr"></i></a></li>
    <li><a href="" title=""><i class="icon-facebook"></i></a></li>
    <li><a href="" title=""><i class="icon-pinterest"></i></a></li>
    <li><a href="" title=""><i class="icon-yahoo"></i></a></li>
    <li><a href="" title=""><i class="icon-blogger"></i></a></li>
    <li><a href="" title=""><i class="icon-vimeo"></i></a></li>
    <li><a href="" title=""><i class="icon-linkedin-2"></i></a></li>
    <li><a href="" title=""><i class="icon-dribbble-3"></i></a></li>
    <li><a href="" title=""><i class="icon-github-2"></i></a></li>
  </ul>
</div>	

CSS

/*色板*/
.color-wheel img {
  margin: 10px 0 0 -20px;
}
/*功能按钮*/
.icon-items li a {
  float: left;
  width: 20px;
  height: 20px;
  text-align: center;
  line-height: 20px;
  margin-right: 5px;
  background-color: #00aec7;
}
.icon-items .checked {
  background-color: #323232;
}
.icon-items i:before {
  
}
.icon-checked:before {
  content: "\e054";
  font-size: 16px;
}
.icon-close:before {
  content: "\e055";
  font-size: 12px;
}
.icon-menu:before {
  content: "\e09b";
}
.icon-plus:before {
  content: "\e093";
  font-size: 12px;
}
.icon-minus:before {
  content: "\e092";
  font-size: 12px;
}
.icon-radio-checked:before {
  content: "\e01e";
  font-size: 14px;
}
.icon-radio-unchecked:before {
  content: "\e023";
  font-size: 14px;
} 
.social-items li {
  float: left;
  width: 53px;
  text-align: center;
  line-height: 53px;
  margin-bottom: 20px;
  margin-right: 15px;
}
.social-items li:nth-child(3n) {
  margin-right: 0;
}
.social-items li a {
  display: block;
  background-color: #00aec7;
}
.social-items li a:hover {
  background-color: #006675;
}
.icon-tumblr:before {
  content: "\e0b7";
}
.icon-facebook:before {
  content: "\e049";
}
.icon-pinterest:before {
  content: "\e0bc";
}
.icon-yahoo:before {
  content: "\e0bd";
}
.icon-blogger:before {
  content: "\e0b1";
}
.icon-vimeo:before {
  content: "\e06a";
}
.icon-linkedin-2:before {
  content: "\e0aa";
}
.icon-dribbble-3:before {
  content: "\e04b";
}
.icon-github-2:before {
  content: "\e063";
}	

效果

导航

八、手风琴效果

HTML

<!--手风琴-->
<div class="accordion">
  <ul class="nostyle">
    <li>
      <input type="radio" id="ac-1" name="accordion-1" checked="checked">
      <label for="ac-1">Option 1</label>
      <div class="accordion-content">
        <img src="img/ac-1.jpg" alt="">
        <h3>Here you title</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
      </div>
    </li>
    <li>
      <input type="radio" id="ac-2" name="accordion-1">
      <label for="ac-2">Option 2</label>
      <div class="accordion-content">
        <img src="img/ac-1.jpg" alt="">
        <h3>Here you title</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
      </div>
    </li>
    <li>
      <input type="radio" id="ac-3" name="accordion-1">
      <label for="ac-3">Option 3</label>
      <div class="accordion-content">
        <img src="img/ac-1.jpg" alt="">
        <h3>Here you title</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
      </div>
    </li>
  </ul>
</div>
<div class="accordion-2 mt-40">
  <ul class="nostyle">
    <li>
      <input type="radio" id="ac-4" name="accordion-2" checked="checked">
      <label for="ac-4">Option 1</label>
      <div class="accordion-content">
        <img src="img/ac-1.jpg" alt="">
        <h3>Here you title</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
      </div>
    </li>
    <li>
      <input type="radio" id="ac-5" name="accordion-2">
      <label for="ac-5">Option 2</label>
      <div class="accordion-content">
        <img src="img/ac-1.jpg" alt="">
        <h3>Here you title</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
      </div>
    </li>
    <li>
      <input type="radio" id="ac-6" name="accordion-2">
      <label for="ac-6">Option 3</label>
      <div class="accordion-content">
        <img src="img/ac-1.jpg" alt="">
        <h3>Here you title</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
      </div>
    </li>
  </ul>
</div>	

CSS

/*手风琴*/
[class^="accordion"] {
  padding: 10px;
  background-color: #fff;
}
[class^="accordion"] li {
  margin-bottom: 10px
}
[class^="accordion"] li img {
  max-width: 320px;
  vertical-align: middle;
}
[class^="accordion"] input[type="radio"] {
  display: none;
}
[class^="accordion"] label {
  display: block;
  color: #fff;
  line-height: 40px;
  font-weight: bold;
  font-size: 18px;
  padding: 0 5px; 
  background-color: #00aec7;
}
/*展开内容*/
[class^="accordion"] input[type="radio"]:checked + label,
.accordion label:hover {
  background-color: #006675;
}
[class^="accordion"] input[type="radio"]:checked ~ .accordion-content {
  display: block;
}
.accordion-content {
  display: none;
  padding: 10px 0 20px;
}
.accordion-content h3 {
  font-size: 14px;
  line-height: 30px;
} 
.accordion-2 {
  background-color: #323232;
}
.accordion-2 .accordion-content {
  color: #fff;
  background-color: #323232;
}	

效果

导航

九、视频播放面板

HTML

<div class="vodeo-player mt-40">
  <div class="video-container">
  	<div class="hide">
     <a href="" title="" class="like-button"><i class="icon-like"></i></a>
     <a href="" title="" class="link-button"><i class="icon-link"></i></a>
  	</div>
  	<img src="img/video-container.jpg" alt="">
  </div> 
  <div class="vodeo-bar clearfix">
  	<ul class="nostyle">
     <li><a href="" title="" class="play-button"><i class="icon-play"></i></a></li>
     <li>
     	<div class="vodeo-progress"> <span>06:52</span> </div>
     </li>
     <li><a href="" title="" class="new-tab-button"><i class="icon-new-tab"></i></a></li>
     <li><a href="" title="" class="loop-button"><i class="icon-loop"></i></a></li>
  	</ul> 
  </div>
</div>	

CSS

/*视频播放器*/
.vodeo-player {
  padding: 10px;
  background-color: #323232;
}
.video-container {
  position: relative;
}
.video-container:hover .hide {
  display: block;
}
.video-container .hide {
  display: none;
  position: absolute;
  right: 10px;
}
.video-container .hide a {
  display: block;
  width: 40px;
  line-height: 40px;
  text-align: center;
  margin-top: 10px;
  background-color: rgba(0,0,0,.2);
} 
.icon-like:before {
  content: "\e08c";
  color: #00aec7;
}
.icon-link:before {
  content: "\e035";
}
.vodeo-bar {
  margin-top: 10px;
}
.vodeo-bar li {
  float: left;
}
.vodeo-bar li a {
  display: block;
  text-align: center;
  width: 42px;
  height: 40px;
  background-color: #00aec7;
}
.play-button:after {
  display: inline-block;
  content: "";
  width: 0;
  height: 0;
  margin-top: 8px;
  margin-left: 12px;
  border-width: 10px 12px;
  border-style: solid;
  border-color: transparent;  
  border-left-color: #fff;
}
.vodeo-progress {
  position: relative;
  width: 400px;
  height: 10px;
  margin: 12px 15px 0;
  background-color: #00aec7;
}
.vodeo-progress:after {
  position: absolute;
  left: 50%;
  content: "";
  width: 200px;
  height: 10px;
  background-color: #000;
}
.vodeo-progress span {
  position: absolute;
  top: -40px;
  left: 50%;
  color: #fff;
  padding: 5px 10px;
  margin-left: -25px;
  position: absolute;
  background-color: #000;
  z-index: 2;
}
.vodeo-progress span:before,.vodeo-progress span:after {
  position: absolute;
  content: "";
}
.vodeo-progress span:before {
  top: 36px;
  left: 18px;
  border: 8px solid #fff;
  box-shadow: 0 0 0 2px #2e2e2e;
  border-radius: 50%;
}
.vodeo-progress span:after {
  top: 100%;
  left: 50%;
  margin-left: -5px;
  border: 5px solid transparent;
  border-top-color: #000;
}
.new-tab-button {
  margin-right: 10px;
}
.icon-new-tab:before {
  content: "\e0a0";
  font-size: 24px;
}
.icon-loop:before {
  content: "\e08a";
  font-size: 24px;
}	

效果

导航

十、选项卡(tabs)

HTML

<div class="tab-menu mt-40">
  <div class="tab-menu-container"> 
    <div class="tab-1" id="tab-1">
      <h2><a href="#tab-1" title="Option 1" class="active">Option 1</a></h2>
      <div class="filters-bar clearfix">
        <strong># <i class="icon-menu"></i></strong>
        <strong>Title <i class="icon-menu"></i></strong>
        <strong>Status</strong>
        <strong>Price <i class="icon-menu"></i></strong>
      </div>
      <div class="text-columns clearfix">
        <ul class="nostyle">
        	<li>
              <span>1</span>
              <span>Loremt ipsum</span>
              <span>Deactive</span>
              <span>$0.99</span>
        	</li>
        	<li class="active">
              <span>2</span>
              <span>Consectetuer</span>
              <span>Deactive</span>
              <span>$1.99</span>
        	</li>
        	<li>
              <span>3</span>
              <span>Nonummy</span>
              <span>Deactive</span>
              <span>$0.78</span>
        	</li>
        	<li>
              <span>4</span>
              <span>Euismod</span>
              <span>Deactive</span>
              <span>$1.99</span>
        	</li>
        	<li>
              <span>5</span>
              <span>Consequat</span>
              <span>Deactive</span>
              <span>$22.50</span>
        	</li> 
        	<li>
              <span>6</span>
              <span>Lobortis</span>
              <span>Deactive</span>
              <span>$0.99</span>
        	</li>
        	<li>
              <span>7</span>
              <span>Vulputate velit</span>
              <span>Deactive</span>
              <span>$0.99</span>
        	</li>  
        </ul>
      </div>
    </div>
    <div class="tab-2" id="tab-2">
      <h2><a href="#tab-2" title="Option 2">Option 2</a></h2>
      <div class="filters-bar clearfix">
        <strong># <i class="icon-menu"></i></strong>
        <strong>Title <i class="icon-menu"></i></strong>
        <strong>Status</strong>
        <strong>Price <i class="icon-menu"></i></strong>
      </div>
      <div class="text-columns clearfix">
        <ul class="nostyle">
        	<li>
              <span>1</span>
              <span>Consectetuer</span>
              <span>Deactive</span>
              <span>$1.99</span>
        	</li>
        	<li>
              <span>2</span>
              <span>Nonummy</span>
              <span>Deactive</span>
              <span>$0.78</span>
        	</li>
        	<li>
              <span>3</span>
              <span>Loremt ipsum</span>
              <span>Deactive</span>
              <span>$0.99</span>
        	</li>
        	<li class="active">
              <span>4</span>
              <span>Consequat</span>
              <span>Deactive</span>
              <span>$22.50</span>
        	</li>
        	<li>
              <span>5</span>
              <span>Euismod</span>
              <span>Deactive</span>
              <span>$1.99</span>
        	</li> 
        	<li>
              <span>6</span>
              <span>Vulputate velit</span>
              <span>Deactive</span>
              <span>$0.99</span>
        	</li>
        	<li>
              <span>7</span>
              <span>Lobortis</span>
              <span>Deactive</span>
              <span>$0.99</span>
        	</li>  
        </ul>
      </div>
    </div>
  </div>
</div>	

CSS

/*选项卡*/
.tab-menu-container {
  position: relative;
  padding-top: 35px;
  height: 352px;
}
.tab-1,.tab-2 {
  position: absolute;
  width: 588px;
  height: 352px;
}
.tab-1 h2 {
  position: absolute;
  top: -35px;
  left: 0;
}
.tab-2 h2 {
  position: absolute;
  top: -35px;
  left: 140px;
  margin-left: 20px;
}
.tab-1:target, .tab-2:target {
  z-index: 1;
}
.tab-menu h2 {
  padding-left: 10px; 
  height: 35px;
  line-height: 35px;
}
.tab-menu h2 a {
  display: inline-block;
  font-size: 18px;
  padding: 0 10px;
  width: 130px;
  background-color: #00aec7;
}
.tab-2 h2 a {
  background-color: #006675;
}
.tab-1:target + .tab-2 h2 a {
  background-color: #00aec7;
}
.tab-1:target h2 a,.tab-2:target h2 a,.tab-menu h2 a:hover {
  background-color: #006675;
} 
.filters-bar {
  color: #fff;
  line-height: 40px;
  background-color: #006675;
}
.filters-bar strong:first-child,
.text-columns span:first-child {
  width: 19%;
}
.filters-bar strong,.text-columns span {
  float: left; 
  width: 27%;
  text-indent: 20px;  
}
.filters-bar i:before {
  font-size: 14px;
}
.text-columns {
  padding-bottom: 20px;
  background-color: #fff;
}
.text-columns li {
  margin: 10px 0;
  height: 30px;
  line-height: 30px;
}
.text-columns li:hover,.text-columns .active {
  color: #fff;
  background-color: #00aec7;
} 	

效果

导航

十一、按钮效果

HTML

<div class="normal-buttons">
  <button type="button">Button</button>
  <button type="button" class="black">Button</button>
  <button type="button" class="active">Button</button>
  <button type="button">Button</button>
</div>
<div class="big-buttons">
  <button type="button">Button</button>
  <button type="button" class="black">Button</button>
  <button type="button" class="active">Button</button>
  <button type="button">Button</button>
</div>	

CSS

/*按钮*/
.big-buttons,.normal-buttons {
  float: left;
}
.big-buttons {
  width: 340px;
  margin-left: 20px;
  font-size: 18px;
  font-weight: bold;
}
.normal-buttons {
  width: 220px; 
  font-size: 14px;
  font-weight: bold;
}
.controls-buttons button {
  color: #fff;
  text-align: center; 
  margin-bottom: 10px;
  border: none;
  background-color: #00aec7;
}
.normal-buttons button {
  width: 90px;
  line-height: 30px;
}
.big-buttons button {
  width: 150px;
  line-height: 50px;
  margin-bottom: 15px;
}
.controls-buttons button:nth-child(odd) {
  margin-right: 20px;
}
.controls-buttons .black {
  background-color: #000;
}
.controls-buttons .active,.controls-buttons button:hover {
  background-color: #006675;
}	

效果

导航

十二、价格区块

HTML

<div class="price-box clearfix">
  <ul class="price-box-items">
    <li>
      <div class="item-1">
        <h2><span>BasicBasic</span></h2>
        <h3>$ <span>5</span>.99 <em>/</em> Month</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet olore <em>magna</em> aliquam erat volutpat.</p>
      </div>
    </li>
    <li>
      <div class="item-2 active">
        <h2><span>Advanced</span></h2>
        <h3>$ <span>10</span>.99 <em>/</em> Month</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet olore <em>magna</em> aliquam erat volutpat.</p>
      </div>
    </li>
    <li>
      <div class="item-3">
        <h2><span>Premium</span></h2>
        <h3>$ <span>99</span>.00 <em>/</em> Month</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet olore <em>magna</em> aliquam erat volutpat.</p>
      </div>	
    </li>
  </ul>
</div>
<div class="price-box-2 clearfix mt-40">
  <ul class="price-box-items">
    <li>
      <div class="item-1">
        <h2><span>BasicBasic</span></h2>
        <h3>$ <span>5</span>.99 <em>/</em> Month</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet olore <em>magna</em> aliquam erat volutpat.</p>
      </div>
    </li>
    <li>
      <div class="item-2 active">
        <h2><span>Advanced</span></h2>
        <h3>$ <span>10</span>.99 <em>/</em> Month</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet olore <em>magna</em> aliquam erat volutpat.</p>
      </div>
    </li>
    <li>
      <div class="item-3">
        <h2><span>Premium</span></h2>
        <h3>$ <span>99</span>.00 <em>/</em> Month</h3>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet olore <em>magna</em> aliquam erat volutpat.</p>
      </div>	
    </li>
  </ul>
</div>	

CSS

/*价格盒子*/
[class^="price-box"] li {
  float: left;
  width: 33%;
  text-align: center; 
}
[class^="item-"] {
  margin-left: 10px;
  background-color: #fff;
}
.price-box-items h2 {
  color: #fff;
  font-size: 30px;
  line-height: 60px;
  background-color: #00aec7; 
}
.price-box-items h3 {
  font-size: 24px;
  line-height: 100px;
}
.price-box-items h3 span {
  font-size: 48px; 
}
.price-box-items em {
  color: #00aec7; 
}
.price-box-items p {
  color: #969696;
  padding: 0 20px 40px; 
}
.price-box-items [class^="item-"]:hover h2,[class^="item-"].active h2 {
  background-color: #006675; 
} 
.price-box-2 [class^="item-"] {
  background-color: #323232;
}
.price-box-2 .price-box-items h3 {
  color: #fff;
}	

效果

导航

十三、时钟与进度条

HTML

<!--时钟-->
<div class="controls-clock clearfix mt-20">
  <ul class="clock-item">
    <li class="hours">
      <span class="hours-1">0 1 2 </span> 
      <span class="hours-2">0 1 2 3 4 5 6 7 8 9 </span> 
    </li>
    <li class="minutes">
      <span class="minutes-1">0 1 2 3 4 5 </span> 
      <span class="minutes-2">0 1 2 3 4 5 6 7 8 9 </span> 
    </li>
    <li>Hours</li>
    <li>Minutes</li>
  </ul>
</div>
<!--进度条-->
<div class="controls-progress-bar">
  <div class="progress-bar-item mt-20">
    <div class="bar-1">
      <div class="progress"></div>
    </div>
    <p>Loading...</p>
  </div>
  <div class="progress-bar-item mt-40">
    <div class="bar-2">
      <div class="progress">
       <span>80%</span>
      </div>
    </div>
  </div>
  <div class="progress-bar-item mt-60">
    <div class="bar-3">
      <div class="progress">
        <span>20%</span>
      </div>
    </div>
  </div>
  <div class="progress-bar-item mt-60">
    <div class="bar-4">
      <div class="progress">
        <span>60%</span>
      </div>
    </div>
  </div>
</div>	

CSS

/*时钟动画*/
@keyframes minutes-1 {
  0% {
    top: 0;
  }
  100% {
    top: -660px;
  }
}
@keyframes minutes-2 {
  0% {
    top: 0px;
  }
  100% {
    top: -1100px;
  }
}
@keyframes hours-1 {
  0% {
    top: 0;
  }
  100% {
    top: -330px;
  }
}
@keyframes hours-2 {
  0% {
    top: 0px;
  }
  100% {
    top: -1100px;
  }
}
/*进度条动画*/
@keyframes bar-1 {
  0% {
    width: 0;
  }
  100% {
    width: 100%;
  }
}
/*时钟*/
.clock-item li {
  float: left;
  width: 110px;
  line-height: 30px;
  text-align: center;
  margin-right: 10px;
  overflow: hidden;
}
.clock-item .hours,.clock-item .minutes {
  position: relative;
  line-height: 110px;
  height: 110px;
  font-size: 60px;
  background-color: #00aec7;
}  
.clock-item span {
  position: absolute;
  display: inline-block;
  width: 45px;
}
.clock-item .hours-1,.clock-item .minutes-1 {
  left: 0;
  margin-left: 10px;
}
.clock-item .hours-2,.clock-item .minutes-2 {
  right: 0;
  margin-right: 10px;
}
.clock-item a {
  color: #000;
  text-decoration: none;
}
.hours:before,.hours:after,.minutes:before,.minutes:after {
   position: absolute;
   top: 50%;
  left: 0;
  content: '';
}
.hours:before,.minutes:before {
  margin-top: -4px;
  height: 10px;
  width: 2px;
  box-shadow: 8px 0 0 0 #fff, 100px 0 0 0 #fff;
}
.hours:after,.minutes:after {
  width: 100%;
  border-top: 1px solid #fff;
}
.minutes .minutes-2 {
  animation: minutes-2 600s steps(10, end) infinite;
}
.minutes .minutes-1 {
  animation: minutes-1 3600s steps(6, end) infinite;
}
.hours .hours-2 {
  animation: hours-2 36000s steps(10, end) infinite;
}
.hours .hours-1 {
  animation: hours-1 2160000s steps(3, end) infinite;
}
/*进度条*/
.progress-bar-item {
  position: relative;
  width: 100%;
  height: 10px;
  background-color: #323232;
}
.progress {
  position: relative;
  height: 10px;
  background-color: #00aec7;
}
.bar-1 .progress {
  width: 0;
  animation: bar-1 10s linear 2s infinite;
}
.bar-2 .progress {
  width: 80%;
}
.bar-3 .progress {
  width: 20%;
}
.bar-4 .progress {
  width: 60%;
}
.bar-3 .progress:after,.bar-4 .progress:after {
  position: absolute;
  top: -50%;
  right: -8px;
  content: "";
  width: 15px;
  height: 15px;
  border: 2px solid #323232;
  border-radius: 50%;
  background-color: #fff;
}
[class^="bar-"] span {
  position: absolute;
  top: 100%;
  right: -25px;
  color: #fff;
  margin-top: 10px;
  width: 50px;
  line-height: 26px;
  text-align: center;
  background-color: #322332;
}
.bar-3 span {
  top: 15px;
}
[class^="bar-"] span:after {
  position: absolute;
  top: -10px;
  left: 20px;
  content: "";
  border: 5px solid transparent;
  border-bottom-color: #323223;
}	

效果

导航

十四、文本框

HTML

<!--文本框-->
<div class="controls-form-texts mt-60">
  <form action="" method="get" accept-charset="utf-8">
    <div class="form-item">
      <input type="text" name="text edit" id="" placeholder="Text edit" class="text-edit focus-5">
    </div>
    <div class="form-item">
      <input type="text" name="text edit" id="" placeholder="Text edit">
    </div>
    <div class="form-item select-text">
      <input type="text" name="text edit" id="" placeholder="3 560 €" class="focus-5">
    </div>
    <div class="form-item select-text">
      <input type="text" name="text edit" id="" placeholder="2 317 €">
    </div>
  </form>
</div>	

CSS

.controls-form-texts {
  line-height: 60px;
}
.controls-form-texts input[type="text"] {
  width: 310px;
  height: 40px;
  padding-left: 3px;
  text-indent: 5px;
  border: none;
  border-radius: 1px;
  box-shadow: 0 2px 5px rgba(0,0,0,.3);
  transition: all 300ms;
}
.controls-form-texts ::-webkit-input-placeholder {
  font-size: 14px;
  font-style: normal;
  color: #333;
}
.select-text {
  position: relative;
}
.select-text:before,.select-text:after {
  position: absolute;
  right: 20px;
  content: "";
  width: 1px;
  height: 1px;
  border: 8px solid transparent;
  border-width: 8px;
}
.select-text:before {
  top: 12px;
  border-bottom-color: #00aec7;
}
.select-text:after {
  top: 32px;
  border-top-color: #00aec7;
}
input[type="text"].focus-5,.form-item-login input:focus,.controls-form-texts input[type="text"]:focus {
  outline: 0 none; 
   box-shadow: 0 0 0 5px #00aec7; 
}	

效果

导航

以上就是整个Metrostyle的UI Web效果,不知道您搞懂了多少,篇幅较长,如果看得不太爽,那就下载源码仔细看看吧。

demodownload

特别声明:Metrostyle整个UI设计图并不是W3cplus成员设计,而是国外友要提供,如果您私自将上面效果应用到商业中造成的侵仅,本站概不负责,此处提供的代码仅供前端有好者学习所用。谢谢!

如需转载,请遵守W3cplus版权声明,烦请注明出处:http://www.w3cplus.com/demo/metrostyle-web-ui-green.html

主流浏览器的Hack写法

$
0
0

此处的“hack”并非是网络中很神秘的组织“黑客”,而是使用他们可以帮助你解决浏览器下一些怪异和特殊的bug。很多时候对于这样的讨论也非常多,比如说在您的代码中应不应该使用hack?甚至延伸到使用“hack”是一个优秀的前端人员?其实,有时候是逼不得以,必须为之。

有关于hack的使用方法和种类,互联系网上成千上万,比较典型的介绍有:

  1. 浏览器兼容之旅的第二站:各浏览器的Hack写法
  2. Browser CSS Hacks
  3. Moving IE specific CSS into @media blocks
  4. Detecting browsers javascript hacks
  5. Browser Specific Hacks
  6. Browser-Specific CSS Hacks
  7. CSS hacks

大家平时看得多的应该是IE浏览器的hack写法比较多,但对于现代浏览器,比如说Safari、Chrome、Firefox等浏览器的hack写法并不多见,甚至有的不知道怎么写。如果您是属于后者,根本不知道各浏览器下具有哪些hack手段,不要着急。因为Hugo GiraudelTim Pietrusky将各浏览器下的hack写整理放在了Browserhacks.com之上。当然也要非常感谢Paul IrishNicolas Gallagher所做的补充与说明。为了国内前端开发者更好的查阅,我将Browserhacks.com上有关于各种浏览器的hack写法搬移到w3cplus上,以供大家翻阅与查找。

一、Chrome浏览器

选择器Hack

/* Chrome 24- and Safari 5- */
::made-up-pseudo-element, .selector {
  代码放在这里
}	

媒体查询Hacks

/* Chrome, Safari 3+ */
@media screen and (-webkit-min-device-pixel-ratio:0) {
  代码放在这里	
}	

JavaScript Hack

/* Chrome */
var isChrome = Boolean(window.chrome);	

二、Firefox浏览器

属性选择器Hack

/* Firefox 1.5 */
body:empty .selector {
 样式代码放这里
}
/* Firefox 2+ */
.selector, x:-moz-any-link {
 样式代码放这里	
}
/* Firefox 3+ */
.selector, x:-moz-any-link; x:default {
 样式代码放这里	
}
/* Firefox 3.5+ */
body:not(:-moz-handler-blocked) .selector {
 样式代码放这里	
}	

媒体查询Hack

/* Firefox 3.5+, IE 9/10, Opera */
@media screen and (min-resolution: +72dpi) {
 样式代码放这里		
}
/* Firefox 3.6+ */
@media screen and (-moz-images-in-menus:0) {
 样式代码放这里		
}
/* Firefox 4+ */
@media screen and (min--moz-device-pixel-ratio:0) {
 样式代码放这里		
}	

JavaScript Hack

/* Firefox */
var isFF = !!navigator.userAgent.match(/firefox/i);

/* Firefox 2 - 13 */
var isFF = Boolean(window.globalStorage);

/* Firefox 2/3 */
var isFF = /a/[-1]=='a';

/* Firefox 3 */
var isFF = (function x(){})[-5]=='x';	

混合型Hack

/* Firefox 3+ */
@-moz-document url-prefix() {
 样式代码放这里		
}	

三、Opera浏览器

属性选择器Hack

/* Opera 9.25, Safari 2/3.1 */
*|html[xmlns*=""] .selector {
 样式代码放这里	
}

/* Opera 9.27 and below, Safari 2 */
html:first-child .selector {
 样式代码放这里	
}

/* Opera 9.5+ */
noindex:-o-prefocus, .selector {
 样式代码放这里	
}	

媒体查询Hack

/* Opera 7 */
@media all and (min-width: 0px){
 样式代码放这里		
}

/* Opera 12- */
@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) {
 样式代码放这里		
}

/* Opera, Firefox 3.5+, IE 9/10 */
@media screen and (min-resolution: +72dpi) {
 样式代码放这里		
}

/* Opera, IE 8/9/10 */
@media screen {
 样式代码放这里		
}	

JavaScript Hack

/* Opera 9.64- */
var isOpera = /^function \(/.test([].sort);

/* Opera 12- */
var isOpera = Boolean(window.opera);	

四、Safari浏览器

属性选择器Hack

/* Safari 2/3 */
html[xmlns*=""] body:last-child .selector {
 样式代码放这里		
} 
html[xmlns*=""]:root .selector  {
 样式代码放这里		
}

/* Safari 2/3.1, Opera 9.25 */
*|html[xmlns*=""] .selector {
 样式代码放这里		
}

/* Safari 5- and Chrome 24- */
::made-up-pseudo-element, .selector {
 样式代码放这里		
}	

媒体查询Hack

/* Safari */
var isSafari = /a/.__proto__=='//';	

五、IE浏览器

选择器Hack

/* IE 6 and below */
* html .selector  {
 样式代码放这里		
} 
.suckyie6.selector {
 样式代码放这里		
} /* .suckyie6 can be any unused class */

/* IE 7 and below */
.selector, {
 样式代码放这里		
}

/* IE 7 */
*:first-child+html .selector {
  样式代码放这里	
} 
.selector, x:-IE7 {
 样式代码放这里		
} 
*+html .selector {
 样式代码放这里		
} 

/* Everything but IE 6 */
html > body .selector {
 样式代码放这里		
}

/* Everything but IE 6/7 */
html > /**/ body .selector {
  样式代码放这里	
}
head ~ /* */ body .selector {
 样式代码放这里		
}

/* Everything but IE 6/7/8 */
:root *> .selector {
 样式代码放这里		
} 
body:last-child .selector {
 样式代码放这里		
} 
body:nth-of-type(1) .selector {
 样式代码放这里		
} 
body:first-of-type .selector {
 样式代码放这里		
}	

属性/属性值 Hack

/* IE 6 */
.selector { _color: blue; } 
.selector { -color: blue; }

/* IE 6/7 - any combination of these characters: 
 ! $ & * ( ) = % + @ , . / ` [ ] # ~ ? : <  > | */
.selector { !color: blue; } 
.selector { $color: blue; } 
.selector { &color: blue; } 
.selector { *color: blue; } 
/* ... */

/* IE 6/7 - acts as an !important */
.selector { color: blue !ie; } 
/* string after ! can be anything */

/* IE 8/9 */
.selector { color: blue\0/; } 
/* must go at the END of all rules */

/* IE 9/10 */
.selector:nth-of-type(1n) { color: blue\9; }

/* IE 6/7/8/9/10 */
.selector { color: blue\9; } 
.selector { color/*\**/: blue\9; }

 /* Everything but IE 6 */
.selector { color/**/: blue; }

媒体查询Hack

/* IE 6/7 */
@media screen\9 {
 样式代码放这里		
}

/* IE 6/7/8 */
@media \0screen\,screen\9 {
 样式代码放这里		
}

/* IE 8 */
@media \0screen {
 样式代码放这里		
}

/* IE 8/9/10 & Opera */
@media screen\0 {
 样式代码放这里		
}

/* IE 9/10, Firefox 3.5+, Opera */
@media screen and (min-resolution: +72dpi) {
 样式代码放这里		
}

/* IE 9/10 */
@media screen and (min-width:0\0) {
 样式代码放这里		
}

/* IE 10+ */
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
 样式代码放这里		
}

/* Everything but IE 6/7/8 */
@media screen and (min-width: 400px) {
 样式代码放这里		
}

JavaScript Hack

/* IE <= 8 */
var isIE = '\v'=='v';	
/* IE 6 */
(checkIE = document.createElement("b")).innerHTML = "<!--[if IE 6]><i></i><![endif]-->"; 
var isIE = checkIE.getElementsByTagName("i").length == 1;	
/* IE 7 */
(checkIE = document.createElement("b")).innerHTML = "<!--[if IE 7]><i></i><![endif]-->"; 
var isIE = checkIE.getElementsByTagName("i").length == 1;
navigator.appVersion.indexOf("MSIE 7.")!=-1	
/* IE 8 */
(checkIE = document.createElement("b")).innerHTML = "<!--[if IE 8]><i></i><![endif]-->"; 
var isIE = checkIE.getElementsByTagName("i").length == 1;	
/* IE 9 */
(checkIE = document.createElement("b")).innerHTML = "<!--[if IE 9]><i></i><![endif]-->"; 
var isIE = checkIE.getElementsByTagName("i").length == 1;	
/* IE 10 */
var isIE = eval("/*@cc_on!@*/false") && document.documentMode === 10;	

/* IE 10 */
var isIE = document.body.style.msTouchAction != undefined;

上面列出各个浏览器下hack的写法,当然在实际运用之中并不建议使用hack。如果你的页面需要hack来处理时,请先检查你的css或者js,如果实在无法达到要求,在考虑使用hack来处理。

特别声明:以上展示的hack代码均来自于:http://browserhacks.com/

如需转载,请遵守W3cplus版权声明,烦请注明出处:http://www.w3cplus.com/css/browser-hacks.html

js 检测数组函数

$
0
0
var isArray = Function.isArray || function(o) {
  return typeof o === "object"&&
  Object.prototype.toString.call(o) === "[object Array]";
};

深入了解 Flexbox 伸缩盒模型

$
0
0

介绍

Flexbox(伸缩布局盒) 是 CSS3 中一个新的布局模式,为了现代网络中更为复杂的网页需求而设计。本文将介绍 Flexbox 语法的技术细节。浏览器的支持越来越快,所以当 Flexbox 被广泛支持并应用时你将会快人一步。如果你想知道它是什么并是如何工作的,不妨仔细了解下吧!

为什么需要伸缩布局盒(Flexbox)?

作者长期以来使用表格、浮动、行内块元素和其他 CSS 属性来布局网站内容。然而,这些并不是为复杂的页面和网页应用而设计的。不管是简单的垂直居中,还是灵活的网格布局都很难靠一己之力轻易实现,因此成就了 CSS 网格框架。但是,如果真的需要那么多项目来实现做这些事,为什么不让它来的更简单些呢?Flexbox 的目的就是改变这一切。

规范状态和浏览器支持情况

Flexbox 规范的相关工作已经进展了3年。不同的浏览器也实现了不同的实验版本。在2012年9月,Flexbox 语法的第三个主要修订版本进入到候选推荐阶段。这意味着 W3C 认为当前的语法是稳定的,并鼓励浏览器开发商去实现它。

Flexbox 规范时间表:

  • 2009年7月 工作草案 (display: box;)
  • 2011年3月 工作草案 (display: flexbox;)
  • 2011年11月 工作草案 (display: flexbox;)
  • 2012年3月 工作草案 (display: flexbox;)
  • 2012年6月 工作草案 (display: flex;)
  • 2012年9月 候选推荐 (display: flex;)

Flexbox 已经被浏览器快速支持。Chrome 22+, Opera 12.1+, 和 Opera Mobile 12.1+ 已经支持了本文中所描述的 Flexbox。Firefox 18Blackberry 10也很快就会实现。我推荐大家使用已经支持的浏览器来阅读本文和查看例子。

概念和术语

虽然现在我们可以使用 Flexbox 轻松创建布局,而不会像以前那样难以理解,但我们仍然需要花一些时间去熟悉到底如何使用 Flexbox。新的术语和概念可能会是我们使用 Flexbox 时的一个障碍,所以让我们先来了解以下它们。

Flexbox 由 伸缩容器伸缩项目组成。通过设置元素的 display属性为 flexinline-flex可以得到一个伸缩容器。设置为 flex的容器被渲染为一个块级元素,而设置为 inline-flex的容器则渲染为一个行内元素。

这里的示例创建了一个伸缩容器。

1234
.flex-container{
display:-webkit-flex;
display:flex;
}

本文中所有的示例都会带有相应的浏览器厂商前缀。

伸缩容器中的每一个子元素都是一个伸缩项目。伸缩项目可以是任意数量的。伸缩容器外和伸缩项目内的一切元素都不受影响。简单地说,Flexbox 定义了伸缩容器内伸缩项目该如何布局。

Flex Lines 伸缩行

伸缩项目沿着伸缩容器内的一个 伸缩行定位。通常每个伸缩容器只有一个伸缩行。

这个示例展示了2个项目在默认情况下的定位:沿着一个水平伸缩行从左至右显示。

Writing Modes 书写模式

在你设计 Flexbox 时的有一个重要的部分是更改伸缩行的方向。默认情况下,伸缩行和文本方向一致:从左至右,从上往下。

这是 W3C 关于一个名为书写模式的新特性工作草稿。书写模式是一个新的方法,让你可以从右往左写,甚至竖着写,就像你知道的某些语言一样。

书写模式是一个正在进行的计划,但是 Chrome 已经率先支持了 direction CSS 属性。如果我们在上一个例子中设置方向为 rtl (从右往左) 那么不仅仅文字会从右往左书写,而且 伸缩行也改变了方向,并更改了页面的布局。

这也许就是 Flexbox 为什么如此抽象难懂的地方。当你正在制作一个语言不确定的页面时你不能简单的只是说“上”、“下”、“左”、“右”。

The Main Axis and the Cross Axis 主轴和侧轴

为了描述抽象的书写模式,Flexbox 使用 主轴侧轴的概念。伸缩行跟随主轴。侧轴则垂直于主轴。

起点、终点和各轴的方向的名称如下:

  • 主轴起点 Main Start
  • 主轴终点 Main End
  • 主轴方向 Main Direction (有时候也成为伸缩流方向 Flow Direction)
  • 侧轴起点 Cross Start
  • 侧轴终点 Cross End
  • 侧轴方向 Cross Direction

在继续了解之前明白主轴和侧轴是至关重要的。Flexbox 中的一切都和这些轴有关。在我们所有的例子中,书写模式都是从左至右,从上到下,但是你需要记住并不是所有的 Flexbox 都是这样的。

伸缩容器的属性

flex-direction 伸缩流的方向

flex-direction允许你更改伸缩容器的主轴方向。flex-direction的默认值是 row。该值表示伸缩项目根据书写模式的方向布局。再次提醒,默认是从左至右,从上到下。其他的值如下:

  • row-reverse: 主轴起点和主轴终点交换。如果书写模式是从左至右,伸缩项目则是从右往左显示。
  • column: 主轴和侧轴交换。如果书写系统是垂直的,那么伸缩项目也是垂直显示的。
  • column-reverse: 和 column 一样,但是方向相反。

让我们把前一个示例中的 flex-direction改为 column

现在我们的伸缩项目就是垂直显示的了。

justify-content 主轴对齐

伸缩容器的 justify-content属性用于调整主轴上伸缩项目的位置。可能的值为:

  • flex-start (默认)
  • flex-end
  • center
  • space-between
  • space-around

这里我们设置 justify-contentcenter让伸缩项目在主轴上居中对齐:

flex-start, flex-end, 和 center一看就懂。space-betweenspace-around则是分配伸缩项目之间空白空间的不同方法。这张规范中的图示很好的解释了一切:

align-items 侧轴对齐

align-items是一个和 justify-content相呼应的属性。align-items调整伸缩项目在侧轴上的定位方式。可能的值有:

  • flex-start (默认)
  • flex-end
  • center
  • baseline
  • stretch

这里我们设置 align-itemscenter让伸缩项目在侧轴上居中对齐:

和之前一样,flex-start, flex-end, 和 center的意义显而易见。stretch也很简单:它会将伸缩项目从侧轴起点拉伸到侧轴终点。baseline则是让伸缩项目与它们的基线对齐。基线根据伸缩项目的内容计算得到。下面这张来自W3C标准的图例很好的解释了这些属性:

flex-wrap 伸缩行换行

目前为止,每个伸缩容器都有且只有一个伸缩行。使用 flex-wrap你可以为伸缩容器创建多个伸缩行。这个属性接受以下值:

  • nowrap (默认)
  • wrap
  • wrap-reverse

如果 flex-wrap设置为 wrap,在一个伸缩行容不下所有伸缩项目时,伸缩项目会换行到一条新增的伸缩行上。新增的伸缩行根据侧轴的方向添加。

我们使用 flex-wrap来看个例子:

wrap-reverse和 wrap 一样,只是新的伸缩行会被添加到侧轴的反方向上。

align-content 堆栈伸缩行

align-content会更改 flex-wrap的行为。它和 align-items相似,但是不是对齐伸缩项目,它对齐的是伸缩行。可能你已经想到了,它接受的值也很相似:

  • stretch (默认)
  • flex-start
  • flex-end
  • center
  • space-between
  • space-around

这些值与 justify-contentalign-items中的值一样。

在这个例子中,我们设置 align-contentcenter

flex-flow 伸缩方向与换行

flex-flowflex-directionflex-wrap的缩写。

flex-flow: [flex-direction] [flex-wrap]

举个例子:

1234
.flex-container{
-webkit-flex-flow:columnnowrap;
flex-flow:columnnowrap;
}

伸缩项目的属性

一个伸缩项目是一个伸缩容器的子元素。伸缩容器中的文本也被视为一个伸缩项目。

伸缩项目中内容与普通流一样。举例来说,当一个伸缩项目被设置为浮动,你依然可以在这个伸缩项目中放置一个浮动元素。

伸缩项目都有一个 主轴长度(Main Size)和一个 侧轴长度(Cross Size)。主轴长度是伸缩项目在主轴上的尺寸。侧轴长度是伸缩项目在侧轴上的尺寸。或者说,一个伸缩项目的宽或高取决于伸缩容器的轴,可能就是它的主轴长度或侧轴长度。

下面的属性可以调整伸缩项目的行为:

order 显示顺序

order是最简单明了的属性。设置伸缩项目的 order 可以调整它们渲染时的顺序。在这个例子中,我们设置其中一个伸缩项目的 order为 -1,于是它被提前到了其他伸缩项目的最前面。

如果需要文档顺序和显示顺序不同时,这就是个很有用的功能了。

margin 外边距

你应该对 margin: auto;这种用法很熟悉。在伸缩盒中,它也能做同样的事情,但是更加强大。一个 "auto"的 margin 会合并剩余的空间。它可以用来把伸缩项目挤到其他位置。

这里我们在第一个伸缩项目上声明了 margin-right: auto;,导致了所有的剩余空间被合并到那个元素的右边去了:

这里我们使用 margin: auto;来重现经典CSS布局中的圣杯:真·垂直居中:

align-self 侧轴对齐

伸缩项目的 align-self属性会覆盖该项目的伸缩容器的 align-items属性。它的值和 align-items一样:

  • stretch (默认)
  • flex-start
  • flex-end
  • center
  • baseline

在这个例子中我们为每个伸缩项目应用了不同的 align-self值:

我在例子中包含了2个基线对齐的伸缩项目,因为它们的对齐需要互相作用。

flex 伸缩性

现在我们终于要开始设置伸缩盒的伸缩性了。flex指定了一个伸缩项目该如何分配主轴上的剩余空间。

让我们一次把所有的常见值都看一遍吧。

flex: [number]

这个语法指定了一个数字,代表了这个伸缩项目该占用的剩余空间比例。

在这个例子中,第一个伸缩项目占用了 2/4 的剩余空间,而另外两个各占用了 1/4 的剩余空间。

如果把每个伸缩项目都设置为 1 的话,那么剩余空间就会被平均分配了。

flex: initial

一个 flex属性值被设为 initial的伸缩项目,在有剩余空间的情况下不会有任何变化,但是在必要的情况下会被收缩。

flex: auto

一个 flex属性值被设为 auto的伸缩项目,会根据主轴自动伸缩以占用所有剩余空间。

auto目前仅在 Opera 12.11 尚有效,在 Chrome 23.0.1271.95 上无效。你可以通过使用 flex: 1;来达到一样的效果。

flex: none

一个 flex属性值被设为 none的伸缩项目,在任何情况都不会发生伸缩。

flex 缩写

flex也可以把 flex-grow, flex-shrink, 和 flex-basis这3个缩写为1个声明:

flex: [flex-grow] [flex-shrink] [flex-basis]

大多数情况下没必要使用这种语法。另外,它需要一个更容易理解的伸缩算法。如果你觉得自己挺厉害的,到规范里看一下吧

当然你也可以将 flex-grow, flex-shrink, 和 flex-basis作为单个属性分开来设置。但我强烈反对这种方式:当使用 flex缩写时,即使没有某些值没有设置也能获得更合理的默认值。

visibility 叠加项目

当该值生效时,应用 visibility: collapse;visibility: hidden;display: none;的效果是不一样的。如果是 collapse,该元素会影响伸缩容器的侧轴长度,但不会被现实或占用主轴的空间。如果你想动态添加或移除伸缩项目又不会影响伸缩容器的侧轴长度,这将会非常有用。

目前为止,visibility: collapse;还没有被让任何浏览器正确的实现。现在 visibility: collapse;还和 visibility: hidden;实现着一样的效果。我希望能尽快得到改观。

你可以在 这里看到 collapse应该是如何工作的。

总结

如你所见,伸缩布局盒(Flexbox) 是一个强大的新型布局模式,将会给网站带来革命性的布局方法,但它也需要一种全新的思考方式。希望这篇文章能为你使用伸缩布局盒构建网站带来帮助。我不知道你怎么想,但是在我看来未来是美好的。

原文:Dive into Flexbox (http://weblog.bocoup.com/dive-into-flexbox)
参考资料:Css3-flexbox (http://www.w3.org/html/ig/zh/wiki/Css3-flexbox)

转自:[译]深入了解 Flexbox 伸缩盒模型http://c7sky.com/dive-into-flexbox.html

附上一篇由W3C中国团队整理的译文CSS 伸缩盒布局模组

扩展阅读:

  1. CSS3 Flexible Box Layout Explained
  2. CSS3 Flexbox Layout module
  3. Learn You a Flexbox for Great Good!
  4. Website Design Understanding the CSS3 Flexbox
  5. Flexbox — fast track to layout nirvana?
  6. Flexbox Revisited: The New Syntax For Flexible Boxes
  7. QUICK HITS WITH THE FLEXIBLE BOX MODEL
  8. An Introduction to the CSS Flexbox Module
  9. The CSS 3 Flexible Box Model
  10. CSS3 Flexible Box Model
  11. Flexible box ("Flexbox") layout (Windows)
  12. The CSS3 Flex Box Specification
  13. julyvoice's choice
  14. CSS3 Flexbox Reference

——大漠

六种实现元素水平居中

$
0
0

居中效果在CSS中很是普通的效果,平时大家所看到的居中效果主要分为三大类:水平居中、垂直居中和水平垂直居中。而其中水平居中相对于后两者来说要简单得多。早期总结了一下互联网上有关于水平垂直居中的几种实现方案,比如说《CSS制作水平垂直居中对齐》中介绍了八中实现水平垂直的方案,而在《CSS制作图片水平垂直居中》一文介绍了四种实现图片垂直居中的方案,并且在《CSS3实现水平垂直居中》使用了css3的flexbox的属性轻松实现多行文本水平垂直居中的方法。当然大家有可能认为这些方法对于浏览嘎嘎的兼容性处理太烦了,也有人使用jQuery的方法实现水平垂直居中效果,比如在《jQuery制作元素在屏幕中水平垂直居中效果》中介绍的。

回到我们今天的话题,水平居中的实现方案,大家最熟悉的莫过开给元素定一个显示式的宽度,然后加上margin的左右值为auto。如:

.center {
	width: 960px;
	margin-left: auto;
	margin-right: auto;
}	

这种方法给知道了宽度的元素设置居中是最方便不过的了,但有很多情况之下,我们是无法确定元素容器的宽度。换句话说,未有明确宽度的时候,上面的方法无法让我们实现元素水平居中。那要怎么办呢?这也就是我们今天需要讨论的问题。

为了更好的说明问题,我们来看一个制作分页效果的代码:

HTML

<div class="pagination">
  <ul>
    <li><a href="#">Prev</a></li>
    <li><a href="#">1</a></li>
    <li><a href="#">2</a></li>
    <li><a href="#">3</a></li>
    <li><a href="#">4</a></li>
    <li><a href="#">5</a></li>
    <li><a href="#">Next</a></li>
  </ul>
</di

给分页加上样式:

.pagination li {
  line-height: 25px;
}
.pagination a {
  display: block;
  color: #f2f2f2;
  text-shadow: 1px 0 0 #101011;
  padding: 0 10px;
  border-radius: 2px;
  box-shadow: 0 1px 0 #5a5b5c inset,0 1px 0 #080808;
  background: linear-gradient(top,#434345,#2f3032);
}
.pagination a:hover {
  text-decoration: none;
  box-shadow: 0 1px 0 #f9bd71 inset,0 1px 0 #0a0a0a;
  background: linear-gradient(top,#f48b03,#c87100);
}	

这是一个极普通的样式代码,初步的效果:

分页导航效果

这很显然不是我们需要的效果,接下来我们分几种方案来制作:

一、margin和width实现水平居中

第一种方法是最古老的实现方案,也是大家最常见的方案,在分页容器上定义一个宽度,然后配合margin的左右值为“auto”实现效果:

.pagination {
  width: 293px;
  margin-left: auto;
  margin-right: auto;
}
.pagination li {
  line-height: 25px;
display: inline;
  float: left;
  margin: 0 5px;
}
.pagination a {
  display: block;
  color: #f2f2f2;
  text-shadow: 1px 0 0 #101011;
  padding: 0 10px;
  border-radius: 2px;
  box-shadow: 0 1px 0 #5a5b5c inset,0 1px 0 #080808;
  background: linear-gradient(top,#434345,#2f3032);
}
.pagination a:hover {
  text-decoration: none;
  box-shadow: 0 1px 0 #f9bd71 inset,0 1px 0 #0a0a0a;
  background: linear-gradient(top,#f48b03,#c87100);
}	

代码中绿色部分是为了实现分页居中效果而添加的代码。(下文中没有特殊声明,绿色部分代码表示新增加的代码。),先来看看效果:

分页导航效果

效果是让我们实现了,但其扩展性那就不一定强了。示例中只显示了五页和向前向后的七个显项,但往往我们很多情况下是不知道会有多少个分页项显示出来,而且也无法确定每个分页选项的宽度是多少,也就无法确认容器的宽度。

优点:实现方法简单易懂,浏览器兼容性强;

缺点:扩展性差,无法自适应未知项情况。

二、inline-block实现水平居中方法

这个方法早期在《如何解决inline-block元素的空白间距》和《CSS3制作的分页导航》中都有涉及到,但未单独提取出来。此次,将这种方法拿出来说。

仅inline-block属性是无法让元素水平居中,他的关键之处要在元素的父容器中设置text-align的属性为“center”,这样才能达到效果:

.pagination {
  text-align: center;
  font-size: 0;
  letter-spacing: -4px;
  word-spacing: -4px;
}
.pagination li {
  line-height: 25px;
  margin: 0 5px;
display: inline-block;
  *display: inline;
  zoom:1;
  letter-spacing: normal;  
  word-spacing: normal;
  font-size: 12px;
}
.pagination a {
  display: block;
  color: #f2f2f2;
  text-shadow: 1px 0 0 #101011;
  padding: 0 10px;
  border-radius: 2px;
  box-shadow: 0 1px 0 #5a5b5c inset,0 1px 0 #080808;
  background: linear-gradient(top,#434345,#2f3032);
}
.pagination a:hover {
  text-decoration: none;
  box-shadow: 0 1px 0 #f9bd71 inset,0 1px 0 #0a0a0a;
  background: linear-gradient(top,#f48b03,#c87100);
}	

效果如下:

分页导航效果

这个方法相对来说也是简单易懂,但使用了inline-block解决了水平居中的问题,却又产生了一个新的问题,就是分页项与分页项由回车符带来的空白间距,那么不知情的同学就会不知道如何解决?(而且这个间距并不是所有浏览器都有),所以需要解决下inline-block带来的间距,详细的解决方法可以阅读《如何解决inline-block元素的空白间距》一文。

做点:简单易懂,扩展性强;

缺点:需要额外处理inline-block的浏览器兼容性。

三、浮动实现水平居中的方法

刚看到标题,大家可能会感到很意外,元素都浮动了,他还能水平居中?大家都知道,浮动要么靠左、要么靠右,还真少见有居中的。其实略加处理就有了。

.pagination {
  float: left;
  width: 100%;
  overflow: hidden;
  position: relative;
}
.pagination ul {
  clear: left;
  float: left;
  position: relative;
  left: 50%;/*整个分页向右边移动宽度的50%*/
  text-align: center;
}
.pagination li {
  line-height: 25px;
  margin: 0 5px;
display: block;
  float: left;
  position: relative;
  right: 50%;/*将每个分页项向左边移动宽度的50%*/
}
.pagination a {
  display: block;
  color: #f2f2f2;
  text-shadow: 1px 0 0 #101011;
  padding: 0 10px;
  border-radius: 2px;
  box-shadow: 0 1px 0 #5a5b5c inset,0 1px 0 #080808;
  background: linear-gradient(top,#434345,#2f3032);
}
.pagination a:hover {
  text-decoration: none;
  box-shadow: 0 1px 0 #f9bd71 inset,0 1px 0 #0a0a0a;
  background: linear-gradient(top,#f48b03,#c87100);
}	

效果如下所示:

分页导航效果

这种方法实现和前面的与众不同,使用了浮动配合position定位实现。下面简单的介绍了一下这种方法实现原理,详细的可以阅读Matthew James Taylor写的《Horizontally Centered Menus with no CSS hacks》一文。

没有浮动的div:大家都知道div是一个块元素,其默认的宽度就是100%,如图所示:

分页导航效果

如果div设置了浮动之后,他的内容有多宽度就会撑开有多大的容器(除显式设置元素宽度值之外),这也是我们实现让分页导航居中的关键所在:

分页导航效果

接下来使用传统的制作方法,我们会让导航浮动到左边,而且每个分页项也进行浮动,就如下图所示一样:

分页导航效果

现在要想的办法是让分页导航居中的效果了,在这里是通过“position:relative”属性实现,首先在列表项“ul”上向右移动50%(left:50%;),看到如下图所示:

分页导航效果

如上图所示一样,整个分页向右移动了50%的距离,紧接着我们在“li”上也定义“position:relative”属性,但其移动的方向和列表“ul”移动的方向刚好是反方向,而其移动的值保持一致:

分页导航效果

这样一来就实现了float浮动居中的效果。

特别声明:方法三思想来源于Matthew James Taylor写的《Horizontally Centered Menus with no CSS hacks》一文,并且引用其文中演示的示意图。

优点:兼容性强,扩展性强;

缺点:实现原理较复杂。

四、绝对定位实现水平居中

绝对定位实现水平居中,我想大家也非常的熟悉了,并且用得一定不少,早期是这样使用的:

.ele {
	position: absolute;
	width: 宽度值;
	left: 50%;
	margin-left: -(宽度值/2);
}	

但这种实现我们有一个难题,我并不知道元素的宽度是多少,这样也就存在如方法一所说的难题,但我们可以借助方法三做一点变通:

.pagination {
  position: relative;
}
.pagination ul {
  position: absolute;
  left: 50%;
}
.pagination li {
  line-height: 25px;
  margin: 0 5px;
 float: left;
  position: relative;/*注意,这里不能是absolute,大家懂的*/
  right: 50%;
}
.pagination a {
  display: block;
  color: #f2f2f2;
  text-shadow: 1px 0 0 #101011;
  padding: 0 10px;
  border-radius: 2px;
  box-shadow: 0 1px 0 #5a5b5c inset,0 1px 0 #080808;
  background: linear-gradient(top,#434345,#2f3032);
}
.pagination a:hover {
  text-decoration: none;
  box-shadow: 0 1px 0 #f9bd71 inset,0 1px 0 #0a0a0a;
  background: linear-gradient(top,#f48b03,#c87100);
}	

效果如下所示:

分页导航效果

优点:扩展性强,兼容性强;

缺点:理解性难。

五、CSS3的flex实现水平居中方法

CSS3的flex是一个很强大的功能,她能让我们的布局变得更加灵活与方便,唯一的就是目前浏览器的兼容性较差。那么第五种方法,我们就使用flex来实现,其实这种方法早在《CSS3实现水平垂直居中》一文有介绍,我们把水平居中的部分代码取出来:

.pagination {
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-pack: center;
  display: -moz-box;
  -moz-box-orient: horizontal;
  -moz-box-pack: center;
  display: -o-box;
  -o-box-orient: horizontal;
  -o-box-pack: center;
  display: -ms-box;
  -ms-box-orient: horizontal;
  -ms-box-pack: center;
  display: box;
  box-orient: horizontal;
  box-pack: center;
}
.pagination li {
  line-height: 25px;
  margin: 0 5px;
float: left;
}
.pagination a {
  display: block;
  color: #f2f2f2;
  text-shadow: 1px 0 0 #101011;
  padding: 0 10px;
  border-radius: 2px;
  box-shadow: 0 1px 0 #5a5b5c inset,0 1px 0 #080808;
  background: linear-gradient(top,#434345,#2f3032);
}
.pagination a:hover {
  text-decoration: none;
  box-shadow: 0 1px 0 #f9bd71 inset,0 1px 0 #0a0a0a;
  background: linear-gradient(top,#f48b03,#c87100);
}	

效果如下:

分页导航效果

优点:实现便捷,扩展性强

缺点:兼容性差。

六、CSS3的fit-content实现水平居中方法

今天看《Horizontal centering using CSS fit-content value》一文,让我体验了一下"fit-content"制作水平居中的方法。我也将这种方法收进来。

“fit-content”是CSS中给“width”属性新加的一个属性值,他配合margin可以让我轻松的实现水平居中的效果:

.pagination ul {
  width: -moz-fit-content;
  width:-webkit-fit-content;
  width: fit-content;
  margin-left: auto;
  margin-right: auto;
}
.pagination li {
  line-height: 25px;
  margin: 0 5px;
float: left;
}
.pagination a {
  display: block;
  color: #f2f2f2;
  text-shadow: 1px 0 0 #101011;
  padding: 0 10px;
  border-radius: 2px;
  box-shadow: 0 1px 0 #5a5b5c inset,0 1px 0 #080808;
  background: linear-gradient(top,#434345,#2f3032);
}
.pagination a:hover {
  text-decoration: none;
  box-shadow: 0 1px 0 #f9bd71 inset,0 1px 0 #0a0a0a;
  background: linear-gradient(top,#f48b03,#c87100);
}	

效果如下:

分页导航效果

优点:简单易懂,扩展性强;

缺点:浏览器兼容性差

上面总共为大家整理了六种实现水平居中的方法,希望对大家有所帮助。如果您有更好的建议,希望能与我们一起分享。

如需转载,烦请注明出处:http://www.w3cplus.com/css/elements-horizontally-center-with-css.html

通俗的英文指南——Javascript的原型

$
0
0

特别声明:此篇文章由Sunnylost根据Sebastian的英文文章原名《A Plain English Guide to JavaScript Prototypes》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://sporto.github.com/blog/2013/02/22/a-plain-english-guide-to-javascript-prototypes/以及作者相关信息

——作者:Sebastian

——译者:Sunnylost

当我开始学习JavaScript的对象模型时,第一反应就是难以置信。我完全被它的原型本质给弄糊涂了,毕竟这是我头一次遇到以原型为基础的语言。因为JS中有构造函数这个概念,所以我看不出使用原型能给JS带来任何的好处。我敢说你们中的大部分人也有同样的经历。

但是当我更多的使用JavaScript后,我不仅开始理解它的对象模型,甚至还喜欢上了它的一部分。感谢JavaScript让我见识到了原型语言的优雅与灵活。现在的我十分推崇原型语言,原因就是相对于以类为基础的语言,原型语言的有着更简单、更灵活的对象模型。

JavaScript中的原型

绝大部分的指南或者教程在开始讲解JavaScript对象时,总是直接从「构造函数」讲起。我觉得这是错误的,因为过早的引入相对复杂的概念,只能让JavaScript看起来更复杂,学起来更迷惑。所以让我们暂时抛开这个概念,先讲讲原型的基础。

原型链(又叫做原型继承)

JavaScript中的所有对象都有原型。当对象收到一个消息(译者注:在这里可以理解为属性查找或方法调用),JavaScript便尝试先从对象自身查找属性,如果查不到,那么该消息就会传递给对象的原型并以此类推。这个工作机制很像以类为基础的语言中的单根继承。

deodesign

原型链的长度没有限制,但通常来说,过长的原型链会造成代码维护与理解上的困难,因此不值得推荐。

__proto__对象

理解JavaScript原型链最简单的方式就是通过__proto__属性。可惜的是,在ES 6之前,__proto__并不是JavaScript中的标准接口,所以一定不要在工作代码中使用它。尽管有这样的限制,这个属性使我们讲解原型更容易了。

// 让我们先创建一个alien对象
var alien = {
  kind: 'alien'
}

// 然后是一个person对象
var person = {
  kind: 'person'
}

// 最后是一个叫做zack的对象
var zack = {};

// 设置alien为zack的原型
zack.__proto__ = alien

// zack现在与alien关联了起来
//  它继承了alien的所有属性
console.log(zack.kind); //=> ‘alien’

// 接下来将person设置为zack的原型
zack.__proto__ = person

// 这时候zack又和person关联在一起了
console.log(zack.kind); //=> ‘person’	

如你所见,__proto__属性的含义与用法简单明了。即便我们不能在工作的代码中使用__proto__,但我想上面那些例子已经为你理解JavaScript对象模型打下了坚实的基础。

你可以像下面这么操作,来判断一个对象是否是另一个对象的原型:

console.log(alien.isPrototypeOf(zack))
//=> true	

原型查找是动态的

你可以在任何时候为原型增加新属性,原型链查找机制会如你所愿找到这些新属性。

var person = {}

var zack = {}
zack.__proto__ = person

//当前zack没有kind属性
console.log(zack.kind); //=> undefined

// 让我们在person上增加kind属性
person.kind = 'person'

// 现在有反应了,因为它从person上找到了kind属性
console.log(zack.kind); //=> 'person'

新建/更新的属性被赋值给了对象,而不是它的原型

如果你更新一个在原型上已经存在的属性会发生什么?我们来试试:

var person = {
  kind: 'person'
}

var zack = {}
zack.__proto__ = person

zack.kind = 'zack'

console.log(zack.kind); //=> 'zack'
// zack 现在拥有kind属性

console.log(person.kind); //=> 'person'
// person上的属性没有被修改	

注意:「kind」属性已经同时存在于person和zack上了。

Object.create

前面解释过使用__proto__为对象设置原型这个办法并不通用。所以我们介绍另外一种简单方法:Object.create()。这是在ES 5中新增的方法,对于那些古老的浏览器或者JS引擎,可以使用es5-shim来模拟。

var person = {
  kind: 'person'
}

//  创建一个原型为person的新对象
var zack = Object.create(person);
  
console.log(zack.kind); // => ‘person’	

你可以向Object.create()方法中传入一个对象,用来给新生成的对象设置特定的属性:

var zack = Object.create(person, {age: {value:  13} });
console.log(zack.age); // => ‘13’	

是不是觉得传进去的对象很麻烦?实际上它必须是这个样子。详细信息可以查看文档

Object.getPrototype

可以使用Object.getPrototypeOf()方法来获得对象的原型:

ar zack = Object.create(person);
Object.getPrototypeOf(zack); //=> person	

这里可没有Object.setPorototype这样设置原型的方法。

构造函数

在JavaScript中,构造函数是用来创建原型链最常用的方法。构造函数如此流行的原因在于:它是创建类型的唯一途径。另外一个值得考虑的因素是大部分引擎都对构造函数进行了高度优化。

很不幸的是,构造函数容易让人困惑,在我看来,它是让初学者认为JavaScript难以理解的主要原因。但构造函数是JS语言中的一个重要部分,我们必须对其深刻理解。

作为构造器的函数

在JavaScript中,创建函数的实例可以这么来做:

function Foo(){}

var foo = new Foo();

//foo 现在是Foo的一个实例
console.log(foo instanceof Foo ) //=> true	

对函数使用关键字new,使得函数从本质上来讲表现的像工厂,即函数能够生成新的对象。后面会讲到,新创建的对象通过函数的原型与函数保持关联。在JavaScript中,我们将这个对象称为函数的实例。

隐式赋值的「this」

当我们使用「new」,JavaScript以「this」关键字的形式向函数中注入了新创建对象的隐式引用。在函数运行结尾处也会隐式的返回该引用。

当我们这么做:

function Foo() {
  this.kind = ‘foo’
}

var foo = new Foo(); 
foo.kind //=> ‘foo’	

实际上会相当于这么做:

function Foo() {
  var this = {}; // 这里的this是无效的,我们这么做只是为了演示
  this.__proto__ = Foo.prototype;
  
  this.kind = ‘foo’
  
  return this;
}	

需要注意的是:只有在使用「new」的时候,「this」才会被赋值为新创建的对象。如果你忘记书写「new」,那么「this」会指向全局对象。忘记new是造成众多bug的原因,所以千万不要忘记写new。

有一个惯例我十分喜欢,那就是如果一个函数被用作构造函数,那么它的函数名首字母要大写,如果你忘记写new关键字,就会很容易发觉。

「函数原型」

JavaScript中的每个函数都有一个特殊属性「prototype」。

function Foo(){
}

Foo.prototype	

让人有些不敢相信的是:此「prototype」并非函数真正的原型(__proto__)。

foo.__proto__ === foo.prototype //=> false	

如果「prototype」术语的含义如此不明确,可想而知会对使用它的人们产生多大的困扰。有一个澄清的方法我认为不错,那就是始终将函数的「prototype」属性称为「函数的原型」,永远不要称其为「原型」。

「prototype」属性指向一个对象,这个对象就是当对函数使用「new」时创建的实例的原型。听起来糊涂?用例子来解释是最容易不过的了:

function Person(name) {
  this.name = name;
}

// 函数person拥有一个prototype属性
// 我们可以为函数的原型增加新属性
Person.prototype.kind = ‘person’

// 当我们使用new来生成新对象时
var zack = new Person(‘Zack’);

// 新对象的原型将指向person.prototype
zack.__proto__ == Person.prototype //=> true

//  在这个新对象中,我们能够访问在Person.prototype上定义的属性
zack.kind //=> person	

这就是关于JavaScript对象模型的绝大部分内容了。理解__proto__与function.prototype是如何关联的将会给你带来无尽的满足感,当然也可能相反。

文章有错误?看着还迷惑?给我留言吧!

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

关于Sunnylost

08年开始自学java,09年加入北漂行列,从事Java Web工作,出于对JavaScript的喜爱,在2011年以外包身份进入新浪微博从事JS开发,目前就职于一淘。由于工作关系,逐步接触CSS,开始完善自身的前端技能。欢迎随时关注我:新浪微博

如需转载烦请注明出处:

英文原文:http://sporto.github.com/blog/2013/02/22/a-plain-english-guide-to-javascript-prototypes/

中文译文:http://www.w3cplus.com/js/a-plain-english-guide-to-javascript-prototypes.html

图像技术在网页中创造深度

$
0
0

本文由陈陆扬根据的《USING TRANSPARENCY IN WEB DESIGN: DOS AND DON’TS》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://tympanus.net/codrops/2013/02/27/image-techniques-for-creating-depth-in-web-design/,以及作者相关信息

——作者:

——译者:陈陆扬

我们生活在一个三维的世界中,设计师们每天都试图在网页设计中能够重现这个三维世界的某些东西。其中,景深——这一元素的加入能在很大程度上为某些特定的设计增加真实感。

这其实比你想象的要简单。在2D屏幕上模拟真实事物的关键是利用图像创建景深。而这一效果可以用多种方式来实现,包括摄影本身,图像图层,或者是操作一些特效来实现。

分层

rangerover

mikedascola

adlucent

gardner

matteo

分层是一种被广泛运用的方法,在设计过程中常常用于被放置的图像和对象上,同时也被用来操作图像,或者在图像自身中就被刻意使用。

我们都见过这种布局:图片随意得摆在其他图片上面,看起来就像是一叠打印好的照片。你肯定知道这个创建景深的技巧,这样能使你感觉你就是在翻阅这些摄影作品。这就是设计过程中的分层技巧,有时候这种效果使用得非常明显,就像以上例子中展示的那样,而有时候又会使用的非常隐晦,不易察觉。

通常多个图片会合并成一张图片,从而创建出两个独立的部分,前景和背景。创建完之后,这种效果应该几乎是看不见的。以上面Range Rover的网站为例,车和城市的图片都非常壮观,而且当两者结合起来的时候就使你感觉你就站在车的旁边眺望着远处的城市。

另一种有效的分层方法是将图片或图像放置于类似平面的背景上。如果搭配角度或方向奇特的图片和渐变色的背景,你将看到非常精彩的效果。

最后,有些图像的分层是建立在思维之中的。这种摄影技术是基于运用不同物体的重叠线条来创建的深度。通常,会使用颜色和对比来突出线条,这样可以将镜头中的物体一个个区别出来。这种技术对业余摄影者来说,掌握起来会稍显困难。

摄影

ermenegildo

ownedition

worth

charmer

hytter

draught

创建景深最重要的方法之一其实在图像本身之中。在合成图像的时候先设计好,这样就能使创建景深变得轻而易举。

但应该如何来组成图片呢?其实有很多选择,包括请一位专业的摄影师来给出有关景深的意见,但这不是能够一直实现的。如果你自己在为项目拍摄照片,那可以参考以下有关景深的技巧。

在前景中创建一个视觉兴趣区,而且确保照片有主题有背景。把这些当做独立的部分来思考(把这些部分当做独立的区域来思考布局),这对你合成和创建图像会有很大的帮助。

改变视角。从一个出乎意料的角度拍摄照片,这样会改变主题和背景的透视,增加了视觉维度。只要玩转了角度,对于同一张图像,你也可以做到从一个合适的层面以及更广的视角来合成。

纵向摄影。在合成图像的时候改变垂直轴,这样能使你获得大不一样的图片。

可以考虑使用自然线条和阴影,有时,在照片里的内容就能自己增加景深的感觉。举例来说,在扩大背景的时候使用不同的阴影,就能使得重点更加突出。

图像操作

使用类似于Adobe Photoshop这样的图片编辑软件,设计者使用一些简单的技巧就可以在图像中创建景深。这在处理肖像或其他拍摄时没考虑景深的照片时,是一个非常好的选择。

这个技巧是:在前景中设置主题,并在背景中添加模糊效果,最后单独凸显主题元素(在photoshop中,使用半径为5.0的高斯模糊就能达到非常好的效果)。

这个技巧通过降低背景的视觉权重,从而创建出了景深的效果,达到了突出图片主题的最终目的。

阴影特效

guestd

upstate

toykomilk

oyyo

阴影是为物体和图片创建景深和位置最简单,也是最自然的手法之一。阴影的位置,暗度和形态可以传递出非常具体的意义。而使用阴影最关键的一点就是让阴影看起来自然。

最好的阴影效果是细微、跟随着光的图案的效果,要确保阴影要反应出它所跟着的图片的感觉。如果用户第一眼注意到的是阴影,那它就没发挥到自己该起的作用。

图像下的环绕式阴影可以创建出一种浮动、3D的效果。这经常使用在按钮和一些较小的用户交互元素上。在物体前设置特定形态的阴影可以使一个平面物体看起来像站起来一样,就像Guest’d网站上的那样(在被提及之前,你是否注意到了那些阴影?)扭曲阴影——并不是相关物体形状的镜像,能使物体显现出另一个形状,或者升空背景图片(或者从背景中凸显出来)。

阴影也可以增加物件和元素的真实触感。人物背后的阴影可以使其从背景中脱离开来(凸显出来),带入到图片的第一线中。阴影应该落在图片中光源的对面,这样才会显得自然和谐,这个技巧虽然常见,但却是十分重要的。

插图和其他图片

emotions

flourish

dascola

octi

在设计项目中,摄影照片中所使用的概念和操作手法也同样适用于插图和其他图片,稍有不同的地方是常常需要你自己去创建出这种效果。

上图那梦幻般的阴影就是一个很好的例子。图像被背景的光和影详尽地烘托,使之相对于网站其他部分而言呼之欲出。

总结

在设计项目中,景深是一种用来创建真实感的不错的手法。它能连接用户和用户在屏幕上所看到的景象,使用户能感觉到多个场景。

甚至对于缺乏真实景深的图像,不管是照片还是基于矢量的用户交互元素,也都可以用来操作并添加出三维的效果。设计分层、修改对象方向和添加阴影是创建额外景深的最好手法。

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

关于陈陆扬

毕业于东北大学,从事前端开发,目前主要关注无线方面。对前端技术有强烈的兴趣,希望有机会和大家交流。新浪微博

如需转载烦请注明出处:

英文原文:http://tympanus.net/codrops/2013/02/27/image-techniques-for-creating-depth-in-web-design

中文译文:http://www.w3cplus.com/css/image-techniques-for-creating-depth-in-web-design.html

提升移动设计用户体验的9种方法

$
0
0

本文由LL根据的《Nine Ways to Improve User Experience in Mobile Design》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://css-tricks.com/nine-ways-to-improve-user-experience-in-mobile-design/,以及作者相关信息

——作者:

——译者:LL

以下内容来自Ben Terrill的一篇投稿文章。在Mobify工作的Ben带领着他的团队帮助他们那些就像Starbucks, Bose 和 Threadless的重要客户在移动和平板方面上打造出了卓越的完美体验。Ben参与编写了一篇名为50 Ways to Please Your Customers的电子书籍,而该书提供了移动web设计的最佳实践方法。

来自Mobify的Julie Szabo通过信件帮助我对这本书进行了一些改善,虽然我很少这么做,但我还是觉得很有必要向大家说明一下:Julie Szabo的这封信完全是无偿的帮助,而且这本免费提供给大家的书也是非常优秀的。

我建议大家都可以作为客座作者来写点东西。并在书上挑选出自己认为的最佳章节,另外,我想再这里添加一些内容来为大家分享,好好享受吧。

——CHRIS COYIER

在Mobify公司,我们最近在电子商务的客户网站上分析了超过两亿个客户的数据,并从中得知通过智能手机和平板电脑来进行购物的网站访问者就占得27%总人数比例。对于一些国家,比如巴西,我们发现将近一半的电子商务贸易就来自于移动设备。

在当今的社会,对于每个公司或者出版商在网络上都需要一个制定关于移动互联网的战略。为此我们就如何建立一个优秀的移动网站编写了一本电子读物,以下来自这本书的9个技巧下面,我们就如何面向来自移动网络访问者,列举出该书的9个技巧来有效提升你的网站体验。

提升移动设计用户体验的9种方法

提示和显示(又称,逐步展示)

移动设备型号大小不大而且网站要显示大量的信息。使用逐步展示这个方法先显示给用户部分内容。这就不需要一开始就超负荷加载大量的信息,然后让他们根据自己的需要选择扩展显示的内容。

“手风琴”菜单奏出美妙之音

在限制内容页面长度上,使用手风琴插件是一个有效的选择,在合适的地方使用它们,能够起到简明扼要的作用。需要注意的是你要为其提供扩展以及收起的按钮。

提升移动设计用户体验的9种方法

注:上面的示例来自于Brad FrostCodePen库。

幻灯片效果让用户感觉开心舒适

幻灯片效果是一个实现文章主题“图文并茂”的完美方案,你要明确在幻灯片效果中有多少内容并且安排好他们当前的位置。如果你的幻灯片是自动播放的,那么在与用户互动的时候,还需要确保用户能够随时停止幻灯片的自动播放。

提升移动设计用户体验的9种方法

注:上面示例是一个RoyalSlider具有响应式效果,触摸,并停止播放等交互效果。

尊重你用户那“笨笨”的手指头

我们都能很难做到在我们的移动设备上进行灵活的操作。很显然,在移动设备的触控方面上我们的手指头都显得有点大了。所以为了使得你的设计行为合理化,我们需要把触摸的区域变得大一点。我们建议是40px*40px的大小,同样也需要给触摸的目标留出更多的间距,我们建议在该区域的周围至少空出10px的间距。总之而言,按钮就应该是大号的,这才能让别人来轻松点击。

编者提示:苹果设计建议为44*44 更多信息

借助字体图标来节省时间

我们♥图标,这些的运用让你的设计更具灵性!避免同时管理retina sprite和icon sprites,我们可以使用采用一个字体库设置图标,就像Font Awesome;glyphish; iconsweets;symbolset. 或者,还可以制作属于你自己的字体图标。详情请看这里啊。

编者提示:该站点的相关资源如下所示,其中包括了一篇关于如何在HTML上使用字体图标的文章,一个不同字体图标的集合,还有一个关于如何自己制作字体图标的视频展示。

使用一些行之有效的管理窍门

创建retina图标并且在使用不支持retina的设备的情况下,要使用CSS的background-size属性来调小他们的大小尺寸。他们同样会有好的显示效果并且不会在较小的屏幕上占据比较大的空间。

编者提示:Retina媒体的使用那是相当简单的。通过你可以只需在可以使用retina的屏幕上提供适当的图片即可。对于不支持retina的屏幕来说,在整个屏幕图像刚好容纳的一个图像的时候,在支持retina的屏幕的一般尺寸中,已经可以在屏幕的一半大小中容纳下两个相同大小的图像。

明确你可用的视窗尺寸,并使其保持流畅运行

我们都知道iPhone4的屏幕尺寸是320px*480px(或者说其分辨率为960px*640px)但是,在使用chrome浏览器时候所用到的真正屏幕尺寸是什么呢?(答案是:320px*414px)而这个恰恰是你的用户所要体验的。明确你需要用到的屏幕尺寸,并且使得在这些情况下无论是直式显示方式还是横式显示方式都能流畅显示。让你的用户感觉到舒适快乐。

提升移动设计用户体验的9种方法

设定你的默认最小字体为14px大小

即使14px大小的字体看起来仍然相当大了,但我们还是得这么做。而需要把字体还要变得更小的唯一情况是(最小字体的大小不能再小于12px了)在表格中作为特别注明标签的时候。

迎合世界上多数设备中的APIs

当我们制作移动桌面网站的时候,有时候却傻乎乎地忘记智能手机以及移动设备还具备提供定位,通话,拍照等等功能。不要在你的桌面网站上抹杀了你的创造性。

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

关于LL

广东某大学在读大学生,热爱Web前端,对前端技术有强烈的兴趣,在这里希望有机会和大家共同分享与交流,从而更好的提升自己。请关注我:新浪微博

如需转载烦请注明出处:

英文原文:http://css-tricks.com/nine-ways-to-improve-user-experience-in-mobile-design/

中文译文:http://www.w3cplus.com/css/nine-ways-to-improve-user-experience-in-mobile-design.html

Viewing all 1557 articles
Browse latest View live