当前位置: 首页 > Web前端 > HTML

内容宽度自适应的CSS输入框

时间:2023-04-02 22:36:20 HTML

通常我们看到的输入框都是固定宽度的,但有时我们也会遇到内容宽度自适应的情况。目前我知道的有两种方式,相信不难找到。为普通的div标签设置contenteditable="true"。设置inline-block后,可以自适应内容的宽度。将input的输入内容同步到一个透明的div中。parent的宽度跟随div的宽度,然后设置input为Absolute定位覆盖在顶部,设置width为100%是一个很好的解决方案。这次带来全新的纯CSS实现,相信能带来不一样的感受1.可替换元素首先,input不同于普通的div元素,它是可替换元素在CSS中,可替换元素(replacedelement)是不受控制的通过CSS。这些元素是外部对象,其外观独立于CSS呈现。一般情况下,如果你想让一个元素的宽度在内部确定,你可以设置div{display:inline-block;}在CSS3中,你也可以通过另一种方式实现div{width:fit-content;}属性,可以参考这篇文章:理解CSS3max/min-content和fit-content等宽度值?张欣旭-欣空间-欣生活(zhangxinxu.com)然而,在输入中,这些并不容易使用。从development中也可以看到,input有一层shadow-root,浏览器并没有暴露相关的选择器给开发者使用。因此,仅通过常规方法无法实现自适应内容宽度。2.下划线样式看到效果图中的输入框你能想到什么?没错,下划线。下划线是一种文字装饰,它跟在文字后面,所以去掉input的边框后,再添加一个下划线input{border:0;大纲:0;text-decoration:4pxsolidunderline;}效果如下下划线确实出来了,而且也跟在输入内容后面,但是有点太紧了。3、下划线偏移为了解决上述问题,需要一个新的CSS属性text-underline-offset来表示下划线的偏移位置。目前兼容性还不错。除IE外,主流浏览器均支持。现在,从下划线输入偏移一点距离{/**/text-underline-offset:10px;}下划线实际上没有了!下面的text-underline-offset从0px→10px变化。这是由于内部尺寸问题。下划线已移出容器。尝试给input加上高度,比如input{/**/height:60px;text-underline-offset:10px;}但是没有效果。从开发者工具可以看出,外面设置的高度不会影响里面的尺寸,所以里面还是默认的高度。那么,有什么办法可以改变高度吗?答案是行高line-height!输入{/**/行高:2;text-underline-offset:10px;}行高属于text属性,可以继承到里面,这样内部尺寸直接拉伸,下划线也可见4.默认最小因为宽度有下划线,当输入框没有内容,或者只有占位符时,下划线不存在。比如的效果如下。可能感觉有点难看,希望加上一个下划线的最小宽度(当然需要设计决定)这时候可以用线性渐变输入绘制下划线{background:linear-gradient(currentColor,currentColor)centerbottom6pxno-repeat;背景大小:10rem4px;这样,就会有一个类似最小宽度的效果。需要注意的是,下划线的位置和线性渐变的位置一定要保持一致。改变颜色,然后刚才的线性渐变也需要改变颜色input:focus{text-decoration-color:dodgerblue;background-image:linear-gradient(dodgerblue,dodgerblue)}这样就实现了文章开头的效果。完整代码可访问:自动输入(codepen.io)6.总结及说明以上介绍了一个全新的能够实现自适应内容宽度的纯CSS方案,使用了通常不太起眼的下划线相关样式。如果你的项目不需要兼容IE,而你正好有这个需求,可以放心使用。不过,即使不使用上面的方法,也可以了解一下思路。总结一下要点:input是一个可替换的元素。下划线跟在文本之后,而不是容器。现在新增了text-underline-offset,可以用来控制输入内容为空时下划线的偏移量。下划线不存在。CSS渐变可用于绘制下划线。下划线颜色可以通过文本装饰颜色text-decoration-color修改。还有一个小细节,input其实是设置了100%的宽度,也就是整行都可以使用Input,但是从视觉上看划线部分好像是输入框,算是一个小技巧。如果您觉得还不错,如果对您有帮助,请点赞,收藏,转发???