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

text-shadow制作的22个文字特效

$
0
0
text-shadow制作的22个文字特效

CSS的text-shadow属性给我们制作文字效果带来极大的方便,曾经需要使用图片的效果,现在完全可以使用一个属性来搞定,早前在《CSS3制作文字特效》和《10个text-shadow制作的文字效果》写了一些文字的效果,今天再次整理了22个text-shadow的效果,可能有些效果会相同,但有些效果是第一次出现的,大家可以通过案例中的源码找到text-shadow制作文字效果的思路。

demodownload

HTML CODE

<div class="text-wrap box1">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box2">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box3">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box4">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box5">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box6">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box7">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box8">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box9">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box10">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box11">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box12">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box13">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box14">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box15">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box16">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box17">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box18">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box19">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box20">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box21">W3cplus | Pure CSS3 Text Shadow Effects</div>
<div class="text-wrap box22">W3cplus | Pure CSS3 Text Shadow Effects</div>

CSS CODE

body {background: url(body_bkg.png);}
.text-wrap {
  width: 600px;
  min-height: 100px;
  margin: 20px auto;
  padding: 30px 0;
  border: 5px solid white;
  position: relative;
  box-shadow: 0 0 4px rgba(0, 0, 0, 0.80);
  clear: both;
  font-family: 'Aclonica', serif;
  font-size: 50px;
  text-align: center;
}
.box1 {
  color: rgba(0, 174, 239, 0.2);
  text-shadow: rgba(0, 0, 30, 0.0784314) 0px 5px 2px;
}
.box2 {
  color: #FAFAFA;
  text-shadow: rgba(255, 255, 255, 0.0980392) -1px -1px 1px, rgba(0, 0, 0, 0.498039) 1px 1px 1px;
}
.box3 {
  color: #333;
  text-shadow: rgba(0, 0, 0, 0.298039) -5px 5px 5px;
}
.box4 {
  color: #FAFAFA;
  text-shadow: #999 0px 1px 0px, #888 0px 2px 0px, #777 0px 3px 0px, #666 0px 4px 0px, #555 0px 5px 0px, #444 0px 6px 0px, #333 0px 7px 0px, #001135 0px 8px 7px;
}
.box5 {
  color: white;
  text-shadow: white 0px 0px 5px, white 0px 0px 10px, white 0px 0px 15px, #FF2D95 0px 0px 20px, #FF2D95 0px 0px 30px, #FF2D95 0px 0px 40px, #FF2D95 0px 0px 50px, #FF2D95 0px 0px 75px;
  letter-spacing: 5px;
}

.box6 {
  color: rgba(0, 168, 255, 0.498039);
  text-shadow: rgba(255, 0, 180, 0.498039) 3px 3px 0px;
}
.box7 {
  color: #990F0A;
  text-shadow: #EEE 5px 1px 0px, #707070 7px 3px 0px;
}
.box8 {
  color: rgb(42, 79, 84); 
  text-shadow: rgb(254, 252, 201) 0px 0px 20px, rgb(254, 236, 133) 10px -10px 30px, rgb(255, 174, 52) -20px -20px 40px, rgb(236, 118, 12) 20px -40px 50px, rgb(205, 70, 6) -20px -60px 60px, rgb(151, 55, 22) 0px -80px 70px, rgb(69, 27, 14) 10px -90px 80px; 
}
.box9{
  color: rgb(0, 160, 217);
  text-shadow: rgb(219, 105, 105) 0px 0px 4px, rgb(219, 105, 105) 0px 0px 0.2em; 
}
.box10{
  text-shadow: #91BAD8 0px 0px 1px, white 0px -1px 2px, #7B92A8 0px -3px 2px, rgba(0, 0, 0, 0.8) 0px 15px 25px;
  color: transparent;
}
.box11 {
  color: white;
  text-shadow: #BF7F00 3px 3px 8px, #BF7F00 -3px -3px 8px;
}
.box12 {
  color: #00A0D9;
  text-shadow: #A4C2D9 3px 3px 0px, #5C5F72 7px 7px 0px;
}
.box13 {
  background: #9AC1E1;
  color: transparent;
  text-shadow: rgba(255, 255, 255, 0.6) 0px 0px 10px, rgba(255, 255, 255, 0.4) 0px 0px 30px, rgba(255, 255, 255, 0.298039) 0px 0px 50px, rgba(255, 255, 255, 0.298039) 0px 0px 180px;
}
.box14 {
  background: #222;
  color: #333;
  opacity: 0.4;
  text-shadow: rgba(255, 255, 255, 0.298039) -1px -1px 0px, rgba(0, 0, 0, 0.8) 1px 1px 0px;
}
.box15 {
  color: #00A0D9;
  text-shadow: #686868 0px 0px 2px, #DDD 0px 1px 1px, #D6D6D6 0px 2px 1px, #CCC 0px 3px 1px, #C5C5C5 0px 4px 1px, #C1C1C1 0px 5px 1px, #BBB 0px 6px 1px, #777 0px 7px 1px, rgba(100, 100, 100, 0.4) 0px 8px 3px, rgba(100, 100, 100, 0.0980392) 0px 9px 5px, rgba(100, 100, 100, 0.14902) 0px 10px 7px, rgba(100, 100, 100, 0.2) 0px 11px 9px, rgba(100, 100, 100, 0.247059) 0px 12px 11px, rgba(100, 100, 100, 0.298039) 0px 13px 15px;
}
.box16 {
  color: #00A0D9;
  text-shadow: #00A0D9 1px 1px 3px, #00A0D9 -1px -1px 3px;
}
.box17 {
  color: #00A0D9;
  text-shadow: #A8C0D8 -0.06em 0px, #7B92A8 0.06em 0px;
}
.box18 {
  color: transparent;
  text-shadow: #91BAD8 0px 0px 5px;
}
.box19 {
  background-image: url(low_contrast_linen.png);
  color: transparent;
  text-shadow: rgba(245, 245, 255, 0.34902) 0px 0px 0px, rgba(0, 0, 30, 0.0980392) 0px 0.04em 0.02em;
  z-index: 1;
  -webkit-text-stroke-width: 6px;
  -webkit-background-clip: text;
  -webkit-text-stroke-color: rgba(255, 255, 255, 0.0470588);
}
.box20 {
  color: transparent;
  -webkit-text-stroke-width: 1px;
  -webkit-text-stroke-color: rgba(0, 0, 0, 0.2);
  letter-spacing: 0.04em;
  text-shadow: rgba(255, 255, 255, 0.498039) 0px 5px 6px, rgba(255, 255, 255, 0.2) 1px 3px 3px;
  -webkit-background-clip: text;
}
.box21 {
  color: transparent; 
  -webkit-text-stroke-width: 0px;
  -webkit-text-stroke-color: initial; 
  letter-spacing: 0.04em; 
  text-shadow: rgba(255, 255, 255, 0.498039) 0px 5px 6px, rgba(255, 255, 255, 0.2) 1px 3px 3px; 
  -webkit-background-clip: text; 
  background-color: rgba(123, 146, 168, 0.901961);
}
.box22 {
  color: rgb(160, 174, 193);
  text-shadow: rgb(125, 146, 168) 1px 1px 0px, rgb(125, 146, 168) 2px 2px 0px, rgb(125, 146, 168) 3px 3px 0px, rgb(125, 146, 168) 4px 4px 0px, rgb(125, 146, 168) 5px 5px 0px; 
}

demodownload

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


Pure CSS3 3D Text Effects

$
0
0
Pure CSS3 3D Text Effects

3D的文字特效都是通过text-shadow属性来制作的,其原理很简单,就是多个text-shadow的属性值叠加,模拟出3D的效果。其中主要一点就是掌握角度值,也就是X轴和Y轴的位置。今天我通过3D css Text Generator在线工具,生成了0、45、90、135、180、224、270、315和360九个不同角度的3D文字效果,将其代码放上来给大家参考。当然大家还可以通过这个在线工具,设计相关的参数。工具使用方法很简单,我就不细说了。

demodownload

HTML CODE

<div class="text-wrap box1">W3cplus (0 deg)</div>

CSS CODE

