【问题标题】:How to put text over an image without absolute positioning or setting the image as backbround如何在没有绝对定位或将图像设置为背景的情况下将文本放在图像上
【发布时间】:2010-12-22 05:17:47
【问题描述】:

我正在尝试查看是否可以在不使用 position: absolute 或将图像作为元素背景的情况下将一些文本放在图像上。
限制的原因是 HTML 代码要进入电子邮件,事实证明 hotmail 都不支持。
我记得当我第一次开始学习 CSS 时,在图像周围摆弄浮动文本时,我经常会发现文本在图像上到处都是。遗憾的是,我无法重现这种行为。

全文(编辑于):
我从图形设计师那里收到了精美的布局。它基本上是一张漂亮的背景图片,带有链接到网站的徽标,中间基本上是“文本在此处”区域。
在这些情况下,像往常一样,我使用表格来确保一切都保持原位并且可以跨浏览器+跨邮件客户端工作。
问题出在中间的“文本到这里”区域不是白色矩形,而是有一些背景图形。
经过一些测试,Live Hotmail 似乎不喜欢这两个位置:绝对或背景图像;相对边距也不好,因为它们会破坏布局的其余部分。

当前版本,适用于任何其他邮件客户端/网站:

...
<td>
<img src='myimage.jpg' width='600' height='400' alt=''>
<p style="position: absolute; top: 120px; width: 500px; padding-left: 30px;">
blablabla<br>
yadda yadda<br>
</p>
</td>
...

当然,“不可能”可能是一个完全可以接受的答案,但我希望不是 ;)

【问题讨论】:

  • [gripe]电子邮件应该是纯文本媒体。我可以承认需要富文本 - 偶尔使用粗体或斜体 - 但背景图片只是不必要的膨胀。[/gripe]
  • 玛莎,我非常同意你的看法。但是由于客户想要在他的电子邮件中包含图形和酷炫的东西,我几乎别无选择。只是希望他们不会开始要求 javascript 效果! ;)
  • 我完全同情,Agos,这就是为什么我将我的评论标记为抱怨。 :)

标签: html css css-float css-position hotmail


【解决方案1】:

我过去常常一上桌就玩这种特技。真的很难看,并且可能会让你运行它的任何验证器感到非常尴尬:重叠的表格单元格。可以在大多数浏览器中使用,即使没有 css。

例子:

<table>  
  <tr>
    <td></td>
    <td rowspan=2><img src="//i.stack.imgur.com/XlOi4.png"></td>
  </tr>  
  <tr>
    <td colspan=2>This is the overlay text</td>
  </tr>  
</table>

我知道,我应该为此投反对票。

【讨论】:

  • 这太疯狂了!另外:作品,排序。布局(您可能已经通过示例猜到了)已经依赖于表格进行定位。由于我已经有几个 colspans 和 rowspans 正在运行并且我在设置它们时很糟糕,所以我只是在我的 td 中放了另一个 ,并且基本上使用了你的示例。它可以工作,但它以某种方式增加了 1px(在 Safari 上是水平的,在 Firefox 上是垂直的),甚至以各种方式指定大小都无法解决它。
  • 我怎样才能修改它以使文本仅在图像未加载时可见。当图像可用时,我不想显示文本。
  • 以前 - 您是否尝试将 cellpadding 和 cellspacing 设置为零?
  • 这个解决方案在苹果邮件、gmail 和 Outlook.com 中对我有用,但在 Outlook 2010 中破坏了布局。必须坚持使用纯色方形背景。
  • 如何在这些行中有更多行和不同宽度百分比的情况下做到这一点?
【解决方案2】:

如果使用绝对定位,则应同时指定lefttop 属性。此外,您应该在某个父元素上设置position:relative; 以使其成为一个层,以便绝对定位使用该元素作为原点。如果你不指定原点,它可能是窗口,也可能是其他元素,你不知道你的绝对定位元素会在哪里结束。

