带边界半径的多线圆角

Posted

技术标签:

【中文标题】带边界半径的多线圆角【英文标题】:Multi-line rounded corners with border radius 【发布时间】:2015-01-30 23:10:41 【问题描述】:

我正在尝试为具有背景的跨度提供边界半径。没有自动换行它可以正常工作。但是当有自动换行时,它看起来像这样:

如您所料,我只需要对边缘进行圆角处理(左上边缘除外)。我不认为我可以使用border-radius 属性来做到这一点,而且我不知道该怎么做。

有什么想法吗? 谢谢。

编辑:代码

.messageTextCont 
  margin-left: 5px;
  word-break: break-word;

.messageText 
  font-size: 17px;
  font-weight: 300;
  color: #FBFDFE;
  background-color: #402060;
  padding: 0px;
  box-shadow: 5px 0 0 #402060, -5px 0 0 #402060;
  line-height: 23px;
  -moz-border-bottom-left-radius: 5px;
  -webkit-border-bottom-left-radius: 5px;
  border-bottom-left-radius: 5px;
  -moz-border-bottom-right-radius: 5px;
  -webkit-border-bottom-right-radius: 5px;
  border-bottom-right-radius: 5px;
  -moz-border-top-right-radius: 5px;
  -webkit-border-top-right-radius: 5px;
  border-top-right-radius: 5px;

edit2:我也可以用js解决方案

edit3 :通过包含这个,我非常接近我想要的:

-webkit-box-decoration-break: clone;
-o-box-decoration-break: clone;
box-decoration-break: clone;

它的作用是复制第一行的样式,并将它们应用到第二行以防断字。但问题如下:

现在它完全克隆了第一行的属性并将它们应用到第二行,使左上角和右上角也圆角,这是不应该的。为了掩盖这一点,我让线条重叠了一点,我得到了结果,但现在一些字母也重叠了。如果我找到解决重叠字母问题的方法而不是这个,问题就解决了。

edit4:我使用了盒子阴影:

box-shadow: 5px 0 0 #402060, -5px 0 0 #402061, -5px -3px 0 orange, 5px -3px red;

为了掩盖不必要的差距。现在结果是这样的:

我现在唯一的问题是下面的线与上面的线重叠。如果有某种方式使上面的线与底线重叠,那么问题就解决了。

【问题讨论】:

很确定这对于纯 CSS 是不可能的 你能展示一下你目前尝试过的代码吗? 不,CSS 无法检测到内容。我怀疑,您需要 JS 来确定换行符的位置并在其中包含一个额外的跨度。 如果您提供所需样式的模型,可能会对其他人有所帮助。 文字超过2行怎么办? 【参考方案1】:

[已解决]:我的解决方案如下所示:

.messageText 
  font-size: 17px;
  font-weight: 300;
  color: #FBFDFE;
  background-color: #402060;
  padding: 0px;
  box-shadow: 5px 0 0 #402060, -5px 0 0 #402061, 5px 5px 0 #402060, -5px 5px #402060;
  line-height: 23px;
  -moz-border-bottom-left-radius: 5px;
  -webkit-border-bottom-left-radius: 5px;
  border-bottom-left-radius: 5px;
  -moz-border-bottom-right-radius: 5px;
  -webkit-border-bottom-right-radius: 5px;
  border-bottom-right-radius: 5px;
  -moz-border-top-right-radius: 5px;
  -webkit-border-top-right-radius: 5px;
  border-top-right-radius: 5px;
  -webkit-box-decoration-break: clone;
  -o-box-decoration-break: clone;
  box-decoration-break: clone;

这里是 jsFiddle:

http://jsfiddle.net/vpo2x84s/3/

【讨论】:

【参考方案2】:

可以通过添加box-decoration-break: clone;来完成

JSFiddle

【讨论】:

【参考方案3】:

你必须做的事情对于这个简单的效果来说太多了。但只是为了回答您的问题,这里有一种方法:

您需要检测换行,然后插入一个新的<span>。因此,您正在为第二行创建第二个跨度。第三个,用于第三行,依此类推。

要检测换行,您需要在所有空格处拆分文本,删除文本,在检查父母身高的同时逐字重新添加。如果高度增加,则您有一个换行符。

这是一个使用 jQuery 的快速而肮脏的 javascript 解决方案

var textContainer = $('span');

textContainer.each(function()
    var current = $(this);
    var text = current.text();

    var words = text.split(' ');

    current.text(words[0]);
    var height = current.height();

    // loop through text
    for(var i = 1; i < words.length; i++)
        // save current text
        var origText = current.text();
        // insert new word
        current.text(current.text() + ' ' + words[i]);

        // height increased?
        if(current.height() > height)
            // remove just inserted word to NOT line break
            current.text(origText);
            // insert linebreak and new span
            var linebreak = $('<br />').insertAfter(current);
            current = $('<span>').insertAfter(linebreak);
            // put the removed word into the new span
            current.text(current.text() + ' ' + words[i]);
        
    
);

部分代码来自Source,我对其进行了修改以满足您的需求。

亲身体验here on JSFiddle

请注意:这真的又快又脏。如果您经常使用它,您可以并且应该优化此代码的性能。

【讨论】:

以上是关于带边界半径的多线圆角的主要内容,如果未能解决你的问题,请参考以下文章

CSS 具有边界半径的防弹圆角

CSS 带有CSS3边界半径的CSS圆角

带边框半径的防弹圆角

带有圆角的 Flutter WebView

图层和阴影上的圆角半径

带圆角的可滚动表格