body{background-color: #665757;}
.text-wrap {
  width: 600px;
  min-height: 100px;
  margin: 20px auto;
  padding: 30px 0;
  border: 5px solid #ccc;
  position: relative;
  box-shadow: 0 0 4px rgba(0, 0, 0, 0.80);
  clear: both;
  font-family: 'Aclonica', serif;
  font-size: 50px;
  text-align: center;
  color: #f7edf7;
}
.box1 {
  text-shadow:0px 0px 0 rgb(188,178,188),1px 0px 0 rgb(173,163,173),2px 0px 0 rgb(157,147,157),3px 0px 0 rgb(142,132,142),4px 0px 0 rgb(126,116,126),5px 0px 0 rgb(111,101,111),6px 0px 0 rgb(95,85,95), 7px 0px 0 rgb(79,69,79),8px 0px 7px rgba(0,0,0,0.35),8px 0px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}
.box2 {
  text-shadow:0px 0px 0 rgb(188,178,188),1px -1px 0 rgb(173,163,173),2px -2px 0 rgb(157,147,157),3px -3px 0 rgb(142,132,142),4px -4px 0 rgb(126,116,126),5px -5px 0 rgb(111,101,111),6px -6px 0 rgb(95,85,95), 7px -7px 0 rgb(79,69,79),8px -8px 7px rgba(0,0,0,0.35),8px -8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}
.box3 {
  text-shadow:0px 0px 0 rgb(188,178,188),0px -1px 0 rgb(173,163,173),0px -2px 0 rgb(157,147,157),0px -3px 0 rgb(142,132,142),0px -4px 0 rgb(126,116,126),0px -5px 0 rgb(111,101,111),0px -6px 0 rgb(95,85,95), 0px -7px 0 rgb(79,69,79),0px -8px 7px rgba(0,0,0,0.35),0px -8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}
.box4 {
  text-shadow:0px 0px 0 rgb(188,178,188),-1px -1px 0 rgb(173,163,173),-2px -2px 0 rgb(157,147,157),-3px -3px 0 rgb(142,132,142),-4px -4px 0 rgb(126,116,126),-5px -5px 0 rgb(111,101,111),-6px -6px 0 rgb(95,85,95), -7px -7px 0 rgb(79,69,79),-8px -8px 7px rgba(0,0,0,0.35),-8px -8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}
.box5 {
  text-shadow:0px 0px 0 rgb(188,178,188),-1px 0px 0 rgb(173,163,173),-2px 0px 0 rgb(157,147,157),-3px 0px 0 rgb(142,132,142),-4px 0px 0 rgb(126,116,126),-5px 0px 0 rgb(111,101,111),-6px 0px 0 rgb(95,85,95), -7px 0px 0 rgb(79,69,79),-8px 0px 7px rgba(0,0,0,0.35),-8px 0px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}

.box6 {
  text-shadow:0px 0px 0 rgb(188,178,188),-1px 1px 0 rgb(173,163,173),-2px 2px 0 rgb(157,147,157),-3px 3px 0 rgb(142,132,142),-4px 4px 0 rgb(126,116,126),-5px 5px 0 rgb(111,101,111),-6px 6px 0 rgb(95,85,95), -7px 7px 0 rgb(79,69,79),-8px 8px 7px rgba(0,0,0,0.35),-8px 8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}
.box7 {
  text-shadow:0px 0px 0 rgb(188,178,188),0px 1px 0 rgb(173,163,173),0px 2px 0 rgb(157,147,157),0px 3px 0 rgb(142,132,142),0px 4px 0 rgb(126,116,126),0px 5px 0 rgb(111,101,111),0px 6px 0 rgb(95,85,95), 0px 7px 0 rgb(79,69,79),0px 8px 7px rgba(0,0,0,0.35),0px 8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}
.box8 {
  text-shadow:0px 0px 0 rgb(188,178,188),1px 1px 0 rgb(173,163,173),2px 2px 0 rgb(157,147,157),3px 3px 0 rgb(142,132,142),4px 4px 0 rgb(126,116,126),5px 5px 0 rgb(111,101,111),6px 6px 0 rgb(95,85,95), 7px 7px 0 rgb(79,69,79),8px 8px 7px rgba(0,0,0,0.35),8px 8px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}
.box9{
  text-shadow:0px 0px 0 rgb(188,178,188),1px 0px 0 rgb(173,163,173),2px 0px 0 rgb(157,147,157),3px 0px 0 rgb(142,132,142),4px 0px 0 rgb(126,116,126),5px 0px 0 rgb(111,101,111),6px 0px 0 rgb(95,85,95), 7px 0px 0 rgb(79,69,79),8px 0px 7px rgba(0,0,0,0.35),8px 0px 1px rgba(0,0,0,0.5),0px 0px 7px rgba(0,0,0,.2);
}

以上代码来自于3D css Text Generator在线工具生成。

demodownload

3D css Text Generator

3d css text generator

如需转载,烦请注明出处:http://www.w3cplus.com/demo/pure-css3-3d-text-effects.html

藤藤每日一练——CSS3 Animation Menu

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

这是一个使用CSS3中的transition和transform两个属性制作的一个动画下拉菜单效果,整个效果未采用任何js脚本代码,其中下接的折叠效果是通过transform的rotate来实现的,而transition是用来控制动画更具线性,当然这个效果也用到了transform的3d旋转属性,感兴趣的可以围观一下。扩大你自己的视野。

demodownload

HTML CODE

<div class="box">
  <ul class="menu">
    <li><a href="#"></a></li>
    <li><a href="#">About Me</a>
    	<ul>
        <li><a href="#">Lorem ipsum dolor</a></li>
        <li><a href="#">Maecenas lacinia sem</a></li>
        <li><a href="#">Suspendisse fringilla</a></li>
    	</ul>
    </li>
    <li><a href="#">Portfolio</a>
    	<ul>
        <li><a href="#">Lorem ipsum dolor</a></li>
        <li><a href="#">Maecenas dignissim ..</a></li>
        <li><a href="#">Suspendisse fringilla</a></li>
        <li><a href="#">Lorem ipsum dolor</a></li>
        <li><a href="#">Maecenas lacinia sem</a></li>
        <li><a href="#">Suspendisse fringilla</a></li>
    	</ul>
    </li>
    <li><a href="#">Clients</a>
    	<ul>
        <li><a href="#">Lorem ipsum dolor</a></li>
        <li><a href="#">Maecenas lacinia sem</a></li>
        <li><a href="#">Suspendisse fringilla</a></li>
    	</ul>
    </li>
    <li><a href="#">Contact Me</a>
    	<ul>
        <li><a href="#">Lorem ipsum dolor</a></li>
        <li><a href="#">Maecenas dignissim ..</a></li>
        <li><a href="#">Suspendisse fringilla</a></li>
    	</ul>
    </li>
    <li><a href="#">Support</a></li>
  </ul>
</div>

CSS CODE

body {
  background-color: #f2f2f2;
}   
.box {
  margin-top: 40px;
  height: 85px;
  border-bottom: 5px solid #fff;
  background-color: #0dc2e3;
  background-image: -webkit-linear-gradient(180deg, transparent 55%, #00bfe1 45%);
  background-image: -o-linear-gradient(180deg, transparent 50%, #00bfe1 50%);
  background-image: -ms-linear-gradient(180deg, transparent 50%, #00bfe1 50%);
  background-image: linear-gradient(90deg, transparent 50%, #00bfe1 50%);
  background-size: 30px 30px;
}
.menu {
  width: 750px;
  margin: 0 auto;
  -webkit-perspective: 50px;
  -moz-perspective: 50px;
  -ms-perspective: 50px;
  perspective: 50px;
  
}
.menu > li {
  display: inline-block;
  padding-top: 48px;
  -webkit-transform-style: preserve-3d;
  -moz-transform-style: preserve-3d;
  -ms-transform-style: preserve-3d;
  transform-style: preserve-3d;
}
.menu > li > a {
  position: relative;
  display: block;
  line-height: 36px;
  color: #fff;
  font-weight: bold;
  font-size: 20px;
  padding: 0 20px;
}
.menu > li:first-child > a:before {
  position: absolute;
  left: 0;
  top: 36px;
  content: '';
  width: 1px;
  height: 1px;
  border-width: 15px 30px;
  border-style: solid;
  border-color: transparent;
  border-top-color: #4bb100;
}
.menu > li:first-child > a:after {
  font-family: 'iconminia';
  font-style: normal;
  speak: none;
  font-weight: normal;
  -webkit-font-smoothing: antialiased;
  font-size: 22px;
  content: "\21";
}
.menu > li:first-child a,
  .menu > li:first-child:hover > a,
  .menu > li:first-child:hover a:hover {
  color: #fff;
  top: 2px;
  height: 36px;
  margin-right: 10px;
  text-shadow: 0 1px 0 #3c8f00;
  border-radius: 5px 5px 0 0;
  box-shadow: 0 1px 0 #a6d980 inset;  
  background-color: #4bb100;
}
.menu > li:hover > a {
  color: #1a89c8;
  text-decoration: none;
  border-radius: 5px 5px 0 0;
  background-color: #fff;
} 
.menu ul {
  position: absolute;
  text-align: left;
  line-height: 40px;
  font-size: 14px;
  width: 200px;
  background-color: #fff;
  -webkit-transition: all 0.3s ease-in;
  -moz-transition: all 0.3s ease-in;
  -ms-transition: all 0.3s ease-in;
  transition: all 0.3s ease-in;
  -webkit-transform-origin: 0px 0px;
  -moz-transform-origin: 0px 0px;
  transform-origin: 0px 0px;
  -webkit-transform: rotateX(-90deg);
  -moz-transform: rotateX(-90deg);
  transform: rotateX(-90deg);
  -moz-backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
.menu ul a {
  display: block;
  padding: 0 15px 0 10px;
  color: #1a89c8;
}
.menu > li:hover ul {
  display: block;
  -webkit-transform: rotateX(0deg);
  -moz-transform: rotateX(0deg);
  -ms-transform: rotateX(0deg);
  transform: rotateX(0deg);
}
.menu ul a:hover {
  color: #fff;
  text-shadow: 0 1px 0 #1c71a1;
  text-decoration: none;
  background-color: #218bc7;
} 
@font-face {
  font-family: 'iconminia';
  src:url('fonts/iconminia.eot');
  src:url('fonts/iconminia.eot?#iefix') format('embedded-opentype'),
   url('fonts/iconminia.svg#iconminia') format('svg'),
   url('fonts/iconminia.woff') format('woff'),
   url('fonts/iconminia.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
}

demodownload

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

藤藤每日一练——CSS3制作手风琴菜单

$
0
0
藤藤每日一练——CSS3制作手风琴菜单

早期制作手风琴菜单都需要依赖于js的脚本来实现,自从CSS3出现后,制作这种效果不在需要依赖于任何脚本。另外实现手风琴效果的制作方法有很多种,但较为常见的是使用css3的“:target”选择器来实现。在本例中也是一样的,通过“:target”选择器来控制下接菜单的“max-height”,原理简单,方法也简单,只是细节处理稍加注意。

demodownload

HTML Code

<ul class="menu">
  <li class="item1" id="one"><a href="#one">Friends </a>
    <ul>
      <li class="subitem1"><a href="#">Cute Kittens </a></li>
      <li class="subitem2"><a href="#">Strange “Stuff” </a></li>
      <li class="subitem3"><a href="#">Automatic Fails </a></li>
    </ul>
  </li>
  <li class="item2" id="two"><a href="#two">Videos </a>
    <ul>
      <li class="subitem1"><a href="#">Cute Kittens </a></li>
      <li class="subitem2"><a href="#">Strange “Stuff” </a></li>
      <li class="subitem3"><a href="#">Automatic Fails </a></li>
      <li class="subitem2"><a href="#">Strange “Stuff” </a></li>
      <li class="subitem1"><a href="#">Cute Kittens </a></li>
      <li class="subitem2"><a href="#">Strange “Stuff” </a></li>
    </ul>
  </li>
  <li class="item3" id="three"><a href="#three">Galleries</a>
    <ul>
      <li class="subitem3"><a href="#">Automatic Fails</a></li>
    </ul>
  </li>
  <li class="item5" id="five"><a href="#five">Robots</a>
    <ul>
      <li class="subitem1"><a href="#">Cute Kittens</a></li>
      <li class="subitem2"><a href="#">Strange “Stuff”</a></li>
      <li class="subitem3"><a href="#">Automatic Fails </a></li>
    </ul>
  </li>
</ul>

CSS Code

body {
  background-color: #666;
}  
.demo {
  width: 200px;
  height: 400px;
  margin: 40px auto 0;
}
.menu > li {
  line-height: 50px;
  border-bottom: 1px solid #3d3d3d;
  box-shadow: 0 1px 0 #888;
}  
.menu > li:first-child {
  border-top: 1px solid #3d3d3d;
  box-shadow: 0 1px 0 #888,0 1px 0 #888 inset;
}
.menu a {
  position: relative;
  outline: 0;
  display: block;
  text-align: left;
  color: #e5e5e5;
  font-size: 18px;
  text-shadow: 0 1px 1px #171717;
  padding: 0 40px;
}
.menu a:hover {
  text-decoration: none;
}
.menu > li > a:before,
  .menu > li > a:after {
  font-family: 'LigatureSymbols';
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-font-smoothing: antialiased;
  -ms-font-smoothing: antialiased;
  -o-font-smoothing: antialiased;
  font-smoothing: antialiased;
  -webkit-font-feature-settings: "liga" 1, "dlig" 1;
  -moz-font-feature-settings: "liga=1, dlig=1";
  -ms-font-feature-settings: "liga" 1, "dlig" 1;
  font-feature-settings: "liga" 1, "dlig" 1;
  font-size: 26px;
}
.menu > li > a:before {
  position: absolute;
  left: 10px;
  color: #e5e5e5;
  text-shadow: inherit -1px 0 #fff,0 -2px 0 #1a1a1a,0 1px 2px #1a1a1a;
}
.menu > li > a:after {
  position: absolute;
  right: 10px;
  color: #292929;
  text-shadow: -1px 0 0 #050505,1px 0 0 #868686;
}
.menu > li:nth-child(1) > a:before{
  content:"friend";
}
.menu > li:nth-child(2) > a:before{
  content:"video";
}
.menu > li:nth-child(3) > a:before{
  content:"paint";
}
.menu > li:nth-child(4) > a:before{
  content:"android";
}
.menu > li > a:after{
  content:"plus";
}
.menu ul {
  line-height: 30px;
  max-height: 0;
  overflow: hidden;
  -webkit-transition: max-height .5s linear;
  -moz-transition: max-height .5s linear;
   transition: max-height .5s linear;
}
.menu ul a {
  color: #000;
  text-shadow: 0 1px 1px #848484;
  font-size: 12px;
}
.menu ul a:hover {
  color: #ccc;
  text-shadow: 0 1px 0 #252525;
}
.menu li:target > a:after {
  content: "minus";
}
.menu li:target ul {
  max-height: 200px;
  border-top: 1px solid #3d3d3d;
  box-shadow: 0 1px 0 #888 inset;
}
@font-face {
    font-family: 'LigatureSymbols';
    src: url('font/LigatureSymbols-2.05.eot');
    src: url('font/LigatureSymbols-2.05.eot?#iefix') format('embedded-opentype'),
      url('font/LigatureSymbols-2.05.woff') format('woff'),
      url('font/LigatureSymbols-2.05.ttf') format('truetype'),
      url('font/LigatureSymbols-2.05.svg#LigatureSymbols') format('svg');
    font-weight: normal;
    font-style: normal;
}  

demodownload

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

藤藤每日一练——Pure CSS3 Accordion Slider

$
0
0
藤藤每日一练——Pure CSS3 Accordion Slider

Accordion Slider 以前都是使用jQury或别的js脚本来制作,今天我们给大家展示一个纯CSS3实现的水平手风琴幻灯片播放的效果。这个效果有两个关键之处,第一是HTML结构中的input[type="radio"]是必备的,第二是样式通过radio的选中与未选中来控制对应的img显示和隐藏。这里采用的是css的兄弟元素选择器(~),这个是一个很好的应用。当然实现这种效果还可以通过“target”来实现,不过这种方法实现要借助js来显示默认的第一张图片,有兴趣的可以将这个案例改装一下。

demodownload

HTML CODE

<ul class="main_promo clearfix" id="main_promo">
  <li>
    <input type="radio" name="radio-set" checked="checked"/>
    <div class="slide">
      <a href="#"><p>Slide One</p><strong>1</strong></a>
    </div>
    <div class="slide_img">
      <img src="img/img_01.jpg" alt="" />
    </div>
  </li>
  <li>
    <input type="radio" name="radio-set" />
    <div class="slide">
      <a href="#slide_two"><p>Slide Two</p><strong>2</strong></a>
    </div>
    <div class="slide_img">
      <img src="img/img_02.jpg" alt="" />
    </div>
  </li>
  <li>
    <input type="radio" name="radio-set" />
    <div class="slide">
      <a href="#slide_three"><p>Slide Three</p><strong>3</strong></a>
    </div>
    <div class="slide_img">
      <img src="img/img_03.jpg" alt="" />
    </div>
  </li>
  <li>
    <input type="radio" name="radio-set" />
    <div class="slide">
      <a href="#slide_four"><p>Slide Four</p><strong>4</strong></a>
    </div>
    <div class="slide_img">
      <img src="img/img_04.jpg" alt="" />
    </div>
  </li>
</ul>

CSS CODE

body {
  background-color: #f6f6f6;
}
.demo {
  width: 940px;
  margin: 40px auto 0;
}
.main_promo {
  border: 5px solid #3d3d3d;
  border-radius: 7px;
  box-shadow: 0 8px 16px rgba(0,0,0,.2);
  background-color: #1c1c1c;
}
.main_promo li {
  position: relative;
  float: left;
  padding: 5px 0 5px 6px;
  overflow: hidden;
}
.main_promo div {
  float: left;
}

.slide a {
  position: relative;
  z-index: 1;
  display: block;
  outline:none;
  width: 50px;
  height: 300px;
  border-radius: 5px;
  background-color: #303030;
  transition: all 0.3s ease-in;
}
.slide p {
  position: absolute;
  top: 30px;
  left: -25px;
  color: #ddd;
  height:20px;
  width: 100px;
  font-size: 14px;
  font-weight: bold;
  text-shadow: 0 1px 1px rgba(0,0,0,.8);
  word-break:break-all;
  transform: rotate(-90deg);
}
.slide strong {
  font-size: 30px;
  color: #191919;
  text-shadow: 0 1px 0 #454545;
  position: absolute;
  bottom: 15px;
  left: 15px;
}
.slide_img {
  overflow: hidden;
  width: 0;
  height: 0;
  transition: width 0.5s ease-in-out;
}
.slide_img img {
  width:  692px;
  height: 300px;
}
input[type="radio"] {
  position: absolute;
  left: 5px;
  z-index: 99;
  width: 50px;
  height: 300px;
  opacity: 0;
  cursor: pointer;
}
input:checked ~ .slide a {
  text-decoration: none;
  background:radial-gradient(circle,#434343,#303030);
}
input:checked ~ .slide_img {
  overflow: visible; 
  width:692px; 
  height:300px;  
  margin-left: 8px;
}

特别声明:从这个案例开始,我们所有的CSS3属性都省去其前缀“-moz”、“-webkit”、“-o”、“-ms”,而用改用了prefixfree脚本来实现。详细的使用方法可以点击这里

demodownload

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

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

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

Lavalamp Menu是一种很好的效果,早期在国外的博客中看到过这种效果,是通过jquery插件制作的,一开始还不知道这种效果就叫Lavalamp呢?后来为之告诉我的,今天使用CSS3写了一个垂直的Lavalamp的导航效果,这个效果其实很简单,主要是ribbons的制作要点功夫,然手就是选择器的使用,如果你掌握了这两个部分的知识,那么制作这个效果只是一个思路问题,看看代码你就知道了。

demodownload

HTML Code

<ul class="menu unstyled">
  <li><a href="#" title=""><strong>Steve Careless</strong></a></li>
  <li><a href="#" title=""><strong>Hank Azarena</strong></a></li>
  <li><a href="#" title=""><strong>Joan Rivals</strong></a></li>
  <li><a href="#" title=""><strong>Johnny Dip</strong></a></li>
  <li><a href="#" title=""><strong>Gwyneth Patron</strong></a></li>
  <div class="ribbon_wrap">
    <div class="ribbon_rail">
      <div></div>
    </div>
  </div>
</ul>

CSS code

body {
  background: radial-gradient(#1d1d1d 15%, transparent 20%) 0 1px,
    radial-gradient(#1d1d1d 15%, transparent 20%) 4px 5px;
  background-color:#282828;
  background-size:4px 8px;
}  
.demo {
  margin: 40px auto 0;
  width: 170px;
  text-align: center;
}
.menu {
  position: relative;
  width: 170px;
  padding: 5px 0;
  line-height: 35px;
  border-radius: 5px;
  background: linear-gradient(top,#dbdbdb,#999);
}
.menu a {
  display: block;
  color: #484848;
  text-decoration: none;
  text-shadow: 0 1px 0 #e0e0e0;
  font-size: 14px;
}
.menu li:hover a,
  .menu li:first-child a {
  color: #980202;
  text-shadow: 0 1px 0 rgba(0,0,0,.1);
}
.menu li:hover a{
  color: #fff;
}
.menu li {
  position: relative;
  z-index: 2;
}
.ribbon_wrap {
  position: absolute;
  top: 8px;
  left: -20px;
  z-index: 1;
  transition: top 0.4s;
}
.ribbon_rail {
  position: relative;
  width: 170px;
  height: 30px;
  padding: 0 20px;
  color: #e3e3e3;
  text-shadow: 0 1px 0 #6b6b6b;
  box-shadow: 0 2px 5px rgba(0,0,0,.2);
  background: linear-gradient(top,#ff3f3f,#a50000);
}
.ribbon_rail:before,
  .ribbon_rail:after {
  position:absolute;
  content:"";
  top:100%;
  width:0;
  height:0;
  border: 5px solid transparent;
}
.ribbon_rail:before {
  left:0;
  border-color: #5d0f0f #5d0f0f transparent transparent;
}
.ribbon_rail:after { 
  right:0;
  border-color: #5d0f0f transparent transparent #5d0f0f;
}
.ribbon_rail > div {
  width: 100%;
}
.ribbon_rail > div:before,
  .ribbon_rail > div:after {
  content:"";
  position: absolute;
  top:10px;
  z-index: -1;
  width: 0;
  height:0;
  border-width: 14px;
  border-style: solid;
  border-color: #ff1515 #ff1515 #920000 #ff1515;
}
.ribbon_rail > div:before {
  right: 100%;
  border-left-color: transparent;
  margin-right: -10px;
}
.ribbon_rail > div:after {
  left: 100%;
  border-right-color: transparent;
  margin-left: -10px;
}
.menu li:nth-child(1):hover ~ .ribbon_wrap{ 
  top: 8px; 
}
.menu li:nth-child(2):hover ~ .ribbon_wrap{  
  top: 43px;
}
.menu li:nth-child(3):hover ~ .ribbon_wrap{  
  top: 78px; 
}
.menu li:nth-child(4):hover ~ .ribbon_wrap{
  top: 113px;
}
.menu li:nth-child(5):hover ~ .ribbon_wrap{
  top: 148px;
}

demodownload

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

70+优秀的前端工具

$
0
0
70+优秀的前端工具

随着CSS3的出现,CSS3讨论的话题越来越多了,现在各种教程也是多如牛毛,不比一年前的时候,找个资料要捞遍整个互联网,而且还很难找到自己需要的参考资料。从侧面也说明,CSS3对于前端工程师来说,越来越重要了,从各处的招聘信息也能看出这一点。说这么说我想强调的是他的重要性。另一方面,有很多CSS3的效果真的不需我们自己一个一个去写,在这种情况就互联网上有关于CSS3的工具就出现了,这些工具将给你的制作节省很多时间,让你有更多的时间去做自己想要做的事情。经过一年多的收集,我想有必要在w3cplus上为大家整理一份这样的工具列表,方便大家寻找。同时也希望这些工具能帮助大家学习,以及给你的工作带来极大的方便。

本来想单独整一份有关于CSS3的工具,后来仔细一思考,还是将前端的一些优秀工具全列在此文,在这篇文章中,我为大家分得稍为更细一些,让大家有针对性的查找,从而节省了找这些工具的时间。

一、CSS3属性值的查询

这一块主要为大家搜集了几个查找css3相关属性介绍的工具,这些工具能让你了解CSS3的相关属性以及其简单的使用方法,还有就是浏览器的兼容性等。

1、CSS Values

css values

CSS Values主要是用来帮助大家查找CSS的相关属性的语法,以及使用方法,能快速的进入相对应的w3c官网介绍、MDN信息介绍等。

2、CSS3,Please!

CSS3,Please!

CSS3 Please主要是为大家提供了目前较为实用的一些CSS3属性的介绍,以及示范代码。

3、CSS3 Click Chart

CSS3 Click Chart

CSS3 Click Chart为大家提供了W3c草案中的属性介绍,并且可以在对应的属性中找到相关的教程以及w3c官网的详细介绍。

4、CSS666.com

CSS666.com

css666.com就是一个提供CSS相关属性查询、以及对应属性值的简单介绍。

5、caniuse.com

caniuse.com

caniuse.com提供了CSS相关属性的浏览器兼容表,同时提供了对应属性资源。另外这个站还提供了html5之类的查询

6、 HTML5 / CSS3 Box.com

 HTML5 / CSS3 Box.com

HTML5 / CSS3 Box.com提供了各种前端工具。

二、CSS3效果生成工具

第二部分介绍的工具都是些集成了CSS3多个属性的生成工具,我们可以通过这些工具直接生成一些CSS3效果,比如说渐变、盒子阴影、文本阴影、圆角等等。

1、Westciv Tools

Westciv Tools

Westciv Tools主要为CSS3提供了渐变gradients、盒子阴影box-shadow、变形transform和文字描边四种在线生成效果的工具。

2、CSS3 Generator

CSS3 Generator

CSS3 Generator提供了13个CSS3较为常用的属性代码生成工具,而且可以通过这款工具除了在线生成效果代码之外,还可以实时看到你修改的效果,以及浏览器的兼容性。

3、CSS3 Maker

CSS3 Maker

CSS3 Maker提供了10个最为常用的CSS3属性在线生成工具,比如说border-radius、gradient、transfrom、animation、transition、rgba、text-shadow、box-shadow、text rotation和@font-face。同样的你可以在线设置相关属性参数,了解浏览器对其的支持性,最方便的可以直接下载生成的代码。

4、LayerStyle

LayerStyle

LayerStyle这款工具虽然服务的属性不多,只有box-shadow。渐变色,圆角几个,但他是的工作原理非常的接近于photoshop的面板工具,我想会有很多人喜欢,因为他对大家来说很熟悉,一点都不陌生。

5、CSS3 GENERATOR

CSS3 GENERATOR

CSS3 GENERATOR可以同时为一个元素完成border-radius、box-shadow、gradient和opacity多项属性的设置。

6、Live Tools

Live Tools

Live Tools是一个UI制作工具,他提供了按钮、表单、icon图标和Ribbons的制作工具,可以在线配置相关参数,生成你需要的效果代码。

7、Mikeplate

Mikeplate

Mikeplat可以同时为一个元素设置多个CSS3的属性样多,比如说圆角、阴影、旋转等。

8、CSS3 Generator

CSS3 Generator

CSS3 Generator(Pascal seven)和前面的CSS3 Generator工具不太一样,这个工个是十个CSS3属性为同一个元素服务,当然你可以选择性的使用你需要的属性。

9、CSS3 Ps

CSS3 Ps

CSS3 Ps是photoshop cs6的一款插件,如果你是仅是一位设计师,不懂任何coding的活,但想使用CSS3属性来实现你的部分设计效果,那么你就可以使用CSS Ps来帮助,一键搞定。

三、按钮生成工具

Button的制作是很常见,早期为了效果好,都是使用image来实现,自从CSS3出来后,现在很多效果都是通过代码来实现,可是如何用代码写好按钮效果实在是让人头痛,其实没有那么复杂,我们使用工具,一切交给工具,你就轻松了。接下来为大家介绍几款常用的buttons制作工作。

1、Button Maker

Button Maker

Button Maker是CSS-TRICKS提供的一款在线生成Buttons的工具,可以根据工具上的参数,定制适合自己需要的Button。

2、线性渐变按钮

线性渐变按钮

这是一款制作线性渐变按钮的工具,他提供了详细的参数让你设置,可以制作出各式各样的按钮效果

3、CSS3 Button Generator

CSS3 Button Generator

CSS3 Button Generator是一个傻瓜式的按钮制作工具。

4、CSS3 Button Generator

CSS3 Button Generator

CSS3 Button Generator是一款简单的按钮生成工具,他可以制作出两种状态下的按钮效果,当然你如果需要其他状态的下按钮效果,要在其基础上做一些参数的变化,相对来说麻烦一点。

5、Glassy Buttons

Glassy Buttons

Glassy Buttons是用来制作玻璃按钮效果的工具

6、Button Generator

Button Generator

生成和图片效果一样的按钮工具。

7、Button Factory

Button Factory

在线制作漂亮的按钮工具。

8、AsButtonGen

AsButtonGen

AsButtonGen可以在线根据自己需求定制不同的按钮效果。

9、Webarti CSS3 Button Maker

Webarti CSS3 Button Maker

Webarti CSS3 Button Maker是一款非常强大的按钮在线生成工具,他提供了很多种不同按钮效果让你参考,可以说只需选择就能制作出自己需要的按钮,思考的时间都不用你花了。

10、sciweavers

sciweavers

这是一款制作buttons的好工具,有多种风格供你参考,还能做一定的调整。

11、cssbutton.me

cssbutton.me

可以辅助你随意自定义按钮效果的一款工具。

四、@font-face字体转换工具

@font-face属性可以帮助我们制作一些特殊的字体,不过这个属性对于中文字体来说有所限制。由于中文字体较大,无法转换。

1、@FONT-FACE GENERATOR

@FONT-FACE GENERATOR

@FONT-FACE GENERATOR只需其中一种字体,就可以帮我们转换成@font-face各浏览器下所需的所有字体格式。

2、@FONT-FACE kit generator

@FONT-FACE kit generator

@FONT-FACE kit generator只需其中一种字体,就可以帮我们转换成@font-face各浏览器下所需的所有字体格式。

五、字体查询

字体是一个站点设计必备的东东,但有很多字体我们都不知道,更不知道字体在页面中呈现的效果,还有就是不知道如何取到这些这体,这里给大家推荐两个站点,可以实时看到不同字体的效果,以及下载。

1、CSS FONT STACK

CSS FONT STACK

CSS FONT STACK能让你实时看到各种字体在web中的渲染效果。

2、Font 2U

Font 2U

Font2u提供了各种字体的下载以及字体的详细信息。

六、在线制作ICON

ICON使用@font-face制作是越来越普遍了,但有一些icon字体库有几个icon,而往往我们有时候只需要其中的几个,加载所有的icon感觉浪费,其实没有必要这么做的,在线有两个网站,上面提供了各种字体icon库,我们只需要选择其中的部分,进行安装就OK了。

1、Fontello

Fontello

Fontello.com提供了12种字体icon的在线制作,你可以选择其中的某几个icon生成你需要的图标

2、icomoon

icomoon

icommon就比较强大了,除了免费的字体之外,你还可以导入你自己的svg字体,生成你需要的icon。

七、ICON图标下载

很多时候不想花时间去制作一些透明的ICON,想要现成的,但有时候有不知道去哪找,这里给大家推荐几个网站,这几个站点提供了各种尺寸的透明PNG的ICON下载。

1、ICON FINDER

ICON FINDER

ICON FINDER这个站点,可以搜索到自己需要的各种字体。

2、FIND ICONS

FIND ICONS

FIND ICONS这个站和前面的那个站很类似,类似的域名都差不多,功能也差不多。

3、Freepik.com

Freepik.com

Freepik.com除了提供ICON的下载之外,还提供了其他设计素材的下载。

八、圆角生成工具

圆角的制作不在局限于图片,现在使用最多的应该是border-radius。这是一个很简单的属性,但有工具总比自己代码去测试强,虽然前面的工具中或多或少包括了圆角的生成部分,但不是针对性的,下面为大家介绍几款专门用来制作圆角的在线工具。

1、border radius

border radius

border radius就是一款很简单的用来制作圆角的在线生成工具,不过这款工具只能制作简单的圆角效果。(水平和垂直圆角半径一样大小)。

2、CssRound

CssRound

一款简单的圆角调试工具。

九、渐变生成工具

渐变效果,用CSS3写,里面的代码真心的记不住,我每次都需要去查相关的文档,而且一个好的渐变效果,需要不断的去调试,如果使用现成的工具就省心多了。

1、Ultimate CSS Gradient Generator

Ultimate CSS Gradient Generator

Ultimate CSS Gradient Generator真心的好用,是我常用的一个在线制作渐变的工具,他除了类似于photoshop的渐变工具之外,还是firefox和chrome浏览器的一个插件。而且还能生成兼容IE的滤镜代码,好强大的。

2、CSS3 Gradient Generator

CSS3 Gradient Generator

这是一个简单的渐变制作工作,可以制作出常用的一些渐变效果。

3、CSS + SVG + Canvas cross-browser gradient generator

CSS + SVG + Canvas cross-browser gradient generator

CSS + SVG + Canvas cross-browser gradient generator,看标题就知道是怎么一回事了。

十、颜色获取以及配色工具

颜色种类太多,有时候为了一种颜色不知道他的编码很头痛,有时候又想看看几种颜色在同一个web页面上配色是否协调。其实这些都可以交给工具去帮我们。

1、Color Schemer Online

Color Schemer Online

通过输入rgba和十六进制或者颜色面板上取颜色值,就能获取到相关系列的颜色值。

2、Color Schemes and Color Palettes

Color Schemes and Color Palettes

提供了各种web的配色方案和颜色面板

3、Hsl Color Picker

Hsl Color Picker

Hsl Color Picker提供了一个颜色值之间的转换工具,取其中一个值,就能得到相应的其他命名的颜色值。

3、HSL COLOR PICKER

HSL COLOR PICKER

HSL COLOR PICKER工具是通过设置HSL的颜色,然后工具中能看到对应的颜色,同时还能得到十六进制和rgb的颜色值。

4、Peise.net

Peise.net

Peise.net提供了各种颜色的配色方案,以及颜色的理论知识。

5、hex color

hex color

hex color工具是志哥编写的一个关于css背景颜色属性值转换的一个工具,

十一、盒子阴影box-shadow

box-shadow给我们带来很多种阴影的实现方法,而且比制作图片还简单,下面提供几款在线制作阴影的工具。

1、CSS Drop Shadow

CSS Drop Shadow

这款工具可以在线直接生成七种不同类型的阴影效果,这七种也是常见的不同阴影效果。

2、CSS3 Drop Shadows

CSS3 Drop Shadows

这个工具和上面的工具有点类似,使用CSS3制作一些特别的阴影效果。

十二、CSS3动画

css3的animation可以让我们不在依赖于javaScript的脚本就能实现一些动画效果,但这个属性的制作,时间点控制还是需要花时间去调试的,如果有工具让我们一下就能搞定,不是大家期待的?

1、liffect effect

liffect effect

liffect effect可以说是一个css3 animation的动画库,里面涵盖了20多种动画效果,极其类似于jQuery Easing Plugin中的效果。

2、CSS3 Animation Generator

CSS3 Animation Generator

CSS3 Animation Generator和前面的一款类似,但没有第一款那么多动画效果。

3、Animate.css

Animate.css

Animate.css不是生成代码的工具,但绝对是各种动画效果的参考示例网站。

4、animatable

animatable

animatable和Animate.css一样不是生成代码的工具,但他在线提供了39种不同的动画效果。

5、stylie

stylie

stylie在线生成keyframe的一款工具。

十三、px转em工具

我们最常用的度量单位就是像素(px),但他是一个固定值单位,有时候我们难免需要使用到相对单位em,那么px转em往往会让你计算到晕死,特别是多层嵌套的情况下,今天提供几款工具,让你能整个明白,用得放心。

1、pxtoem

pxtoem

一款简单的px转em工具,可查询到不同状态下的变化值。

2、Em Calculator

Em Calculator

Em Calculator是一款强大的px转em的工具,无论你层级有多深,都能给你计算出来。

十四、布局工具

布局就不用解释了(^_^)。能用工具制作布局,我想用的人还是算少的吧,要是你没看过,那你要看看,

1、Pageblox

Pageblox

Pageblox是一款在线生成布局的工具,提供了七种常见的布局模式,而且还可以根据自己的需求做一些自定义的设置。

2、Gridpak

Gridpak

Gridpak是一款生成responsive网格布局系统的工具。

3、CSS Layout Generator

CSS Layout Generator

CSS Layout Generator是一款布局生成工具,可以生成固定布局,流体布局等。

4、RatioSTRONG

RatioSTRONG

RatioSTRONG是一款将固定布局转换成百分值布局的一款值转换工具。

5、Variable Grid System

Variable Grid System

Variable Grid System 一个自定义的网格系统工具。

6、Gridinator

Gridinator

Gridinator是一款能制作px、em、%值三值的网格布局工具。

十五、base64l图片

图片转64位,一直不知道如何转的,后来搜索了两个工具,觉得蛮不错的,就列入进来了,给有需要有朋友使用。

1、image2base64

image2base64

本地图片转换成base64位的一款工具

2、imagetobase64converter

imagetobase64converter

本地图片转换成base64位的一款工具

十六、border-image工具

border-image现在虽然列入了css3中,但目前仅在webkit下能用,不过他是一个很强大的属性,将来肯定能帮我们解决不少的麻烦问题,这次整工具,也将列入进来。

1、border-image-generator

border-image-generator

border-image-generator就是border-image的一款运用工具,使用这款工具,能轻松的用好border-image属性。

十七、css3 Transform

CSS3的transform属性能轻易将元素进行一些变换,比如说旋转、绽放和扭曲等,制作这样的效果也有现在的工具。

1、CSS3 Transform Generator

CSS3 Transform Generator

CSS3 Transform Generator就是在线高度transform的属性。

2、3D CSS Tester

3D CSS Tester

3D CSS Tester是一款在线生成3D旋转的工具。

十八、CSS3 Transition

CSS3的transition属性制作动画虽然没有animation那么强大,但实现一些润滑动画效果是足够了,而这个属性中最重要的是就是他的动画函数,如果你不知道这些函数怎么来写,可以利用一下下面的工具。

1、CSS EASING ANIMATION TOOL

CSS EASING ANIMATION TOOL

CSS EASING ANIMATION TOOL主要用来生成transition属性的运动曲线函数。

2、cubic-bezier

cubic-bezier

cubic-bezier用来制作立方贝塞尔曲线,用于transition属性中。

十九。其他

最后给大家搜集了一些前端相关的应用工具,比如说3D文本、三角制作、彩带制作等工具。

1、3D CSS Text

3D CSS Text

3D CSS Text是一个用来制作不同角度下的3D文字效果。

2、3D Ribbon Generator

3D Ribbon Generator

3D Ribbon Generator一款在线制作立体彩带工具。

3、CSS triangle generator

CSS triangle generator

CSS triangle generator一款在线制作三角图形工具。

4、CSS3 Menu

CSS3 Menu

CSS3 Menu是用来制作导航菜单。

5、CSS Load

CSS Load

CSS Load是一款纯代码制作loading的工具。

6、CSS Sprites Generator

CSS Sprites Generator

CSS Sprites Generator是在线制作图片精灵的工具

7、Html ipsum

Html ipsum

Html ipsum是一个html结构的测试模板,你做测试页面时,所需的结构,可以直接通过这个网站复制,提交工作效率。

8、CSS3 Multi Column

CSS3 Multi Column

CSS3 Multi Column一个多列属性设置工具。

9、CSS ARROW PLEASE!

CSS ARROW PLEASE!

CSS ARROW PLEASE!是一款带三角的tooltip制作工具。

10、CSS FilterLab

CSS FilterLab

CSS FilterLab是css3下的filter属性的效果查询工具。

11、Flexplorer

Flexplorer

Flexplorer是css3中flexbox属性的管理工具,可以通过这款工具实现flexbox的布局效果。

这里为大家搜集了近80款不同的工具,希望这些工具对大家今后的工作和学习有所帮助。当然,其他同学手中肯定有很多我没有发现的好工具,如果您愿意分享的话,欢迎将你一直认为好用的工具在下面跟贴,我会将您分享的好工具与贴上来与大家分享。

如需转载,烦请注明出处:http://www.w3cplus.com/source/front-end-developer-excellent-tool.html

随时可用的基础样式

$
0
0

特别声明:此篇文章由D姐根据英文文章原名《BASIC READY-TO-USE CSS STYLES》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://tympanus.net/codrops/2012/10/23/basic-ready-to-use-css-styles/以及作者相关信息

作者:HUGO GIRAUDEL

译者:D姐

如果你平时搜集了一些基本样式,在你写样式的时候就能派上用场。如何用类名定义这些简单的样式,并把他们应用到到各种元素上,这才是最重要的。

既然如此,今天我们将要探讨一下在开发过程中,需要搜集哪些简单的样式来帮助你从头创建一个网站或是应用程序,这也是今天这篇课程的要点,为此,准备了一段基本样式片段备用。

在继续往下介绍之前,先解释一下,我是如何搭建他们的。我尝试根据他们的类型进行分类,所以将他们分成“链接”、“输入框”、“普通文本”等等。这样做的主要出发点是“将这些简单的样式可以达到可利用”,这也就是说,为什么用类名来定义这些简单的基本样式。另外,这些样式并不是直接应用到某个元素上,而是用一个非语义化的类名,达到复用性。当然,你也可以根据自己的需要或者项目的需求,给这些基本的样式定义你喜欢的类名,比如说像这样定义:

.my-class {
  /* 任何样式写在这里 */
}
 
.my-class.custom {
  /*在.my-class类名上有一些特殊的样式,可以另外增加一个类名.custom,将特殊样式写在这里 */
}

其实仅定义“.custom”这个类本身并没有太大的意义,但是哪果你把他运用到一个有“my-class”类名的元素上,效果就不一样,你就会发现这个类名会覆盖一些“my-class”类名下的样式。这样的运用,我想你有碰到过。

这样一来,你现在应该有了一些基本的概念,接下来我们看看这些模式,首先从块元素开始吧。

注:本教程中运用到CSS3属性时并没有添加任何前缀,但是你在你的样式表中需要添加对应的前缀。

块元素(Block-level elements)

也许你在创建一个图片库时,想给这些图片添加一些与众不同的样式,也许你在设计你的博客时,想特别强调你的边栏,也行你在制作你的简历模板时,想让你的照片更漂亮些,那这些都要怎么做呢?想知道就继教往下。

HTML结构

在这节中,我给一个“div”元素定义了一个“block-level”的类名,也可以给这个元素添加其他额外的类名。当然只要他是一个块元素你就可以在这个元素上做想要做的事情,比如说,你打算给一张图片应用 这些样式的话,你要先确保他的“display:block”

<div class="block-level"></div>

基本样式

这个demo中,我给这个div应用了几行CSS代码:

.block-level {
  width: 120px;
  height: 120px;
  margin: 20px;
  position: relative;
  float: left;
}

当然,你可以为了需要添加更多的样式,但此处只是为了给一个块元素设置样式,所以只写了几行重要的样式。

这一节看起来好像有点不知道在说什么?我也看了原文,最后我们翻译想表达的意思是,有些时候你想给一些相同块元素同样的样式的时候,我们可以给元素添加一个相同的类名,并将这些相同的样式运用在这个类名上,如果译得不好,还请高人多多指点

大漠

阴影(shadow)

有时候想要给一个块元素添加稍深一点的不同效果,最好的解决办法是给这个元素添加一点阴影效果。然而,使用阴影效果是件危险的事情,因为没有使用好,他可以轻意的破坏你的设计。如果你不信,可以看看最新的eBay上面的阴影效果。

ebay

最初的想法仅是给每一个块添加一个细微的阴影,而不是如上图所示的一大块的黑影,好像看上去在说“嘿,我在这里!还有这里”,以致于一个阴影破坏了整个设计。

既然上面的阴影破坏了设计,有什么办法能让阴影显得细微些呢?个人拙见是通过box-shadow的扩散半径的负值给元素添加单边的阴影:

.drop-shadow {
  background: #9479fa;
}
 
.drop-shadow.top {
  box-shadow: 0 -4px 2px -2px rgba(0,0,0,0.4)
}
 
.drop-shadow.right {
  box-shadow: 4px 0 2px -2px rgba(0,0,0,0.4)
}
 
.drop-shadow.bottom {
  box-shadow: 0 4px 2px -2px rgba(0,0,0,0.4)
}
 
.drop-shadow.left {
  box-shadow: -4px 0 2px -2px rgba(0,0,0,0.4)
}

这样下来的阴影效果是不是看上去舒服些呢?

box-shadow

注:box-shadow的颜色依赖于你的元素背景色,如果你的背景越淡,阴影颜色也就越淡。而且你不能同一个元素添加多个方向的类名,那样后面的就会覆盖前面的,如果你想要给一个元素设置多边阴影效果,你可以创建一个多边的box-shadow。

接下来,我们来看另外四个box-shadow的示例,这里主要想强调的是,制作一黑色或白色外发光,模糊或不模糊的块元素,这些并不太重要,而重要的是元素的背景是什么?比如说(普通颜色、纹理背景、图片背景等),他们会直接影响一个元素的阴影显示效果。

div[class*="emphasize-"] {
  background: #69D2E7;
}
 
.emphasize-dark {
  box-shadow: 0 0 5px 2px rgba(0,0,0,.35)
}
 
.emphasize-light {
  box-shadow: 0 0 0 10px rgba(255,255,255,.25)
}
 
.emphasize-inset {
  box-shadow: inset 0 0 7px 4px rgba(255,255,255,.5)
}
 
.emphasize-border {
  box-shadow: inset 0 0 0 7px rgba(255,255,255,.5)
}

效果如下所示:

box-shadow

最后阴影还有两种重要的效果,内浮雕和外浮雕,下面的示例中,第一个是内浮雕,他是一个轻内浮雕,而且仅适用于一个在顶部有非常小的反光效果,第二个相对来说复杂些,使用多层阴影,并且加重单边效果,这个效果一般运用在按钮的制作中。

div[class*="embossed"] {
  background: #8ec12d;
  color: #333;
  text-shadow: 0 1px 1px rgba(255,255,255,0.9);
}
 
.embossed-light {
  border: 1px solid rgba(0,0,0,0.05);
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.7);
}
 
.embossed-heavy {
  border: 1px solid rgba(0,0,0,0.05);
  box-shadow: 
   inset 0 2px 3px rgba(255,255,255,0.3), 
   inset 0 -2px 3px rgba(0,0,0,0.3),
   0 1px 1px rgba(255,255,255,0.9);
}

box-shadow

这一节并不是想向大家介绍如何使用box-shadow的使用方法,而是从细节之处告诉大家,box-shadow使用要细心,不然容易破坏你的整体设计;其二,元素的阴影颜色跟你元素的背景属性有很大的关联性,可以说元素的背景色或背景图片、纹理之类会直接影响元素的阴影效果;第三,在基本样式中为每一种不同的阴影效果定义了一个不同的类名。至少我从这一节中学到了这么几点,不知道你在这节中收获了什么?

大漠

渐变(Gradients)

有时候,你可能想给一个元素添加渐变,这个想法给你带的好处是,只需要修改背景颜色或图片就能达到渐变的效果:

div[class*="gradient"]{
  background-color: #DEB8A0;
  box-shadow: 0 0 0 1px #a27b62;
}
 
.gradient-light-linear {
  background-image: linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,0));
}
 
.gradient-dark-linear {
  background-image: linear-gradient(rgba(0,0,0,.25), rgba(0,0,0,0));
}

基本上,他就像在Photoshop里的图层一样的简单,从一个透明层到另外一个透明层,这些层都使用在你的一个元素上。上面的线性渐变是比较简单的部分,但径向渐变有时也需要使用到,比如说给元素添加一些光效。其最简单的运用:

.gradient-light-radial {
  background-image: radial-gradient(center 0, circle farthest-corner, rgba(255,255,255,0.4), rgba(255,255,255,0));
}
 
.gradient-dark-radial {
  background-image: radial-gradient(center 0, circle farthest-corner, rgba(0,0,0,0.15), rgba(0,0,0,0));
}

border-radius

渐变真是件复杂的事情,至少我每次写渐变我都要看看他的语法。

圆角(Rounded corners)

圆角是设计中常见的一个效果,以前写一个圆角,我们需要添加很多个浏览器前缀,现在只需要一个border-radius属性,有了他们,我们是不是看到了曙光,制作圆角并不是件非常痛苦的事情。

根据设计,直角可以很漂亮或是很糟糕。不管怎么说,你可以给一组元素添加圆角,甚至是小圆角,所以我为他们创建了一些类名

div[class*="rounded"] {
  background: #fca1cc;
}
 
.light-rounded {
  border-radius: 3px;
}
 
.heavy-rounded {
  border-radius: 8px;
}
 
.full-rounded {
  border-radius: 50%;
}
 
.barrel-rounded {
  border-radius: 20px/60px;
}

gradient

关于圆角,我自己总结了一套像素尺寸的规格:

  1. 0px没用任何圆角效果;
  2. 1~4px,有一个小圆角效果,多数人分辨不出边缘是否有弧度,只是不会有像直角的锋利感觉;
  3. 5~10px,这里圆角不大不小。根据设计,它可以看上去简单,或者说漂亮
  4. >10px,大于10px的圆角是一个大圆角

在你使用圆角属性时,有两个属性值你要记着:

  1. 当你的元素是正方形时,50%的圆角就可以将这个元素变成圆形,如果你的元素是一个长方形,50%的圆角就可以将这个元素变成椭圆形。
  2. 为了实现一个圆角的图标,根据Nina GiorgievaTwitter中的评论所说,最完美的比例是“6.4”。所以如果你有一个宽度100的正方形,并且你想把它变成一个图标,那你应当给他运用16px的圆角。这个值是根据(100/6.4=15.625)计算得来的。

链接(Links)

前面主要对块元素做了改进,接下来我们一起谈谈链接。因为链接随处可见,从导航到外部链接,按钮型的链接等。

在详细谈链接之前,先将链接分成内联链接和块链接两种。内联链接大多是锚点,从网站上当前面跳转到另一个页面,块链接多是用于制作按钮。导航菜单等。

HTML 模板

你也许了解了一些。从这一节我们需要两个不同的环境:一个是内联链接 的例子;另一个是简单的块链接例子。后者我用的是<a>标签,当然你也可以使用“<input>”或是“<button>”标签。

<!-- Inline -->
This is some dummy text to show an <a href="#">inline link</a>.
 
<!-- Block -->
<a href="#">Link</a>

内联链接(inline links)

我尝试尽量保持内联链接默认效果:实实的下划线,鼠标悬浮时改变其颜色。但我试图想要点让你觉得很酷的创意。在内联链接上加了一个背景色,然后悬浮状态改变背景颜色。

.inline-link-1 {
  display: inline-block;
  margin: 0 0.2em;
  padding: 3px;
  background: #97CAF2;
  border-radius: 2px;
  transition: all 0.3s ease-out; 
  /* Font styles */
  text-decoration: none;
  font-weight: bold;
  color: white;
}
 
.inline-link-1:hover {
  background: #53A7EA
}
 
.inline-link-1:active {
  background: #C4E1F8
}
 
.inline-link-1:visited {
  background: #F2BF97
}

inline links

重要的是:不要忘了给内联链接添加访问过的状态“:visited”。因为有些人习惯于在浏览网站时了解自己点过哪些链接,看过哪些内容。这里,我应用了一个旋转了180度的纯色,因为我喜欢让默认的链接与访问过的链接有所不同。

如果你想看一些内联链接的效果,这个例子很不错。但具体用什么样的样式,这还得取决于你的设计:一些人想让链接看起来分散些,而另一些人想链接大的足以触发动作。说到底就看你的选择了。

接下来看一个轻量级的例子,他们更多依赖于默认的链接样式。

.inline-link-2 {
  display: inline-block;
  border-bottom: 2px dashed rgba(0,0,0,0.9);
  /* Font styles */
  text-decoration: none;
  color: #777;
}
 
.inline-link-2:hover {
  border-bottom-style: dotted;
}
 
.inline-link-2:active {
  border-bottom-style: solid;
}
 
.inline-link-2:visited {
  border-bottom: 2px solid #97CAF2;
}

这个想法是把虚线作为默认状态。当你的鼠标滑过链接时,他变成点状,最终当你点击他的时候,他又变成实线。

inline links

最后一种效果在链接前添加一个小三角,这个小三角通过一个伪类来创建。我们可以把他理解为用户离开网站或是什么的一种方式:

.inline-link-3 {
  display: inline-block;
  position: relative;
  padding-left: 6px;
  /* Font styles */
  text-decoration: none;
  color: #6AB3EC;
  text-shadow: 0 1px 1px rgba(255,255,255,0.9);
}
 
.inline-link-3:hover {
  color: #3C9CE7;
}
 
.inline-link-3:before {
  content: "\25BA";
  font-size: 80%;
  display: inline-block;
  padding-right: 3px;
  pointer-events: none;
}
 
.inline-link-3:hover:before {
  color: #F2BF97;
}

inline links

块状链接(block links)

现在,让我们看一下块状链接。多数情况当用户丐你的网站或是应用程序交互是通过按钮进行的。比如说,提交一个评论、进入下一个页面,登录或是更多操作。无论你是使用(<a>、<input>、<button>)中的任何一种元素类型,你都试图想用一些简洁的样式来吸引你的用户。

先来看一个简单的例子,然而,有一些设计可以配合的很完美,比如说Metro的一个UI风格

.metro {
  display: inline-block;
  padding: 10px;
  margin: 10px;
  background: #08C;
  /* Font styles */
  color: white;
  font-weight: bold;
  text-decoration: none;
}
 
.metro:hover {
  background: #0AF
}

Ok,我们来看一些基于相同基础并带有3D效果的。你也许意识到这是CSS的新技术,我们这里在前面的基础上添加一个新的类名

.metro.three-d {
  position: relative;
  box-shadow: 
      1px 1px #53A7EA, 
      2px 2px #53A7EA, 
      3px 3px #53A7EA;
  transition: all 0.1s ease-in;
}
 
.metro.three-d:active {
  box-shadow: none;
  top: 3px;
  left: 3px;
}

看,是不是很炫,尤其是在“active”状态下。

block links

让我们在尝试一些更轻量级的链接效果。下面这个是一个厚边框带阴影的链接效果:

.bordered-link {
  display: inline-block;
  padding: 8px;
  border: 3px solid #FCB326;
  border-radius: 6px;
  box-shadow: 
    0 2px 1px rgba(0, 0, 0, 0.2), 
    inset 0 2px 1px rgba(0, 0, 0, 0.2);
  /* Font styles */
 text-decoration: none;
  font-size: 14px;
  text-transform: uppercase;
  color: #222;
}
 
.bordered-link:hover {
  border-color: #FDD68B
}
 
.bordered-link:active {
  border-color: #FEE8BD
}

block links

让我们创建一些更有吸引力的东东

.modern {
  display: inline-block;
  margin: 10px;
  padding: 8px 15px;
  background: #B8ED01;
  border: 1px solid rgba(0,0,0,0.15);
  border-radius: 4px;
  transition: all 0.3s ease-out;
  box-shadow: 
      inset 0 1px 0 rgba(255,255,255,0.5), 
      0 2px 2px rgba(0,0,0,0.3), 
      0 0 4px 1px rgba(0,0,0,0.2); 
  /* Font styles */
  text-decoration: none;
  text-shadow: 0 1px rgba(255,255,255,0.7);
}
 
.modern:hover {
  background: #C7FE0A
}

通过下面的类名,我们甚至可以添加一些更复杂的阴影效果

.embossed-link {
  box-shadow: 
      inset 0 3px 2px rgba(255,255,255,.22), 
      inset 0 -3px 2px rgba(0,0,0,.17), 
      inset 0 20px 10px rgba(255,255,255,.12), 
      0 0 4px 1px rgba(0,0,0,.1), 
      0 3px 2px rgba(0,0,0,.2);
}
 
.modern.embossed-link {
  box-shadow: 
     inset 0 1px 0 rgba(255,255,255,0.5), 
     0 2px 2px rgba(0,0,0,0.3), 0 0 4px 1px rgba(0,0,0,0.2), 
     inset 0 3px 2px rgba(255,255,255,.22), 
     inset 0 -3px 2px rgba(0,0,0,.15), 
     inset 0 20px 10px rgba(255,255,255,.12), 
     0 0 4px 1px rgba(0,0,0,.1), 0 3px 2px rgba(0,0,0,.2);
}
 
.modern.embossed-link:active {
  box-shadow: 
     inset 0 -2px 1px rgba(255,255,255,0.2), 
     inset 0 3px 2px rgba(0,0,0,0.12);
}

最后,但并非最不重要的,添加一个类名,并在类名使用伪元素,让他看起来更像按钮的背景部分

.socle {
  position: relative;
  z-index: 2;
}
 
.socle:after {
  content: "";
  z-index: -1;
  position: absolute;
  border-radius: 6px;
  box-shadow: 
      inset 0 1px 0 rgba(0,0,0,0.1),
      inset 0 -1px 0 rgba(255,255,255,0.7);
  top: -6px;
  bottom: -6px;
  right: -6px;
  left: -6px;
  background: linear-gradient(rgba(0,0,0,0.1), rgba(0,0,0,0));
}

block links

你可以根据需要修改圆角的值.但对于依赖于圆角的按钮看起来有点别扭。

对于链接来说已经很完美了,现在你可以为你的a标签用属于你自己的类名创建一些基本样式。

输入框(inputs)

在我先前的教程中我忆已经说过,在网络中表单几呼是无处不在,输入框也一样,特别是文本输入框。可悲的是他的默认样式太丑了,但我肯定我们可以做得更好。

HTML结构

<input type="text" placeholder="Input name">

样式

我们先从一些非常简单的开始,添加边框和圆角来替换输入框的默认样式

.simple-input {
  display: block;
  padding: 5px;
  border: 4px solid #F1B720;
  border-radius: 5px;
  color: #333;
  transition: all 0.3s ease-out;
}
 
.simple-input:hover {
  border-radius: 8px
}
 
.simple-input:focus {
  outline: none;
  border-radius: 8px;
  border-color: #EBD292;
}

输入框是一种奇怪的元素,所以我们这里给他设置“display:block”,使得事情变得简单些,并且添加一个“padding”来给内容留出一些空间。

inputs

你有没有想过复制一个IOS的输入框效果呢?

.mac {
  display: block;
  border: none;
  border-radius: 20px;
  padding: 5px 8px;
  color: #333;
  box-shadow: 
      inset 0 2px 0 rgba(0,0,0,.2), 
      0 0 4px rgba(0,0,0,0.1);
}
 
.mac:focus {
  outline: none;
  box-shadow: 
      inset 0 2px 0 rgba(0,0,0,.2), 
      0 0 4px rgba(0,0,0,0.1), 
      0 0 5px 1px #51CBEE;
}

inputs

接下来,我们尝试着制作一个带有渐变背景和内阴影效果的输入框:

.depth {
  display: block;
  border: 1px solid rgba(255,255,255,0.6);
  background: linear-gradient(#eee, #fff);
  transition: all 0.3s ease-out;
  box-shadow: 
      inset 0 1px 4px rgba(0,0,0,0.4);
  padding: 5px;
  color: #555;
}
 
.depth:focus {
  outline: none;
  background-position: 0 -1.7em;
}

inputs

最后一个例子更趋于原始情况。不是一个盒子,仅仅是一条线。你也许会以一个完美的例子做为结束,因为你拥有了一个很棒的表单效果

.line {
  display: block;
  border: none;
  color: #333;
  background: transparent;
  border-bottom: 1px dotted black;
  padding: 5px 2px 0 2px;
}
 
.line:focus {
  outline: none;
  border-color: #51CBEE;
}

inputs

结束语

脱离设计的环境一切都是浮云,但是有了这些预设的类名,你在创建网站或应用程序时节省很多时间,尤其是当你不是一个css忍者。

主要的思想是在你的样式表中有这些类名(或是如果你在一个特别的文件里有预处理程序)当你创建你的标签时只需要简单的调用他们。或是你需要一些样式,只需要拷贝他们就行

最后我鼓励你创建自己的类名,适合自己的品味和需要。花一些时间构建某种类型的ui工具,他将在你的设计过程中确实节省你一些时间,你将会感激你自己的,相信我

感谢你阅读本教程,和往常一样,如果你有任何疑问或是想要展示你自己的类名,请与我联系。

demodownload

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

如需转载烦请注明出处:

英文原文:http://tympanus.net/codrops/2012/10/23/basic-ready-to-use-css-styles

中文译文:http://www.w3cplus.com/css/basic-ready-to-use-css-styles.html


学习提高你CSS技术的法则

$
0
0

本文由99根据的《LEARNING PRINCIPLES FOR IMPROVING YOUR CSS》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://tympanus.net/codrops/2012/11/20/learning-principles-for-improving-your-css/,以及作者相关信息

作者:HUGO GIRAUDEL

译者:99

在今天的文章中,我将要聊聊我在一年半的实践中,总结出来的css经验。

首先让我提醒你,css是极其简单的一门语言,简单到可以用三个词概括:选择器,属性以及属性的值。这也是一些人不喜欢css的原因:他们觉得写css像孩子玩乐高玩具一样简单。

是这样的。。如果你给一个9岁的孩子介绍css的基本原理,他就会搭建一个网站。不过这个网站不会很复杂,也就是一些包含头部,链接,内容图片的页面而已。

事实上,css是一门简单的语言,并不意味着每个人的水平一样。有些人写起css来就跟个大猩猩在玩棍子,有些人可以掌握css,而有些人可以使用魔法般的使用css。

不管怎样,我还是要给你分享一些我这几个月来理解的东西,这并不是一些代码片段或者是css小技巧,而更像是一些通用的规则或者是最佳实践之类的东西,如下:

  1. 不要让你的代码脱离你的掌控,尽量简洁
  2. 掌握基础,学习CSS技巧
  3. 保持代码的可复用性
  4. 面向对象的css
  5. Css3 了解他能做的以及你可以使用的部分
  6. 渐进增强与优雅降级
  7. Css预处理工具
  8. 与时俱进
  9. 取长补短
  10. 熟能生巧

你想说什么呢?你准备好了?那我们继续往下吧。

1.不要让你的代码脱离你的掌控,尽量简洁

别让你的代码脱离你的掌控

这是编程的一种通用建议,不仅仅适合css. 当你开始写代码的时候,先思考,思考以下几个问题:

  1. 我怎样实现?
  2. 有其他方法实现么?
  3. 怎样优化(简洁,可维护,等等)?

急于编码会浪费时间,你有可能花了一个小时也没实现,不得不从头再来,这不应该发生。

如果你花了好几个小时写一个css幻灯片,最终没办法用了个js幻灯片插件或者别的,这是很蛋疼的,并不是说你没成功,而是无谓的浪费了很多时间。如果项目有deadline的话,你就要悲剧了。

保持他的简单性

Css很简单,但如果你想,同样可以变得很复杂。在很多场景里,最简单的即是最好的。当你要实现什么效果的时候,问问自己:还有更简单的方法实现么? 答案经常是肯定的。

举个例子,简单水平导航栏,你可以有多种方法实现:

  1. 列表元素浮动;
  2. 改变列表元素display属性为inline;
  3. 改变列表元素display属性为inline-block。

最简单的-设置display:inline,不需要清除浮动,不需要清除inline-block造成的空白,只需要一些padding即可,结束。

2. 掌握基础,学习CSS技巧

不仅是掌握css,掌握任何东西都要从基础做起。一个对最基本的东西都理解不透彻的人是不可能成为大师的。

CSS基础

什么是css基础呢?你可能会听到不同的声音,这也是一种无法用言语表达的东西。但我认为,css的基础是以下两部分:

  1. 盒模型:每个元素在css中都是一个盒子模型(块级或者内联),包含宽高及各种padding margin border.这是最重要的,详细可以阅读这里
  2. 权重:了解哪个属性权重最高,在调试css中非常重要。更多相关信息可以阅读Assigning property values, Cascading, and Inheritance一文。

CSS技巧

当你了解了以上原理,才算踏上了康庄大道。那么现在你可能会处理一些特殊情况,下面展示了一些:

忘了在父元素设置position

.child {
  position: absolute;
  top: 0;
  left: 0;
}
 
/* 这是忘了的*/
/*
.parent {
  position: relative; // Or anything else than static
}
*/

这时候你会想:坑爹啊,怎么东西跑到页面左上角了???你忘了给父元素设置 position:absolute或relative了。。

添加下下层技巧

.parent {
  z-index: 1;
  opacity: 0.5;
  transform: rotate(5deg);
}
 
.child {
  z-index: -1;
}

每个搞前端的都被层叠上下文折磨过。这个例子告诉我们,你不能对一个已经触发层叠上下文的元素(可能是z-index,transform或者是透明度)的子元素来应用z-index属性。 这没有变通方案,一旦你遇到过,绝对会记忆犹新。。

忘了清除浮动的技巧

你的布局乱套了,容器乱飞。你泪流满面:这是肿摸了。。请检查下浮动,可能忘了清除浮动了。

记住,一个容器如果仅仅包含浮动元素,他会塌陷,除非你清除浮动或者设置height或者overflow属性。

这种例子比比皆是,如果继续写那就没完没了了,这不是我这篇文章的目的。

我只是想指出 每天,人们都会不断的发现,css有很多的特性跟特殊情况。 你可能这一次踩个坑,下次就知道怎么对付了。

3. 保持代码的可复用性

Dry代表 不要重复自己。这并不是css特有的,这适合任何语言。

它的核心思想是,能重用的代码就不要写第n遍。在别的语言意味着封装成function,在css里,常常代表你需要利用一个可复用的类来代替重复应用的一个属性。这将在后面的面向对象css中进一步讲解。其实对于重构来说这是很简单的,我来解释一下:

当你在你的样式表里发现一段代码多次使用的时候,你需要重构一下,最终变成只出现一次(可复用)。例子:

.navigation li {
  color: #333;
}
 
.navigation li a {
  color: #333;
}
 
/* Refactoring */
 
.navigation li,
.navigation li a {
  color: #333;
}

明白么?你肯定会纳闷,这俩有啥区别啊?有两点需要考虑: 性能跟可维护性。

关于性能: 更少的行数意味着浏览器解析css会更快。按照下面这样写,浏览器会同时给两个选择器应用颜色,而不会解析两次。

关于可维护性,如果你需要修改类似的颜色,这样只需要修改一行,这里可能仅仅是两行,如果50行,100行呢。

扩展阅读

  1. DRY CSS, don’t repeat your CSS
  2. DRY CSS: a don’t-repeat-yourself methodology for creating efficient, unified and scalable style sheets

4. 面向对象的css

这是什么东东?

Oocss意思是面向对象的css,经常在其他面向对象的语言中出现这个名词。意思是利用一个“对象”,通常为一个类的实例(包含一些属性和方法)。你可能会问:这跟css有啥关系啊。

首先我要说明,oocss更像一个概念,css是不能真的“面向对象编程”的,因为没有命名空间,函数,方法,类,条件语句等。因此你要是谈oocss可能会被人嘲讽。

事实上我也是这么认为的,但我们可以利用这样的思想来促进css的书写,让网站性能提升,提高可维护性。

我们应该怎么做?

很简单,使用类名,各种类名。可以把你的网站想象成一个带有很多“方法”跟“组件”的地方,尝试找出这些重复的部分,把他们作为“对象”(类名),从而重用。

为了让你的对象划分的更精确,有两点需要注意:

  1. 分离结构与表现
  2. 分离容器与内容

单独的结构和样式

分离结构与表现是很重要的,这样你就可以单独操作负责显示的部分,让这部分在网站中多次出现,并且作用于不同的元素上。看看下面的代码,它可以作用到一个盒子,一个图片,或者一个按钮上:

#my-button,
.my-box
.my-box img {
  border: 1px solid #444;
  border-radius: 5px;
  box-shadow: 0 0 5px rgba(0,0,0,0.1);
}

另外我们可以用一个叫做.skin的类名代替,然后应用到所要使用的元素上

.skin {
  border: 1px solid #444;
  border-radius: 5px;
  box-shadow: 0 0 5px rgba(0,0,0,0.1);
}

这样使用,会让css样式表更加容易让人理解,更容易维护,解析更快。

单独的容器(结构)和内容

我认为这是oocss最重要的一点:每种组件拥有独立的代码,而不是在你某次写页面时配合页面的特定部分来定义。在你的站点中,类似的组件应该重用,就像下面代码一样:

#main h2 {
  color: #343434;
  font-size: 25px;
  line-height: 20px;
  border-bottom: 1px solid rgba(0,0,0,0.2);
  box-shadow: 0 1px rgba(255,255,255,0.4);
}

这时候不管是我从页面底部再次使用h2,或者我用同样的思想使用h3,都可以类似上面所写的,创建一个类,并给类设置样式,而不是给元素单独设置样式。

关于从不使用ID的一说?

当Nicole Sullivan提出oocss的概念时,最热烈的讨论是“绝对不使用id选择器么?” Nicholas C. Zakas 与 Nicole Sullivan在他们的csslint(css质量检查工具)中特别反对对id选择器的使用。

为了理解nicole的观点,我们必须认识到id选择器因为高权重会在使用中出现一些问题。如下代码(代码来自于这里):

<!-- HTML -->
<div id="header">
<p>
<a href="#">Foo</a>
<a href="#">Bar</a>
</p>
<div class="tweet">
<a href="#">Follow me on twitter</a>
</div>
</div>
<div class="tweet">
    <a href="#">Follow me on twitter</a>
</div>
/* CSS */
#header a { color: #f90;  }
.tweet     a { color: #000; }

如果让第一个twitter的链接变黑,你有两种选择:给一个id,或者利用!important选择器来机枪打蚊子。如果header是一个类名,就不会有这种问题了。

这也是Nicole Sullivan为什么讲“no ID”的原因。

我引用 harry roberts对此话题的一个讨论来作为这节结束

[...] I have decided that a blanket ban is sensible. Save yourself many potential headaches and never use IDs in your CSS files.

当然原则上id是可以使用的,而且很易生效

我对OOCSS的理解

事实上我并不熟悉oocss。因为我并不在一个拥有很多前端的的大型网站工作。Oocss对大型网站架构很有用,但不适合单页面作战。

然而虽然我并未应用oocss,但我关注前端工作中的组件重用,样式表的可维护性以及性能。这也是oocss所注重的,所以在某些方面,我的工作跟oocss并没有太大区别。

扩展阅读

  1. An introduction to OOCSS
  2. Object Oriented CSS
  3. OOCSS.org
  4. Don’t use IDs in CSS selectors?
  5. OOCSS——概念篇
  6. OOCSS——核心篇

5. Css3:了解他能做的以及你可以使用的部分

现在我们打住概念性的讨论,来点干货:css3,虽然这玩意至今没有个确切的定义。

Unlike CSS 2, which is a large single specification defining various features, CSS 3 is divided into several separate documents called “modules”. Each module adds new capabilities or extends features defined in CSS 2, over preserving backward compatibility. [...] Due to the modularization, different modules have different stability and statuses.

From Cascading Style Sheets on Wikipedia

现在我们来讨论下那些已经被现代浏览器实现的一些特性。

当前,从圆角到渐变,从透明到阴影,伪类,随处可见css3。

学习你能做些什么?

我觉得,通过利用css3,你可以减少http请求(图片请求),减少标签数量,减少js的代码量。让我们展开来说:

  1. 圆角,一行代码代替了用四张小图片拼四个圆角;
  2. 透明度与alpha通道的支持: 一行代码代替了一张半透明png;
  3. 更先进的选择器:不需要js来写了;
  4. Flexbox:几行代码代替了一整个布局框架;
  5. 渐变:几行代码代替了背景平铺的图片;
  6. 多背景:不需要多个容器了;
  7. 伪类:装饰性的元素不需要额外的标签去定义了。

我可以继续讲下去,但是我相信你已经明白了我的意思:知晓你到底可以用css3来做什么。你需要做一个目录么?你可以用纯css来实现,配合CSS counters,你需要做一个漂亮的自定义边框么?你可以利用border-image属性来实现。

ss能做无数的事情,css3也一样。你需要了解css力所能及跟力所不能及的。但深入这些,没有什么捷径,只能通过不断的阅读文档,自我探索。比如,你可以用calc()属性来计算,但如果要搞六列的等高布局,你肯定会杯具。

学习你能用什么?

css最大的问题是浏览器兼容性。在css3里这种情况变得更加糟糕。当你不断试验css3属性时,这将是你萦绕不去的梦魇。

比如最耳熟能详的css3属性:border-radius,杯具的是ie8以下,跟opera mini浏览器仍然不认识这玩意。事实上chrome跟FF对圆角的渲染也不一致。

这对一名前端来说意味着啥呢?优雅降级。如果你做圆角,除了border-radius,你仍然需要利用多图片来拼圆角,努力让各大浏览器保持一致。

当我要使用css时这是我通常的思考步骤:

  1. 我要用这css干嘛?
  2. 我明白我要干嘛了,这是css2规范里的么?
    1. 必须的,结束。
    2. 不行,跳到第三步
  3. 这玩意兼容性怎么样啊
    1. 很好的兼容啊,结束
    2. 兼容性很一般,跳到第四步
  4. 这是锦上添花还是需求啊?
    1. 这是锦上添花,那么低端浏览器我就只能优雅降级了。
    2. 这是需求啊!跳到第五步
  5. 我怎么在不兼容的浏览器里对付这个需求呢?

现在以渐变为例:

  1. 这里要用渐变?
  2. 用吧。。css2里有渐变?
    1. 渐变是css3的好吧。
  3. 兼容性呢?
    1. 还好吧,一般化,ie8以下跟operamini不支持css3渐变(这里明显有误了)
  4. 这是锦上添花还是需求啊?
    1. 这只是一种更炫的手段,不是重点。不支持的我就用个单色代替吧。
    2. 需求要求这里就是用渐变啊!我得找兼容了。
  5. 我要如何让它不支持的浏览器上工作
    1. 用背景图片吧。

如果你用css的时候思考这些步骤,就有思路来处理浏览器兼容性跟优雅降级之类的了。

注意!一定要注意你产品的用户!如果你要做移动端app或者移动设备,你可以使劲用css3属性,不用担心。但如果你做个银行系统。。抱歉了,大部分用户都是ie8以下的

Providing fallbacks

根据不同情况,对低端浏览器做兼容可能会很蛋疼,也可能会很烦人。

No fallback or simple fallback

如果有些增强用户体验的特性不被支持,不会带来什么后果的话,你就不用强制兼容了,这太爽了。

也有一些情况兼容起来也比较简单。

总之你需要写两份属性来实现这个效果,作用于老版本浏览器的跟现代浏览器版的。

.my-element {
  border: 1px solid #666;
  border: 1px solid rgba(0,0,0,0.3);
  background: #708090;
  background: hsl(210, 13%, 50%);
}

以上的例子中,如果浏览器不识别rgba跟hsl颜色,他会读第一行跟第三行作为降级。那么现代浏览器就会覆盖这些属性,以新属性来渲染。

Modernizr

现在当我们聊到css3的时候,绝对会提及一个库Modernizr。 他可以对浏览器做html5跟css3的特性检测。听起来可能觉得很庞大,但这个库性能非常的好。

无论如何,有时你必须确切地知道如果浏览器支持一个特定的功能。因为,对我们说,提供另一种优雅降级版本,需要知道他的CSS属性。

/* Normal version */
.dropdown {
  opacity: 0;
  pointer-events: none;
}
 
.trigger:hover .dropdown {
  opacity: 1;
  pointer-events: auto;
}
 
/* Fallback with Modernizr */
 
.no-opacity .dropdown,
.no-pointerevents .dropdown {
  opacity: 1;
  pointer-events: auto;
  display: none;
}
 
.no-opacity .trigger:hover .dropdown,
.no-pointerevents .trigger:hover .dropdown {
  display: block;
}

如果你要提供一个降级方案的话,需要依赖modernizr提供的两个类(.no-opacity 跟.no-pointerevents)但不能同时触发两个。在使用新技术的时候,一定要记得优雅降级,这对用户体验很重要,如果不行,一定要告知用户。

扩展阅读

  1. CSS current work with table of specifications
  2. WebPlatform.org
  3. Modernizr for feature detection
  4. CanIUse for the browser support

6. 渐进增强与优雅降级

这两个概念大家肯定耳熟能详了,尤其是优雅降级。其实两者还是有点区别的。

渐进增强

渐进增强,你需要制定一个基本的需求和功能,然后根据浏览器支持度,增强用户体验。你在使用的时候,需要用一些html5属性来提醒某些部分缺失(比如在某某浏览器下可以获得最佳体验)。这是一种根据浏览器引擎增强用户体验的方式。

优雅降级

当你谈到优雅降级的时候,通常是给低端浏览器提供一个不支持特性的替代方案。他的形式通常是从高级到低级讨论的。比如说你需要在canvas标签里面注明,这样当浏览器不支持canvas的时候用户就会知道了。

<canvas>
This page uses HTML5 Canvas. Please use a recent browser to see this content. To get another browser, go to <a href="http://browsehappy.com/">BrowseHappy</a>
</canvas>

他们有何不同?

事实上没啥区别。有些特性呈现在现代浏览器上,而对此在低端浏览器上则上替代方案。这是一个过程:你可以让网页在现代浏览器中的效果很炫,也得顾忌ie,或者置之不理,这完全取决于你。事实上我想说:不同浏览器的用户体验绝对是不同的,即使你需要提供一些基本功能,也请记得利用新特性增强一下你的浏览器或者应用,这是非常好的。

扩展阅读

  1. Progressive enhancement and graceful degradation
  2. Understanding progressive enhancement

7. Css预处理工具

Css预处理器大概是本年度热门话题了。。这玩意真的好用么?用来干嘛?我需要用么?用什么样的?这是css圈子里的热门话题了。

在这个环节我将以客观的态度来对待这个问题。首先要明确一点:如果你不想用预处理器,请不要用,然后就不会纠结了。不用预处理器并不代表你不是个好前端,仅仅是你可能无法完成一些事情而已。但对待预处理器这件事上,你仍然需要有自己独立的思考。

接下来,什么是预处理器?事实上预处理器就是把一些语句段编译成别的引擎(比如浏览器)需要的语言。各种语言都有预编译,比如html可以使用markdown或者jade。Less,sass跟stylus都是css的预处理器。Coffeescript是js的预处理器,当然还有php的预处理器:cakephp。

要点是什么?

预处理器赋予了css一些基于面向对象语言的特性,比如

  1. 变量(variables)
  2. 可传参的函数(functions (with parameters))
  3. 命名空间(namespaces)
  4. 嵌套(nesting)
  5. 条件语句(conditional statements)
  6. 操作(operations)
  7. 其他(and many more)

听起来很有吸引力,对吧?也许你想要一个例子来找出发生了什么。让我们看下面的CSS导航栏。

.navigation {
  width: 800px;
  width: calc(100%-150px);
}
.navigation li {
  color: #444;
}
.navigation li a {
  text-decoration: none;
}

看一个Scss处理的版本

$main-color: #444;
 
.navigation {
  width: (100%-150px);
  li {
      color: $main-color;
      a {
          text-decoration: none;
      }
  }
}

预处理器的基本功能就是把这些表达式翻译成css,结果肯定是相同的,而处理逻辑不同。预处理器会自动处理并输出结果,而不需要calc函数的支持。

最终,你得到了一个可读性更强的(包含嵌套与变量),可维护性更强的(包含变量与函数)的样式表。上面的仅仅是举个例子,在真实的项目里你会体会到这一点。

如何选择?

现在市面上已经有一些不同的css预处理器了,他们各有千秋,同时在细微之处也有区别。选择的余地完全在你手里。这里提供几个主要的选择:

  1. Sass (written in Ruby)
  2. LESS (written in JavaScript)
  3. Stylus (written in JavaScript)
  4. Crush (written in PHP)

最好的方式是了解他们是否能最完美的满足你跟你项目的需求。这是由很多因素决定的,如果全部列出来就超出本文的范围了,但你可以找到一些相关的css预处理器的资料。

我对CSS预处理的理解?

我不敢说精通css预处理器,但我非常喜欢。他完善了一些css缺少的非常有用的特性:变量,嵌套以及条件语句。

我之前小玩了一下less,受益匪浅。利用less我完善了以前制作的 CSS Loading Animations,less应用在了循环,自动加前缀以及关键帧上。

我也尝试了sass跟compass。令我震惊的是这玩意安装很简单,在ruby上跑得也很顺畅。所以我觉得Sass + Compass碉堡了。你可以看看我的文章:为啥我抛弃了less选择了sass

不过我还是需要完全手写普通的css,这也占据了我工作的绝大部分。但最终我觉得大家都会用css预处理器。Css缺乏一些很有用的特性,而预处理器正好填补了这方面的空白。

扩展阅读

  1. Sass vs. LESS vs. Stylus
  2. Musing on preprocessing
  3. Deep Dive Into CSS Preprocessors
  4. Guidelines using OOCSS and CSS preprocessors

8. 与时俱进

语言在不断的进化,css是显著典型。Css草案没完没了,浏览器厂商也在不断的实现这些。

因此,你需要与时俱进,始终对新技术保持跟进,虽然一时半会还用不上,但可以了解chrome开发版本是不是支持了?chrome跟safari,ff,opera未来的版本会不会支持呢?你需要在css解决方案及css问题上,不断的开拓自己的眼界。

扩展阅读

  1. Cascading Style Sheets home page
  2. CanIUse.com for browser share and compatibility
  3. Mozilla Developer Network for excellent documentation
  4. HTML5 Rocks for latest, cutting-edge tutorials and articles

9. 取长补短

读源码是学编程最好的方式之一。css是客户端的,你可以用WebKit Inspector, Dragonfly, Firebug F12等工具看css。同时,互联网是很开放的,大家都乐于开源。

另外一种方法是跟着教程一步步地走,然后从头自己写一遍。遇到问题后瞄一眼答案,然后继续。

如果你觉得自己已经熟悉css了,想深入css,你需要写一些demo来测试那些试验性的css属性,或者解决一个问题的不同思路。学无止境。

前阵子Chris Coyier, Tim Sabat 和 Alex Vazquez三位建立了CodePen,他是一个在线分享前端代码的平台,可以自由的添加你需要的库,比如jQuery, jQuery UI, MooTools, YUI, Prototype, Zepto, Dojo, Ext JS, PrefixFree等等。同时也可以使用一些预处理器比如HAML, Markdown, Slim, LESS, SCSS, Sass, CoffeeScript。

学习其他人例子的网站:

  1. CodePen
  2. CSS Deck
  3. Dabblet
  4. TheCodePlayer
  5. CSS3 案例

10. 熟能生巧

实践出真知。所以最好的建议:不断的练习。熟能生巧。并不是让你不停的从头建站。你可以从dribbble上找些图用纯css实现一下。最终你可能不一定会用到,但你学到了,这就足够了。

我之前也说了,掌握基础,了解技巧。Css有很多坑,填坑是csser日常工作的一部分。而坑都是写代码的时候踩出来的,只有踩过了,解决过了,才能提高。

同时我建议你多多分享自己的代码,让大家提提意见,取百家之长方为上。你可以扔到JSFiddle里然后分享到群里,问问大家有没有可以吐槽的。

扩展阅读

本文提到很多链接与资源,全部列入在此,以供大家索引阅读:

  1. Cascading Style Sheets home page
  2. CSS current work with table of specifications
  3. Assigning property values, Cascading, and Inheritance
  4. Cascading Style Sheets on Wikipedia
  5. CSS 2.1: Box Model
  6. WebPlatform.org
  7. Modernizr
  8. CanIUse.com
  9. Z-Index And The CSS Stack: Which Element Displays First? by Steven Bradley
  10. DRY CSS, don’t repeat your CSS by Steven Bradley
  11. DRY CSS: a don’t-repeat-yourself methodology for creating efficient, unified and scalable style sheets by Jeremy Clarke
  12. Progressive enhancement and graceful degradation on DevOpera
  13. Understanding progressive enhancement by Aaron Gustafson
  14. Sass
  15. LESS
  16. Stylus
  17. Crush
  18. Sass vs. LESS vs. Stylus by Johnathan Croom
  19. Musing on preprocessing by Chris Coyier
  20. Deep Dive Into CSS Preprocessors by Johnathan Verrecchia
  21. Guidelines using OOCSS and CSS preprocessors by Chris Webb
  22. Mozilla Developer Network
  23. HTML5 Rocks
  24. CodePen
  25. CSS Deck
  26. Dabblet
  27. TheCodePlayer

非常感谢你阅读此文,希望这篇文章可以真正在你学习使用css的时候帮到你。当然有意见跟建议你也可以提出来~

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

如需转载烦请注明出处:

英文原文:http://tympanus.net/codrops/2012/11/20/learning-principles-for-improving-your-css

中文译文:http://www.w3cplus.com/css/learning-principles-for-improving-your-css.html

23 Box-shadow Effects

$
0
0
23 Box-shadow Effects

Box-shadow效果是CSS3中很实用的属性之一,现在网站大量的阴影效果都是通过这个属性来制作,今天整理了23个盒子阴影效果以供大家参考。当然这个案例中的效果不单单是一些简单的box-shadow效果,在整个案例中,有些效果使用了CSS3的伪类选择器,以及CSS3的transform等属性,制作了一些特殊的box-shadow效果,感兴趣的往下吧。

demodownload

HTML Code

<div class="box box1"><p>Effect 1</p></div>
<div class="box box2"><p>Effect 2</p></div>
<div class="box box3"><p>Effect 3</p></div>
<div class="box box4"><p>Effect 4</p><div class="shBl"></div><div class="shBr"></div></div>
<div class="box box5"><p>Effect 5</p><div class="shBl"></div><div class="shBlFlod"></div></div>
<div class="box box6"><p>Effect 6</p><div class="cornerLf"></div><div class="cornerRt"></div></div>
<div class="box box7"><p>Effect 7</p></div>
<div class="box box8"><p>Effect 8</p></div>
<div class="box box9"><p>Effect 9</p></div>
<div class="box box10"><p>Effect 10</p></div>
<div class="box box11"><p>Effect 11</p><div class="ribbon"></div></div>
<div class="box box12"><p>Effect 12</p><div class="shBl"></div><div class="shBlFlod"></div><div class="ribbon"></div></div>
<div class="box box13"><p>Effect 13</p><div class="cornerLf"></div><div class="cornerRt"></div><div class="ribbon"></div></div>
<div class="box box14"><p>Effect 14</p><div class="ribbon"></div></div>
<div class="box box15"><p>Effect 15</p><div class="ribbon"></div></div>
<div class="box box16"><p>Effect 16</p></div>
<div class="box box17"><p>Effect 17</p></div>
<div class="box box18"><p>Effect 18</p></div>
<div class="box box19"><p>Effect 19</p></div>
<div class="box box20"><p>Effect 20</p></div>
<div class="box box21"><p>Effect 21</p></div>
<div class="box box22"><p>Effect 22</p></div>
<div class="box box23"><p>Effect 23</p></div>

CSS Code

.box {
  width: 300px;
  min-height: 300px;
  margin: 30px;
  display: inline-block;
  background: #fff;
  border: 1px solid #ccc;
  position:relative;
  text-align:center;
}
.box p {
  margin: 30px;
  outline: none;
	font-family: 'Jim Nightshade', cursive;
	font-size:60px;
	font-weight:bold;
	color:rgb(41, 180, 240);
	text-shadow: 0 1px 0 rgba(0,0,0,0.3);
}
/*=========Box1===========*/
.box1{  
  background: -webkit-gradient(linear, 0% 20%, 0% 100%, from(#fff), to(#fff), color-stop(.1,#f3f3f3));
  background: -webkit-linear-gradient(0% 0%, #fff, #f3f3f3 10%, #fff);
  background: -moz-linear-gradient(0% 0%, #fff, #f3f3f3 10%, #fff);
  background: -o-linear-gradient(0% 0%, #fff, #f3f3f3 10%, #fff);
  /*设置Box的阴影效果*/
  box-shadow: 0px 3px 30px rgba(0, 0, 0, 0.1) inset;
  /*制作右下脚折边效果*/
  border-radius: 0 0 6px 0 / 0 0 50px 0;
}
/*使用:before来制作底部阴影,并对阴影进行旋转的扭曲和位移设置*/
.box1:before{
  content: '';
  width: 50px;
  height: 100px;
  position:absolute;
  bottom:0; right:0;
  box-shadow: 20px 20px 15px rgba(0, 0, 0, 0.1);
  z-index:-1;
  -webkit-transform: translate(-35px,-40px)    skew(0deg,30deg) rotate(-25deg);
  -moz-transform: translate(-35px,-40px) skew(0deg,32deg)    rotate(-25deg);
  -o-transform: translate(-35px,-40px) skew(0deg,32deg)    rotate(-25deg);    
  transform: translate(-35px,-40px) skew(0deg,32deg)    rotate(-25deg);    
}
/*使用:after来制作顶部的阴影,并对阴影进行旋转的扭曲和位移设置*/
.box1:after{
  content: '';
  width: 100px;
  height: 100px;
  top:0; left:0;
  position:absolute;
  display: inline-block;
  z-index:-1;
  box-shadow: -10px -10px 15px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg)    translate(20px,25px) skew(20deg);
  -moz-transform: rotate(7deg) translate(20px,25px) skew(20deg);
  -o-transform: rotate(7deg) translate(20px,25px) skew(20deg);    
  transform: rotate(7deg) translate(20px,25px) skew(20deg);      
}
/*==========Box2============*/
.box2{
  padding: 0 0 1px 0;
  background: #f3f3f3;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#f3f3f3), to(#fff), color-stop(.1,#f3f3f3));
  background: -webkit-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -moz-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -o-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  border-top: 1px solid #ccc;
  border-right: 1px solid #ccc;
  border-radius: 0 0 60px 0 / 0 0 60px 0;
  box-shadow: -1px 2px 2px rgba(0, 0, 0, 0.2);  
}
.box2:before{
  content:'';    
  width: 25px;
  height: 20px;
  position: absolute;
  bottom:0;
  right:0;
  border-radius: 0 0 30px 0;
  box-shadow:-2px -2px 5px rgba(0, 0, 0, 0.3);
  -webkit-transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -moz-transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -o-transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
}
/*这里,我们做出的褶皱阴影*/
.box2:after{
  content: '';
  z-index: -1;
  width: 100px;
  height: 100px;
  position:absolute;
  bottom:0;
  right:0;
  background: rgba(0, 0, 0, 0.2);
  display: inline-block;
  box-shadow: 20px 20px 8px rgba()0,0,0,0.2;
  -webkit-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -moz-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -o-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);    
  transform: rotate(0deg) translate(-45px,-20px) skew(20deg);       
}
/*==========Box3=========*/
.box3{
  padding: 5px 0 ;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -moz-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -o-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  border-radius:60px / 5px;
  box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
}
.box3:before{
  content: '';
  width: 50px;
  height: 50px;
  top:0; right:0;
  position:absolute;
  display: inline-block;
  z-index:-1;
  box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  -moz-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  -o-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);    
  transform: rotate(2deg) translate(-14px,20px) skew(-20deg);      
}
.box3:after{
  content: '';
  width: 100px;
  height: 100px;
  top:0; left:0;
  position:absolute;
  z-index:-1;
  display: inline-block;
  box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(20px,25px) skew(20deg);
  -moz-transform: rotate(2deg) translate(20px,25px) skew(20deg);    
  -o-transform: rotate(2deg) translate(20px,25px) skew(20deg);    
  transform: rotate(2deg) translate(20px,25px) skew(20deg);  
}
/*============Box4==============*/
.box4{
  padding: 5px 0 ;
  background: #fff;
  background: -webkit-gradient(linear, 0% 20%, 0% 100%, from(#fff), to(#fff), color-stop(.2, #f2f2f2));
  background: -webkit-linear-gradient(0% 0% 360deg, #fff, #f2f2f2 20%, #fff );
  background: -moz-linear-gradient(0% 0% 360deg, #fff, #f2f2f2 20%, #fff );
  background: -o-linear-gradient(0% 0% 360deg, #fff, #f2f2f2 20%, #fff );
  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
}
.box4:before{
  content: '';
  width: 50px;
  height: 50px;
  top:0; right:0;
  position:absolute;
  z-index: -1;
  box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  -moz-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);    
  -o-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
}
.box4:after{
  content: '';
  width: 50px;
  height: 50px;
  top:0; left:0;
  position:absolute;
  z-index:-1;
  display: inline-block;
  box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(12px,25px) skew(20deg);
  -moz-transform: rotate(2deg) translate(12px,25px) skew(20deg);    
  -o-transform: rotate(2deg) translate(12px,25px) skew(20deg);
  transform: rotate(2deg) translate(12px,25px) skew(20deg);
}
/*盒子右下角阴影效果*/
.box4 .shBr{
  width: 100px;
  height: 100px;
  bottom:0; right:0;
  position:absolute;
  z-index: -1;
  box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(0deg) translate(-20px,-15px) skew(20deg);
  -moz-transform: rotate(0deg) translate(-20px,-15px) skew(20deg);
  -o-transform: rotate(0deg) translate(-20px,-15px) skew(20deg);    
  transform: rotate(0deg) translate(-20px,-15px) skew(20deg); 
}
/*盒子左下角阴影效果*/
.box4 .shBl{
  width: 100px;
  height: 100px;
  bottom:0; left:0;
  position:absolute;
  z-index: -1;
  box-shadow: -10px 10px 10px rgba(0, 0, 0, 0.2);
 -webkit-transform: rotate(0deg) translate(20px,-15px) skew(-20deg);
  -moz-transform: rotate(0deg) translate(20px,-15px) skew(-20deg);
  -o-transform: rotate(0deg) translate(20px,-15px) skew(-20deg);
  transform: rotate(0deg) translate(20px,-15px) skew(-20deg);     
}
/*==========Box5==========*/
.box5{
  padding: 0 0 1px 0;
  background: #f3f3f3;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#f3f3f3), to(#fff), color-stop(.1,#f3f3f3));
  background: -webkit-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -o-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -moz-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  border-top: 1px solid #ccc;
  border-right: 1px solid #ccc;
  border-radius: 0 0 60px 60px / 0 0 60px 60px;
  box-shadow: -1px 2px 2px rgba(0, 0, 0, 0.2);
}
/*右折效果*/
.box5:before{
  content:'';    
  width: 25px;
  height: 20px;
  background: white;
  position: absolute;
  bottom:0; right:0;
  background: -webkit-gradient(linear, 0% 20%, 50% 40%, from(#fff), to( #eee), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 50% 90deg, #fff, #fff 10%, #eee);
  background: -moz-linear-gradient(0 50% 90deg, #fff, #fff 10%, #eee);
  background: -o-linear-gradient(0 50% 90deg, #fff, #fff 10%, #eee);
  border-radius: 0 0 30px 0;
  box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.3);
  -webkit-transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -moz-transform: rotate(-20deg) skew(-40deg,-3deg)translate(-13px,-13px);
  -o-transform: rotate(-20deg)skew(-40deg,-3deg) translate(-13px,-13px);    
  transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
}
/*右折的阴影*/
.box5:after{
  content: '';
  z-index: -10;
  width: 100px;
  height: 100px;
  position:absolute;
  bottom:0;
  right:0;
 background: rgba(0, 0, 0, 0.2);
  display: inline-block;
  box-shadow: 20px 20px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -moz-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -o-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  transform: rotate(0deg) translate(-45px,-20px) skew(20deg);      
}
/*左下角折角*/
.box5 .shBlFlod{
  z-index: -10;
  width: 50px;
  height: 50px;
  position:absolute;
  bottom:0; left:0;
  box-shadow: -20px 20px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(0deg) translate(40px,-20px) skew(-20deg);
  -moz-transform: rotate(0deg) translate(40px,-20px) skew(-20deg);
  -o-transform: rotate(0deg) translate(40px,-20px) skew(-20deg);
  transform: rotate(0deg) translate(40px,-20px) skew(-20deg);
}
/*左下角阴影*/
.box5 .shBl{
  content:'';    
  width: 25px;
  height: 20px;
  background: white;
  position: absolute;
  bottom:0; left:0;
  background: #fff;
  background: -webkit-gradient(linear, 0% 20%, 50% 80%, from(#fff), to( #eee), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  background: -moz-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  background: -o-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  border-border-radius:0 0 30px 0;
  box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.3);
  -webkit-transform: rotate(103deg) skew(-3deg,-40deg) translate(-13px,-15px);
  -moz-transform: rotate(103deg) skew(-3deg,-40deg) translate(-13px,-15px);    
  -o-transform: rotate(103deg) skew(-3deg,-40deg) translate(-13px,-15px);
  transform: rotate(103deg) skew(-3deg,-40deg) translate(-13px,-15px);    
}
/*=========Box6========*/
.box6{
  padding: 0 0 1px 0;
  background:#fff;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 0 270deg, #fff, #fff 10%, #f3f3f3);
  background: -moz-linear-gradient(0 0 270deg, #fff, #fff 10%, #f3f3f3);
  background: -o-linear-gradient(0 0 270deg, #fff, #fff 10%, #f3f3f3);
  border-top: 1px solid #ccc;
  border-right: 1px solid #ccc;
  border-left: 1px solid #ccc;
  border-radius: 60px 60px 60px 0 / 5px 5px 60px 0;
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.3) ;
}
.box6:before{
  content:'';    
  width: 25px;
  height: 20px;
  position: absolute;
  bottom:0;
  right:0;
  border-radius: 0 0 30px 0;
  box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.3);
  -webkit-transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -moz-transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);    
  -o-transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);    
  transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);    
}
.box6:after{
  content: '';
  z-index: -10;
  width: 100px;
  height: 100px;
  position:absolute;
  bottom:0;
  right:0;
  background: rgba(0, 0, 0, 0.2);
  display: inline-block;
  box-shadow: 20px 20px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -moz-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -o-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  transform: rotate(0deg) translate(-45px,-20px) skew(20deg);    
}
.box6 .cornerLf{
  width: 100px;
  height: 100px;
  top:0; left:0;
  position:absolute;
  z-index:-6;
  display: inline-block;
  box-shadow: -10px -10px 20px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(20px,25px) skew(20deg);
  -moz-transform: rotate(2deg) translate(20px,20px) skew(20deg);
  -o-transform: rotate(2deg) translate(20px,20px) skew(20deg);
  transform: rotate(2deg) translate(20px,20px) skew(20deg);    
}
.box6 .cornerRt{
  content: '';
  width: 50px;
  height: 50px;
  top:0; right:0;
  position:absolute;
  display: inline-block;
  z-index:-6;
  box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  -moz-transform: rotate(2deg) translate(-14px,15px) skew(-20deg);
  -o-transform: rotate(2deg) translate(-14px,15px) skew(-20deg);
  transform: rotate(2deg) translate(-14px,15px) skew(-20deg);    
}
/*==========Box7=========*/
.box7{
  padding: 0 0 1px 0;
  background: #fff;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 0 270deg, #fff, #fff 10%, #f3f3f3);
  background: -o-linear-gradient(0 0 270deg, #fff, #fff 10%, #f3f3f3);
  background: -moz-linear-gradient(0 0 270deg, #fff, #fff 10%, #f3f3f3);
  border-top: 1px solid #ccc;
  border-right: 1px solid #ccc;
  border-left: 1px solid #ccc;
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2);
}
.box7:before{
  content: '';
  position:absolute;
  width: 130px;
  height: 30px;
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  background: rgba(0, 0, 0, 0.1);
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -webkit-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -o-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -moz-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2);
  -webkit-transform:translate(-50px,10px) skew(10deg,10deg) rotate(-50deg);
  -moz-transform:translate(-50px,10px) skew(10deg,10deg) rotate(-50deg);    
  -o-transform:translate(-50px,10px) skew(10deg,10deg) rotate(-50deg);    
  transform:translate(-50px,10px) skew(10deg,10deg) rotate(-50deg);    
}
.box7:after{
  content: '';
  position:absolute;
  right:0;
  bottom:0;
  width: 130px;
  height: 30px;
  background: rgba(0, 0, 0, 0.1);
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -webkit-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -o-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -moz-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2);
  -webkit-transform: translate(50px,-20px) skew(10deg,10deg) rotate(-50deg);
  -moz-transform: translate(50px,-20px) skew(10deg,10deg) rotate(-50deg);
  -o-transform: translate(50px,-20px) skew(10deg,10deg) rotate(-50deg);
  transform: translate(50px,-20px) skew(10deg,10deg) rotate(-50deg)
}
/*==========Box8=========*/
.box8{
  border: 2px solid #ccc;
  background: rgba(0, 0, 0, 0.5);
  box-shadow: 0px 1px 12px rgba(0, 0, 0, 0.1);
}
.box8:before{
  content: '';
  width: 110%;
  left: 0; 
  height: 110%;
  z-index:-1;
  position:absolute;
  border: 1px solid #ccc;
  background: #f3f3f3;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#f3f3f3), to(#fff), color-stop(.1,#f3f3f3));
  background: -webkit-linear-gradient(0 0 90deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -o-linear-gradient(0 0 90deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -moz-linear-gradient(0 0 90deg, #f3f3f3, #f3f3f3 10%, #fff);
  box-shadow: 0px 0px 12px rgba(0,0,0,0.1);
  -webkit-transform: translate(-5%,-5%);
  -moz-transform: translate(-5%, -5%);
  -o-transform: translate(-5%, -5%);
  transform: translate(-5%, -5%);
}
.box8:after{
  content: '';
  width: 100%;
  left: 0; 
  height: 55%;
  z-index:-2;
  background: none;
  position:absolute;
  border-radius: 20px;
  box-shadow: 15px 0px 30px rgba(0, 0, 0, 0.2);
  -webkit-transform: translate(0,0);
  -moz-transform: translate(0,0);
  -o-transform: translate(0,0);
  transform: translate(0,0);
}
/*=========Box9=======*/
.box9{
  border: 1px solid rgba(0,0,0,0.1);
  border-radius:20px;
  background: white;
  box-shadow:0px 0px 5px rgba(0,0,0,0.3);
}
 /*底部的透明框效果*/
.box9:before{
  content: '';
  width: 110%;
  left: 0; 
  height: 111%;
  z-index:-1;
  position:absolute;
  border-radius:20px;
  border: 1px solid rgba(0,0,0, 0.1);
  background: rgba(0, 0, 0, 0.0);
  box-shadow: 0px 0px 5px rgba(0,0,0,0.2);
  -webkit-transform:     translate(-5%,-5%);
  -moz-transform: translate(-5%, -5%);
  -o-transform: translate(-5%, -5%);
  transform: translate(-5%, -5%);
}
/*这是框的顶部部分的粘带效果*/
.box9:after{
  content: '';
  position:absolute;
  top:-25px; left: 30%;
  width: 130px;
  height: 40px;
  background: rgba(0, 0, 0, 0.1);
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -webkit-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -o-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -moz-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  box-shadow: 0px 0px 12px rgba(0,0,0,0.2);
}
/*=========Box10=====*/
.box10{
  padding: 0 0 1px 0;
  background: #fff;
  background: -webkit-gradient(linear, 100% 100%, 50% 10%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
  background: -webkit-linear-gradient(100% 50%, #fff, #fff 10%, #f3f3f3);
  background: -o-linear-gradient(100% 50%, #fff, #fff 10%, #f3f3f3);
  background: -moz-linear-gradient(100% 50%, #fff, #fff 10%, #f3f3f3);
  border: 1px solid #ccc;
  box-shadow: 1px 1px 4px rgba(0,0,0, 0.1);
  border-radius: 0 0 60px 0 / 0 0 5px 0;
}
.box10:before{
  content: '';
  width: 98%;
  z-index:-1;
  height: 100%;
  padding: 0 0 1px 0;
  position: absolute;
  bottom:0; right:0;
  background: #fff;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f9f9f9), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 0 270deg, #fff, #fff 10%, #f9f9f9);
  background: -o-linear-gradient(0 0 270deg, #fff, #fff 10%, #f9f9f9);
  background: -moz-linear-gradient(0 0 270deg, #fff, #fff 10%, #f9f9f9);
  border: 1px solid #ccc;
   box-shadow: 1px 1px 8px rgba(0,0,0,0.1);
  border-radius: 0 0 60px 0 / 0 0 5px 0;
  -webkit-transform: skew(2deg,2deg) translate(3px,8px);
  -moz-transform: skew(2deg,2deg) translate(3px,8px);
  -o-transform: skew(2deg,2deg) translate(3px,8px);
  transform: skew(2deg,2deg) translate(3px,8px);    
}
.box10:after{
  content: '';
  width: 98%;
  z-index:-1;
  height: 98%;
  padding: 0 0 1px 0;
  position: absolute;
  bottom:0; right:0;
  background: #fff;
  background: -webkit-gradient(linear, 0% 20%, 0% 100%, from(#f3f3f3), to(#f6f6f6), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 0 360deg, #f3f3f3, #fff 10%, #f6f6f6);
  background: -o-linear-gradient(0 0 360deg, #f3f3f3, #fff 10%, #f6f6f6);
  background: -moz-linear-gradient(0 0 360deg, #f3f3f3, #fff 10%, #f6f6f6);
  border: 1px solid #ccc;
  box-shadow: 0px 0px 8px rgba(0,0,0, 0.1);
  -webkit-transform: skew(2deg,2deg) translate(-1px,2px);
  -moz-transform: skew(2deg,2deg) translate(-1px,2px)    ;
  -o-transform: skew(2deg,2deg) translate(-1px,2px)    ;
  transform: skew(2deg,2deg) translate(-1px,2px)    ;
}
/*==========Box11========*/
.box11{
  padding: 0 0 1px 0;
  background: #f3f3f3;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#f3f3f3), to(#fff), color-stop(.1,#f3f3f3));
  background: -webkit-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -o-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -moz-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  border-top: 1px solid white;
  border-right: 1px solid #ccc;
  border-radius: 0 0 60px 0;
  box-shadow: -1px 2px 2px rgba(0,0,0,0.2);
}
.box11:before{
  content:'';    
  width: 25px;
  height: 20px;
  background: white;
  position: absolute;
  bottom:0; right:0;
  background:#fff;
  background: -webkit-gradient(linear, 0% 20%, 50% 40%, from(#fff), to( #eee), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  background: -o-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  background: -moz-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  border-radius: 0 0 30px 0;
  box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.3);
  -webkit-transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -moz-transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -o-transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
}
.box11:after{
  content: '';
  z-index: -1;
  width: 100px;
  height: 100px;
  position:absolute;
  bottom:0;
  right:0;
  background: rgba(0, 0, 0, 0.2);
  display: inline-block;
  box-shadow: 20px 20px 17px rgba(0,0,0,0.2);
  -webkit-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -moz-transform: rotate(0deg) translate(-40px,-17px) skew(20deg);
  -o-transform: rotate(0deg) translate(-40px,-17px) skew(20deg);
  transform: rotate(0deg) translate(-40px,-17px) skew(20deg);    
}
.box11 .ribbon{
  position:absolute;
  top:-25px; left: 30%;
  width: 130px;
  height: 40px;
  background:#ccc;
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -webkit-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -o-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -moz-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2);
}
/*========Box 12========*/
.box12{
  padding: 0 0 1px 0;
  background:#f3f3f3;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#f3f3f3), to(#fff), color-stop(.1,#f3f3f3));
  background: -webkit-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -o-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  background: -moz-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
  border-top: 1px solid #ccc;
  border-right: 1px solid #ccc;
  border-radius: 0  0 60px 60px;
  box-shadow: -1px 2px 2px rgba(0, 0, 0, 0.2);
}
.box12:before{
  content:'';    
  width: 25px;
  height: 20px;
  background: white;
  position: absolute;
  bottom:0; right:0;
  background: -webkit-gradient(linear, 0% 20%, 50% 40%, from(#fff), to( #eee), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  background: -o-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  background: -moz-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  border-radius: 0 0 30px 0;    
  box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.3);
  -webkit-transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -moz-transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);    
  -o-transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
}
.box12:after{
  content: '';
  z-index: -10;
  width: 100px;
  height: 100px;
  position:absolute;
  bottom:0;
  right:0;
  background: rgba(0, 0, 0, 0.2);
  display: inline-block;
  box-shadow: 20px 20px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -moz-transform: rotate(0deg) translate(-40px,-17px) skew(20deg);
  -o-transform: rotate(0deg) translate(-40px,-17px) skew(20deg);    
  transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
}
.box12 .shBlFlod{
  z-index: -10;
  width: 50px;
  height: 50px;
  position:absolute;
  bottom:0; left:0;
  box-shadow: -20px 20px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(0deg) translate(40px,-20px) skew(-20deg);
  -moz-transform: rotate(0deg) translate(40px,-17px) skew(-20deg);
  -o-transform: rotate(0deg) translate(40px,-17px) skew(-20deg);    
  transform: rotate(0deg) translate(40px,-20px) skew(-20deg);
}
.box12 .shBl{
  width: 25px;
  height: 20px;
  z-index:20;
  background: white;
  position: absolute;
  bottom:0; left:0;
  background: -webkit-gradient(linear, 0% 20%, 50% 80%, from(#fff), to( #eee), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  background: -o-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  background: -moz-linear-gradient(0 50%, #fff, #fff 10%, #eee);
  border-radius: 0 0 30px 0;
  box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.3);
  -webkit-transform: rotate(103deg) skew(-3deg,-40deg) translate(-13px,-15px);
  -moz-transform: rotate(103deg) skew(-3deg,-40deg) translate(-13px,-15px);    
  -o-transform: rotate(103deg) skew(-3deg,-40deg) translate(-13px,-15px);
  transform: rotate(103deg) skew(-3deg,-40deg) translate(-13px,-15px);
}
.box12 .ribbon{
  content: '';
  position:absolute;
  top:-25px; left: 30%;
  width: 130px;
  height: 40px;
  background: #ccc;
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -webkit-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -o-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -moz-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2);
}
/*=======Box 13=====*/
.box13{
  padding: 0 0 1px 0;
  background:#fff;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0% 0% 270deg, #fff, #fff 10%, #f3f3f3);
  background: -o-linear-gradient(0% 0% 270deg, #fff, #fff 10%, #f3f3f3);
  background: -moz-linear-gradient(0% 0% 270deg, #fff, #fff 10%, #f3f3f3);
  border-top: 1px solid #ccc;
  border-right: 1px solid #ccc;
  border-left: 1px solid #ccc;
  border-radius: 60px 60px 60px 0 / 5px 5px 60px 0;
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.3) ;
}
.box13:before{
  content:'';    
  width: 25px;
  height: 20px;
  position: absolute;
  bottom:0;
  right:0;
  border-radius: 0 0 30px 0;
  box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.3);
  -webkit-transform: rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -moz-transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  -o-transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);
  transform:    rotate(-20deg) skew(-40deg,-3deg) translate(-13px,-13px);      
}
.box13:after{
  content: '';
  z-index: -10;
  width: 100px;
  height: 100px;
  position:absolute;
  bottom:0;
  right:0;
  background: rgba(0, 0, 0, 0.2);
  display: inline-block;
  box-shadow: 20px 20px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -moz-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
  -o-transform: rotate(0deg) translate(-45px,-20px) skew(20deg);    
  transform: rotate(0deg) translate(-45px,-20px) skew(20deg);
}
.box13 .cornerLf{
  width: 100px;
  height: 100px;
  top:0; left:0;
  position:absolute;
  z-index:-6;
  display: inline-block;
  box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(20px,25px) skew(20deg);
  -moz-transform: rotate(2deg) translate(20px,25px) skew(20deg);
  -o-transform: rotate(2deg) translate(20px,25px) skew(20deg);    
  transform: rotate(2deg) translate(20px,25px) skew(20deg);      
}
.box13 .cornerRt{
  content: '';
  width: 50px;
  height: 50px;
  top:0; right:0;
  position:absolute;
  display: inline-block;
  z-index:-6;
  box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  -moz-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  -o-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
}
.box13 .ribbon:before{
  content: '';
  position:absolute;
  top:0; left: 0;
  width: 130px;
  height: 40px;
  background:rgba(0,0,0,0.2);
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -webkit-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -o-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -moz-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(90deg) skew(0,0) translate(100px,65px);
  -moz-transform: rotate(90deg) skew(0,0) translate(100px,65px);
  -o-transform: rotate(90deg) skew(0,0) translate(100px,65px);    
  transform: rotate(90deg) skew(0,0) translate(100px,65px);
}
.box13 .ribbon:after{
  content: '';
  position:absolute;
  top:0; right: 0;
  width: 130px;
  height: 40px;
  background:rgba(0, 0, 0, 0.1);
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -webkit-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -o-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -moz-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(90deg) skew(0,0) translate(100px,-65px);
  -moz-transform: rotate(90deg) skew(0,0) translate(100px,-65px);
  -o-transform: rotate(90deg) skew(0,0) translate(100px,-65px);
  transform: rotate(90deg) skew(0,0) translate(100px,-65px);
}
 /*==========Box14=========*/
.box14{
  padding: 5px 0 ;
  background:#fff;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
  background: -wbkit-linear-gradient(0% 0% 270deg, #fff, #fff 10%, #f3f3f3);
  background: -o-linear-gradient(0% 0% 270deg, #fff, #fff 10%, #f3f3f3);
  background: -moz-linear-gradient(0% 0% 270deg, #fff, #fff 10%, #f3f3f3);
  border: 1px solid #ccc;
  border-radius: 60px/5px;
  box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
}
.box14:before{
  content: '';
  width: 50px;
  height: 50px;
  top:0; right:0;
  position:absolute;
  display: inline-block;
  z-index:-1;
  box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
  -webkit-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  -moz-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
  -o-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);    
  transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
}
.box14:after{
  content: '';
  width: 100px;
  height: 100px;
  top:0; left:0;
  position:absolute;
  z-index:-1;
  display: inline-block;
  box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);    
  -webkit-transform: rotate(2deg) translate(20px,25px) skew(20deg);
  -moz-transform:  rotate(2deg) translate(20px,25px) skew(20deg);
  -o-transform:  rotate(2deg) translate(20px,25px) skew(20deg);    
  transform:  rotate(2deg) translate(20px,25px) skew(20deg);
}
.box14 .ribbon{
  position:absolute;
  top:0; right: 0;
  width: 130px;
  height: 40px;
  background: rgba(0, 0, 0, 0.1);
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -moz-linear-gradient(555% 0% 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  box-shadow: 0px 0px 12px rgba(0,0,0,0.2);
  -webkit-transform: rotate(6deg) skew(0,0) translate(-60%,-5px);
  -moz-transform: rotate(6deg) skew(0,0) translate(-60%,-5px);
  -o-transform: rotate(6deg) skew(0,0) translate(-60%,-5px);
  transform: rotate(6deg) skew(0,0) translate(-60%,-5px);
}

/*=========BOX15======*/
.box15{
  padding: 0 0 1px 0;
  background:#fff;
  background: -webkit-gradient(linear, 100% 100%, 50% 10%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
  background: -webkit-linear-gradient(100% 50% 90deg, #fff, #fff 10%, #f3f3f3);
  background: -o-linear-gradient(100% 50% 90deg, #fff, #fff 10%, #f3f3f3);
  background: -moz-linear-gradient(100% 50% 90deg, #fff, #fff 10%, #f3f3f3);
  border: 1px solid #ccc;
  box-shadow: 1px 1px 4px rgba(0,0,0,0.1);
  border-radius: 0 0 60px 0 / 0 0 5px 0;    
}

.box15:before{
  content: '';
  width: 98%;
  z-index:-1;
  height: 100%;
  padding: 0 0 1px 0;
  position: absolute;
  bottom:0; right:0;
  background: #fff;
  background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f9f9f9), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0 0 270deg, #fff, #fff 10%, #f9f9f9);
  background: -o-linear-gradient(0 0 270deg, #fff, #fff 10%, #f9f9f9);
  background: -moz-linear-gradient(0 0 270deg, #fff, #fff 10%, #f9f9f9);
  border: 1px solid #ccc;
  box-shadow: 1px 1px 8px rgba(0,0,0,0.1);
  border-radius: 0 0 60px 0 / 0 0 5px 0;
  -webkit-transform: skew(2deg,2deg) translate(3px,8px);
  -moz-transform: skew(2deg,2deg) translate(3px,8px);
  -o-transform: skew(2deg,2deg) translate(3px,8px);    
  transform: skew(2deg,2deg) translate(3px,8px);
}
.box15:after{
  content: '';
  width: 98%;
  z-index:-1;
  height: 98%;
  padding: 0 0 1px 0;
  position: absolute;
  bottom:0; right:0;
  background: #f3f3f3;
  background: -webkit-gradient(linear, 0% 20%, 0% 100%, from(#f3f3f3), to(#f6f6f6), color-stop(.1,#fff));
  background: -webkit-linear-gradient(0% 0% 360deg, #f3f3f3, #fff, #f6f6f6);
  background: -o-linear-gradient(0% 0% 360deg, #f3f3f3, #fff, #f6f6f6);
  background: -moz-linear-gradient(0% 0% 360deg, #f3f3f3, #fff, #f6f6f6);
  border: 1px solid #ccc;
  box-shadow: 0px 0px 8px rgba(0,0,0,0.1);
  -webkit-transform: skew(2deg,2deg) translate(-1px,2px);
  -moz-transform: skew(2deg,2deg) translate(-1px,2px);
  -o-transform: skew(2deg,2deg) translate(-1px,2px);    
  transform: skew(2deg,2deg) translate(-1px,2px);
}

.box15 .ribbon{
  position:absolute;
  top:0; left: 0;
  width: 130px;
  height: 40px;
  background:rgba(0, 0, 0, 0.1);
  background: -webkit-gradient(linear, 555% 20%, 0% 92%, from(rgba(0, 0, 0, 0.1)), to(rgba(0, 0, 0, 0.0)), color-stop(.1,rgba(0, 0, 0, 0.2)));
  background: -webkit-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -o-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  background: -moz-linear-gradient(555% 0 180deg, rgba(0,0,0,0.1), rgba(0,0,0,0.2) 10%, rgba(0,0,0,0.0));
  border-left: 1px dashed rgba(0, 0, 0, 0.1);
  border-right: 1px dashed rgba(0, 0, 0, 0.1);
  box-shadow: 0px 0px 12px rgba(0,0,0,0.2);
  -webkit-transform: rotate(-30deg) skew(0,0) translate(-30px,-20px);
  -moz-transform: rotate(-30deg) skew(0,0) translate(-30px,-20px);
  -o-transform: rotate(-30deg) skew(0,0) translate(-30px,-20px);
  transform: rotate(-30deg) skew(0,0) translate(-30px,-20px);
}
/*============box16==========*/
.box16{
	box-shadow: 0 10px 6px -6px #777;
}

/*========box17================*/
.box17:before, 
.box17:after{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 15px;
  left: 10px;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777;
  box-shadow: 0 15px 10px #777;
  -webkit-transform: rotate(-3deg);
  -moz-transform: rotate(-3deg);
  -o-transform: rotate(-3deg);
  -ms-transform: rotate(-3deg);
  transform: rotate(-3deg);
}
.box17:after
{
  -webkit-transform: rotate(3deg);
  -moz-transform: rotate(3deg);
  -o-transform: rotate(3deg);
  -ms-transform: rotate(3deg);
  transform: rotate(3deg);
  right: 10px;
  left: auto;
}

/*==========box18=======================*/
.box18:before{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 15px;
  left: 10px;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777;
  -webkit-box-shadow: 0 15px 10px #777;
  -moz-box-shadow: 0 15px 10px #777;
  box-shadow: 0 15px 10px #777;
  -webkit-transform: rotate(-3deg);
  -moz-transform: rotate(-3deg);
  -o-transform: rotate(-3deg);
  -ms-transform: rotate(-3deg);
  transform: rotate(-3deg);
}

/*========box19===================*/
.box19:after{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 15px;
  right: 10px;
  left: auto;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777;
  box-shadow: 0 15px 10px #777;
  -webkit-transform: rotate(3deg);
  -moz-transform: rotate(3deg);
  -o-transform: rotate(3deg);
  -ms-transform: rotate(3deg);
  transform: rotate(3deg);
}  

/*=============box20=====================*/
.box20:before, 
.box20:after{
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 25px;
  left: 10px;
  width: 50%;
  top: 80%;
  max-width:300px;
  background: #777; 
  box-shadow: 0 35px 20px #777;
  -webkit-transform: rotate(-8deg);
  -moz-transform: rotate(-8deg);
  -o-transform: rotate(-8deg);
  -ms-transform: rotate(-8deg);
  transform: rotate(-8deg);
}
.box20:after{
  -webkit-transform: rotate(8deg);
  -moz-transform: rotate(8deg);
  -o-transform: rotate(8deg);
  -ms-transform: rotate(8deg);
  transform: rotate(8deg);
  right: 10px;
  left: auto;
}

/*=============box21===============*/
.box21{
  box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
}
.box21:before, 
.box21:after{
  content:"";
  position:absolute; 
  z-index:-1;
  box-shadow:0 0 20px rgba(0,0,0,0.8);
  top:50%;
  bottom:0;
  left:10px;
  right:10px;
  border-radius:100px / 10px;
} 
.box21:after{
  right:10px; 
  left:auto;
  -webkit-transform:skew(8deg) rotate(3deg); 
  -moz-transform:skew(8deg) rotate(3deg);     
  -ms-transform:skew(8deg) rotate(3deg);     
  -o-transform:skew(8deg) rotate(3deg); 
  transform:skew(8deg) rotate(3deg);
}

/*=============box22===================*/
.box22{
  box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
}
.box22:before, 
.box22:after{
  content:"";
  position:absolute; 
  z-index:-1;
  box-shadow:0 0 20px rgba(0,0,0,0.8);
  top:0;
  bottom:0;
  left:10px;
  right:10px;
  border-radius:100px / 10px;
} 
.box22:after{
  right:10px; 
  left:auto;
  -webkit-transform:skew(8deg) rotate(3deg); 
  -moz-transform:skew(8deg) rotate(3deg);     
  -ms-transform:skew(8deg) rotate(3deg);     
  -o-transform:skew(8deg) rotate(3deg); 
  transform:skew(8deg) rotate(3deg);
}

/*===============box23=================*/
.box23{
  box-shadow:0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
}
.box23:before, 
.box23:after{
  content:"";
  position:absolute; 
  z-index:-1;
  box-shadow:0 0 20px rgba(0,0,0,0.8);
  top:10px;
  bottom:10px;
  left:0;
  right:0;
  border-radius:100px / 10px;
} 
.box23:after{
  right:10px; 
  left:auto;
  -webkit-transform:skew(8deg) rotate(3deg); 
  -moz-transform:skew(8deg) rotate(3deg);     
  -ms-transform:skew(8deg) rotate(3deg);     
   -o-transform:skew(8deg) rotate(3deg); 
  transform:skew(8deg) rotate(3deg);
}  

demodownload

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

Responsive列布局

$
0
0

本文根据的《Responsive Column Layouts 》所译,整个译文带有自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://webdesignerwall.com/tutorials/responsive-column-layouts,以及作者相关信息

作者:Nick La

译者:大漠

布局W3cplus说的也比较多了,但Responsive的列布局还是第一回说,(如果你是第一次听说Responsive这个词,建议你点击和先了解Responsive)。今天看到一篇有关于Responsive的列布局教程,觉得值得一读,将其译成中文,希望对有需要的同学有所帮助。

通常我们进行列布局,都需要在第一列添加一个类名“first”,在最后一列添加一个类名“last”,主要用来清除他们之间的margin,(有关这方面的介绍可以详细阅读为之写的《CSS解决方案》中的《项目列表解决方安》,这里详细介绍了类似于列布局的相关方法,或者点击这里了解如何避免重复列末尾的Margin。)而且还通过添加类名“clearfix”来清除浮动。这些都是比较古老的解决方案了,今天我们一起来看一个新方案,就是使用CSS3的伪元素选择器“nth-of-type”来实现一个简单的Responsive列布局效果。使用这种方法制作了一些WordPress主题模板。制作这些模板中,他没有使用“first”和“last”类名就实现了多列在不同设备下都能自适应,换句话说,他就是能实现四列、三列、两列等等之间的切换。

demo

接下来,我们一起看看具体是如何实现的。

很不方便的“first”和"last"类名

通常情况下,我们都是添加“first”和“last”类名来清除涉浮动在网格中列的margin值,添加“first”和"last"类名是特别烦人的事情,特别是在Responsive布局中,你无法确认哪列在什么时候是处第一列,以及哪列在什么时候处最后一列,几乎是个死题,无解。

针对这种情况,我们来看一个示例图,假设我有一个四列的布局,总容器宽度“960px”,其中每列是“225px”,而且给每列设置了“margin-left”和“margin-right”为"10px"的列间距,为了让最后一列不掉下来,我们通常会给“1、5、9”添加“first”类名,在“4、8、12”列添加“last”类名,这个时候在类名“first”上清除“margin-left”为“0”,而在“last”类名上清除“margin-right”为“0”,这样布局才会正常。

HTML结构

<div class="layout clearfix">
  <div class="first">first</div>
  <div></div>
  <div></div>
  <div class="last">last</div>
  <div class="first">first</div>
  <div></div>
  <div></div>
  <div class="last">last</div>
  <div class="first">first</div>
  <div></div>
  <div></div>
  <div class="last">last</div>
</div>

CSS代码

.layout {
  width: 960px;
  margin: 20px auto;
}
.layout div {
  width: 225px;
  height: 150px;
  background: #ccc;
  margin: 10px;
  float: left;
  /*font style*/
  font-size: 50px;
  font-weight:bold;
  color:orange;
  text-align: center;
  line-height: 150px;
}
.layout .first {
  margin-left: 0px;
}
.layout .last {
  margin-right: 0px;
}

这个时候布局非常的完美:

Responsive Column Layouts

大家都知道Responsive设计最主要的就是能适应各种设备下的屏幕渲染,此处我简单的来模仿一下,我现在在另一个分辨率下,只想显示成三列,这个时候我们的结构是没办法改变了,我们来看看效果(我将容器模拟成放三列的宽度:225*3+40=715px);

.layout {
  width: 715px;
  margin: 20px auto;
}

这个时候的布局真是惨不忍睹呀:

Responsive Column Layouts

在这里我只是想通过这个模拟Responsive的例子来说明一个问题,就是列布局,使用添加类名的方法,在Responsive中是行不通的,至于什么原因,我想不用我说,大家都懂的。

使用nth-of-type

既然添加类名的方法做不到,我们就需要去思考别的方案,所幸的是,CSS3提供了一个先进的选择器“nth-of-type”,我们可以使用":nth-of-type(An+B)"表达来代替“first”和“last”类名清除相对应的margin值。例如:

  1. .grid4.col:nth-of-type(4n+1)=四列布局中的第一个(相当于first类名),也就是说等于在“1,5,9”列上添加类名“first”
  2. .grid3.col:nth-of-type(3n+1)=三列布局中的第一个(相当于first类名),也就是说等于“1,4,7”列上添加类名“first”
  3. .grid2.col:nth-of-type(2n+1)=两列布局中的第一个(相当于first类名),也就是说等于“1,3,5”列上添加类名“first”
.grid4 .col:nth-of-type(4n+1),
.grid3 .col:nth-of-type(3n+1),
.grid2 .col:nth-of-type(2n+1) {
  margin-left: 0;
  clear: left;
}

Responsive Column Layouts

使用Media Queries实现Responsive

至于什么是“Media Queries”在这里就不多说了,感兴趣的可以点击这里了解,此处我们还是回到正题,前面介绍使用“nth-of-type”来实现代替“first”"last"类名的方案,为了实现真正的Responsive列布局效果,我们使用流体网格,而不是像素网格:

/* col */
.col {
  background: #eee;
  float: left;
  margin-left: 3.2%;
  margin-bottom: 30px;
}

/* grid4 col */
.grid4 .col {
  width: 22.6%;
}

/* grid3 col */
.grid3 .col {
  width: 31.2%;
}

/* grid2 col */
.grid2 .col {
  width: 48.4%;
}

1、实现四列向三列转换

当视窗小于740px的宽度时,将实现四列向三列转换,在这个转换过程中我们要做的是:

  1. 将“.grid4.col”的列宽度调整到“31.2%”(相当于三分之一的宽度);
  2. 重置"margin-left"和“clear”值;
  3. 重新使用“nth-of-type(3n+1)”设置margin和clear的值。
@media screen and (max-width: 740px) {
  .grid4 .col {
    width: 31.2%;
  }
  .grid4 .col:nth-of-type(4n+1) {
    margin-left: 3.2%;
    clear: none;
  }
  .grid4 .col:nth-of-type(3n+1) {
    margin-left: 0;
    clear: left;
  }
}

此时效果就由四列向三列转换了。

Responsive Column Layouts

2、由四列和三列向两列转换

当视窗的宽度小于“600px”时,我们列布局由四列和三列向两列转换,表面上看来好像要复杂一些,其实他们使用的原理和前面的是一样的,先分别调整列宽和重置margin与clear:

@media screen and (max-width: 600px) {
  /* change grid4 to 2-column */
  .grid4 .col {
    width: 48.4%;
  }
  .grid4 .col:nth-of-type(3n+1) {
    margin-left: 3.2%;
    clear: none;
  }
  .grid4 .col:nth-of-type(2n+1) {
    margin-left: 0;
    clear: left;
  }

  /* change grid3 to 2-column */
  .grid3 .col {
    width: 48.4%;
  }
  .grid3 .col:nth-of-type(3n+1) {
    margin-left: 3.2%;
    clear: none;
  }
  .grid3 .col:nth-of-type(2n+1) {
    margin-left: 0;
    clear: left;
  }
}

所有列全屏显示

当视窗宽度小于“400px”时,设置所有列的宽度为“100%”,同时重置margin和float:

@media screen and (max-width: 400px) {
  .col {
    width: 100% !important;
    margin-left: 0 !important;
    clear: none !important;
  }
}

IE的兼容性

Media Queries和“nth-of-type”都不支持IE8以及其以下版本。你可以使用selectivizr.js脚本来提供nth-of-type在IE下的兼容问题和使用respond.js来做Media Queries在IE下的兼容。不过遗憾的是这两个脚本不能很好的在一起运行(比如说,nth-of-type无法在Media Queries内运行)。也就是说在IE底下无法实现Responsive列布局的四列向三列或两列转换。

上面简单的介绍了如何使用“nth-of-type”和“media queries”实现Responsive列布局,如果你对这方面知识感兴趣,你可以继续阅读下面文章:

  1. Responsive Layout
  2. Beating Borders: The Bane of Responsive Layout
  3. The Goldilocks Approach
  4. Design sites using the Responsive Grid System
  5. Responsive jQuery Masonry

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

如需转载烦请注明出处:

英文原文:http://webdesignerwall.com/tutorials/responsive-column-layouts

中文译文:http://www.w3cplus.com/css3/responsive-column-layouts.html

16+国外优秀的UI设计资源库

$
0
0
16+国外优秀的UI设计资源库

网站设计或者说UI设计对于Web上的运用是非常的关键,一个站做得好不好,能不能吸引人的眼球,设计占了不低的地位,但话又说回来,Web前端人员又有多少人是设计专业毕业,具有这方面的能力呢?像我这样没有设计艺术细胞的页面仔,有时候为了一个效果苦于无法整出来,唯一的办法就是去搜索寻找相关的设计资源网站,找到适合自己的UI效果。经过平时的积累与搜集,我整理了一个UI设计以及Web设计相关的资源网站,希望对一些不懂设计的前端人员有所帮助。

这些UI效果或者Web页面效果,我们可以拿来模仿,更大的好处是,我们可以找到一些免费的资源下载,然后拿他来当作目标,练习我们的代码。正如w3cplus上的大部分CSS3案例,我们都是通过这些网站的搜集,然后一个一个用CSS3代码来实现设计图的效果,我觉得这是一个很好的学习和检验我们代码能力的一种方法,不信你可以试试,这样的笨办法或许你会像我一样的喜欢。因为我就是这样做的。

1、Freebies Gallery

Freebies Gallery

2、Open Dept

Open Dept

3、Psd Freebies

Psd Freebies

4、Design Shock

Design Shock

5、Mighty deals

Mighty deals

6、Deviantart

Deviantart

7、Media Loot

Media Loot

8、Premium Pixels

Premium Pixels

9、Favbulous

Favbulous

10、DesignModo

DesignModo

11、Spyrestudios

Spyrestudios

12、SenDesignz

SenDesignz

13、Blazrobar

Blazrobar

14、Pepsized

Pepsized

15、Wegraphics

Wegraphics

16、365PSD

365PSD

目前搜集了16个设计方面的资源网站,当然,有些同学手上可能有更优秀的,希望您能与我们分享,如果您有这方面的资源,可以在下面的评论中跟贴,我们将相关的资源整理出来,与大家分享,方便大家使用与学习。

如需转载,烦请注明出处:http://www.w3cplus.com/source/ui-design.html

CSS3 Animation Dropdown Menu With Metrostyle Web UI

$
0
0
CSS3 Animation Dropdown Menu With Metrostyle Web UI

菜单效果在网上琳琅满目,w3cplus也制作了不少。今天根据Metrostyle的UI设计效果,配合CSS3的transform,aimation属性制作了一个下拉的动画导航效果。这个效果在webkit浏览器下得到较好的支持,在Firefox下有些卡。其中最关键的地方使用了两个额外标签控制翻转的前后效果,详细的制作过程看代码吧。

demodownload

HTML CODE

<div id="nav">
  <ul class="nav-menu clearfix unstyled">
    <li><a href="#" class="three-d active">
      Home
      <span class="three-d-box"><span class="front">Home</span><span class="back">Home</span></span>
    </a></li>
    <li><a href="#" class="three-d">
      Services
      <span class="three-d-box"><span class="front">Services</span><span class="back">Services</span></span>
    </a></li>
    <li><a href="#" class="three-d">
      Products
      <span class="three-d-box"><span class="front">Products</span><span class="back">Products</span></span>
    </a></li>
    <li><a href="#" class="three-d">
      About
      <span class="three-d-box"><span class="front">About</span><span class="back">About</span></span>
    </a></li>
    <li><a href="#" class="three-d">
      Contact
      <span class="three-d-box"><span class="front">Contact</span><span class="back">Contact</span></span>
    </a></li>
    <li><a href="#" class="three-d">
      Blog
      <span class="three-d-box"><span class="front">Blog</span><span class="back">Blog</span></span>
    </a>
      <ul class="clearfix unstyled drop-menu">
        <li><a href="#" class="three-d">
          Html5
          <span class="three-d-box"><span class="front">Html5</span><span class="back">Html5</span></span>
        </a></li>
        <li><a href="#" class="three-d">
          Css3
          <span class="three-d-box"><span class="front">Css3</span><span class="back">Css3</span></span>
        </a></li>
        <li><a href="#" class="three-d">
          JavaScript
          <span class="three-d-box"><span class="front">JavaScript</span><span class="back">JavaScript</span></span>
        </a></li>
        <li><a href="#" class="three-d">
          Videogames
          <span class="three-d-box"><span class="front">Videogames</span><span class="back">Videogames</span></span>
        </a></li>
      </ul>
    </li>
    <li><a href="#" class="three-d">
      Shop On-line
      <span class="three-d-box"><span class="front">Shop On-line</span><span class="back">Shop On-line</span></span>
    </a></li>
  </ul>
</div>

CSS CODE

@font-face {
  font-family: 'sansationregular';
    src: url('sansation_regular-webfont.eot');
    src: url('sansation_regular-webfont.eot?#iefix') format('embedded-opentype'),
      url('sansation_regular-webfont.woff') format('woff'),
      url('sansation_regular-webfont.ttf') format('truetype'),
      url('sansation_regular-webfont.svg#sansationregular') format('svg');
  font-weight: normal;
  font-style: normal;

}
body {
  background-color:#edecec;
}
.nav-menu {
  display: block;
  background: #74adaa;
  width:950px;
  margin: 50px auto 150px;
}

.nav-menu > li {
  display: inline;
  float:left;			
  border-right:1px solid #94c0be;
}
.nav-menu > li:last-child {
  border-right: none;
}
.nav-menu li a {
  color: #fff;
  display: block;
  text-decoration: none;
  font-family: 'sansationregular';
  -webkit-font-smoothing: antialiased;
  -moz-font-smoothing: antialiased;
  font-smoothing: antialiased;
  text-transform: capitalize;
  overflow: visible;
  line-height: 20px;
  font-size: 20px;
  padding: 15px 30px 15px 31px;			
}

/* animation domination */
.three-d {
  perspective: 200px;
  transition: all .07s linear;
  position: relative;
}

.three-d:not(.active):hover {
  cursor: pointer;
}

.three-d:not(.active):hover .three-d-box, 
.three-d:not(.active):focus .three-d-box {
  transform: translateZ(-25px) rotateX(90deg);
}

.three-d-box {
  transition: all .3s ease-out;
  transform: translatez(-25px);
  transform-style: preserve-3d;
  pointer-events: none;
  position: absolute;
  top: 0;
  left: 0;
  display: block;
  width: 100%;
  height: 100%;
}

.front {
  transform: rotatex(0deg) translatez(25px);
}

.back {
  transform: rotatex(-90deg) translatez(25px);
  color: #FFE7C4;
}

.front, .back {
  display: block;
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  background: #74adaa;
  padding: 15px 30px 15px 31px;	
  color: white;
  pointer-events: none;
  box-sizing: border-box;
}
.nav-menu li .active .front,
.nav-menu li .active .back,
.nav-menu li a:hover .front,
.nav-menu li a:hover .back {
  background-color: #51938f;
  background-size: 5px 5px;
  background-position: 0 0, 30px 30px;
  background-image: -*-linear-gradient(45deg, #478480 25%, transparent 25%, transparent 75%, #478480 75%, #478480), linear-gradient(45deg, #478480 25%, transparent 25%, transparent 75%, #478480 75%, #478480);
}
.nav-menu ul {
  position: absolute;
  text-align: left;
  line-height: 40px;
  font-size: 14px;
  width: 200px;
  transition: all 0.3s ease-in;
  transform-origin: 0px 0px;
  transform: rotateX(-90deg);
  backface-visibility: hidden;
}
.nav-menu > li:hover ul {
  display: block;
  transform: rotateX(0deg);
}

demodownload

如需转载,烦请注明出处:http://www.w3cplus.com/demo/css3-animation-dropdown-menu-with-metrostyle-web-ui.html

Pure CSS3 Create Luminous Button

$
0
0
Pure CSS3 Create Luminous Button

这是一个很简单的按钮效果,其来源于鬼哥的鬼群,看到鬼大问这样的按钮怎么制作,默认效果就不说了,说一下点击时的效果吧。当你点击按钮时,中间会有发光,并向外扩散的淡光效果。看到效果大家在考虑是否使用text-shadow制作,或者说使用box-shadow效果制作。但思量过来,直接在button上使用这两个属性都无法实现,最后决定使用“:after”来制作发光的效果。经过尝试,效果还是制作出来了,只不过没有设计师的那么完美。希望大家能从中找到一点思路。

demodownload

HTML CODE

<button class="btn" type="submit">Submit</button>
<button class="btn" type="reset">Reset</button>

CSS CODE

body {
  background:#347db0;
  text-align: center;
}
.btn-wrap {
	text-align: center;
	margin: 50px;
}
.btn{
  position: relative;
  display: inline-block;
  line-height: 25px;
  padding: 5px 15px;
	margin:10px;
	transition: all .3s ease-out;
  text-transform: uppercase;
  border-radius: 5px;
  border: 1px solid #1e639a;
  color: #fff;
  font-weight: bold;
  cursor: pointer;
  text-shadow:0 1px 2px rgba(0,0,0,.4);
  box-shadow: inset 1px 0 0  #559ad5,inset -1px 0 0  #559ad5,inset 0 1px 0  #559ad5,inset 0 -1px 0  #559ad5,0 0 1px rgba(0,0,0,0.5);
  background: #4086c2; /* Old browsers */
  background: -*-linear-gradient(to bottom,  #4086c2 0%,#2989d8 100%,#3378b1 100%); 
}
.btn:hover {
  background: #3378b1; /* Old browsers */
  background: -*-linear-gradient(to bottom,  #3378b1 0%,#2989d8 0%,#4086c2 100%); 
}
.btn:active:after {
  content: "";
  display:block;
  width: 2px;
  height: 2px;
  position:absolute;
  border-radius:2px;
  top:50%;
  left: 50%;
  margin: -1px 0 0 -1px;
  z-index:2;
  background: rgba(255,255,255,1);
  box-shadow:0 0 10px 5px rgba(255,255,255,0.5),
    0 0 20px 10px rgba(255,255,255,0.5),
    0 0 30px 15px rgba(255,255,255,0.4),
    0 0 40px 20px rgba(255,255,255,0.3),
    0 0 50px 25px rgba(255,255,255,0.3),
    0 0 60px 30px rgba(255,255,255,0.3),
    0 0 70px 35px rgba(255,255,255,0.3);
}​

demodownload

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

如何移除button在IE67下的黑边

$
0
0

好久没有处理过IE6下的兼容问题了,今天有朋友碰到过input[type="submit"]和button[type="submit"]在IE6-7下会出现黑边,就算是你在样式中重置了一个border属性也是如此。真是蛋疼的很。后来经过查找相关的资料,终于找到了解决方法,放上来与大家分享一下,这个问题有可能不只一个人会碰到。(^_^)

在介绍如何处理这个bug之间我们一起来回顾一下,在IE6-7下,input[type="submit"]和button[type="submit"]存在的问题还不仅是这个,常见的有:button在IE67下的宽度兼容问题button的行高问题(各浏览器下解析不一样)、button的outline问题,甚至submit在ios下也存在问题。这么多烦人的事,苦逼了前端人员,(具体解决方案可以点击这里查看)。今天就在为大家增加一个问题的解决方案——如何去除IE67下按钮的黑边框

问题

问题是这样的,你的登录表单中有一个登录按钮,当登录按钮得到焦点,并且消失焦点后,登录按钮会有一个1px的黑色边框,这样直接影响了页面的效果,但是这样的问题是怎么来的,我也不知道(希望有知道朋友能帮忙解释一下)。而且这样的bug将出现在下面两个元素上:

  1. button按钮使用了【type="submit"】会产生这样的bug;
  2. input使用了【type="submit"】也会产生这样的bug。

一起来看这个问题的截图:

如何移除button在IE67下的黑边

解决方案

要解决这样的bug最好的方法就是在button和input的标签外添加一个标签,然后将样式写在这个标签上,并且把button和input的默认样式都去除掉,相信不少同学是这样使用的,简单了事。但有的情况下我们是无法为这两个元素添加标签的,那么我们就需要别的方法来解决。

正常的解决方案是没了,只有使用滤镜来解决:

<!--[if IE]>
<style type="text/css">
  input {
    filter:chroma(color=#000000);
  }
</style>
<![endif]-->
	

因为这个问题,存在所有按钮上,为了一劳永逸,建议在reset.css样式中加入:

input[type=submit],
input[type=reset],
input[type=button]{
  filter:chroma(color=#000000);
}

属性选择器在IE下没有得到较好的支持,可以使用类名来代替,比如说“form-text”。

就是这么一句代码,把黑色边框去掉了。

顺便介绍一个IE6-7解决焦点点状线去除的技巧,我们有时候在ie6-7下使用

a:focus, *:focus {outline:none;}

无法除点状线,但有时候又需要去掉这样的点状线,那么有也有一个比较BT的解决方法,代码就一句:

a:focus, *:focus {
  noFocusLine: expression(this.onFocus=this.blur());
}

看个对比图吧:

问题是解决了,但你要问我这个问题为什么会这样,又为什么这样能解决?说实话,我也不知道,我只想告诉大家的是,这么做能解决你需要解决的问题,希望对大家有所帮助。如果您知道怎么来的,记得告诉我哟。谢谢!

如需转载,烦请注明出处:http://www.w3cplus.com/css/remove-black-border-around-input-buttons-in-ie.html


响应式导航菜单在移动端的制作方法与解决方案

$
0
0

本文根据的《Responsive Mobile Navigation Menu - Methods and Solutions》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://www.queness.com/post/13093/responsive-mobile-navigation-menumethods-and-solutions,以及作者相关信息

作者:Kevin Liew

译者:大漠

Responsive设计现在是网页设计中的一种趋势,现在浏览网页不在是仅限于PC端,而是有很多类型的屏幕尺寸——桌面、笔记本电脑、平板电脑和智能手机等等。一个网页要能在这么多种类型屏幕上显示,Responsive设计似乎是一种完美的解决方案。因为他允许你创建一个网站,可以适应不同的分辨率。这是具有挑战性的,从桌面到移动端屏幕。为此,内容有需要隐藏的,图片必须能自动适应大小和一些其他网页元素需要相应的改变。详细的介绍可以阅读前面介绍的《Responsive Web Design》和《Responsive设计的十个基本技巧》。在这里,我们要看看网页设计中至关重要的UI组件之一网站导航菜单。因为导航也涉及到响应式设计的变化。

解决方案有许多种,比如说使用选择下拉框制作菜单、CSS下拉菜单、切换导航菜单等,(可以看看《20款Responsive Menu教程》,这里有近20种响应式导航菜单制作案例与相关教程的介绍)。当然这些解决方案都有自己的优缺点,至于使用哪种解决方案,就需要根据您的需求,从中找到一个完美的解决方案来适合你的项目。接下来为大家提供一些响应式导航菜单的制作方法和解决方案,希望能帮你完成更好的Responsive设计。

一、导航变小

让导航菜单随着屏幕分辨率变小而变小,这是方案适合那种小规模的网站,这是最简单的解决方案,只需要通过css来确保导航菜单能完全适合在小屏幕上正常显示。这个解决方案虽然简单快捷有效,但是其有一个致命的缺点,导航数量有限。如果你的导航菜单上有四个以上的项目,这种方案是一个不可选的方案,因为你为了适应小屏幕时将菜单项目变小,从而导致一些用户很难阅读和点击到正确的链接。

响应式导航菜单在移动端的制作方法与解决方案

参考案例

  1. Unmatched Style
  2. Siyelo
  3. Cowork Chicago
  4. Zach Woomer
  5. Fico
  6. Heath Life

扩展阅读

这种方法需要的CSS技巧。通过更改导航菜单项的字体大小和间距,确保导航菜单适应小屏幕。

二、导航菜单块状显示

这种解决方案和缩小导航菜单的解决方案很像,也是通过CSS将导航菜单项调整为块状(一个导航项占用一行)。这样做的目的是为了让导航菜单更易阅读和点击。适用于一些小项目中。然而他也有一个很大的缺点,全部列出每个导航项,一旦你的导航菜单项目多,这些导航菜单项就会占用大量的屏幕,将一些重要信息挤到屏幕下面而无法阅读,所以这种方案来制作移动端屏幕下的导航并不是一种最好的解决方案。

响应式导航菜单在移动端的制作方法与解决方案

参考案例

  1. Regent College
  2. Green Belt
  3. Fiafo
  4. Travel Oregon
  5. Open Medical Device Research Library
  6. YAML

扩展阅读

  1. An Alternative to select elements as anvigation in narrow viewports
  2. Code a responsive navigation menu

三、下拉选择框方案

使用表单“select”制作下拉菜单是一种解决移动端导航菜单的方案,也是一种常见的解决方案。这个方案思路很简单,将导航菜单列表“ul”转换成一个“select”,当然,要实现这样的效果,我们需要javaScript脚本来辅助实现。这种方案不好的一点就是每种设备下的UI效果不一致(select在各浏览器下渲染不一致),为了解决这个问题,你可以使用javascript插件来模拟制作一个select的UI效果,这样做会稍许的麻烦。不过话又说回来,如果你的客户对select的UI不一致性要求不是很高的话,这是一种蛮好的解决方案。

响应式导航菜单在移动端的制作方法与解决方案

参考案例

  1. ISO.org
  2. Smashing Magazine
  3. Desgin Intellection

扩展阅读

  1. Responsive Mnu
  2. TinyNav
  3. Convert Menu to Dropdown
  4. SelectNav

四、CSS下拉菜单

采用“select”下拉菜单的同一个概念,换用CSS制作下拉菜单(这样简单多了)。在移动设备或小屏幕下,导航菜单是隐藏的,取而代之的是一个菜单按钮。当用户点击了这个菜单按钮时,导航菜单项以下拉菜单的样子展示出来。这个解决方案并不是菜单显示,内容往下推,而是整个菜单层缀在内容上面。这个方案解决了前面个方案的所有不足问题,可称得上是一种完美的解决方案。

Responsive移动导航制作方法与解决方案

参考案例

  1. Fringe Web Development
  2. Neowada
  3. Sony

扩展阅读

  1. Mobile Navigation Design Tutorial
  2. Responsive Drop Dwon Navigation Menu

五、切换菜单

这个方案类似于“CSS下拉菜单”方案,默认状态下把导航菜单项隐藏,只显示菜单按钮。也是通过用户点击菜单按钮,隐藏的导航菜单才会显示出来,但是有一点区别的:css下拉菜单,弹出的导航菜单不会把内容往下推,而是层缀在内容之上,而这个方案却不一样,当用户点击菜单按钮后,导航菜单项显示出来,同时内容会往下推,空出足够的空间放置强出的下拉菜单。为了让你的效果更优雅些,建议切换菜单时,给他们加上一些动画的效果。这种方案也是常见的一种解决方案,不需要考虑UI之类的问题,而且也不会占用大量空间等。

响应式导航菜单在移动端的制作方法与解决方案

参考案例

  1. Atlanta Ballet
  2. William & Mary
  3. Green Belt
  4. Starbucks
  5. Dconstruct
  6. Zurb Foundation

扩展阅读

  1. Flexible Navigation
  2. Twitter Bootstrap
  3. Responsive Toggle Menu
  4. Big Menus, Small Screens Responsive Multi Level Navigation

六、页脚锚点

页脚锚点是另一个简单的实现方案。制作两个导航菜单,一个在页头,一个在页脚。当屏幕尺寸足够小的时候,头导航被替换成一个锚点链接,这个链接直接指向到页脚菜单。

响应式导航菜单在移动端的制作方法与解决方案

参考案例

  1. Built With Momentum
  2. Grey Goose
  3. Contents Magazine

扩展阅读

  1. A Simple Responsive Mobile First Navigation

七、侧栏菜单

如果你在使用IOS,侧栏菜单对你来说并不陌生。如Facebook和twitter在Ios上的运用,在足够小的屏幕下,他们将导航菜单隐藏在侧边栏,只显示一个菜单按钮,当你点击菜单按钮时显示整个导航菜单。并将内容向右推。这也是种很优秀的解决方案。

响应式导航菜单在移动端的制作方法与解决方案

参考案例

  1. Facebook Mobile

扩展阅读

  1. jPanel Menu

八、其他解决方案

除了常见的解决方案,有一些其他更高级的方案,比如,弹出导航菜单,向下导航和路径导航等。

弹出菜单

使用弹出模块制作的弹出菜单,比如说Remodelista写的一个弹出模块。实现弹出导航的模块有很多,比如说FancyBoxModal Window tutorial等。

响应式导航菜单在移动端的制作方法与解决方案

路径导航

这是一个很有创意的方案,不过他更多的依赖于css3和javascript。当用户点击菜单按钮时,导航菜单会以一种独特的路径方式展示在这个按钮周边,如果你要关闭弹出的导航菜单,用户必须选择其中一个菜单项或者再次点击菜单按钮。详细的可以看看这个免费的案例

响应式导航菜单在移动端的制作方法与解决方案

向下展开

这种方案其实和侧边栏方案有点类似,先将导航进行隐藏,在顶部显示一个向下推的UI按钮,当用户点击这个按钮后,整个导航菜单显示出来,同时内容向下推。如果你要关闭导航,需要选择其中一个菜单项,或者再次点击菜单按钮,导航菜单才能隐藏。

响应式导航菜单在移动端的制作方法与解决方案

你可以看看这个案例

上面从不同方案介绍了Responsive导航菜单在移动端上的解决方案以及参考案例,这些方案都各有各的优势和劣势,具体哪种方案更适合你,这主要根据您的项目需求来决定。就我个人而言,我比较喜欢切换菜单的这种方案,简单又不失优雅。

我希望你会发现这篇文章很有用,有人在研究可能的解决方案总是好的,因为这些研究出来的方案在实际中能帮你节省时间和精力。如果您想阅读更多关于响应式导航菜单的优点和缺点,你可以看看Brad Frost对响应菜单的专题介绍《

特别声明:文中相关资源来自于:Kevin Liew写的Responsive Mobile Navigation Menu - Methods and Solutions。如果你遇到相关链接无法正常打开,烦请开启您的VPN。

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

如需转载,烦请注明出处:

英文原文:http://www.queness.com/post/13093/responsive-mobile-navigation-menumethods-and-solutions

中文译文:http://www.w3cplus.com/css3/responsive-mobile-navigation-menumethods-and-solutions.html

2012年优秀jQuery插件连载(十一)

$
0
0
2012年优秀jQuery插件连载(十一)

这一期向大家推荐的插件,大家平时有看到,只是效果稍做了些许的修改。比如说多个图片的横向滚动效果,评论系统,图片放大,弹出框,幻灯片播放效果,分步指引效果,滑块效果等。这些插件效果,都配有对应的API和DEMO下载,如果你感兴趣的话,可以了解一下,以备急需是可以使用得上。

1、ALS ANY LIST SCROLLER

ALS ANY LIST SCROLLER

一款制作列表滚动的jQuery插件。

2、mlens

mlens

一个放大镜的jQuery插件。

3、Tweet Feed

Tweet Feed

一款制作twitter feed的时间轴效果插件

4、X-editable

X-editable

这个库充许你在你的页面上实现在线编辑功能。

5、a!ertifyjs

a!ertifyjs

一个不引人注目的,用来制作系统通知的一个插件

5、SIMPLE EFFECTS FOR DROP-DOWN LISTS

SIMPLE EFFECTS FOR DROP-DOWN LISTS

一个自定义下拉列表的效果。

6、ayaSlider

ayaSlider

一款灵活的幻灯片播放插件。

7、jQuery Destaque Plugin

jQuery Destaque Plugin

一个具有paralax效果的滑动prestentation插件。

8、STACKSLIDER: A FUN 3D IMAGE SLIDER

STACKSLIDER: A FUN 3D IMAGE SLIDER

一个3D翻页幻灯片效果。

9、jQRangeSlider

jQRangeSlider

一个强大的滑块选择的值jQuery插件。

10、Crumble

Crumble

一款制作引导步骤的插件。

  1. 2012年优秀jQuery插件连载(一)
  2. 2012年优秀jQuery插件连载(二)
  3. 2012年优秀jQuery插件连载(三)
  4. 2012年优秀jQuery插件连载(四)
  5. 2012年优秀jQuery插件连载(五)
  6. 2012年优秀jQuery插件连载(六)
  7. 2012年优秀jQuery插件连载(七)
  8. 2012年优秀jQuery插件连载(八)
  9. 2012年优秀jQuery插件连载(九)
  10. 2012年优秀jQuery插件连载(十)

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

应不应该使用inline-block代替float

$
0
0

本文由99根据的《Should You Use Inline-Blocks As A Substitute For Floats?》所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://www.vanseodesign.com/css/inline-blocks/,以及作者相关信息

作者:Steven Bradley

译者:99

CSS布局创建网站,浮动绝对占据了很大的比例.大块区域如主内容及侧边栏,以及在其中的小块区域,都可以看到浮动的影子.这里浮动是唯一的解决方案吗?

浮动通常表现正常,但有时候搞起来会很纠结。特别是处理内部容器中的浮动,比如对一排图片使用浮动后对齐出现问题。Inline-block是我们的另一种选择。使用这种属性可以模拟部分浮动的特征,而不需要处理一些浮动带来的问题。

Inline-block不是什么新鲜话题了,估计你也用过。不过我最近才是用到这个属性。之前的几个站点上,有展示一系列照片的需求,我就用inline-block代替了浮动。

box module

inline-block是什么?

Inline-block是元素display属性的一个值。这个名字的由来是因为,display设置这个值的元素,兼具行内元素( inline elements)跟块级元素(block elements)的特征。

  1. 块级元素(block elements),来源于CSS盒子模型。块级元素包含width height,padding,border与margin,他们的排列方式是从上到下排列。 行内元素,排列方式是水平排列。
  2. 行内元素(inline elements)排列方式是水平排列。
  3. 行内块元素(inline-block elements)在内部他的表现类似block元素,比如他拥有block元素的width height,padding,border与margin,而外部的排列方式有类似行内元素,即水平排列,而不是像块级元素一样从上到下排列

如果你考虑了上面这些东东,你可以了解到,inline-block元素跟元素设置浮动后的表现差别并不是很大。对盒子设置浮动后,同样会水平排列。虽然他们实现的原理不同,但内部表现为块级元素,水平排列这种需求,浮动跟inline-block都适合实现。

box module

inline-block和float的区别

虽然设置浮动跟设置inline-block有些特征类似,但两者的区别还是非常明显的:

  1. 文档流(Document flow):浮动元素会脱离文档流,并使得周围元素环绕这个元素。而inline-block元素仍在文档流内。因此设置inline-block不需要清除浮动。当然,周围元素不会环绕这个元素,你也不可能通过清除inline-block就让一个元素跑到下面去。
  2. 水平位置(Horizontal position):很明显你不能通过给父元素设置text-align:center让浮动元素居中。事实上定位类属性设置到父元素上,均不会影响父元素内浮动的元素。但是父元素内元素如果设置了display:inline-block,则对父元素设置一些定位属性会影响到子元素。(这还是因为浮动元素脱离文档流的关系)。
  3. 垂直对齐(Vertical alignment):inline-block元素沿着默认的基线对齐。浮动元素紧贴顶部。你可以通过vertical属性设置这个默认基线,但对浮动元素这种方法就不行了。这也是我倾向于inline-block的主要原因。
  4. 空白(Whitespace):inline-block包含html空白节点。如果你的html中一系列元素每个元素之间都换行了,当你对这些元素设置inline-block时,这些元素之间就会出现空白。而浮动元素会忽略空白节点,互相紧贴
  5. IE6和IE7:Ie67对此属性部分支持。如果你要兼容这些浏览器,必须解决这个问题。这不是个大问题,但值得留意一下。

box module

现在我们对块级元素设置了display:inline-block,图片左侧,元素之间出现空白。如果我们移除元素之间的空白(换行),就得到了图片右侧的效果。这是唯一的区别。(详细介绍可以参阅如何解决inline-block元素的空白间距)

解决空白问题

你现在估计已经跃跃欲试了,不过估计不想让那些空白出现。这里有一些方法来去掉空白:

  1. 删除html中的空白:不要让元素之间换行,这可能比较蛋疼,但也是一种方法,特别是你元素不多的时候。
  2. 使用负边距:你可以用负边距来补齐空白。但你需要调整font-size,因为空白的宽度与这个属性有关系。我认为是0.25em,但我不确定。如果有人知道可以留言告诉我。
  3. 给父元素设置font-size:0:不管空白多大,由于空白跟font-size的关系,设置这个属性即可把空白的宽度设置为0.在实际使用的时候,你还需要给子元素重新设置font-size。

什么时候使用inline-block,什么时候使用float

什么时候使用,取决于你的设计稿跟解决方法。如果你需要文字环绕容器,那浮动是不二选择。如果你需要居中对齐元素,inline-block是个好选择。

最终,这可以归结为float跟inline-block的两种属性作用后的区别,你需要对其作出选择。

  1. 使用inline-block:当你需要控制元素的垂直对齐跟水平排列时,使用inline-block。
  2. 使用浮动:当你需要让元素环绕某一个元素时,或者需要支持旧版本ie,或者不想处理inline-block带来的空白问题时,使用浮动。

box module

上图,把一系列元素设置了浮动,因为盒子二号宽度的关系,可以发现盒子五号被挤进去了(这些元素都脱离了文档流),这是图片排列中很常见的问题。

浮动、inline-block和图像排列

我使用inline-block主要是为了处理垂直对齐问题。我想这也是很多人使用这个属性的原因。我制作的很多站点都不可避免的带有一些图片列表

若父元素中的图片等高,设置浮动就会工作正常。但一旦有一列图片比较高时,图片的排列就会出现问题。这是因为浮动后,图片脱离了文档流。

而inline-block由于未脱离文档流,不会出现这个问题。如果你想再创建一列图片时,不会受到上一列图片inline:block的影响。而你在使用时需要时刻注意清除浮动,当内容不断变化时这很容易产生bug。

这里有个更明显的例子来体现inline-block跟float的区别:

我制作了一个demo来展示一下两个写法效果的区别

box module

上面的块级元素被设置了inline-block。由于他们没有脱离文档流,所以元素不会被某个过长的列挤上来。

inline-block导航

另一种inline-block的适用场景:横向导航栏。通常,我们一般会设置a元素display:block然后进行浮动来制作。有时候我会直接通过对列表元素设置display:inline来制作。如果在制作中,你需要设置不同的display属性来处理浮动,那么inline-block不失为一种更好的解决方案。

当你需要将元素排列成一行或者多行时,更倾向于考虑使用inline-block代替float。当然,直接使用table也是一种方法,他毕竟是专门用来处理横向与纵向排列的元素的。

如果你需要创建一个很复杂的包含行列的布局,table是你的最佳选择,不过你同样也可以考虑inline-block

总结

我们经常使用浮动,但浮动并不是唯一的解决方案。有时候inline-block会更好,特别是你想排列一些图片,或者横向排列链接时。

Inline-block元素带有一些行内元素的特征(横向排列),同时内部也拥有块级元素的属性。这个跟浮动很类似,只不过有些区别。

这些区别决定了你该使用哪种方案。如果你很纠结垂直对齐问题或者横向排列元素,不妨使用inline-block。如果你需要对一个元素跟围绕他的一些元素进行更多控制,你需要浮动。

当然,table也是你处理一些问题的最佳方案。

同样我想说的,这不是什么新东西,但我会通过这篇文档还有demo来介绍一些应该使用但有些人尚未使用inline-block的场景。

非常感谢你阅读此文,希望这篇文章可以真正在你学习使用css的时候帮到你。当然有意见跟建议你也可以提出来~

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

如需转载烦请注明出处:

英文原文:http://www.vanseodesign.com/css/inline-blocks/

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

藤藤每日一练——Pure CSS3 Create Pagination

$
0
0
藤藤每日一练——Pure CSS3 Create Pagination

Pagination(分页导航)效果,可以说每个网站都会有的效果,制作原理简单,今天我们也用css3制作了一个分页导航的效果,整个效果使用的CSS3属性很少,主要使用gradient来制作了渐变图片,使用border-radius来制作了圆角,不过藤藤在这个案例中为了模仿“active”效果,使用了“:target”属性来做的,实际生产中建议这么使用,因为active可以通过程序来控制,不是我们CSS的菜。详细的看代码吧,希望大家喜欢。

demodownload

HTML Code

<ul class="pager">
  <li id="first"><a href="#first">« First</a></li>
  <li id="page_up"><a href="#page_up">«</a></li>
  <li id="one"><a href="#one">1</a></li>
  <li id="two"><a href="#two">2</a></li>
  <li id="three"><a href="#three">3</a></li>
  <li id="four"><a href="#four">4</a></li>
  <li id="five"><a href="#five">5</a></li>
  <li id="six"><a href="#six">6</a></li>
  <li id="seven"><a href="#seven">7</a></li>
  <li id="next_page"><a href="#next_page">»</a></li>
  <li id="last"><a href="#last">Last »</a></li>
</ul>

CSS Code

body {
  background-color: #262626;
}
.demo {
  width: 400px;
    margin: 40px auto 0;
}
.pager li {
  display: inline-block;
  line-height: 25px;
}
.pager 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);
}
.pager a:hover {
  text-decoration: none;
  box-shadow: 0 1px 0 #f9bd71 inset,0 1px 0 #0a0a0a;
  background: linear-gradient(top,#f48b03,#c87100);
}
.pager li:target a {
  box-shadow: 1px 0 5px #1a1a1b inset,1px 0 0 #2d2d2d,0 1px 0 #2d2d2d;
  background: linear-gradient(top,#252627,#1c1c1e);
}

demodownload

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

面向对象的CSS(OOCSS)

$
0
0

特别声明:此篇文章由D姐根据的英文文章原名《An Introduction To Object Oriented CSS (OOCSS)》进行翻译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss以及作者相关信息

作者:

译者:D姐

你曾经听过这样一句话:“内容就是王道”吗?作为一位Web开发者,因为工作的缘故经常与内容打交道,这可能是很正常不过了。对于我们已经是过渡使用,但是什么才能把游客吸引到一个网站才是真正的一道。

从一个Web开发者的观点来看,一些人认为速度才是王道。久而久之,我也开始认同这个观点。近年来许多有经验的前端工程题提供建议"如何才能通过一些最佳实践的方法提高用户体验度呢?"

不幸的是,众多开发者忽视了CSS的表现(认为他太过简单,是一种机械的工作),而把更多关注在Javascript的性能上或者其他方面。

在这篇文章中,我将通过面向对象的css概念的介绍,让你了解一些经常被忽视的地方是如何在改善用户体验和网页可维护性上面发挥作用的。

OOCSS面向对象的css原则

任何基于面向对象的代码方法,其主要目的都是鼓励代码的复用。OOCSS也是一样,讲究复用,并最终可以更快更高效的书写你的样式,同时方便日后的添加和维护。

oocss

根据oocss在github上的描述,oocss是基于两个主要原则

1、结构与样式的分离

几乎页面上的每个元素都有不同的视觉特效(也叫皮肤),他们在不同的环境中重复的在使用。思考一下,一个网站的品牌logo,它的颜色,细微的渐变或是可见的边框。另一方不是视觉特效(结构)也在不断的重复使用。

当把这些不同的特性抽象到一个基于类的模块里,他们变得可复用,可以运用到任何的元素上,并且具有相同的效果。让我们来看一个代码的前后对比,你就明白我在说些什么了。

在运用oocss的原则前,你的css可能是这个样子的:

#button {
  width: 200px;
  height: 50px;
  padding: 10px;
  border: solid 1px #ccc;
  background: linear-gradient(#ccc, #222);
  box-shadow: rgba(0, 0, 0, .5) 2px 2px 5px;
}

#box {
  width: 400px;
  overflow: hidden;
  border: solid 1px #ccc;
  background: linear-gradient(#ccc, #222);
  box-shadow: rgba(0, 0, 0, .5) 2px 2px 5px;
}

#widget {
  width: 500px;
  min-height: 200px;
  overflow: auto;
  border: solid 1px #ccc;
  background: linear-gradient(#ccc, #222);
  box-shadow: rgba(0, 0, 0, .5) 2px 2px 5px;
}

上面的三个元素都有各自的样式,而且都是用不可复用的id选择器定义的样式。但是他们也有一些公用的样式。这些公用的样式由网站品牌风格或设计风格所决定的。

由于一些长远考虑,我们抽象出一些公用的样式所以结果成这样:

.button {
  width: 200px;
  height: 50px;
}

.box {
  width: 400px;
  overflow: hidden;
}

.widget {
  width: 500px;
  min-height: 200px;
  overflow: auto;
}

.skin {
  border: solid 1px #ccc;
  background: linear-gradient(#ccc, #222);
  box-shadow: rgba(0, 0, 0, .5) 2px 2px 5px;
}
 

现在给所有元素运用类名,公用的样式部分整合到一个类名“skin”上,用来复用到元素上。我们只需要把“skin”类名添加给所有的元素,除了更少的使用了利用代码之外,其效果和前面的例子前生的效果一模一样。

2、容器与内容的分离

关于oocss在github上的描述,第二个原则是容器与内容的分离。为了说明这个的重要性,采用以下css:

#sidebar h3 {
  font-family: Arial, Helvetica, sans-serif;
  font-size: .8em;
  line-height: 1;
  color: #777;
  text-shadow: rgba(0, 0, 0, .3) 3px 3px 6px;
}

这些样式将运用到ID为“#sidebar”的子元素“h3”上,但是如果想把字体大小和文本阴影之外的样式运用到脚部具有相同效果的“h3”上,又应该怎么办?

然后我们也许需要这样做:

#sidebar h3, #footer h3 {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 2em;
  line-height: 1;
  color: #777;
  text-shadow: rgba(0, 0, 0, .3) 3px 3px 6px;
}

#footer h3 {
  font-size: 1.5em;
  text-shadow: rgba(0, 0, 0, .3) 2px 2px 4px;
}

或许我们可能会写的更糟糕:

#sidebar h3 {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 2em;
  line-height: 1;
  color: #777;
  text-shadow: rgba(0, 0, 0, .3) 3px 3px 6px;
}

/* other styles here.... */

#footer h3 {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 1.5em;
  line-height: 1;
  color: #777;
  text-shadow: rgba(0, 0, 0, .3) 2px 2px 4px;
}

这样写代码的,或许初学人员会经常犯的,就算是你从事过前端工作一段时间,有一定的经验了,或许还是会犯这样的错误。犯错误是好事,但是犯了这样的错误你是否有思考过,为什么会写成这样?如果你从没有思考过,只是照旧这样写,那就是糟糕的一件事了。因为你只是在机械的工作,为了完成boss给你的任务而且。长期下来是件恐怖的事情。

大漠

今天我们没有复用样式可能觉得不必要,也许没有意识到(或是简单的根本不关心)。随着OOCSS的推行,我们鼓励大家长远考虑一下不同元素的公用样式是什么?然后把他们分离成模块或是对象,以便可以重复用到任何需要的地方。

在上面的例子中,用后代选择器声明的样式是不能复用的,因为他们依赖于一个特定的容器(在这里例子里要么是侧栏要么是页脚)。

当我们用基于oocss建立的类模块,我们确保我们的样式不依赖于任何包含元素。这意味着他们可以在文档的任何地方被复用,无论结构如何。

3、现实生活中的一个例子

为了进一步说明oocss是如何运用的,在我的网站最新设计我将做一些类似的工作。在我编写完我的网站页头的inner元素后,我意识到这个头部内部的一些基础结构也许可以复用到页面的其他元素上。

如下是我沿用以前的写法开始写的页头样式

.header-inside {
  width: 980px;
  height: 260px;
  padding: 20px;
  margin: 0 auto;
  position: relative;
  overflow: hidden;
}

列在这里的一些样式是类名为“header-inner”元素的独特样式。但是其余可以复用的样式我都把他们组成一个模块。这样我就可以抽出结构,样式添加到我们自己的复用类里,如:

.globalwidth {
  width: 980px;
  margin: 0 auto;
  position: relative;
  padding-left: 20px;
  padding-right: 20px;
  overflow: hidden;
}

.header-inside {
  padding-top: 20px;
  padding-bottom: 20px;
  height: 260px;
}

属于globalwidth类中的样式罗列如下

  1. 固定宽度
  2. 用margin:auto居中
  3. 为子元素创建一个定位的参照物
  4. 左右内留白padding为20px
  5. 为清除浮动设置overflow:hidden

现在我们可以自由的把这些样式运用到需要相同特征的任何元素,只需给需要的元素添加类名的简单方式,而无需写一行额外的css代码。

对于我的网站,我在主要的内容元素和页脚内部元素复用了这些结构样式。根据设计,这些样式也许可以运用到水平导航元素,可能会出现在标题和内容,或是任何有固定宽需要在页面居中的其他元素。

给这些元素添加“globalwidth”样式后,结构可能是这样的:

<header>
  <div class="header-inside globalwidth">
  </div>
</header>

<div class="main globalwidth">
</div>

<footer>
  <div class="footer-inside globalwidth">
  </div>
</footer>

也许有人会觉得这种抽象html结构样式的方式,有悖于结构与表现分离的原则

媒体对象

Nicole Sullivan是OOCSS先驱者之一,她创建了一个可以复用的模块称为媒体对象,正如她解释道,可以节省数百行的代码

oocss

媒体对象是体现oocss能力的很好的例子,因为它里面容许包含任何尺寸的媒体元素的内容。尽管许多在他内部运用样式的内容甚至是媒体元素大小本身可能改变,但是媒体对象本身具有的通用基本样式有助于避免不必要的重复。

有关于媒体模块介绍,如果你阅读英文感觉吃力的话,可以看看w3cplus的相关介绍《CSS制作Facebook的媒体对象》、《OOCSS——核心篇

大漠

OOCSS的好处

我已经提到了一些oocss的好处。这里我将对他们做些扩展

1、更快的网站

Oocss带来的好处是很明显的。如果在你的css中有较少的重复样式,那么将使得文件体积更小,从而更快的下载这些资源。

的确,标记将更加混乱,从而创建更大的HTML文件。但是许多情况下标记结构损失很多,却换来了样式表现性能大大提升的效果。

另一个需要记住的概念是在oocss的wiki里面提到他的附属品。这指的是每次在你的css中复用一些样式,本质上就会创建一个有着0行样式的元素。对于大型,高流量的项目,这些附属品有可能是影响性能表现的关键因素。

2、可维护的样式表

随着oocss取代不断增长的特殊样式表,你将有一个易于维护的模块,在里面层叠发挥了重要的作用。

当在现有网站上添加新页面,你将不会不考虑前面的代码,直接在样式表最后添加新的样式。相反你将会复用现有的样式,并在现有样式的基础上扩展你需要的样式。

随着这种类型的长远设想,有可能创建一整个页面只有很少的css代码。任何css模块可以作为所有新页面的基础,这样新css页面就会很小。在某种情况下甚至可以创建一个全新样式的页面却没有一行css代码。

这些可维护性的好处也增强了你的样式表的健壮性。因为样式表已经模块化了,页面是基于oocss搭建的,所以即使一个新开发人员开始使用样式表也不太会破坏它。

需要注意的问题

在社区中对oocss的建立有很大的讨论,并引起了一些争议。这里我想尝试消除一些常见的误解

1、你仍可以使用id

如果你决定用oocss作为你工作的唯一方式,然后你的样式将大量基于css类名建立,你将不会使用id选择器给元素创建样式。

正因为如此,许多人错误声称oocss鼓励完全放弃id的使用。但这是不对的。

避免使用id的规则更具体的说,不在选择器中使用id。所以这是oocss使用原则完全接受的(避免样式使用id选择器),因为你html中的id是用于javascript的钩子和片段标识。

当然,你可能有这样一种情况:你已经把一个id运用到一个元素,而这个元素你知道他在页面中是唯一的。所以,你避免在元素上添加类名节省了几个字节,而是给他使用了id选择器。但是即使在这样一个例子中,依赖于一个类名是更安全的,因为他确保未来你不会遇到特殊的问题。

2、处理较小的项目

对于较小的网站和应用程序,你也许认定oocss在这种情况下是大材小用了。所以这篇文章中倡导的oocss并不适用于所有的项目,他将取决于这个项目本身。

尽管如此,我认为这是个好主意,至少在你所有的项目中开始考虑oocss的运用。一旦你掌握了他的诀窍,我肯定你会很容易发现,他致力于越大的项目收到oocss带来的好处就越明显。

一些实用指导

开始应用oocss是可能需要一些时间的,我现在仍在使用它,所以我不敢声称我知道这一领域的所有答案和经验。

但是这里有些注意事项可能帮助你用oocss的思维方式开始使用oocss:

  1. 避免后代选择器(如不要使用类似于.sidebar h3)
  2. 避免用id作为样式钩子
  3. 避免在你的样式表中给类名附属一个元素名(如不要这样做div.header or h1.title)
  4. 除非一些很少的情况,避免使用!important
  5. 使用CSS Lint检查你的css(这样你可以知道他有哪些选项和疯狂的方法
  6. 使用CSS网格

很显眼有些规则将被打破还需要一些时间,但总体而言,这些对于开发都是好习惯,而且将使得样式表体积更小更易维护。

Nicole Sullivan的著作

如果你想要继续学习有关oocss,那你需要紧跟Nicole Sullivan,本行业最重要的人物

除了在她的blog上定期发布oocss的相关文章,妮可已经做了大量的报告并附有幻灯片。以下你也许有兴趣想看看:

  1. Object Oriented CSS
  2. High Performance Websites: Nicole Sullivan
  3. Our Best Practices Are Killing Us
  4. CSS Bloat

总结

总的来说,我认为oocss在CSS的发展中有一个光明的未来,它是一个概念,所有的开发人员应该开始纳入他们的项目——至少在某种程度上——来帮助创建Web页面更快、更高效、更容易维护

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

如需转载烦请注明出处:

英文原文:http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss

中文译文:http://www.w3cplus.com/css/an-introduction-to-object-oriented-css-oocss.html

Viewing all 1557 articles
Browse latest View live