关于前端:CSS-自适应内容宽度的输入框

4次阅读

共计 2083 个字符,预计需要花费 6 分钟才能阅读完成。

通常咱们见到的输入框都是宽度固定的,但有时也会碰到自适应内容宽度的,像这样

目前我所晓得的有两种形式,置信不难找到

  1. 给一般 div 标签设置 contenteditable=”true”,设置 inline-block 当前,就能够自适应内容宽度了
  2. 将 input 的输出内容同步到一个通明的 div,父级宽度追随 div 的宽度,而后设置 input 为相对定位并笼罩在下面,设置宽度为 100%

都是很不错的计划。这次带来一个全新的纯 CSS 实现计划,置信能带来不一样的感触

一、可替换元素

首先,input 不同于一般的 div 元素,它是一个可替换元素

在 CSS 中, 可替换元素 replaced element)的展示成果不是由 CSS 来管制的。这些元素是一种内部对象,它们外观的渲染,是独立于 CSS 的。

失常状况下,如果心愿一个元素宽度由外部决定,能够设置

div{display: inline-block;}

在 CSS3 中,还能够通过另一种形式实现

div{width: fit-content;}

还不太理解这个属性的能够参考这篇文章:了解 CSS3 max/min-content 及 fit-content 等 width 值 « 张鑫旭 - 鑫空间 - 鑫生存 (zhangxinxu.com)

然而,在 input 中,这些都不好使了,从开发者工具也能够看到,input 还有一层 shadow-root

并且浏览器也没有暴露出相干的选择器供开发者应用,因而,仅仅通过惯例形式是不能实现自适应内容宽度的

二、下划线款式

看到效果图中的输入框能想到什么?没错,就是下划线。下划线是文本润饰的一种,是追随文字走的,所以去除 input 的边框后,加上下划线

input{
  border: 0;
  outline: 0;
  text-decoration: 4px solid underline;
}

成果如下

下划线的确进去了,而且也是追随输出内容的,不过有点贴的太紧了

三、下划线偏移

为了解决上述这个问题,须要用到一个新的 CSS 属性 text-underline-offset,示意下划线偏移地位。目前来说,兼容性还算不错,除了 IE,支流浏览器均反对了

当初,给下划线偏移一点间隔

input{
  /* */
  text-underline-offset: 10px;
}

下划线竟然不见了!如下 text-underline-offset 从 0px → 10px 的变动

这是因为外部尺寸的问题,下划线曾经偏移出容器之外了,试着给 input 增加高度,比方

input{
  /* */
  height: 60px;
  text-underline-offset: 10px;
}

然而,没什么成果

从开发者工具中能够看到,里面设置的高度并不能影响到外部尺寸,所以外部依然是默认的高度

那么,还有什么方法能够扭转高度呢?

答案就是行高 line-height

input{
  /* */
  line-height: 2;
  text-underline-offset: 10px;
}

行高属于文本属性,能够继承到外部,这样外部尺寸就间接被撑开了,下划线也可见了

四、默认最小宽度

因为应用的是下划线,当输入框没有内容时,或者仅仅只有 placeholder,下划线是不存在的,比方

<input placeholder="请输出...">

成果如下

可能感觉有些不难看,心愿加上一个最小宽度的下划线(当然须要设计来定夺)

这时,能够用线性突变画一条下划线就能够了

input{background: linear-gradient(currentColor,currentColor) center bottom 6px no-repeat;
  background-size: 10rem 4px;
}

这样就有一个相似最小宽度的成果了

须要留神的是,下划线的地位和线性突变的地位要保持一致

五、聚焦的款式

当初加上一点聚焦的款式,看起来更像一个输出边框,下划线须要扭转色彩,而后方才的线性突变也须要扭转色彩

input:focus{
  text-decoration-color: dodgerblue;
  background-image: linear-gradient(dodgerblue,dodgerblue)
}

这样就实现了文章结尾的成果

残缺代码能够拜访:auto input (codepen.io)

六、总结和阐明

以上介绍了一种全新的能够实现自适应内容宽度的纯 CSS 计划,用到了平时不太起眼的下划线相干款式,如果你的我的项目不必兼容 IE,也刚好有这方面的需要,就能够释怀用起来了,不过,就算用不上,也能够学习一下思路。上面总结一下要点:

  1. input 是一个可替换元素
  2. 下划线是追随文本的,而不是容器
  3. 当初有一个全新的 text-underline-offset 能够用来管制下划线的偏移
  4. 输出内容为空时下划线也就不存在了
  5. 利用 CSS 突变能够绘制一个下划线
  6. 下划线色彩能够通过文本润饰色彩 text-decoration-color 批改

还有一个小细节时,input 其实是设置了宽度为 100% 的,也就是整行都能够输出,只是视觉上看着如同是下划线那一部分是输入框而已,算是一个小小的障眼法。如果感觉还不错,对你有帮忙的话,欢送点赞、珍藏、转发❤❤❤

正文完
 0