木灵鱼儿
阅读:1461
纯css来做表单校验样式
css3新增了三个伪类::required
、:valid
、:invalid
- :required 表示input不能为空时使用的
- :valid 表示通过,表单元素和form表单都有的伪类
- :invalid 表示不通过,表单元素和form表单都有的伪类
其实如果要做一个表单css校验样式,:valid和:invalid就行了,但是实际操作上,:invalid还是有一些问题的。
当表单元素有required
属性的时候,该表单元素默认就是:invalid,也就说,必填的表单元素,一开始就是不通过。
所以,如果此时设置:invalid伪类样式,是不合适的。
解决办法就是:
使用:placeholder-shown
伪类来做排除,这个伪类表示,当表单元素的placeholder提示文本显示的时候。
而我们的表单在输入内容后,placeholder会消失。
//所有input的placeholder不显示时border为红色
input:not(:placeholder-shown) {
border-color: red;
}
这样的话,即便我们输入了内容,border还是红色的,所以还需要配合:valid
进行样式覆盖
input:not(:placeholder-shown) {
border-color: red;
}
input:valid {
border-color: green;
}
当表单通过时,颜色为绿色,:valid在后面,会覆盖上面红色边框效果。
这样的话,表单在无输入的情况下是无校验效果的,只有在输入后才有。
但是这样还有一个问题,就是当我required的元素,输入的是空格时,也会提示通过,应为他有内容,空字符也是内容。
在html5中,其实为表单元素提供了一个属性:pattern
,他可以接收一个正则作为校验条件。
那这就很香了。
<input type="text" required placeholder="提示文字" pattern="\S+.*"/>
\S
表示非空白就匹配.*
表示任何值都匹配
连起来就表示:开头不能为空格(全空格无法通过验证)
这样我们校验就更加准确了,简单的网页我们可以不需要使用js,在mvc开发中,这个简直就是省事神器。
注意:pattern只能用于input元素。
示例1:form验证通过button按钮颜色高亮
.form button.submit {
color:#fff;
background-color: #999;
}
.form:valid button.submit {
background-color: #027fff;
}
百度找到一个demo,有兴趣可以去看看:demo
补充:
如果表单元素required属性不是所有的都设置,那么验证的样式就应该要做调整,否则,如果是没有required属性的元素,他的校验也是通过的,他会直接使用:valid
的样式。
所以,最好使用属性选择器筛选一下
input[required]:not(:placeholder-shown) {
...
}
input[required]:valid {
...
}
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
利用原生css实现hash哈希定位跳转偏移量处理
前言最近在写目录树跳转功能的时候,还是遇到之前的那个老大难的问题,就是因为header顶部是fixed浮动的,导致hash跳转的时候会被挡住。因为hash定位会将元素的顶部与视图顶部对齐,但是也因为如此,导致被浮动元素挡住了内容。以前我是拦截默认的click事件,然后使用新的定位方法scrollIntoView来实现,通过配置它为居中展示,从而避免这个问题。最近重构主题的时候,发现这种方式并不优雅,而且很麻烦,有没有办法不依赖js实现呢?于是我想起以前看过的一篇文章,有一个css属性可以做的,于是找了很久,终于找到了,它就是scroll-padding!官方定义为:滚动端口的最佳查看区域...

css选择器优先级计算规则
规则概览0级通配选择器、选择符、逻辑组合伪类通配选择器:* {}选择符:+、>、~、空格、||逻辑组合伪类::not() {} :is() {} :where() {} :has() {}1级标签选择器body {}2级类名选择器、属性选择器、伪类类名选择器:.foo {}属性选择器:[foo] {}伪类::hover {} :active {} :focus {} :focus-within {} :focus-visible {} :link {} :visited {} :any-link {} :target {} :target-within {}...
实现一个自动高度的输入框
前言大概在上个月的时候我就看了对应的一些资料,但是一直拖着,因为这个功能其实vue的框架就有提供,比如element ui的input组件,它的这个功能叫自适应文本域,属性为autosize。所以本文也不过多讲解具体实现,主要还是它的原理层的东西。这个功能可以用在哪呢?比如移动端的聊天输入框的高度判断,拿我们的QQ来讲,在没有内容的时候它就只有1行的高度,如果内容过高,就会自动变高,然后也会有一个max的最大高度阈值,这个高度一般是几行,比如最大6行高度,多了就滚动条处理。那么就开始吧!最基本的实现变高原理其实非常简单,假设我现在有一个textarea元素用于用户的输入,然后我希望它在用...

