构建移动网站与APP:HTML 5移动开发入门与实战(跨平台移动开发丛书)
上QQ阅读APP看书,第一时间看更新

2.4 范例——创建一个HTML 5版的APP注册页面

本例是一个常见的用户注册页面,表单由3个文本框组成,类型分别为email、text和password。进入页面后,鼠标会自动聚焦到“电子邮箱”文本框,同时文本框的边框会产生红色渐变的效果。点击“昵称”文本框,“电子邮件”文本框的边框红色消失,此时“昵称”文本框的边框出现红色渐变效果,“密码”文本框的效果相同。

使用支持HTML 5表单新特性的浏览器Google Chrome打开网页文件,运行效果如图2.11所示。打开网页的同时,“电子邮箱”文本框会渐变为红色,运行效果如图2.12所示。点击“注册”按钮,进行表单验证,运行效果如图2.13所示。

图2.11 HTML 5版的注册页面

图2.12 “电子邮件”文本框的边框变红

本例中采用了大量的CSS 3特效,包括刚进入页面聚焦渐变的动画、表单背景色的颜色渐变、文本框的阴影等。通过本示例可以了解如何运用CSS 3制作一个简单的注册页面。

图2.13 点击“注册”按钮

2.4.1 代码设计

利用编辑器编辑如下代码,并保存为“2-3.创建一个HTML 5版的注册页面.html”文件。

