CSS - 文本属性

缩进文本

将Web页面上一个段落的第一行缩进,这是一种最常用的文本格式化效果。

text-indent:[ | ] && hanging? && each-line?

  • 适用于:块容器
  • :用长度值指定文本的缩进。可以为负值。
  • :用百分比指定文本的缩进(相对于父元素宽度)。可以为负值。
  • each-line:定义缩进作用在块容器的第一行或者内部的每个强制换行的首行,软换行不受影响。(CSS3,浏览器还没支持)
  • hanging:反向所有被缩进作用的行。(CSS3,浏览器还没支持)
  
  
      
          
        Document  
        
      
      
        
Text-indent.

如图:当父元素为400px,子元素text-indent:100%;已经到了400px的位置,由此可见,百分比是相对父级块元素的。

CSS - 文本属性_第1张图片


水平对齐

text-align:start | end | left | right | center | justify | match-parent | justify-all

  • 适用于:块容器
  • left:内容左对齐。
  • center:内容居中对齐。
  • right:内容右对齐。
  • justify:内容两端对齐,但对于强制打断的行(被打断的这一行)及最后一行(包括仅有一行文本的情况,因为它既是第一行也是最后一行)不做处理。(CSS3)
  • start:内容对齐开始边界。(CSS3)
  • end:内容对齐结束边界。(CSS3)
  • match-parent:这个值和 inherit 表现一致,只是该值继承的 start 或 end 关键字是针对父母的 <' direction '> 值并计算的,计算值可以是 left 和 right 。(CSS3)
  • justify-all:效果等同于 justify,但还会让最后一行也两端对齐。(CSS3)
//测试justify
.justify {
    text-align: justify;
}

WASHINGTON - US President Donald Trump and the top leader of the Democratic People's Republic of Korea (DPRK), Kim Jong Un, are scheduled to meet at 9:00 am Singapore time on June 12, the White House said on Monday. At a press briefing, White House spokesperson Sarah Sanders also said that the U.S. advance team now in Singapore "is finalizing logistical preparations and will remain in place until the summit begins." Noting that the US side is "actively" preparing for the meeting, she said that the US delegation in the demilitarized zone (DMZ) along the inter-Korean border continues diplomatic negotiations with the DPRK delegation. "The discussions have been very positive and significant progress has been made," she said. Besides the exchanges in Singapore and the DMZ, US Secretary of State Mike Pompeo last week met with Kim Yong Chol, vice chairman of the DPRK's ruling Workers' Party of Korea Central Committee, in New York.

我们看一下当前的结果:

CSS - 文本属性_第2张图片

当前页面文字为两端对齐,但是通过图片红色框中的内容可以看到出现了单词孤岛的现象,在对文本进行两端对齐处理时,需要调整单词的间距,此时会出现“单词孤岛”现象。这个结果不仅看起来很糟糕,而且损伤了可读性。有一些在网页上实现字符断行的方法,但是效果挺差的。如下图:

.justify {
    text-align: justify;
    word-break:break-all;           
}

CSS - 文本属性_第3张图片

CSS 文本(第三版)引入了一个新的属性hyphens。它接受三个值:none、manual 和auto。manual 是它的初始值,其行为正好对应了现有的工作方式:我们可以在任何时候手工插入软连字符,来实现断词折行的效果。很显然hyphens: none; 会禁用这种行为。但是chorme浏览器不支持当前属性,具体属性支持可以查询caniuse。而且我们还需要加上word-wrap:break-word;一起使用.

.justify {
    text-align: justify;

    word-wrap:break-word;
    -moz-hyphens: auto;
    -ms-hyphens: auto;
    -webkit-hyphens: auto;
    hyphens: auto;
}

我们可以看到红色框中有多个链接字符“-”。

CSS - 文本属性_第4张图片

垂直对齐

延申:块级元素和内联元素的高度由何而来?

块级元素:
设置height的属性的情况下,则是以height为准。
未设置height的情况下,则是以块级元素的内容为准。内容最终会到导向到行内元素(块级元素里的文本内容会被匿名块级盒包围)。

内联元素:
内联元素就复杂了,为什么呢?
以文字大小来看,当然是font-size越大,文字就越大。但是事情没有这么简单,前面文章中提到一张图,说的是7阶层叠水平。其中块级元素低于内联元素。
所以这里我们需要想到的是font-size的大小不一定会影响到包含块级元素的高度。这个的具体示例早已经有大牛测试过,请查看文章。结论是:line-height会决定块级元素的高度(没有设置height的情况下)

延申:文本内容的背景不会作用到半间距



测试文本内容的背景不会作用到半间距。

下图当中背景颜色会作用到文本框加上padding,margin。但是不会作用到半间距。

