HTML5+CSS3构建同页面表单间的动画切换

  导读:有开发者表示,HTML5将给个人开发者带来更多机遇。下面的稿件详细描述了一个唯美的动画效果,它实现了在同一个页面中进行登录表单和注册表单的转换。这些效果,完全由HTML5和CSS3实现。文章后面附上了三种不同风格的显示转换效果、以及源码下载。既可为网页瘦身,又可实现漂亮的网页效果,快快收藏吧。

这篇稿件将描述如何在HTML5中,使用CSS3的目标伪类“:target”来创建注册和登录两个表单、并实现它们在同一个页面中的显示转换。此演示目的是向用户展示从登录表单点击标注有“Join us”的按钮链接到注册表单的动画效果。我们将在文章末尾附上本实例的源码下载地址。

点击右下方Join us按钮,登录表单隐藏,注册表单显现

请注意,此实例只用于演示目的,它只能在支持“:target”伪类的浏览器中正常显示出来。

HTML部分

在HTML中定义有两个表单,其中一个表单已用CSS隐藏使之不可见。来看看代码:

 
 
  1. <div id="container_demo" > 
  2.     <!-- hidden anchor to stop jump http://www.css3create.com/Astuce-Empecher-le-scroll-avec-l-utilisation-de-target#wrap4  --> 
  3.     <a class="hiddenanchor" id="toregister"></a> 
  4.     <a class="hiddenanchor" id="tologin"></a> 
  5.     <div id="wrapper"> 
  6.         <div id="login" class="animate form"> 
  7.             <form  action="mysuperscript.php" autocomplete="on"> 
  8.                 <h1>Log in</h1> 
  9.                 <p> 
  10.                     <label for="username" class="uname" data-icon="u" > Your email or username </label> 
  11.                     <input id="username" name="username" required="required" type="text" placeholder="myusername or mymail@mail.com"/> 
  12.                 </p> 
  13.                 <p> 
  14.                     <label for="password" class="youpasswd" data-icon="p"> Your password </label> 
  15.                     <input id="password" name="password" required="required" type="password" placeholder="eg. X8df!90EO" /> 
  16.                 </p> 
  17.                 <p class="keeplogin"> 
  18.                     <input type="checkbox" name="loginkeeping" id="loginkeeping" value="loginkeeping" /> 
  19.                     <label for="loginkeeping">Keep me logged in</label> 
  20.                 </p> 
  21.                 <p class="login button"> 
  22.                     <input type="submit" value="Login" /> 
  23.                 </p> 
  24.                 <p class="change_link"> 
  25.                     Not a member yet ? 
  26.                     <a href="#toregister" class="to_register">Join us</a> 
  27.                 </p> 
  28.             </form> 
  29.         </div> 
  30.   
  31.         <div id="register" class="animate form"> 
  32.             <form  action="mysuperscript.php" autocomplete="on"> 
  33.                 <h1> Sign up </h1> 
  34.                 <p> 
  35.                     <label for="usernamesignup" class="uname" data-icon="u">Your username</label> 
  36.                     <input id="usernamesignup" name="usernamesignup" required="required" type="text" placeholder="mysuperusername690" /> 
  37.                 </p> 
  38.                 <p> 
  39.                     <label for="emailsignup" class="youmail" data-icon="e" > Your email</label> 
  40.                     <input id="emailsignup" name="emailsignup" required="required" type="email" placeholder="mysupermail@mail.com"/> 
  41.                 </p> 
  42.                 <p> 
  43.                     <label for="passwordsignup" class="youpasswd" data-icon="p">Your password </label> 
  44.                     <input id="passwordsignup" name="passwordsignup" required="required" type="password" placeholder="eg. X8df!90EO"/> 
  45.                 </p> 
  46.                 <p> 
  47.                     <label for="passwordsignup_confirm" class="youpasswd" data-icon="p">Please confirm your password </label> 
  48.                     <input id="passwordsignup_confirm" name="passwordsignup_confirm" required="required" type="password" placeholder="eg. X8df!90EO"/> 
  49.                 </p> 
  50.                 <p class="signin button"> 
  51.                     <input type="submit" value="Sign up"/> 
  52.                 </p> 
  53.                 <p class="change_link"> 
  54.                     Already a member ? 
  55.                     <a href="#tologin" class="to_register"> Go and log in </a> 
  56.                 </p> 
  57.             </form> 
  58.         </div> 
  59.   
  60.     </div> 
  61. </div> 

可以看到在上面的代码中,使用了一些HTML5不错的新功能。比如在input type方面,实现密码自动隐藏用户键入点替换(当然这取决于浏览器是否支持)。用浏览器检查输入类型的电子邮件是否是正确格式等。