【代码2-3】

        01    <! doctype html>
        02    <html>
        03    <head>
        04        <style>
        05            *:focus{ outline: none; }      /* 所有元素焦点样式 */
        06             body { text-align: center; }
        07            form                      /* 表单样式 */
        08             {
        09                  height: 240px;
        10                  width: 400px;
        11                  margin: -200px 0 0-240px;
        12                  padding: 30px;
        13                  position: absolute;
        14                  top: 50%;
        15                  left: 50%;
        16                  z-index: 0;
        17                  background-color: #eee;
        18
        19                /* gradient带webkit前缀被Safari 4+, Chrome支持 */
        20                  background-image: -webkit-gradient(linear, left top, left
                      bottom, from(#fff), to(#eee));
        21                /* linear-gradient带webkit前缀被Chrome 10+, Safari 5.1+, iOS
                      5+ 支持 */
        22                  background-image: -webkit-linear-gradient(top, #fff, #eee);
        23                /* linear-gradient带moz前缀被Firefox 3.6-15 支持 */
        24                  background-image: -moz-linear-gradient(top, #fff, #eee);
        25                /* linear-gradient带ms前缀被IE9+ 支持 */
        26                  background-image: -ms-linear-gradient(top, #fff, #eee);
        27                /* linear-gradient带o前缀被Opera 10.5-12.00 支持 */
        28                  background-image: -o-linear-gradient(top, #fff, #eee);
        29                /* 标准格式linear-gradient被Opera 10.5, IE9+, Safari 5, Chrome,
        30                Firefox 4+, iOS 4, Android 2.1+ 支持 */
        31                  background-image: linear-gradient(top, #fff, #eee);
        32                /* border-radius带moz前缀被Firefox 3.5+ 支持 */
        33                  -moz-border-radius: 3px;
        34                /* border-radius带webkit前缀被Safari 3-4, iOS 1-3.2, Android
                      ≤1.6 支持*/
        35                  -webkit-border-radius: 3px;
        36                /* 标准格式border-radius被Opera 10.5, IE9+, Safari 5, Chrome,
        37                Firefox 4+, iOS 4, Android 2.1+支持 */
        38                  border-radius: 3px;
        39
        40                /* box-shadow带webkit前缀被Safari 3-4, iOS 4.0.2-4.2,
                      Android 2.3+ 支持 */
        41                  -webkit-box-shadow:  0 0 2px rgba(0, 0, 0, 0.2), 0 1px 1px
        42                   rgba(0, 0, 0, .2), 0 3px 0 #fff, 0 4px 0 rgba(0, 0, 0, .2) ;
        43                /* box-shadow带moz前缀被Firefox 4+ 支持 */
        44                  -moz-box-shadow:  0 0 2px rgba(0, 0, 0, 0.2), 0 1px 1px rgba(0,
        45                  0, 0, .2), 0 3px 0 #fff, 0 4px 0 rgba(0, 0, 0, .2) ;
        46                /* 标准格式box-shadow被Opera 10.5, IE9+, Firefox 4+, Chrome 6+,
                      iOS 5 支持*/
        47                  box-shadow: 0 0 2px rgba(0, 0, 0, 0.2), 0 1px 1px rgba(0, 0,
        48                  0, .2), 0 3px 0 #fff, 0 4px 0 rgba(0, 0, 0, .2) ;
        49             }
        50            form:before /* before伪元素表示在一个元素的内容之前插入content属性定义的
                  内容与样式*/
        51             {
        52                content: ''; /* content属性与:befor及:after伪元素配合使用,生成某个
        53                CSS选择器之前或之后的内容 */
        54                  position: absolute;
        55                  z-index: -1;
        56                  border: 1px dashed #ccc;
        57                  top: 5px;
        58                  bottom: 5px;
        59                  left: 5px;
        60                  right: 5px;
        61
        62                  -moz-box-shadow: 0 0 0 1px #fff;     /* Firefox 4+ */
        63                  -webkit-box-shadow: 0 0 0 1px #fff;   /* Safari 3-4, iOS 4.0.2
                      4.2, Android 2.3+ */
        64                  box-shadow: 0 0 0 1px #fff;        /* Opera 10.5, IE9+, Firefox
                      4+, Chrome 6+, iOS 5 */
        65             }
        66            input   /* 所有文本框样式 */
        67             {
        68                  float: left;
        69                  padding: 15px 15px 15px 45px;
        70                  margin: 0 0 10px 0;
        71                  width: 353px;
        72                  border: 1px solid #CCC;
        73                  background: #F1F1F1;
        74                  font-size: 14px;
        75                  -webkit-border-radius: 5px;
        76                  -moz-border-radius: 5px;
        77                  border-radius: 5px;
        78
        79                  -moz-border-radius: 5px;     /* Firefox 3.5+ */
        80                  -webkit-border-radius: 5px;    /* Safari 3-4, iOS 1-3.2, Android
                      ≤1.6 */
        81                border-radius: 5px;         /* Opera 10.5, IE9+, Safari 5, Chrome,
                      Firefox 4+, iOS 4, Android 2.1+ */
        82                  -moz-box-shadow: 0 1px 1px #ccc inset, 0 1px 0 #fff;    /* inset
                      表示盒内阴影;Firefox 4+ */
        83                  -webkit-box-shadow: 0 1px 1px #CCC inset, 0 1px 0 white; /*
                      Safari 3-4, iOS 4.0.2-4.2, Android
        84                  2.3+ */
        85                  box-shadow: 0 1px 1px #CCC inset, 0 1px 0 white;        /* Opera
                      10.5, IE9+, Firefox 4+,
        86                  Chrome 6+, iOS 5 */
        87
        88                /* ease(逐渐慢下来); linear(匀速); ease-in(由慢到快); ease-out(由快到
                      慢); ease-in-out(先慢到快再到
        89                慢) */
        90                  -webkit-transition: all 0.5s ease-in-out;        /* Safari 3.2+,
                      Chrome */
        91                  -moz-transition: all 0.5s ease-in-out;      /* Firefox 4-15 */
        92                  -o-transition: all 0.5s ease-in-out;    /* Opera 10.5-12.00 */
        93                  transition: all 0.5s ease-in-out;       /* Firefox 16+, Opera
                        12.50+ */
        94             }
        95            input:focus         /* 所有文本框焦点样式 */
        96             {
        97                  background-color: #fff;
        98                  border-color: #e8c291;
        99                  outline: none;
        100                -moz-box-shadow: 0 0 0 1px #e8c291 inset;
        101                -webkit-box-shadow: 0 0 0 1px #e8c291 inset;
        102                box-shadow: 0 0 0 1px #e8c291 inset;
        103            }
        104          input:hover         /* 所有文本框鼠标悬停样式 */
        105            {
        106                border-color: inherit ! important;
        107                background-color: #EfEfEf;
        108                -webkit-border-radius: 5px 0 0 5px;
        109                -moz-border-radius: 5px 0 0 5px;
        110                border-radius: 5px 0 0 5px;
        111            }
        112          input:not(:focus) { opacity: 0.6; }        /* 所有文本框非焦点样式 */
        113          input:valid { opacity: 0.8; }           /* 所有文本框输入有效样式 */
        114          input:focus:invalid                  /* 所有文本框焦点但输入无效样式 */
        115            {
        116                border: 1px solid red;
        117                background-color: #FFEFF0;
        118            }
        119          section   { width: 400px; margin: 0 auto; }       /* 章节样式 */
        120          .clearfix { clear: both; }                        /* 清除浮动样式 */
        121          #submit:hover,                             /* 提交按钮鼠标悬停和焦点样式 */
        122            #submit:focus
        123            {
        124                background-color: #FDDB6F;
        125
        126              /* 可以参考form样式中的gradient注释 */
        127                background-image: -webkit-gradient(linear, left top, left
                      bottom, from(#FFB94B), to(#FDDB6F));
        128                background-image: -webkit-linear-gradient(top, #FFB94B,
                      #FDDB6F);
        129                background-image: -moz-linear-gradient(top, #FFB94B, #FDDB6F);
        130                background-image: -ms-linear-gradient(top, #FFB94B, #FDDB6F);
        131                background-image: -o-linear-gradient(top, #FFB94B, #FDDB6F);
        132                background-image: linear-gradient(top, #FFB94B, #FDDB6F);
        133            }
        134          #submit             /* 提交按钮样式 */
        135            {
        136                background-color: #FFB94B;
        137                border-width: 1px;
        138                border-style: solid;
        139                border-color: #D69E31 #E3A037 #D5982D #E3A037;
        140                float: left;
        141                height: 35px;
        142                padding: 0;
        143                width: 120px;
        144                cursor: pointer;
        145                font: bold 15px Arial, Helvetica;
        146                color: #8F5A0A;
        147                margin: 20px 0 0 0;
        148
        149              /* 可以参考form样式中的gradient注释 */
        150                background-image: -webkit-gradient(linear, left top, left
                      bottom, from(#FDDB6F), to(#FFB94B));
        151                background-image: -webkit-linear-gradient(top, #FDDB6F,
                      #FFB94B);
        152                background-image: -moz-linear-gradient(top, #FDDB6F, #FFB94B);
        153                background-image: -ms-linear-gradient(top, #FDDB6F, #FFB94B);
        154                background-image: -o-linear-gradient(top, #FDDB6F, #FFB94B);
        155                background-image: linear-gradient(top, #FDDB6F, #FFB94B);
        156
        157              /* 可以参考form样式中的border-radius注释 */
        158                -moz-border-radius: 3px;
        159                -webkit-border-radius: 3px;
        160                border-radius: 3px;
        161
        162              /* 给文字加上阴影,早在CSS 2中已经出现 */
        163                text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
        164
        165              /* 可以参考form样式中的box-shadow注释 */
        166                -moz-box-shadow: 0 0 1px rgba(0, 0, 0, 0.3), 0 1px 0 rgba(255,
                      255, 255, 0.3) inset;
        167                -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.3), 0 1px 0
                      rgba(255, 255, 255, 0.3) inset;
        168                box-shadow: 0 0 1px rgba(0, 0, 0, 0.3), 0 1px 0 rgba(255, 255,
                      255, 0.3) inset;
        169            }
        170            .item-name { background: url(../images/user.png) 10px 11px no
                    repeat; }    /* 昵称背景样式 */
        171            .item-email { background: url(../images/email.png) 10px 11px no
                    repeat; }   /* 密码背景样式 */
        172            .item-password { background: url(../images/keys.png) 10px 11px no
                    repeat; } /* 电子邮箱背景样式 */
        173       </style>
        174       <script src="../js/jquery-1.8.3.js"></script>
        175       <script src="../js/modernizr.custom.2.6.2.js"></script>
        176  </head>
        177  <body>
        178      <header><h2>搞定输入框自动聚焦</h2></header>
        179       <section>
        180            <form action="" method="post">
        181                <div class="clearfix">
        182                  <! -- 第1个autofocus -->
        183                     <input type="email" tabindex="1" id="email" class="item
                          email" placeholder="电子邮箱" autofocus required/>
        184                </div>
        185                <div class="clearfix">
        186                  <! -- 第2个autofocus -->
        187                     <input type="text" tabindex="2" id="name" class="item-name"
                          placeholder="昵称" autofocus
        188                     required/>
        189                </div>
        190                <div class="clearfix">
        191                  <! -- 第3个autofocus -->
        192                     <input type="password" tabindex="3" id="password"
                          class="item-password" placeholder="密
        193                  码" autofocus autocomplete="off" required/>
        194                </div>
        195                <div class="clearfix"><input type="submit" tabindex="4"
                      id="submit" value="注     册" /></div>
        196            </form>
        197       </section>
        198  </body>
        199  </html>

提示

代码中可以看到很多样式前带有-webkit、-moz、-o、-ms的前缀,注释中给出了浏览器的支持情况。想更多地了解各浏览器前缀,可以参考网址http://css3please.com

2.4.2 代码分析

本示例侧重从CSS 3出发,介绍如何构建一个注册页面,下面讲解其中用到的CSS 3技巧。

【代码2-3】中第19~31行、126~132行、149~155行使用了CSS 3 Gradient(渐变)。渐变分为线性渐变(Linear Gradients)和径向渐变(Radial Gradients)。这里使用了线性渐变,WebKit内核的浏览器语法如下。

        -webkit-gradient(<type>, [<point> || <angle>, ]? <stop>, <stop> [, <stop>]* )

在WebKit下Gradient使用的语法如图2.14所示。

图2.14 WebKit下Gradient使用

第1个参数表示渐变类型,渐变类型分为linear(线性渐变)和radial(径向渐变)两种。第2个和第3个参数分别表示渐变的起点和终点,可以用坐标形式或方位值,比如right top(右上角)和right bottom(右下角),也可以使用角度,比如red 10%。第4个和第5个参数表示起始和终止的渐变颜色。

再看标准浏览器的Gradient语法:

        linear-gradient([point || angle, ]? stop, stop [, stop]*)

标准浏览器下Gradient的使用如图2.15所示。

图2.15 标准浏览器下Gradient的使用

标准浏览器下Gradient的渐变类型不在第1个参数上,而是写在样式名称上。第1个参数表示渐变的起点,可以使用方位值或者角度值,第2个和第3个参数和WebKit相同。

提示

想了解更多Gradient的使用,可以参考网址http://css-tricks.com/examples/CSS 3Gradient/

代码32~38行、79~81行、108~110行、158~160行使用了CSS 3的border-radius,中文意思是“圆角”,语法如下:

        border-radius : none | <length>{1,4} [ / <length>{1,4} ]?

其中,length是由浮点数字和单位标识符组成的长度值,可以使用em、ex、pt、px、百分比等,不可为负值。圆角还有其他一些相关属性,比如border-top-right-radius、border-bottom-rightradius、border-bottom-left-radius、border-top-left-radius。

代码40~47行、62~64行、82~85行、100~102行、165~168行使用了CSS 3的boxshadow,语法如下:

        box-shadow :<length> <length> <length> <length> || <color>

参数说明:阴影水平偏移值(可取正负值);阴影垂直偏移值(可取正负值);阴影边框;阴影模糊值;阴影颜色。

例子中使用的盒阴影效果属于盒外阴影,除此之外还有盒内阴影,使用时可增加一个inset,代码如下:

        box-shadow :inset 10px 10px 5px #000000;

如果还想了解更多的盒阴影,可以去http://www.css3maker.com/box-shadow.html动态感受下box-shadow的强大效果。