CSS - 文本属性_第5张图片


延申:文本的内容区可能会大于font-size

* {
    font-family: "Comic Sans MS";
}

.inline {
    font-size: 80px; 
    line-height: 1em; 
    background-color:grey; 
    opacity: 0.7; 
    padding: 0;
}
Test content area draw.


这里的代码可以看到当前span标签的line-height为1em,也就是80px。所以父元素的高度就是80px。但是span元素的背景确实大于80px,这里测试的实际高度为:111px,而且随着字体的变化,字体的高度也会变化。这里是什么原因呢?

字体的em框和字符字形之间可能会存在差别。因为对于大部分字体,其em框的高度与字符字形的高度是不一致的。

CSS2.1中提出:“内容区的高度应当基于字体,但是这个桂芬没有指定如何基于字体确定内容区的高度。使用em框还是字体字形”。这里所以浏览器的操控空间就很大了。浏览器控制当前字体的内容区高度。


line-height

line-height是指文本行基线之间的距离,而不是字体的大小,它确定了将各个元素框的高度增加或者减少多少。line-height 与 font-size 的计算值之差(在 CSS 中成为“行间距”)分为两半,分别加到一个文本行内容的顶部和底部。可以包含这些内容的最小框就是行框。
  • normal 默认。设置合理的行间距。
  • number 设置数字,此数字会与当前的字体尺寸相乘来设置行间距。
  • length 设置固定的行间距。
  • % 基于当前字体尺寸的百分比行间距。
  • inherit 规定应该从父元素继承 line-height 属性的值。


垂直对齐 - vertical-align 

先从div内容垂直居中讲起

先看一个例子:

.block-parent{
    background-color: teal;
    height: 200px;
}

.block-child {
    background-color: gray;
    height: 100px;
}

测试vertical-align的使用环境


父子元素为block
block child

CSS - 文本属性_第6张图片

首先我们使用line-height来实现子div居中,修改css文件如下:

.block-parent{
    background-color: teal;
    height: 200px;
    line-height: 200px;
}

.block-child {
    background-color: gray;
    height: 100px;
    line-height: 100px;
    display: inline-block;
}

CSS - 文本属性_第7张图片

这里简单说一下实现的原理:首先声明,这里的例子只是为了使用line-height。

通过前面学习的知识,我们了解到line-height是文本框和半间距的和。文本框的高度由font-size以及浏览器绘制字体的大小来决定。抛开文本框的高度来说,当line-height的高度增加的时候,那么在没有修改font-size的时候,只会增加上下半间距。并且上下半间距的距离相等。

所以现在代码的情况下,当line-height的高度与父元素的高度相等的时候,自然将父元素的content的内容看成一个line-height为200px的inline元素,但是这种情况不会应用到block子元素,所以将子元素设置为inline-block,并且line-height

设置为子元素的高度,因为line-height具有继承性。

vertical-align实现居中

上面的例子是使用line-height来实现居中的,我们再回忆一下上面的实现方式,是通过上下半间距的相等,然后将文本框放置到了垂直居中的位置。这里又要提起之前的线模型的基线了。

为什么提起基线呢?因为基线是文字垂直位置的初始位置(可以先不管这句话)。OK,既然提到了基线,那么我们是不是可以当作line-height的作用是为了将基线移动位置,当然居中的位置不是基线,而是基线 + 2/(x.height),也就是基线 + 0.5ex,x指的是字母x的高度。还记得四线三格,中心的位置就是基线 + 0.5ex。

走到这里,我们好像发现了关键所在,那就是移动当前inline内容的中线到的父元素文本内容的基线 + 0.5ex。

正好vertical-align:middle可以满足我们的需求:middle会把行内元素框的垂直中点与父元素基线上方0.5ex对齐。

.block-parent{
    background-color: teal;
    height: 200px;
}

.first-block-child {
    background-color: gray;
    height: 100px;
    display: inline-block;
    line-height: 100px;
    vertical-align: middle;
    
}

.second-block-child {
    background-color: gray;
    height: 200px;
    display: inline-block;
    line-height: 200px;
    vertical-align: middle;
    
}

测试vertical-align的使用环境


父子元素为block
first block child
 

如图,当前我以class为second-block-child为基准将first-block-child居中。

总结:其实vertical-align的核心思想在于行内框,以行内框的不同位置作为基准与我们想要调节位置的元素对齐。


vertical-align简介

vertical-align 属性适用行内元素(input,image),表格单元格(table-cell)元素。
Formal syntax: baseline | sub | super | text-top | text-bottom | middle | top | bottom | |

不具有继承性

          CSS - 文本属性_第8张图片

  • baseline元素基线与父元素的基线对齐。对于一些 可替换元素,比如