完美的label文本两端对齐

2,472 阅读3分钟

背景

公司需要做一个修改信息的页面,而登记这些信息的页面已经在使用了,而且还是别人开发的。那么我需要做的就是模仿他页面开发。其中遇到了label的两端对齐需求,如何兼容各种浏览器。

第一种:text-align-last: justify

这个是最简单的一个css3样式,但是兼容性不好。

text-align-last: justify;width: 100%;

只需要增加一个宽度属性便可以了。(ps:记得给行内标签加display: inline-block;

第二种:text-align: justify;

这是一种需要一个伪元素才能实现的方案。需要在label文本的后面添加<span></span>或者任意的非块级标签,当然你也可以使用after实现。

原理:justify生效的时候,需要不处于最后一行。那么我们可以增加一行,让label文本不是最后一行就可以生效了。

  label{
      display: inline-block;
      width: 100%;
      text-align: justify;
      height: 0.8rem;
  }
 
 label>span{
      display: inline-block;
      padding-left: 100%;
 }

总结

选择第二种方式比较好一点,没有兼容性问题,比较简单。

基本上内容就到次完结了。

-----------------------------------分割线--------------------------------------------------

新问题:如果一个label文本太长,以上办法无法解决怎么办呢?

新的解决方案依然是第二种,只不过需要对label文本稍加判断,添加不同的类名去实现。

一般来说,一个label文本的最合适的长度是4个中文。那么我们就根据这个判断,去加载不同的类名。

兼容文本太长的解决方案

实现步骤(ps:这个默认label的长度不会超过8个)

  1. 先判断文本长度是否大于4
  2. 加载不同的类名

步骤超级简单,其实这个主要的难点还是在css上。

以下就是不同类名的css

   .label{
          display: inline-block;
          width: 100%;
          text-align: justify;
          height: 0.8rem;
    }
    
    .label1{
          line-height: 0.8rem;
    }
    
    .label2{
          line-height: 0.4rem;
    }
    
    .label>span{
          display: inline-block;
          padding-left: 100%;
    }

两个不同的类名,差别就在于line-height上,其余都是一样。

假如你看懂了,那么如果label文本长度超过了8个中文字,小伙伴应该能很快知道需要新增的样式是什么样了吧。

题外话

有一些字段是必填的,有一些字段是非必填的。那么我们怎么在label上加呢?

第一种:直接在label的文字后面前面加*,或者使用after

这种方式虽然简单,但是会占位子(这里的占位是指与文本的位置,简单说就是算作了一个中文字符),不好用。各位可以试试。

第二种:使用before伪元素,或者直接加在label前面

这种方式跟第一种其实是一样的,会受label标签本身的样式影响

第三种:把label的文本再包一层,然后label使用before伪元素定位。 这种实现方式是最好看的。这里还需要考虑label文本的长度是否超过4的情况。

最后一种代码实现

css

html