Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第 127 题:如何用 css 或 js 实现多行文本溢出省略效果,考虑兼容性 #246

Open
yygmind opened this issue Aug 19, 2019 · 22 comments

Comments

@yygmind
Copy link
Contributor

yygmind commented Aug 19, 2019

No description provided.

@Liingot
Copy link

Liingot commented Aug 19, 2019

单行:
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
多行:
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3; //行数
overflow: hidden;
兼容:
p{position: relative; line-height: 20px; max-height: 40px;overflow: hidden;}
p::after{content: "..."; position: absolute; bottom: 0; right: 0; padding-left: 40px;
background: -webkit-linear-gradient(left, transparent, #fff 55%);
background: -o-linear-gradient(right, transparent, #fff 55%);
background: -moz-linear-gradient(right, transparent, #fff 55%);
background: linear-gradient(to right, transparent, #fff 55%);
}

@pyb123
Copy link

pyb123 commented Aug 19, 2019

text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
/重点,不能用block等其他/
-webkit-line-clamp: 2; //行数
/*! autoprefixer:off /
-webkit-box-orient: vertical;
/
autoprefixer:on */

@1998yyh
Copy link

1998yyh commented Aug 19, 2019

单行:
overflow:hidden;
文本溢出:省略号;
white-space:nowrap;
多行:
display:-webkit-box;
-webkit-box-orient:垂直;
-webkit-line-clamp:3; //行数
溢出:隐藏;
兼容:
p {position:relative; 行高:20px; max-height:40px; overflow:hidden;}
p :: after {content:“...”; 位置:绝对; 底部:0; 右:0; padding-left:40px;
background:-webkit-linear-gradient(left,transparent,#fff 55%);
background:-o-linear-gradient(右,透明,#fff 55%);
background:-moz-linear-gradient(右,透明,#fff 55%);
背景:线性渐变(向右,透明,#fff 55%);
}

单行:
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
多行:
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3; //行数
overflow: hidden;
兼容:
p{position: relative; line-height: 20px; max-height: 40px;overflow: hidden;}
p::after{content: "..."; position: absolute; bottom: 0; right: 0; padding-left: 40px;
background: -webkit-linear-gradient(left, transparent, #fff 55%);
background: -o-linear-gradient(right, transparent, #fff 55%);
background: -moz-linear-gradient(right, transparent, #fff 55%);
background: linear-gradient(to right, transparent, #fff 55%);
}

这个兼容的方法有个问题,如果出现了数字字母这种,是否会出现盖住半个字的操作。

@nowherebutup
Copy link

nowherebutup commented Aug 19, 2019

  • 单行:
width: 300px;
overflow: hidden;
text-overflow: ellip
white-space: nowrap;
  • 多行(文本一定会溢出的情况下)
div{
  width: 300px;
  position: relative;
  line-height: 1.4em;
  height: 4.2em;
  overflow: hidden;
}
div::after{
  content: "...";
  position: absolute;
  right: 0;
  bottom: 0;
}

@ghost2113
Copy link

// 只适用于多行文本一定会溢出的情况
@mixin multiLineEllipsis($lineHeight: 1.2em, $lineCount: 1, $bgColor: white){
overflow: hidden;
position: relative;
line-height: $lineHeight;
max-height: $lineHeight * $lineCount; 
text-align: justify;
margin-right: -1em;
padding-right: 1em;
&:before {
    content: '...';
    position: absolute;
    right: 0;
    bottom: 0;
}
&:after {
    content: '';
    position: absolute;
    right: 0;
    width: 1em;
    height: 1em;
    margin-top: 0.2em;
    background: $bgColor;
}
}

@Joan428
Copy link

Joan428 commented Aug 20, 2019

`

<div id='box' style="width:400px; 
        height: 200px;
        line-height: 30px;
        border: 1px solid #666666;
        overflow:auto;"> </div>

`

`

<script>
    let str = '这是文本这是文本这是文本这是文本这是文本这是文本这是文本这是文本这是文本这是文本这是文本这是文本这是文本这是文本这是文本是文本这是文本这是文本是文本这是文本这是文本是文本这是文本这是文本是文本这是文本这是文本是文本这是文本这是文本是文本这是文本这是文本是文本这是文本这是文本是文本这是文本这是文本是文本这是文本这是文本';
    let box = document.getElementById('box');
    H = box.offsetHeight;
    for(i=0; i<str.length; i++){
        box.innerHTML = str.substring(0,i);
        if(H<box.scrollHeight){
            box.style.overflow = 'hidden';
            box.innerHTML = str.substring(0,i-3) + '...';
            break;
        }
    }
</script>

`

@Liingot
Copy link

Liingot commented Aug 20, 2019 via email

@james9527
Copy link

p.line {
    overflow: hidden;
    -ms-text-overflow: ellipsis;
    text-overflow: ellipsis;
    display:-webkit-box; //将对象作为弹性伸缩盒子模型显示。
    -webkit-box-orient:vertical; //从上到下垂直排列子元素(设置伸缩盒子的子元素排列方式)
    -webkit-line-clamp: 2; // 显示行数,超出两行隐藏且多余的用省略号表示...
    line-clamp: 2;
    max-width: 210px; // 有必要定义max-width
}

@CYYSILVER
Copy link

JS实现版本

  • 使用split + 正则表达式将单词与单个文字切割出来存入words
  • 加上 '...'
  • 判断scrollHeight与clientHeight,超出的话就从words中pop一个出来
<p>这是一段测试文字,this is some test text,测试文字,测试文字测 </p>
const p = document.querySelector('p')
let words = p.innerHTML.split(/(?<=[\u4e00-\u9fa5])|(?<=\w*?\b)/g)
while (p.scrollHeight > p.clientHeight) {
  words.pop()
  p.innerHTML = words.join('') + '...'
}

@summerooo
Copy link

summerooo commented Aug 21, 2019

https://codepen.io/wrenchde/pen/ExYgbyM

一个用正则的方法


<div class="ellipsis">
  <span>xxxx</span>
 </div>

$('.ellipsis').each(function(
    $('span', $(this)).css('word-break', 'break-all')
     var divH = $(this).height()
     var $span = $('span', $(this)).eq(0)
     while ($span.outerHeight() > divH) {
          $span.text($span.text().replace(/(\s)*([a-zA-Z0-9]+|\W)(\.\.\.)?$/, '...'))
     }
})

@1742284240
Copy link

1742284240 commented Aug 30, 2019

单行超出显示省略号

display: block;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;

多行超出显示省略号

1、普通HTML文本(要内联样式)

-webkit-box-orient: vertical;这句要写在内联里面,写在内部css就是没用,不知道为什么。
display: -webkit-box;
word-break: break-all;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;

2、微信小程序

display: -webkit-box;
word-break: break-all;
text-overflow: ellipsis;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp:2;

@DaYesahh
Copy link

DaYesahh commented Sep 4, 2019

let model = document.createElement("div");
let str = "多行文本溢出省略多行文多行文本溢出省略多行文多行文本溢出省略多行文多行文本溢出省略多行文";
model.innerHTML = str;
console.log(model)
let body = document.getElementsByTagName("body")[0];
body.appendChild(model)
model.style=`
  width:200px;
  height:100px;
  border:1px solid red;
  white-space:nowrap;
`;
let name = str.split("");
name.pop();
str = name.join("")
console.log(str)
while(model.scrollWidth > model.offsetWidth) {
	name = str.split("");
    name.pop();
    str = name.join("")
    model.innerHTML = str+".......";
}

@weimingxinas
Copy link

https://blog.wmxfe.com/2018/03/26/css%E5%92%8Cjs%E5%AE%9E%E7%8E%B0%E5%A4%9A%E8%A1%8C%E6%BA%A2%E5%87%BA%E6%98%BE%E7%A4%BA%E7%9C%81%E7%95%A5%E5%8F%B7/
写了一个vue版本的指令,其实对于多行溢出,在非webkit内核浏览器非常不友好,只能通过js实现(css能显示....,但是如果多行,刚好不需要显示,css无法控制其不显示)

@MXXXXXS
Copy link

MXXXXXS commented Sep 19, 2019

附上一个纯css的解决思路, 使用伪类和css变量
在codepen上查看

@gentlecoder
Copy link

附上一个纯css的解决思路, 使用伪类和css变量
在codepen上查看

有问题哈 文字会遮住...的

@MXXXXXS
Copy link

MXXXXXS commented Oct 24, 2019

附上一个纯css的解决思路, 使用伪类和css变量
在codepen上查看

有问题哈 文字会遮住...的

🤔 没有遮住啊, 没理解你的意思

@xdoer
Copy link

xdoer commented Oct 26, 2019

附上一个纯css的解决思路, 使用伪类和css变量
在codepen上查看

有问题哈 文字会遮住...的

🤔 没有遮住啊, 没理解你的意思

文字超过3行就会被遮住。不足三行,第三行也还会有 ...

@MXXXXXS
Copy link

MXXXXXS commented Oct 28, 2019

附上一个纯css的解决思路, 使用伪类和css变量
在codepen上查看

有问题哈 文字会遮住...的

🤔 没有遮住啊, 没理解你的意思

文字超过3行就会被遮住。不足三行,第三行也还会有 ...

本来多行文本所谓"溢出"就是要指定文本显示范围的(遮住多余文本), 这里设置了"3". 你可以改动css变量--lines来设置想要的行数.
文本不足行数需要js来判断切换显示"...", 这里没有给出, 只是提供了思路

@libin1991
Copy link

JS实现多行溢出省略号思路

@FE-Mars
Copy link

FE-Mars commented Feb 26, 2020

这个方案可能会截半个字符
.ellipsis{ position: relative; width: 100px; line-height: 20px; height: 100px; overflow: hidden; } .ellipsis::before{ content: "..."; position: absolute; bottom: 0; right: 0; line-height: 20px; padding: 0px 4px; background-color: #fff; z-index: 1; } .ellipsis::after{ content: ""; position: absolute; width: 100%; height: 20px; background-color: #fff; z-index: 2; }

@Mr-Plants
Copy link

p{position: relative; line-height: 20px; max-height: 40px;overflow: hidden;}
p::after{content: "..."; position: absolute; bottom: 0; right: 0; padding-left: 40px;
background: -webkit-linear-gradient(left, transparent, #fff 55%);
background: -o-linear-gradient(right, transparent, #fff 55%);
background: -moz-linear-gradient(right, transparent, #fff 55%);
background: linear-gradient(to right, transparent, #fff 55%);
}

兼容方案没超出也显示了省略号

@adele-ty
Copy link

adele-ty commented Sep 3, 2023

单行文本溢出显示省略号

先强制一行内显示文本:white-space: nowrap;
超出的部分隐藏:overflow: hidden;
用省略号代替超出的文字:text-overflow: ellipsis;

多行文本溢出显示省略号

有较大兼容性问题,适合于webkit浏览器或移动端(移动端大部分是webkit内核)
Overflow: hidden;
Text-overflow: ellipsis;
弹性伸缩盒子模型显示:display: -webkit-box;
限制在一个块元素显示的文本的行数:-webkit-line-clamp: 2;
设置或检索伸缩盒对象的子元素的排列方式:-webkit-box-orient: vertical;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests