【问题标题】:How to add an image in the end of every wrapped line?如何在每条换行的末尾添加图像?
【发布时间】:2013-05-14 21:31:30
【问题描述】:

假设我们有一个 div 容器,其中包含一些多行文本并且其中一些行被换行。

是否可以添加图像来指示特定行被换行,而不是由<br> 分隔的另一行?

来自 Notepad++ 的所需样本:

沙盒:http://jsfiddle.net/yL9gU/

【问题讨论】:

  • 是的,您可以使用复杂的 JavaScript 做到这一点。但我认为不会有一个很好的跨浏览器解决方案,而且解决方案不会很快。但这看起来应该是所见即所得编辑器的一部分,这是 JavaScript 中最复杂的事情之一。
  • 我想一个好的开始是克隆一个没有设置宽度的 div 并应用white-space: nowrap - 然后比较看看克隆的是否有更大的宽度。然后你需要检查新的段落和换行符等,并重复这个过程,从你已经标记/未标记的内容中删减文本 - 顺便说一句,这是个好问题
  • @mic:用js分享你的想法。我们不怕复杂性:-) PS:我可以想到一个<span>,它与原始容器具有相同的宽度,我们用原始文本提供,期望它按高度增长
  • 更大的宽度 - 如果您已将文本克隆到没有宽度和空白 nowrap 的 div 中,您会期望克隆的 div 比原始容器更宽(如果有换行)在原文中
  • 第一个答案看起来还不错......但我想到了 Chimoo 所说的你只需要检查 br、hr 和显示块元素等并在它们之后“重新启动”就可以了通过 line-height 计算箭头的位置。

标签: html css


【解决方案1】:

我怀疑这可以在不将 BR 更改为 DIV 的情况下完成,因为似乎 BR 真的很难设置样式:

Can you target <br /> with css?

这是一个简单的纯 CSS 解决方案,需要将 BR 更改为 DIV(可能使用 javascript):

#text {
    border: 1px solid black;
    width: 300px;
}
#text div {
    line-height: 16px;
    background: url(http://cdn.sstatic.net/stackoverflow/img/favicon.ico);
    background-repeat: repeat-y;
    background-position: right top;
}
#text div:after {
    float: right;
    width: 16px;
    height: 16px;
    background-color: white;
    content: " ";
}

http://jsfiddle.net/qVn4L/3/

如果您对 JS 解决方案感到满意,也许这里有一些帮助:

detecting line-breaks with jQuery?

【讨论】:

    【解决方案2】:

    这就是你要找的东西:

    body {
        width: 80%;
        margin: 1em auto;
    }
    pre, p {
        margin-bottom: 1em;
    }
    
    /* Line Markup */
    pre {
        white-space: pre-wrap;
    }
    pre code, span.line {
        display: block;
    }
    
    /* Line height = picuture height */
    span.line {
        line-height: 28px;
    }
    
    /* Indicators in :before and :after */
    span.line {
        padding: 0 13px; /* 8px for indicator, 5px for space around text */
        position: relative;
    }
    
    span.line:before, span.line:after {
        background-repeat: repeat-y;
        content: "";
        display: block;
        width: 10px;
        height: 100%;
        position: absolute;
    }
    span.line:before {
        background-image: url("http://iany.me/gallery/2012/02/css-line-wrap-indicator/line-right.png");
        left: 1px;
        top: 0;
    }
    span.line:after {
        background-image: url("http://iany.me/gallery/2012/02/css-line-wrap-indicator/line-right.png");
        right: -1px;
        top: 0;
    }
    
    /* No left indicator on first line and no right indicator on last line */
    span.line {
        overflow: hidden;
    }
    span.line:before {
        top: 28px;
    }
    span.line:after {
        top: auto;
        bottom: 28px;
    }
    
    /* Add color */
    
    pre {
        border-style: solid;
        border-color: #EEE;
        border-width: 0 8px;
        background-color: #AAA;
    }
    
    span.line {
        margin: 0 -8px;
    }
    

    http://jsfiddle.net/fbDKQ/13/

    感谢 Ian Yang,http://iany.me/2012/02/css-line-wrap-indicator/

    jsfiddle 中的图片 url 无法解析,因此您不会看到它在工作,但是将其替换为另一个图片 url,它就会像您需要的那样工作。

    他还让它标记了一条线继续的左侧,但你可以把那部分剪掉。

    【讨论】:

    • 几乎正确,在我的屏幕上。蓝色箭头显示,但也显示在空白行上。那是我粘贴 Lorem Ipsum 文本的时候。
    • @daniel:是的,我也在考虑固定行高解决方案
    【解决方案3】:

    即使测试不佳,我认为这可能接近您想要的: http://jsfiddle.net/yL9gU/9/

    遗憾的是,不得不使用 lettering.js,因此无法保持纯 CSS,请在此处查看更多信息:http://letteringjs.com/

    在此处查看多背景规范,在 IE8 中不起作用:

    http://caniuse.com/#feat=multibackgrounds
    

    【讨论】:

    • 只需更改: t.text() 到 t.html() ,快速修复:)
    • 这是有原因的......所有其他元素都不起作用,因为只实现了 br。
    • 试过
      ,没问题!
    • jsfiddle.net/yL9gU/16 --- 需要将
      设置为最后全白并覆盖蓝色方块
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签