有没有办法只通过css来确定input标签是否有输入?

我有这个想法是因为我想完成一个自动补全的input部件,最基本的功能是:

  • 如果input没有内容,这隐藏下拉框
  • 反之,显示下拉框

我找到了一个也许不是很完美的实现方案,描述中可能会有一些细微的区别,不过我还是很希望能做这个简单的分享


首先,我们构造一个简单的form表单,仅仅只有一个input

<form>
<label for="input">输入框</label>
<input type="text" id="input"/>
</form>

当输入一些值,我设置input的边框颜色为绿的,下面是一个例子:

判断input是否为空

我通过html表单验证去判断是否为空,所以,这里我使用了required属性

<form>
<label> Input </label>
<input type="text" name="input" id="input" required />
</form>
// valid:当input输入值也合法值时采用的样式
#input:valid{
border-color: green;
}

这时,当有输入的时候,input表现的很好,边框颜色也有了相应的变化:

但是,这里有个问题,如果用户输入的是空格,那么边框颜色也会发生改变。

原理上看,这种表现是正常的,因为输入框确实有了内容。

但是,实际上,我不想让空格来触发自动补全弹窗

所以这还不能满足我们的需求,我要做更细致的检查

进一步完善

html提供我们利用正则去验证输入框内容的属性:pattern,这里也尝试使用该属性来完善

因为想把空格视为非法输入,我使用\S+,这个很简单,匹配一个或者多个任何非空白字符

<form>
<label> Input </label>
<input type="text" name="input" id="input" required pattern="\S+"/>
</form>

使用这种方式,的确奏效了,如果用户输入空格,输入框没有任何变化

但了个是,但是这个正则还是有问题,因为只允许输入非空白字符,所以你在任何位置输入空白都会导致输入框校验失败

这里可以使用其他的正则来匹配,比如\^\S+?.+

<form>
<label> Input </label>
<input type="text" name="input" id="input" required pattern="\S+.*"/>
</form>

现在输入框可以和空格混合输入了!

但是如果当前校验失败,输入框没有任何提示,这很不友好!

但我写这篇文章的时候,有一个问题我不断思考,能不能只用css给非法验证也加一种样式?

输入无效

这里不能使用:invalid,因为有required字段,即使我们什么也不做,输入框也会有非正确状态的样式提示,这很奇怪。

查看了相关资源,我们可以使用:placeholder-shown来达到我们的目的

大概思路是:

  • 增加placeholder
  • 如果输入框如果用户输入了内容,但还不合法做一个处理
  • 最后利用css的覆盖特性,添加一个当验证成功的样式处理

最终的css大概是这样

/* 当填充的时候展示红色,所以这里默认是校验失败 */
input:not(:placeholder-shown) {
border-color: hsl(0, 76%, 50%);
}
/* 当验证成功的时候,采用这个样式 */
input:valid {
border-color: hsl(120, 76%, 50%);
}

这里有一个小小的demo

总结

上面的内容就是如何只用css来提供一个基础表单验证功能,说是只用css,其实也利用的pattern能接受正则表达式,哈哈,所以最根本的是如何写出最优的正则表达式。

原文链接

css实现input表单验证的更多相关文章

  1. css修改input表单默认样式重置与自定义大全

    链接地址: 伪元素表单控件默认样式重置与自定义大全 http://www.zhangxinxu.com/wordpress/?p=3381 Chrome 现在不支持通过伪元素修改 meter 元素样式 ...

  2. input表单验证(全面)

    1.英文字母 1 <script type="text/javascript"> 2 //验证只能是字母 3 function checkZm(zm){ 4 var z ...

  3. input表单验证

    1.屏蔽输入法(只是不能输入中文还可以输入特殊字符)<input style="ime-mode:disabled" onkeydown="if(event.key ...

  4. 纯CSS实现表单验证

    ladies and 乡亲们,表单验证你在做吗?客户端or服务器端,javascript or jquery,动手写 or 使用插件,今天我们来探索下使用纯css实现表单验证,借以学习css sele ...

  5. 自定义常用input表单元素三:纯css实现自定义Switch开关按钮

    自定义常用input表单元素的第三篇,自定义一个Switch开关,表面上看是和input没关系,其实这里采用的是checkbox的checked值的切换.同样,采用css伪类和"+" ...

  6. jQuery学习之路(8)- 表单验证插件-Validation

    ▓▓▓▓▓▓ 大致介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 ...

  7. form表单验证-Javascript

    Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...

  8. 实现跨浏览器html5表单验证

    div:nth-of-type(odd){ float: left; clear: left; } .origin-effect > div:nth-of-type(even){ float: ...

  9. jQuery Validate 表单验证 — 用户注册简单应用

    相信很多coder在表单验证这块都是自己写验证规则的,今天我们用jQuery Validate这款前端验证利器来写一个简单的应用. 可以先把我写的这个小demo运行试下,先睹为快.猛戳链接--> ...

随机推荐

  1. ApplicationContext refresh 过程及一些重要的 processor 解析

    回顾 上文 其实我们已经实现了一个简单的 BeanFactory 它具的功能有 注册 Bean 到容器,通过限定名获取 Bean 可以拦截 Bean 初始化前后的处理 可以在 Bean 属性注入后和即 ...

  2. 入门Android底层需要的一些技能

    <Android的设计与实现> Android框架层<Linux系统编程手册> Linux系统编程<Android内核剖析> 编译框架和romC语言和Linux内核 ...

  3. 一文学会Go语言

    go语言随手记 -- go语言定位于高并发服务端程序 1.基本数据类型 boolstringint int8 int16 int32 int64uint uint8 uint16 uint32 uin ...

  4. Android 开发中是否应该使用枚举?

    本文由咕咚发布在个人博客,转载请注明出处. 本文永久地址:https://gudong.name/2019/11/04/use-enum-or-not.html 在 Android 官方文档推出性能优 ...

  5. 【vue】在VS Code中调试Jest单元测试

    在VS Code中调试Jest单元测试 添加调试任务 打开 vscode launch.json 文件,在 configurations 内加入下面代码 "configurations&qu ...

  6. cnblogs侧边栏访客统计 小插件

    之前博客的侧边栏一直用的是flagcounter,直观简洁又好看,近期恍然发现被博客园禁了.禁用原因据说是由于flagcounter将香港(HongKong).台湾(TaiWan)和澳门(Macau) ...

  7. 易初大数据 2019年11月8日 linux 王庆超

    ◆linux系统的特点: (1)完全免费. (2)高效.安全.稳定. (3)支持多种硬件平台. (4)友好的用户界面. (5)强大的网络功能. (6)支持多任务.多用户. ◆linux体系: 1.li ...

  8. React第一次渲染为何容易出现TypeError: Cannot read property 'XX' of undefined

    此题可能大家会不屑一顾,哎,错误都给你怼脸上了你还不会嘛,其实大家有没有认真思考过这其中的原因.先上一张错误图,剩余的全靠编.没兴趣看图的老铁们可以拉到最底下直接看结论 错误:  代码: 其次,我再把 ...

  9. jsoup爬虫实战心得

    1.heder很重要,一切尽在header中.尤其cookie,useragent. 2.对于加密的连接,查看js加密过程并试着通过java或你正在使用的语言去实现 3.查看在跳转之前前端发起的关键请 ...

  10. java架构之路(MQ专题)kafka集群配置和简单使用

    前面我们说了RabbitMQ和RocketMQ的安装和简单的使用,这次我们说一下Kafka的安装配置,后面我会用几个真实案例来说一下MQ的真实使用场景.天冷了,不愿意伸手,最近没怎么写博客了,还请见谅 ...