H5表单验证2(h5自带验证美化)

h5自带验证美化:要做出不一样的表单验证,我们要了解一些伪类及css选择器。

  • :required和:optional
  • :in-range和:out-of-range
  • :valid和:invalid
  • :read-only和:read-write
//:required和:optional
<style>
        .container{
            max-width: 400px;
            margin: 20px auto;
        }
        input,select,textarea{
            width: 240px;
            margin: 10px 0;
            border: 1px solid #999;
            padding: 0.5em 1em;
        }
        label{
            color: #999;
            margin-left: 10px;
        }
/*必填*/
        input:required,textarea:required{
            border-right: 3px solid #aa0088;
        }
/*选填*/
        input:optional,select:optional{
            border-right: 3px solid #999;
        }

        input:required+label::after{
            content: '(必填)';
        }
        input:optional+label::after{
            content: '(选填)';
        }
/*浏览器默认focus的时候没有边框*/
        input:focus,select:focus,textarea:focus{
            outline: 0;
        }
/*focus的时候加自定义边框*/        
        input:required:focus,textarea:required:focus{
            box-shadow: 0 0 3px 1px #aa0088;
        }


        input:optional:focus,textarea:optional:focus{
            box-shadow: 0 0 3px 1px #999;
        }

        input[type="submit"]{
            background-color: #c0a;
            border: 2px solid #a08;
            padding: 10px 0;
            color: #ffffff;
            width: 300px;
        }
        input[type="submit"]:hover{
            background-color: #a08;
        }
    </style>
</head>
<body>
<div class="container">
    <form action="#">
        <input type="name" required><label>名称</label>
        <input type="email" required><label>邮箱</label>
        <input type="tel"><label>手机</label>
        <input type="url"><label>网址</label>
        <select name="#" id="##">
            <option value="1">非必填选项一</option>
            <option value="2">非必填选项二</option>
            <option value="3">非必填选项三</option>
            <option value="4">非必填选项四</option>
        </select>
        <textarea name="#" id="#" cols="30" rows="10" required>留言 (必填)</textarea><br/>
        <!--<button></button>-->
        <input type="submit" value="提交表单"/>
    </form>
</div>

</body>

  • 利用:valid和:invalid制作纯css的表单验证。 

 

 

 

 <style>
        .container{
            margin: 100px;
            position: relative;
        }
        input{
            border: 1px solid #999;
            outline: 0;
            width: 140px;
            height: 30px;
            line-height: 30px;
            text-indent: 36px;
            transition: all .3s;
            border-radius: 3px;

        }
        span.title{
            position: absolute;
            line-height: 30px;
            height: 30px;
            left: 2px;
            top: 2px;
            transition: all .3s;

        }
        input:focus,input:hover{
            text-indent: 2px;
        }
        input:focus+span.title,input:hover+span.title{
            transform: translateX(-120%);
        }

        input:valid~label::after{
            content: '你输入的邮箱正确';
        }
        input:invalid~label::after{
            content: '你邮箱错误';
        }
        input:valid{
            border: 1px solid green;
        }
        input:invalid{
            border: 1px solid red;
        }
    </style>
</head>
<body>
<div class="container">
    <input type="email" id="mail" required placeholder="输入邮箱"/>
    <span class="title">邮箱</span>
    <label for="mail"></label>
</div>
</body>

 

onchange 当文本框失去焦点时,检查input里的值是否符合要求,执行函数

oninput 实时监听文本框的值,不符合要求事件触发,(但是虽不符合要求,值却已经在文本框了)

  • h5表单美化综合案例演示:
  •     用到三个事件:
  1. oninput事件
  2. oninvalid事件
  3. onchange事件

带*是必填项。填写正确边框变绿出现绿色√。填写错误边框变红出现红色❌。

判断验证密码与确认密码是否一致。

setCustomValidity()改变默认提示。

  <style>
        .onelist{
            margin: 10px 0 5px 12px;
        }
        .onelist label{
            width: 80px;
            display: inline-block;
        }
        .onelist input,.onelist select{
            height: 25px;
            line-height: 25px;
            width: 220px;
            border-radius: 3px;
            border: 1px solid #e2e2e2;
        }
        .onelist input[type=submit]{
            width: 150px;
            height: 30px;
            line-height: 30px;
        }

        input:required,select:required{
            background: url("images/img/star.jpg") no-repeat 90% center;/*x轴偏移量90% y轴center*/
        }
        /*必填验证通过*/
        input:required:valid,select:required:valid{
            background: url("images/img/right.png") no-repeat 90% center;
            box-shadow: 0 0 5px green;
            border-color: green;
        }
        /*不通过验证.一开始肯定是错误的*/
        input:focus:invalid,select:focus:invalid{
            background: url("images/img/error.png") no-repeat 90% center;
            box-shadow: 0 0 5px red;
            border-color: red;
            outline: red solid 1px;
        }
    </style>
