1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

表单提示

本帖由 不学无术2006-04-24 发布。版面名称:新人报道

  1. 不学无术

    不学无术 Ulysses 的元神

    注册:
    2005-08-31
    帖子:
    16,714
    赞:
    39
    一般我们可以通过表单的 title 属性呈现“提示(tooltip)”功能,但是样式过于单一,结合《 [新鲜出炉] 简单的弹出菜单》一文中的效果,我们可以做出自定义样式的提示效果,让你的表单具有“Web 2.0”的味道。

    演示:http://www.jindie.net/20060424/ (临时)

    主文件(包括脚本):
    HTML:
    <!-- Head # B -->
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Apollo System - 用户注册</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
    </head>
    <!-- Head # E -->
    
    <body>
    <!-- Header # B -->
    <!-- Header # E -->
    
    <!-- Content # B -->
    <form action="?action=Reg" method="post" name="regstep1" id="regstep1" onsubmit="if (!formcheck()) return false;">
    <table width="480" border="0" align="center" cellpadding="5" cellspacing="1" class="tableBorder">
      <thead>
        <tr>
          <td colspan="2" align="center" class="tableheader">新会员注册系统</td>
        </tr>
    	<tr class="tr1">
    	  <td colspan="2">请填写下列各项信息(<span class="required">*</span>为必填项目)。</td>
    	</tr>
      </thead>
      <tbody>
        <tr class="tr0">
          <td width="30%" align="right"><label> <span class="required">*</span>用户名</label></td>
          <td><input name="Account" class="input" id="Account" size="12" maxlength="12" alt="请输入你想注册的用户名称,不得含有特殊字符与空格" onfocus="showMessage(this);" onblur="hideMessage(this);" title="请输入您想住的的用户名。用户名允许长度4-12个字符,允许字符为字母(a-z)和数字(0-9)。" />
            <input class="input" name="Submit16" onclick="javascript:check_exist();return false;" type="reset" value="重名检测" />
          <!--用户名长度限制在4—12个字符之间。用户名填写范围(0-9 A-Z)字母或数字组合--></td>
        </tr>
        <tr class="tr1">
          <td align="right"><span class="required">*</span><label>登陆密码</label></td>
          <td><input name="Password" type="password" class="input" id="Password" size="12" maxlength="16" onfocus="showMessage(this);" onblur="hideMessage(this);" title="密码的长度限制在6-16个字符之间。密码的组成元素只能是英文字母、数字。" /></td>
        </tr>
        <tr class="tr0">
          <td align="right"><span class="required">*</span><label>密码确认</label></td>
          <td><input name="ConfirmPassword" type="password" class="input" id="ConfirmPassword" size="12" maxlength="16" onfocus="showMessage(this);" onblur="hideMessage(this);" title="请输入与“密码”相同的信息,这是为了防止设置密码时输入错误。" /></td>
        </tr>
        <tr class="tr1">
          <td align="right"><span class="required">*</span><label>密码提问</label></td>
          <td><select name="Question" id="Question" onfocus="showMessage(this);" onblur="hideMessage(this);" title="如果您忘记密码,系统会提出此问题。选择一个容易勾起您的回忆的问题吧!">
            <option value="您上学第一所学校的名字?">您上学第一所学校的名字?</option>
            <option value="您的生日是什么?">您的生日是什么?</option>
            <option value="您最喜欢吃的菜是什么?">您最喜欢吃的菜是什么?</option>
            <option value="您最喜欢的运动是什么?">您最喜欢的运动是什么?</option>
            <option value="您最喜欢的演员是谁?">您最喜欢的演员是谁?</option>
            <option value="您的父亲叫什么名字?">您的父亲叫什么名字?</option>
            <option value="你兄弟有几个?">你兄弟有几个?</option>
            <option value="您的爱人叫什么?">您的爱人叫什么?</option>
            <option value="您的宠物叫什么名字?">您的宠物叫什么名字?</option>
          </select></td>
        </tr>
        <tr class="tr0">
          <td align="right"><span class="required">*</span><label>密码答案</label></td>
          <td><input name="Answer" class="input" id="Answer" size="32" onfocus="showMessage(this);" onblur="hideMessage(this);" title="此答案与前面的问题对应,当您忘记密码时,系统会根据您在这里设定的提示问题和答案帮助您重新设置密码(<em>切忌密码提问和密码答案相同,以防别人盗取您的密码</em>)。" /></td>
        </tr>
        <tr class="tr1">
          <td align="right"><span class="required">*</span><label>联系邮箱</label></td>
          <td><input name="EMail" type="text" id="EMail" size="32" onfocus="showMessage(this);" onblur="hideMessage(this);" title="如果您填写了密码答案请填写您的联系电子邮箱地址。" /></td>
        </tr>
        <tr class="tr0">
          <td align="right">&nbsp;
          <input type="hidden" name="askmejoin" value="" /></td>
          <td><input name="b1" class="input1" type="submit" value="注册" />
              <input name="reset" type="reset" class="input1" value="取消" /></td>
        </tr>
        <tr class="tr1">
          <td align="right"><label>注意事项</label></td>
          <td>
    	  <ul>
    	    <li>请仔细填写上边的所有信息,以便与您联系 </li>
            <li>如有问题,请连系本站客户服务中心</li>
    	  </ul></td>
        </tr>
      </tbody>
    </table>
      </form>
    <!-- Content # E -->
    
    <!-- Footer # B -->
    <!-- Footer # E -->
    <div id="form_message">
        <div id="form_message_header"></div>
    	<div id="form_message_content"></div>
    	<div id="form_message_footer"></div>
    </div>
    <script language="javascript" type="text/javascript">
    
    var oMessage;    //    全局变量,菜单
    var sTitle;
    
    //function showMessage(e, sMessage)
    function showMessage(obj, sMessage)
    {
        oMessage = document.getElementById("form_message");
        oMessage.style.left = findPosX(obj) + 15 + "px";
    	//oMessage.style.left = ((e.clientX - 0) + "px"); 
    	oMessage.style.top = findPosY(obj) + obj.offsetHeight - 2 + "px";
    	//oMessage.style.top = ((e.clientY + document.documentElement.scrollTop) - 3 + "px");
    	oMessage.style.visibility = "visible";
    	//oMessage.style.display = "block";
    	document.getElementById("form_message_content").innerHTML = obj.title;
    	sTitle = obj.title;
    	obj.title = "";
    }
    
    function hideMessage(obj)
    {
        if (oMessage) { 
            oMessage.style.visibility = 'hidden';
    		//oMessage.style.display = 'none';
    		obj.title = sTitle;
    		sTitle = "";
        }
    }
    
    function findPosX(obj)
    {
        var iPosLeft = 0;
        while (obj.offsetParent)
        {
            iPosLeft += obj.offsetLeft;
            obj = obj.offsetParent;
        }
        return iPosLeft;
    }
    
    function findPosY(obj)
    {
        var iPosTop = 0;
        while (obj.offsetParent)
        {
            iPosTop += obj.offsetTop;
            obj = obj.offsetParent;
        }
        return iPosTop;
    }
    </script>
    </body>
    </html>
    CSS 文件:
    HTML:
    /*    HTML    */
    body {
        color: #000;
    	background: #fff;
    }
    body, table, tr, td, input, textarea, select {
        font: 12px/1.5em Tahoma, Helvetica, Sans-Serif, Simsun; 
    }
    em {
        color: #f00;
    	/*font-weight: bold;*/
    }
    
    
    /*    fonts    */
    .required {
        color: #f00;
    }
    .redfonts {
        color: #f00;
    	background: #fff;
    }
    
    .bluefonts {
        color: #00f;
    	background: #fff;
    }
    
    .boldfonts {
        font-weight: bold;
    }
    
    /*    TABLES    */
    .tableborder {
        border: 1px solid #f90;
    }
    .tableheader {
        color: #000;
    	font-weight: bold;
    	background: #fc0;
    	border-bottom: 2px solid #f90;
    }
    .tr0 {
        color: #000;
    	background: #fcfcfc;
    }
    .tr1 {
        color: #000;
    	background: #f6f6f6;
    }
    
    #form_message {
        width: 200px;
    	/*display: none;*/
    	visibility: hidden;
    	position: absolute;
    }
    #form_message_header {
        background: url(images/form_message_top.gif) no-repeat center bottom;
    	height: 17px;
    }
    #form_message_content {
        background: url(images/form_message_middle.gif) repeat-y center center;
    	padding: 8px 10px;
    }
    #form_message_footer {
        background: url(images/form_message_bottom.gif) no-repeat center top;
    	height: 2px;
    }
    
    使用到的图片见附件。

    另外,在《 [新鲜出炉] 简单的弹出菜单》一文中,因为缺少单位“px”,Firefox 下无法得到期望效果。

    使用 IE 的用户会发现提示框会被下拉菜单遮挡,这一直都是个头痛的问题,但是在 Firefox 下不会出现。

    可以考虑使用模拟下拉菜单的方式来实现,也可以将信息框巧妙地定位在下拉菜单之外的区域。

    模拟下拉菜单,可以参考我的《Nice form》一文。
     

    附件文件:

    #1 不学无术, 2006-04-24
    最后编辑: 2006-04-24
  2. 不学无术

    不学无术 Ulysses 的元神

    注册:
    2005-08-31
    帖子:
    16,714
    赞:
    39
    进一步说明。因为我们将提示信息作为 title 的值,所以开始的时候将鼠标覆盖在表单上,也会出现系统定义的提示。

    这个可以通过一些方法来解决的,例如不定义 title 属性,而是将信息内容作为 showMessage 函数的参数。
     
  3. amt

    amt New Member

    注册:
    2005-12-13
    帖子:
    8,582
    赞:
    67
    顶。。
     
  4. 老林

    老林 New Member

    注册:
    2005-09-06
    帖子:
    10,580
    赞:
    36
  5. 小叶

    小叶 New Member

    注册:
    2005-09-04
    帖子:
    17,941
    赞:
    33
    会JS就是牛x
     
  6. 西子宜

    西子宜 Well-Known Member

    注册:
    2005-09-05
    帖子:
    15,739
    赞:
    62
  7. 风狼

    风狼 New Member

    注册:
    2005-10-01
    帖子:
    7,452
    赞:
    25
    很好的东东。可就是看不懂。。唉
     
  8. Kevin

    Kevin New Member

    注册:
    2005-10-23
    帖子:
    12,728
    赞:
    55
    收藏!
     
  9. vicke

    vicke New Member

    注册:
    2005-12-20
    帖子:
    2,348
    赞:
    24
    :) 套上用了 嘎嘎
     
  10. BoBo

    BoBo New Member

    注册:
    2005-09-29
    帖子:
    929
    赞:
    0
    :heart:
     
  11. yjlrwmqj

    yjlrwmqj New Member

    注册:
    2005-09-06
    帖子:
    112
    赞:
    1
    遇见有下拉条的时候就变形不能正常显示了
    怎么解决下?
     
  12. 不学无术

    不学无术 Ulysses 的元神

    注册:
    2005-08-31
    帖子:
    16,714
    赞:
    39
    Firefox 下是不会出现这样的问题的,IE 的弱智表现。

    你可以考虑将“合理”设置显示的位置,以使出现的信息不位于下拉选择上。
     
  13. jeminy

    jeminy Member

    注册:
    2005-09-27
    帖子:
    975
    赞:
    13
    好东西..收了