如何将文本与对角线图像对齐

已发表: 2022-02-16
对角线图像文本

一位 OSTraining 客户要求一种方法来对齐对角线图像旁边的文本,同时保持两个元素之间的空间。

我的第一个想法是在文本的特定点添加断线,但这不起作用,因为该网站是响应式的。

在与客户交谈后,我们提出了一个更优雅的解决方案......

用例

在这个例子中,文本需要左对齐,图像右对齐。 这里真正的挑战是文本不能覆盖图像。 我们想要的结果如下图所示:

2

解决方案

我们可以使用动态宽度值添加浮动在右侧的空 div,以强制文本不覆盖图像。 请注意,在此示例中,图像是使用 CSS 添加为背景的。

1

的HTML

此示例的 HTML 如下所示:

 <div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <div class="spacing"></div>    <p>A buch of dummy text goes here...</p> </div>

您可以注意到具有间距类的多个空 div。 这些元素与一些 CSS 结合生成文本和图像之间的间距。

间距 div 的数量等于填充图像高度所需的文本行数。 在此示例中,图像需要覆盖 14 行。

CSS

为了更好地解释,我将把所需的 CSS 分成几个部分。

 #container {  background-image: url(bg.png);  background-repeat: no-repeat;  background-position: right top;  background-size: 300px auto;  min-height: 300px; }

将图像定义为具有特定位置和大小的背景。

 #container p {  line-height: 22px;  font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;  font-size: 14px; }

#container p选择器引用文本。 定义 font-size 和 line-height 以稍后计算其他属性的值非常重要。

 .spacing {  float: right;  clear: right;  height: 22px; }

此属性告诉空 div 浮动在右侧。 请注意, height的值与我们在段落中用于line-height的值相同。

 .spacing:nth-child(1) {  width: 305px; } .spacing:nth-child(2) {  width: 283px; } .spacing:nth-child(3) {  width: 261px; } .spacing:nth-child(4) {  width: 239px; } .spacing:nth-child(5) {  width: 217px; } .spacing:nth-child(6) {  width: 195px; } .spacing:nth-child(7) {  width: 173px; } .spacing:nth-child(8) {  width: 151px; } .spacing:nth-child(9) {  width: 129px; } .spacing:nth-child(10) {  width: 107px; } .spacing:nth-child(11) {  width: 85px; } .spacing:nth-child(12) {  width: 63px; } .spacing:nth-child(13) {  width: 41px; } .spacing:nth-child(14) {  width: 19px; }

上面的代码是可能需要使用计算器的有趣部分。

.spacing:nth-child(1)选择的宽度值将应用于具有间距类的第一个 div,以同样的方式.spacing:nth-child(2)定义稍小的宽度,依此类推,直到它到达间距元素14 号。

将动态值从高到低定义到右侧每个空 div 的原因可以使文本与左侧对齐而不覆盖图像。

4

话虽如此,我们如何计算每个空 div 的宽度? 答案需要一个基于以下值的小公式:

  • 文本的行高(在我的示例中为 22px)
  • 背景尺寸(本例中为 300 像素)

第一个空 div 的宽度是 305 像素,这是定义的背景宽度加上 5 个额外像素的值,我决定包括以避免文本太靠近图像的边缘。

响应式支持

使用示例代码,该设计在任何屏幕尺寸下都能正常工作。 查看演示并调整浏览器大小以查看它的实际效果。

查看演示

奖金:少

直接使用 CSS 的一种替代方法是 LESS。 如果您不熟悉 LESS,我们有一个教程。

您可以使用 LESS 生成相同的结果,从而轻松地为每个具有间距类的 div 创建多个宽度值,而无需担心数学问题。

 @textHeight: 22px; @backgroundWidth: 300px; @extraSpacing: 5px; @initialWidth: @backgroundWidth + @extraSpacing; @textLines: @backgroundWidth / @textHeight;

通过变量确定文本的高度和背景宽度。

 #container {    background-image: url(bg.png);    background-repeat: no-repeat;    background-position: right top;    background-size: @backgroundWidth auto;    min-height: @backgroundWidth; }

容器的属性。

 #container p {    line-height: @textHeight;    font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;    font-size: @textHeight - 8; } .spacing {    float: right;    clear: right;    height: @textHeight; }

基于一些变量动态计算的文本和间距属性。

 .generate-spacing(@i, @end) when (@i <= @end) {    .spacing:nth-child(@{i}) {        width: @initialWidth - ((@i - 1) * @textHeight);    }    .generate-spacing((@i + 1), @end); } .generate-spacing(1, @textLines);

为所有空 div 生成动态宽度的循环。

在 Codepen 中测试此代码