</head>
<body>
<form action="" class="myform">
    <div class="onelist">
        <label for="UserName">手机号</label>
        <input type="text" name="UserName" id="UserName" placeholder="请输入手机号码" pattern="^[0-9]{10}$" required oninput="this.setCustomValidity('')" oninvalid="this.setCustomValidity('请输入正确的手机号')"/>
    </div>
    <div class="onelist">
        <label for="Password">密码</label>
        <input type="password" name="Password" id="Password" placeholder="6~20位" pattern="^[a-zA-Z0-9]\w{5-19}$" required oninput="this.setCustomValidity('')" oninvalid="this.setCustomValidity('请输入正确的密码')" onchange="checkpassword()"/>
    </div>
    <div class="onelist">
        <label for="Repassword">确认密码</label>
        <input type="password" name="Repassword" id="Repassword" placeholder="确认密码" required onchange="checkpassword()"/>
    </div>
    <div class="onelist">
        <label for="Repassword">了解方式</label>
        <select name="know" required>
            <option value="">==请选择==</option>
            <option value="1">搜索引擎</option>
            <option value="2">朋友圈</option>
            <option value="3">朋友推广</option>
            <option value="4">广告投放</option>
        </select>
    </div>
    <div class="onelist"><input type="submit" value="提交"/></div>
</form>
<script type="text/javascript">
    function checkpassword(){
        var pass1=document.getElementById('Password');
        var pass2=document.getElementById('Repassword');
        if(pass1.value!=pass2.value){
            pass2.setCustomValidity("两次密码输入不一致");
        }else{
            pass2.setCustomValidity("");
        }
    }
</script>
</body>

练习:

  1.     不写样式,只是选择input符合验证时的label,input符合验证时valid,input不符合验证时invalid
  2.      选择label,label和Input是同一父级元素,因此用~选择器
  3.      input获得焦点是focus
  4.     span是input相邻兄弟元素,因此用加号选择器。

 

  • 修改默认气泡样式:

默认气泡在各个浏览器中也不一样。

在谷歌29之前的版本我们可以通过如下伪元素修改,::webkit-validation-bubble.但是之后废弃了。

方法:

  • 用插件
  • 用自己的方式
  •           1.阻止默认气泡
  •           2.创建新的气泡
<style>
        .oneline{line-height: 1.5;margin:10px auto;}
        .oneline label{width:100px;text-indent: 15px;font-size:14px;font-family: "Microsoft Yahei";display: inline-block;}
        .oneline .sinput{width:60%;height:30px;border-radius: 6px;border:1px solid #e2e2e2;}
        .oneline input[type="submit"]{margin-left:20px;width:80px;height:30px;border:0;background-color:#5899d0;color:#fff;font-size:14px;border-radius: 6px;}
        .error-messages{color:red; margin-left: 100px}
    </style>
</head>
<body>
<form id="forms">
    <div class="oneline">
        <label for="name">用户名:</label>
        <input id="name" class="sinput" name="name" type="text" required>
    </div>
    <div  class="oneline">
        <label for="email">Email:</label>
        <input id="email" class="sinput"  name="email" type="email" required>
    </div>
    <div  class="oneline">
        <input type="submit" value="提交" id="thesubmit">
    </div>
</form>
<script>
    function replaceInvalidityUi(form){
        form.addEventListener("invalid",function(event){
            event.preventDefault();//阻止默认气泡
        },true);
        //提交   如果验证不通过,阻止默认气泡
        form.addEventListener("submit",function(event){
            if(!this.checkValidity()){
                event.preventDefault();
            }
        },true)

        //提交之后,做一个点击的提交事件
        var submitBtn=document.getElementById("thesubmit");
        submitBtn.addEventListener("click",function(event){
            var inValidityField=form.querySelectorAll(":invalid");//不符合验证信息的
            var errorMessage=form.querySelectorAll(".error-messages");//清掉所有错误信息
            var parent;

            //循环每一个错误信息
            for(var i=0;i<errorMessage.length;i++){
                errorMessage[i].parentNode.removeChild(errorMessage[i]);
            }

            //添加新的错误信息  错误信息:validationMessage
            for(var i=0;i<inValidityField.length;i++){
                parent=inValidityField[i].parentNode;
                parent.insertAdjacentHTML("beforeend","<div class='error-messages'>"+inValidityField[i].validationMessage+"");
            }

            if(inValidityField.length>0){
                inValidityField[0].focus();
            }
        })

    }
    var form=document.getElementById('forms');
    replaceInvalidityUi(form);
</script>
</body>

用beforebegin可以将表单错误提示信息插入到元素本身之前。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值