有两个环节要记住。你可能已经注意到表单项部的两个<a href>链接。当我们点击并触发目标伪类时,我们就能通过“锚”标记(HTML中一种跳转定位方式,一般用于长网页)在原网页中跳到合适的位置,而不用另打开一个新网页。第二个动作与所用图标、字体相关。我们为显示的图标使用一个数据属性。在HTML中通过设置“icon_character”,就可以选择一个CSS来控制所有的图标风格样式。(这里对于锚标记的使用可能会有些糊涂,但看到后面就会明白了。)

CSS部分

这里将会出现一些CSS3的技巧代码,请注意,可能有的浏览器目前还不支持CSS3而无法正常显示。

两个CSS定义。(后面会说明为什么要定义两个CSS的原因。)

首先,为需要显示的区域定义一个外观。

 
 
  1. #subscribe, 
  2. #login{ 
  3.     position: absolute; 
  4.     top: 0px; 
  5.     width: 88%; 
  6.     padding: 18px 6% 60px 6%; 
  7.     margin: 0 0 35px 0; 
  8.     background: rgb(247, 247, 247); 
  9.     border: 1px solid rgba(147, 184, 189,0.8); 
  10.     box-shadow: 
  11.         0pt 2px 5px rgba(105, 108, 109,  0.7), 
  12.         0px 0px 8px 5px rgba(208, 223, 226, 0.4) inset; 
  13.     border-radius: 5px; 
  14. #login{ 
  15.     z-index: 22; 

这里定义了投影,以及如文章开始的那张图上所示的蓝色辉光。并赋值z-index为22。

下面是关于背景图片样式的代码:

 
 
  1. /**** general text styling ****/ 
  2. #wrapper h1{ 
  3.     font-size: 48px; 
  4.     color: rgb(6, 106, 117); 
  5.     padding: 2px 0 10px 0; 
  6.     font-family: 'FranchiseRegular','Arial Narrow',Arial,sans-serif; 
  7.     font-weight: bold; 
  8.     text-align: center; 
  9.     padding-bottom: 30px; 
  10.   
  11. /** For the moment only webkit supports the background-clip:text; */ 
  12. #wrapper h1{ 
  13.     background: 
  14.     -webkit-repeating-linear-gradient(-45deg, 
  15.         rgb(18, 83, 93) , 
  16.         rgb(18, 83, 93) 20px, 
  17.         rgb(64, 111, 118) 20px, 
  18.         rgb(64, 111, 118) 40px, 
  19.         rgb(18, 83, 93) 40px); 
  20.     -webkit-text-fill-color: transparent; 
  21.     -webkit-background-clip: text; 
  22.   
  23. #wrapper h1:after{ 
  24.     content:' '; 
  25.     display:block; 
  26.     width:100%; 
  27.     height:2px; 
  28.     margin-top:10px; 
  29.     background: 
  30.         linear-gradient(left, 
  31.             rgba(147,184,189,0) 0%, 
  32.             rgba(147,184,189,0.8) 20%, 
  33.             rgba(147,184,189,1) 53%, 
  34.             rgba(147,184,189,0.8) 79%, 
  35.             rgba(147,184,189,0) 100%); 

注意,由于目前只有WebKit浏览器支持background-clip: text,为了在适应不同浏览器,还要创建一个H1标题样式:带条纹背景的文本样式。由于background-clip: text只适用于WebKit,所以这里用WebKit作前缀,这也是为什么要把CSS分成两部分,并只使用来定义的原因。用WebKit作前缀是不太好的做法,仅用于这种演示示例。现在,WebKit的文本颜色透明度属性可以派上用场了:它可以实现透明效果的背景样式。

表单上,标题下方那条水平线的样式也由一个after伪类控制。这里使用了一个2px的高度和两边淡出的效果。

