Amazing Css:自定义下划线样式的Input
Amazing Css:自定义下划线样式的Input
这篇文章将通过CSS的方式实现一个常见的Input样式,包括一些VUE的Tips
效果
相比于传统的方框Input同款样式,下划线的input输入框占用版面更小,视觉效果比较灵活,通常可以使表单面板更加整洁。写这样一个输入框的组件只需要一些CSS和少量的JS就可以完成。
第一步思考:border
对于带下划线的东西,可能最容易想到的就是border这个属性了。border属性的确可以在一定程度上完成这个需求,只需要把传统Input的边框去掉,然后将底部的border加上颜色和宽度就可以完成。
尝试给input添加如下样式,去掉原本的边框,然后给border-bottom加一个颜色和宽度。
<div class="sejta-input-container"><input placeholder="input"/></div>
.sejta-input-container{--inputWidth: 285px;--inputHeight: 30px;width: var(--inputWidth);height: var(--inputHeight);position: relative;& input{height: 100%;width: var(--inputWidth);border: 0;outline: 0;display: flex;border-bottom: cornflowerblue 2px solid;}}
现在这个输入框的样式大概是这样:
第二步思考:PlaceHolder
给input元素加上原生的placeholder属性,先来看看:
好像还阔以~
好吧,尽管对大多数情况,这个PlaceHolder的样式已经够了,在这个强调用户交互感(卖弄技术流)的年代里,可能还需要一点点的修饰。
我们先用代码把原来的PlaceHolder隐藏掉,将PlaceHolder的颜色设置成透明就可以了:
.sejta-input-container{...& input{...&:placeholder-shown::placeholder{color: transparent;}}
}
然后给HTML中加一个Label元素
<div class="sejta-input-container"><input placeholder="this is a placeholder"/><label>this is a placeholder</label></div>
最后给Label元素添加一个绝对定位和样式:
.sejta-input-container{...& label{pointer-events: none;position: absolute;font-size: 12px;color: #C1C1C1;top: calc(50% - 6px);left: 0;}
}
好的,现在的样子大概是这样的:
我尼玛。。一顿操作0-5的既视感,就是说,我们删掉了原来的placeholder,然后用一个label标签占住了原来placeholder的位置。熟悉CSS变换操作(视觉欺骗)的同学可能已经知道我们要干什么了,placeholder是不能乱动的,但是label基本上属于一个可以为所欲为的标签。
为所欲为啊为所欲为:
.sejta-input-container{& label{...transition: .1s linear;transform-origin: 0% 0%;}& input {...&:not(:placeholder-shown)~label,&:focus~label{--transy:calc((-0.5)*var(--inputHeight));transform: scale(0.8) translate(0,var(--transy));color: cornflowerblue;}}}
解读一下,这里用了placeholder-shown的选择器,意思是当placehodler-shown为false的时候,选择input的下一个兄弟元素label(~选择器),让它进行一系列的旋转跳跃。
注意整理的–transy变量,是为了计算transform的位移量而设置的。
我们设置变形中心 transfrom-orgin为0 0的点,这样可以避免变形后的label向右侧移动。
到现在为止,整个dom结构是这样的,这里用了vue的格式来书写:
<template><div class="sejta-input-container"><input placeholder="this is a placeholder"/><label>this is a placeholder</label></div>
</template>
<style lang="scss">.sejta-input-container{--inputWidth: 285px;--inputHeight: 30px;width: var(--inputWidth);height: var(--inputHeight);position: relative;& input{height: 100%;width: var(--inputWidth);border: 0;outline: 0;display: flex;border-bottom: cornflowerblue 2px solid;&:placeholder-shown::placeholder{color: transparent;}&:not(:placeholder-shown)~label,&:focus~label{--transy:calc((-0.5)*var(--inputHeight));transform: scale(0.8) translate(0,var(--transy));color: cornflowerblue;}}& label{transition: .1s linear;transform-origin: 0% 0%;pointer-events: none;position: absolute;font-size: 12px;color: #C1C1C1;top: calc(50% - 6px);left: 0;}}
</style>
<script>export default {name:"sejta-input"}
</script>
第三步思考:更多的交互内容
其实一开始写这个控件,是不想使用border的。border是一个很强大的属性,与此同时也有很大的限制性,比如说动画。
一位伟人说得好,想要为所欲为,首先你需要一个div。
最初为了轻量和简单,准备使用伪元素来仿造border,结果一顿操作发现input没有before或者after伪元素–就算部分chrome浏览器可以渲染出来,显示也不太正常。所以这里直接用div操作了。当然有兴趣的童鞋也可以使用svg的line来做下面的效果。
我们把原来border-bottom的代码去掉,并且添加一个div,用来伪造border:
<div class="sejta-input-container"><input placeholder="this is a placeholder"/><label>this is a placeholder</label><div class="border-line"></div></div>
.sejta-input-container{...& input{.../*border-bottom: cornflowerblue 2px solid;*/box-sizing: border-box;}& .border-line{height: 2px;width:var(--inputWidth);background: cornflowerblue;position: absolute;bottom: 0;left: 0;}
}
OK,现在我们得到了一个跟之前一毛一样的input。注意这个新添加的input属性:
box-sizing:border-box;
它的意思是让input计算高度的时候以边框的位置开始计算。如果没有这一行代码:
Very Well~
下面我们来添加交互效果。首先让代表着激活的这个div宽度为0,然后当输入框激活时,宽度从0变成var(–inputWidth)
.sejta-input-container{...& .border-line{...width: 0px;transition: all .2s linear;}& input{...&:not(:placeholder-shown)~.border-line,&:focus~.border-line{/*transform: scaleX(100);*/width:var(--inputWidth);color: cornflowerblue;}}
}
来看看效果:
Div是真的好用,当初用SVG的位移,定位差点没搞死我。
好的,到现在为止,贴一下全部代码:
<template><div class="sejta-input-container"><input placeholder="this is a placeholder"/><label>this is a placeholder</label><div class="border-line"></div></div>
</template>
<style lang="scss">.sejta-input-container{--inputWidth: 285px;--inputHeight: 30px;width: var(--inputWidth);height: var(--inputHeight);position: relative;& .border-line{width: 0px;height: 2px;transition: all .2s linear;background: cornflowerblue;position: absolute;bottom: 0;left: 0;}& input{box-sizing: border-box;height: 100%;width: var(--inputWidth);border: 0;outline: 0;display: flex;border-bottom: #C1C1C1 2px solid;&:placeholder-shown::placeholder{color: transparent;}&:not(:placeholder-shown)~label,&:focus~label{--transy:calc((-0.5)*var(--inputHeight));transform: scale(0.8) translate(0,var(--transy));color: cornflowerblue;}&:not(:placeholder-shown)~.border-line,&:focus~.border-line{/*transform: scaleX(100);*/width:var(--inputWidth);color: cornflowerblue;}}& label{transition: .1s linear;transform-origin: 0% 0%;pointer-events: none;position: absolute;font-size: 12px;color: #C1C1C1;top: calc(50% - 6px);left: 0;}}
</style>
<script>export default {name:"sejta-input"}
</script>
一个凑合的input就写好了。
How To Vue Components
敬请期待
Amazing Css:自定义下划线样式的Input相关推荐
- css中字体下划线样式,css下划线 浅谈css自定义下划线
使用css样式对一段文字或一段文字中其中几个文字设置虚线效果的下划线如何实现?我们知道css字体下划线使用text-decoration样式实现,而虚线下划线则不能使用此css样式属性.要实现通过下边 ...
- 浅谈CSS自定义下划线
问题描述: 使用:first-letter将首字母的font-size增大后,下划线text-underline也会变粗. eg: <!doctype html> <html> ...
- css里给文字加下划线代码,css添加文字下划线样式的方法
css添加文字下划线样式的方法 发布时间:2020-08-31 13:54:27 来源:亿速云 阅读:65 作者:小新 这篇文章将为大家详细讲解有关css添加文字下划线样式的方法,小编觉得挺实用的,因 ...
- php css下划线,css如何添加文字下划线样式?(代码详解)
css如何添加文字下划线样式?本篇文章就给大家介绍css添加文字下划线样式的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们来了解一下css添加文字下划线样式的方法有哪 ...
- html怎么设置下划线形状,科技常识:CSS如何给文字添加下划线样式
今天小编跟大家讲解下有关CSS如何给文字添加下划线样式 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关CSS如何给文字添加下划线样式 的相关资料,希望小伙伴们看了有所帮助. 在css中可以 ...
- div html 下边加横线_CSS如何给文字添加下划线样式?
在CSS中可以使用text-decoration属性或border-bottom属性来给文字添加下划线样式.下面本篇文章就来给大家介绍一下,希望对大家有所帮助. 方法1:使用text-decorati ...
- css选择器下划线设置,css中怎么设置字体下划线
css中设置字体下划线的方法:1.使用"text-decoration:underline;"设置下划线样式:2.通过"border-bottom"属性设置下划 ...
- php css下划线,如何自定义下划线的样式
下划线可以通过设置border-bottom以及background-image的值来自定义下划线的样式 下划线一般在文本中是一条黑色的直线,那么如何改变下划线的样式呢?接下来在文章中将为大家详细介绍 ...
- CSS设置下划线对齐方式,如何巧妙利用CSS自定义网页下划线样式
如何巧妙利用CSS自定义网页下划线样式 CSS为网页设计者们提供了丰富而灵活的页面元素表现形式的控制手段.但是,或许你可能注意到了,对于下划线,CSS提供的可选操作却不是很多.一般情况下,人们看到的下 ...
最新文章
- 四人过桥问题c语言编程,SQL趣题:四人过桥的问题
- AutoML自动化机器学习技术深入
- python【力扣LeetCode算法题库】16- 最接近的三数之和
- 后Hadoop时代的大数据技术思考:数据即服务
- 排序---对二维数组的排序
- 端到端BPM(带有DMN标记)
- 最大数max(x,y,z)(信息学奥赛一本通-T1152)
- 后渗透后门_TheFatRat:Msfvenom傻瓜化,小白也可以学渗透
- Java多线程学习二十七:AtomicInteger 在高并发下性能不好,如何解决?为什么?
- Android UI控件之Gallery(拖动效果) --拖动式图片浏览
- java运行vbs_如何在Java中执行VBS脚本?
- iOS 中高级面试题(附答案)
- 语音信号处理的过程及其应用
- 超分辨率:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network论文翻译
- Qt widget事件传递顺序以及监听特定控件是否接收某个事件
- SLF4J: Class path contains multiple SLF4J bindings(log4j与logback冲突了)
- win7系统iis建立ftp服务器,win7 iis建立ftp服务器
- 前端自动化 Jenkins/TravisCI/CiecleCi
- 包对象之Oracle如何编译失效包体
- c语言strrchr函数,strrchr_字符串 | Strings_C_参考手册_非常教程
热门文章
- 【办公类-16-06】“校历(月日版)”(python 排班表系列)
- 17岁少年因购票难攻击航司系统,获刑四年!自述三年级辍学,曾自学AI、大数据...
- 利用 Logarithmic Binning (Log-Binning)方法绘制幂律分布(Power-law Distributions)曲线
- dell电脑装linux raid无法安装系统,系统定制安装遇到RAID卡无法安装的解决方案
- xlwings出现的报错
- 大数据搜索引擎原理分析——设计并实现一个中文分词的算法
- 台达DVP系列PLC与台达DTA温控器modbus通讯案例功能:采用台达DVP ES型号PLC,对台达DTA温控器通过485方式,modbus协议,进行温度的设定
- php 文章id连续,真正完美解决wordpress文章ID不连续问题
- 图解八股,真的太顶了
- 转变技术指导重点江苏水稻穗期田管 国稻种芯百团计划行动