关于给css自动添加浏览器前缀
前言为了兼容之前的旧浏览器版本,特别是安卓4.4这种低版本,transform是一定得增加浏览器前缀的,但是我在项目中遇到了设置无效的问题,极度蛋疼,下面是我的解决教程,当然没这个问题,看这篇文章,相信你对如果给项目增加浏览器前缀,会有很充分的认识。教程给css增加浏览器前缀,业界的做法就是使用postcss,目前webpack与vue cli他们需要安装的依赖略有不同:webpack:pnpm i postcss postcss-loader autoprefixer -D添加对应的rules{ test: /.s?css$/, use: [ ...省略...
transform 知识补充
rotate的坐标轴和默认值z轴可以看成正对着自己脸的一根轴,每个轴的旋转方向默认如图箭头所示。所有的旋转角度,正值都是根据默认的旋转方向来得,负值则是相反。transform: rotateZ(45deg);只有Z轴的旋转再二维的界面才是有效的,如下图所示:因为在二维的界面Z轴的变化才是有效的,所以默认值的设置就是Z轴,所以简写形式等效于rotateZtransform: rotate(45deg); /*等同于rotateZ(45deg)*/translatetranslate的变化是根据元素的坐标轴而变化的,比如X轴移动100px;transform: translateX(100...

meta name= viewport 知识补充
网页不能直接识别移动设备的实际像素大小再没有设置meta viewport的时候,网页只能识别硬件的物理像素,而非软件像素。物理像素:硬件本身的实际像素大小软件像素:设备尺寸限制,过大的像素并不能带来很好的体验,显示的内容过多反倒无法正常使用,于是有了软件像素,软件像素是基于一定像素比得到的值。比如 iPhone X的软件像素是:375px*812px;它的比是:3;那么它的物理像素就等于:(375*3)*(812*3)更多的对比可以去这个网站查看:mydevice然而实际上移动端设备都会有一个默认的宽度:980px,所以,即便我们没有设置meta viewport,网页也不可能真的使用...

flex布局知识补充
子元素自身的order属性子元素的order的作用详解:默认情况下order的值都为0,如果这个值越小,那么就越靠近起始点,值越大,位置就越后,order其实用于移动元素的位置,而位置的方向则取决于父元素设置的:flex-direction子元素自身的align-self属性从正常角度,align-self是控制子元素y轴的对齐方式,也称侧轴对齐,这个y轴的定义也是取决于父元素flex-direction子元素自身的flex-basis属性flex-basis的效果,最好配合:flex-shrink:0;让子元素不被压缩。flex-basis会根据主轴的来设置元素的宽度还是高度:当主轴是...
element input异步校验+自定义错误提示
主要的效果就是用户注册时,输入的账号如果已经注册了,要提示已经注册,然后提供一个按钮,直接前往登陆。效果图教程首先我们要知道怎么进行自定义错误提示<template> <el-form :model="form" :rules="rules" ref="ruleForm"> <el-form-item prop="account"> <el-input v-model="form.account" name="a...

element input表单验证数字类型方法大全
是不是常常头疼数字类型的校验,整数,小数,往往无法通过一个rules的type属性搞定,自定义校验又五花八门,是否有一套标准流程呢?整数校验整数校验简单,input使用.number修饰符,rules配置type属性即可。<template> <el-form :model="form" :rules="rules" ref="ruleForm" label-width="100px"> <el-form-item label="短信条数:" pr...