现在,接着进行样式定义。

 
 
  1. /**** advanced input styling ****/ 
  2. /* placeholder */ 
  3. ::-webkit-input-placeholder  { 
  4.     color: rgb(190, 188, 188); 
  5.     font-style: italic; 
  6. input:-moz-placeholder, 
  7. textarea:-moz-placeholder{ 
  8.     color: rgb(190, 188, 188); 
  9.     font-style: italic; 
  10. input { 
  11.   outline: none; 

为输入样式定义outline属性,以便用户能迅速输入正确信息。如果你不打算定义outline,那也应该使用 :active 和 :focus来定义这些输入样式的状态。

 
 
  1. /* all the input except submit and checkbox */ 
  2. #wrapper input:not([type="checkbox"]){ 
  3.     width: 92%; 
  4.     margin-top: 4px; 
  5.     padding: 10px 5px 10px 32px; 
  6.     border: 1px solid rgb(178, 178, 178); 
  7.     box-sizing : content-box; 
  8.     border-radius: 3px; 
  9.     box-shadow: 0px 1px 4px 0px rgba(168, 168, 168, 0.6) inset; 
  10.     transition: all 0.2s linear; 
  11. #wrapper input:not([type="checkbox"]):active, 
  12. #wrapper input:not([type="checkbox"]):focus{ 
  13.     border: 1px solid rgba(91, 90, 90, 0.7); 
  14.     background: rgba(238, 236, 240, 0.2); 
  15.     box-shadow: 0px 1px 4px 0px rgba(168, 168, 168, 0.9) inset; 

这里我们并不全是用伪类去定义输入样式,除了checkbox。因为删除了outline属性,所以这里使用了 a :focus 和:active 状态定义。自从不再为输入样式使用:before 和 :after伪类后,就使用图标的label标签进行设置。这里使用了fontomas库中的一些漂亮图标。还记得data-icon 的属性吗?要把信息传递到正确的地方。这里使用data-icon=’u’ 来表示用户, ‘e’ 表示email, ‘p’ 表示密码。一旦确定的信件,下载字体,用fontsquirrel字体引擎将这些信息转换成@font-face兼容格式。

 
 
  1. @font-face { 
  2.     font-family: 'FontomasCustomRegular'; 
  3.     src: url('fonts/fontomas-webfont.eot'); 
  4.     src: url('fonts/fontomas-webfont.eot?#iefix') format('embedded-opentype'), 
  5.          url('fonts/fontomas-webfont.woff') format('woff'), 
  6.          url('fonts/fontomas-webfont.ttf') format('truetype'), 
  7.          url('fonts/fontomas-webfont.svg#FontomasCustomRegular') format('svg'); 
  8.     font-weight: normal; 
  9.     font-style: normal; 
  10.   
  11. /** the magic icon trick ! **/ 
  12. [data-icon]:after { 
  13.     content: attr(data-icon); 
  14.     font-family: 'FontomasCustomRegular'; 
  15.     color: rgb(106, 159, 171); 
  16.     position: absolute; 
  17.     left: 10px; 
  18.     top: 35px; 
  19.     width: 30px; 

不用为每个图标指定一个类,而是使用content: attr(data-icon) 来检查data-icon属性信息。所以只需要定义字体、颜色和位置。

现在,为两个表单中的提交按钮定义样式。

 
 
  1. /*styling both submit buttons */ 
  2. #wrapper p.button input{ 
  3.     width: 30%; 
  4.     cursor: pointer; 
  5.     background: rgb(61, 157, 179); 
  6.     padding: 8px 5px; 
  7.     font-family: 'BebasNeueRegular','Arial Narrow',Arial,sans-serif; 
  8.     color: #fff; 
  9.     font-size: 24px; 
  10.     border: 1px solid rgb(28, 108, 122); 
  11.     margin-bottom: 10px; 
  12.     text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5); 
  13.     border-radius: 3px; 
  14.     box-shadow: 
  15.         0px 1px 6px 4px rgba(0, 0, 0, 0.07) inset, 
  16.         0px 0px 0px 3px rgb(254, 254, 254), 
  17.         0px 5px 3px 3px rgb(210, 210, 210); 
  18.     transition: all 0.2s linear; 
  19. #wrapper p.button input:hover{ 
  20.     background: rgb(74, 179, 198); 
  21. #wrapper p.button input:active, 
  22. #wrapper p.button input:focus{ 
  23.     background: rgb(40, 137, 154); 
  24.     position: relative; 
  25.     top: 1px; 
  26.     border: 1px solid rgb(12, 76, 87); 
  27.     box-shadow: 0px 1px 6px 4px rgba(0, 0, 0, 0.2) inset; 
  28. p.login.button, 
  29. p.signin.button{ 
  30.     text-align: right; 
  31.     margin: 5px 0; 

这里是一个创建边框投影的技巧,你可以随意设置一条或多条边框投影。这里使用length value来创建一个“假”的第二条边框,宽度为3px,无模糊效果。接着定义复选框的样式:

 
 
  1. /* styling the checkbox "keep me logged in"*/ 
  2. .keeplogin{ 
  3.     margin-top: -5px; 
  4. .keeplogin input, 
  5. .keeplogin label{ 
  6.     display: inline-block; 
  7.     font-size: 12px; 
  8.     font-style: italic; 
  9. .keeplogin input#loginkeeping{ 
  10.     margin-right: 5px; 
  11. .keeplogin label{ 
  12.     width: 80%; 

为表单使用重复线性渐变的样式,以实现条纹背景效果。

 
 
  1. p.change_link{ 
  2.     position: absolute; 
  3.     color: rgb(127, 124, 124); 
  4.     left: 0px; 
  5.     height: 20px; 
  6.     width: 440px; 
  7.     padding: 17px 30px 20px 30px; 
  8.     font-size: 16px ; 
  9.     text-align: right; 
  10.     border-top: 1px solid rgb(219, 229, 232); 
  11.     border-radius: 0 0  5px 5px; 
  12.     background: rgb(225, 234, 235); 
  13.     background: repeating-linear-gradient(-45deg, 
  14.     rgb(247, 247, 247) , 
  15.     rgb(247, 247, 247) 15px, 
  16.     rgb(225, 234, 235) 15px, 
  17.     rgb(225, 234, 235) 30px, 
  18.     rgb(247, 247, 247) 30px 
  19.     ); 
  20. #wrapper p.change_link a { 
  21.     display: inline-block; 
  22.     font-weight: bold; 
  23.     background: rgb(247, 248, 241); 
  24.     padding: 2px 6px; 
  25.     color: rgb(29, 162, 193); 
  26.     margin-left: 10px; 
  27.     text-decoration: none; 
  28.     border-radius: 4px; 
  29.     border: 1px solid rgb(203, 213, 214); 
  30.     transition: all 0.4s  linear; 
  31. #wrapper p.change_link a:hover { 
  32.     color: rgb(57, 191, 215); 
  33.     background: rgb(247, 247, 247); 
  34.     border: 1px solid rgb(74, 179, 198); 
  35. #wrapper p.change_link a:active{ 
  36.     position: relative; 
  37.     top: 1px; 

现在,我们已经定义了两个漂亮的样式了,但在一个时间段里,只需要显示一个。所以,现在用动画效果来实现。

创建切换动画

首先是将不透明度设为0以隐藏表单:

 
 
  1. #register{ 
  2.     z-index: 21; 
  3.     opacity: 0; 

还记得吗?前面登录表单中z-index的值为22。上面这段代码的动作是把z-index的值定义为21,让它可以处在登录表单的上一层(指显示顺序,数字小的显示在前面)。

重点部分:target目标伪类。这里将使用“锚”进行两个表单间的显示过渡。“锚”链接的一般用法,是在页面上的两处实现跳转。但这里并不希望跳转到别处,只需要表单显示的切换。这里的诀窍在于表单顶部的两个小环节中,当点击“锚”标记时,触发第一个表单的显示设置“none”。这样,就避免了任何的页面跳转。

 
 
  1. #toregister:target ~ #wrapper #register, 
  2. #tologin:target ~ #wrapper #login{ 
  3.     z-index: 22; 
  4.     animation-name: fadeInLeft; 
  5.     animation-delay: .1s; 

当点击登录表单上的“Join us”按钮时,就会触发 #toregister,然后通过选择找到#register,激活动画fadeInLeft。使隐藏的表单慢慢显现出来,并同时改变其z-index值,让这个表单出现在其它表单的上面。

下面是实现这种动画样式的代码。

 
 
  1. .animate{ 
  2.     animation-duration: 0.5s; 
  3.     animation-timing-function: ease; 
  4.     animation-fill-mode: both; 
  5. @keyframes fadeInLeft { 
  6.     0% { 
  7.         opacity: 0; 
  8.         transform: translateX(-20px); 
  9.     } 
  10.   
  11.     100% { 
  12.         opacity: 1; 
  13.         transform: translateX(0); 
  14.     } 

表单用“disappearing”的动画形式从左边淡出:

 
 
  1. #toregister:target ~ #wrapper #login, 
  2. #tologin:target ~ #wrapper #register{ 
  3.     animation-name: fadeOutLeftBig; 
  4.   
  5. @keyframes fadeOutLeft { 
  6.     0% { 
  7.         opacity: 1; 
  8.         transform: translateX(0); 
  9.     } 
  10.   
  11.     100% { 
  12.         opacity: 0; 
  13.         transform: translateX(-20px); 
  14.     } 

上面的动画实现代码来自Dan Eden的 animate.css,把其中的动画名称修改为自己的表单对象就可以实现。里面还有一些其他的自定义动画。

(需要注意的是,有些浏览器还不支持background-clip: text。IE9中,过渡和动画效果就无法显示,IE8及更低版本的浏览器还不支持CSS3中的伪类。)

英文原址:tympanus.net

实例演示地址:

从左开始渐变显示的动画效果

从左滑动呈现的动画效果

从小放大的动画效果

点击开始源代码下载

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值