深入理解 input 标签

作者: 五香麻辣豆腐皮

做这篇文章主要是做一个知识积累记录,同时对部分内容根据自身的理解进行了调整

下面步入正题

相信<input />标签大家已经非常的熟悉了,也正因非常熟悉,当我看到陈鱼大佬分享的文章标题时,就产生了兴趣,如此常用的标签还有什么更骚包的东西吗?答案是肯定的,看了后才知道 用纯CSS居然可以直接做到表单验证!

那么要实现这一效果需要些什么呢?

1.首先是选择器方面的一些扩展:

第一类:控制系(Input Control States)

选择器作用
:enabled选择可使用状态的 <input /> 元素
:disabled选择不可使用状态的 <input /> 元素
:read-only选择不可编辑状态的元素(不仅仅是 <input />
:read-write选择可编辑状态的元素(不仅仅是 <input />
:placeholder-shown选择 placeholder text 显示时的元素
:default选择在 <button><input type="checkbox" /><input type="radio" />, 以及 <option> 上的默认状态

第二类:输出系(Input Value States)

选择器作用
:checked选择处于选中状态的 <input type="radio" />
:indeterminate选择状态不确定的表单元素

第三类:侦查系(Input Value-checking)

选择器作用
:blank选择处于空值时的 <input />(暂未被浏览器支持)
:valid选择验证通过的表单元素
:invalid选择验证不通过的表单元素
:in-range选择处于指定范围内的 <input />
:out-of-range选择不处于指定范围内的 <input />
:required选择必填的表单元素
:optional选择选填的表单元素
:user-invalid选择用户输入但值非法时的 <input />(暂未被浏览器支持)

2.其次是其自身的属性:

属性作用
maxlength可输入的最大长度
minlength可输入的最小长度
size输入框的长度
readonly输入框是否只读
required输入框是否必填
multiple输入框是否可以多选
pattern输入框验证规则
min可输入的最小值
max可输入的最大值
step输入框每次的增量
list输入框绑定的可选值数据
placeholder输入框预选文字

接下来我们就用上面的知识来达到 “纯CSS实现表单验证功能”

1.先对功能进行一下描述:
  • 输入框得到焦点时,如果输入的内容验证不通过,则右侧的文本提示显示出来,否则不显示
  • 输入框失去焦点时,如果其中的内容验证不通过,则右侧的文本依然处于显示状态,否则不显示
  • 在输入的过程中,如果输入的内容验证通过,则右侧的文本不显示,否则显示
  • 当账号与密码输入框均验证通过时,登录按钮显示出来 (不过这一功能一般不会这样实现,不符合常理,这里只是为了演示选择器的效果)
2.再看看一下最终效果图

在这里插入图片描述

3.接下来是代码部分

其中重要的部分作用已用注释的方式进行描述

<style>
    form > input {
        margin-bottom: 10px;
    }

    form > .error {
        color: #ff4b52;
    }

    /* 实现验证通过时,按钮出现效果,不过一般表单提交不会做这样的功能,这里仅仅只是为了演示选择器 */
    input[type='text']:invalid ~ input[type='submit'],
    input[type='password']:invalid ~ input[type='submit'] {
        display: none;
    }

    /* 输入框required属性为true、已获得焦点并且验证不通过时 渲染验证提示文本 */
    input[required]:focus:invalid + span {
        display: inline;
    }

    /* 输入框required属性为true并且为空时 不渲染验证提示文本 */
    input[required]:empty + span {
        display: none;
    }

    /* 输入框required属性为true、验证不通过、失去焦点并且有文本内容时 渲染验证提示文本*/
    input[required]:invalid:not(:placeholder-shown) + span {
        display: inline;
    }
</style>
<form>
    <span>账号:</span>
    <input type="text" placeholder="请输入账号" pattern="\w{6,10}" required/>
    <span class="error">账号格式有误,请输入6~10位任意字符</span>
    <br/>
    <span>密码:</span>
    <input type="password" placeholder="请输入密码" pattern="\w{6,10}" required/>
    <span class="error">密码格式有误,请输入6~10位任意字符</span>
    <br/>
    <input type="submit" value="登录"/>
</form>

以上代码最主要的其实就是选择器部分,选择器每一步的作用都已用注释进行了解释

接下来我们我们再演示一个平时没有用过的选择器:indeterminate

上面描述它的作用是 “用于选择状态不确定的表单元素” ,这是一个平时没用过的状态,拿多选框来说,我们的认知类它就两个状态:选中和不选中,而这个选择器表示的是,还不知道选没选中;用生活中在淘宝上淘商品举例的话,我们选了一些商品,但是这些商品我还不知道最后买还是不买。
现在我们就用它来演示一下:

1.依旧是先来一个功能说明:
  • 多选框初始是 未选择 状态
  • 当多选框处于 未选择 状态时,将其设定为 选中 状态
  • 当多选框处于 选中 状态时,将其设定为 不定 状态
  • 当多选框处于 不定 状态时,将其设定为 未选择 状态
2.接着来一张最终效果图:

在这里插入图片描述

3.最后代码贴上:
<style>
    body {
        background: #333;
    }
    label {
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 18px;
        color: #fff;
        padding: 18px 0;
    }
    input {
        margin-right: .5em;
        width: 30px;
        height: 30px;
    }
</style>
<form>
    <label>
        <input type="checkbox" id="choose"/>
        <span for="choose">点击左边</span>
    </label>
</form>
<script>
    document.querySelector('#choose').addEventListener('click', e => {
        if (e.target.readOnly) {
            e.target.checked = e.target.readOnly = false;
        } else if (!e.target.checked) {
            e.target.readOnly = e.target.indeterminate = true;
        }
    });
</script>

这里对上面js代码部分进行分析以及为什么这里要用到readOnly属性,看看它们具体是如何运行的:

  1. 首先说一下为什么要用readOnly属性,因为checkbox具有默认的执行逻辑,也就是我们点击后,它会自动的切换checked的值,所以这里我们需要用另一个(局外人,该属性对于多选框没有什么实际作用)来作为中间值,方便我们逻辑的判断。
  2. 初始多选框的各个状态是:checked属性为fasle,indeterminate 属性为false,readOnly属性为false,页面中显示是空
  3. 当我们点击的多选框的时候,多选框会自动的将checked属性从false变更为true,同时显示上也会打上勾(如果indeterminate为true也会将其自动的变更为false)。这之后,还会触发我们所绑定的click事件,但是进入这里的时候,checked属性已经变更为true了,因此我们所写的if逻辑都不会执行。而此时多选框的各个状态是:checked属性为true,indeterminate 属性为false,readOnly属性为false,页面中显示是勾
  4. 我们再次点击多选框的时候,多选框会自动的将checked属性从true变更为false,同时页面上显示为空。之后,触发我们绑定的click事件,此时逻辑会进入我们else if中的逻辑,因此多选框的各个状态是:checked属性为false,indeterminate 属性为true,readOnly属性为true,页面中显示是-,也就是不定
  5. 第三次点击多选框,多选框自动的将checked属性从false变更为true、将indeterminate 属性从true变更为false,同时页面上显示为勾。之后,触发我们绑定的click事件,此时逻辑会进入我们if中的逻辑,因此多选框的各个状态是:checked属性为false,indeterminate 属性为false,readOnly属性为false,页面中显示是空,至此,多选框的状态回到初始状态。

以上就是多选框整个切换的逻辑执行过程。
好了,本文章到这里就结束了,谢谢观看。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值