还有一些其他替代方法可以将元素相互叠加,每种方法都有自己的局限性。

您可以使用相对定位使文本显示在图像顶部:

<img src="..." alt="" />
<div style="position:relative;top:-50px;">
   This text will display 50 pixels higher than it's original position,
   placing it on top of the image. However, the text will still take up
   room in it's original position, leaving an empty space below the image.
</div>

您可以在另一个元素中使用浮动元素将文本放在图像顶部:

<div>
   <div style="float:left;">
      This text will be on top of the image. The parent element
      gets no height, as it only contains floating elements.
      However, IE7 and earlier has a bug that gives the parent
      element a height anyway.
   </div>
</div>
<img src="..." alt="" />

【讨论】:

  • 您好,感谢您的解释。相对定位(我包括 gWiz 的答案)是不可行的:那会在下面留下一个洞,即使我固定了下面的东西,底部仍然会有几百像素的空白。浮动解决方案在理论上似乎很聪明,但似乎不起作用。该元素确实已从流中移除,但后续元素放置在其旁边,如果没有空间,则放在其下方。
【解决方案3】:

您可以尝试设置负边距。除了最不复杂的布局之外,这在所有布局中都很难维护。负边距有效地将元素“拉”到那个方向。

<img src="blah.jpg" height="100"/>
<div style="margin-top:-100px">
  blah blah blah
</div>

【讨论】:

  • 注意:负边距在很多情况下等同于 position:relative; 负位置,例如position:relative; top:-100px,就像 Guffa 的回答一样。
【解决方案4】:

控制事物外观的最佳方法是将文本作为图像本身的一部分。当然,如果您使用像 jpeg 这样具有高压缩率的有损图像格式,它可能看起来很糟糕,但也许 PNG 对您有用?或者,根据颜色的数量,gif 可能会起作用。

这还为您提供一致的字体、过滤等。

【讨论】:

  • 您的解决方案确实很聪明,但我忘了提到电子邮件是用于确认/邀请目的,因此文本是动态的(例如,它以“嗨,安迪!”开头)。跨度>
  • ...我可以动态生成图像,但光是这个想法就让我头疼。
  • 啊,我明白了。有没有机会动态生成图像?如果您要发送大量此类文件,则可能不可行。您使用什么工具来生成电子邮件?
  • 大声笑,你在我问之前就回答了。 :)
  • 共享主机上的 php ;_;我不会发送很多这些,但这样的解决方案(虽然在技术上非常有趣和具有挑战性)绝对超出了这个项目的范围。
【解决方案5】:

说如果你有一个父 div 和一个图片和段落在里面,给他们三个位置“相对”,给孩子“z-index”,说“20”图片和“21”文本。文本将出现在图像上。并且你可以用“top or left or right or bottom”来调整文字

CSS
#learning{
margin: 0px;
padding:0px;
height: auto;
width: 100%;
position: relative;

}
#learning>img{
width:inherit;
height:inherit;
margin: 0px;
display: block;
position: relative;
z-index: 20;
}
#learning > p{
font-family: 'droid_serifitalic';
color: white;
font-size: 36px;
position: relative;
top:470px;
left:500px;
z-index: 21;
} 

【讨论】:

    【解决方案6】:

     .main_image{grid-area: overflow;}
    
        .main_text{
        grid-area:overflow;
        color: white;
        margin: auto auto auto 5%;
        font-size: 2rem;
        line-height: 3rem;} 
        .main{
        display: grid;
        grid-template-columns: 1fr;
        grid-template-rows:1fr; 
        grid-template-areas: "overflow";
        }
        <div class="main">
    			
          <div class="main_image">
             <img src="https://images.unsplash.com/photo-1548783300-70b41bc84f56?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=334&q=80" style="width:100%; height:auto">
           </div>
    
           <div class="main_text"> 
                <p>overlap text</p>
                <h2>your text</h2>
                <p>lorem ipsum lorem lorem</p>
           </div>  
       </div>
       

    【讨论】:

    • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多