我的目标是:
1.限制文本行数
1.文本应右对齐
1.文本溢出:3个点
当我将text-align: right;
添加到样式时,问题就开始了:3点的行为与没有text-align
样式属性时的行为不同:通常,3个点在文本容器之外(灰色)。
x1c 0d1x的数据
**比较“好”与“坏”风格;**唯一的区别:“good”不包含text-align: right;
样式属性。尝试在这些样式中使用font-size,你会发现对于“好”样式,3个点总是在文本容器内(灰色背景),而对于“坏”样式,3个点的位置是意外的(可能在容器内,或部分在容器内,或完全在容器外)
那么,* 有没有可能像“好”样式一样有3个点的行为,但同时让文本正确对齐?***考虑到行数限制。
* {
box-sizing: border-box;
}
body {
height: 100vh;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
background: #78b9f3;
margin:0;
font-family: "Arial";
}
.wrapper {
display: flex;
justify-content: center;
}
.card {
background: #fff;
box-shadow: 0 4px 24px 3px rgb(0 0 0 / 10%);
padding: 20px;
margin: 20px;
width: 200px;
height: auto;
border-radius: 6px;
}
p {
font-size: 1em;
line-height: 1.3em;
margin:0;
}
h2 {
font-size: 1.5em;
margin: 0 0 0.5em 0;
}
.good {
font-size: 20px;
background-color: grey;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
.bad {
font-size: 20px;
text-align: right;
background-color: grey;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
个字符
7条答案
按热度按时间iugsix8n1#
TL;DR:没有100%可预测的css修复
只要看看mdn上的兼容性表除了firefox,浏览器的支持是相当参差不齐的(说得委婉些)。
但是,您可以使用一些JavaScript来修复此呈现问题。
...或者你也可以mimic
text-overflow
anline-clamp
properties with some old school overflow and line height properties.示例一:css only hack
这个技巧是基于定义一些
line-height
相关的类。CSS变量有助于简化计算:
字符串
实际的溢出指示符(省略号)元素只是一个具有背景渐变的绝对定位伪元素(放置在相对定位的父元素中)。
的数据
示例二:js hack for
line-clamp
这个技巧是基于
word-break: break-all
将在块边界内呈现省略号的事实。不幸的是,这将导致丑陋的断字。
要解决此问题,
<span>
元素的数组。word-break: break-word
属性的特殊类示例三:js hack仿真线夹
非常类似于前面的js方法-通过将元素的文本拆分为span元素。
这一次,我们通过附加一个自定义的
<span>
元素来完全替换css elllipsis占位符。溢出的“省略号”占位符根据一些边界框检查放置:离开溢出定义边界的第一个跨度元素将是用于前置省略跨度的位置/索引。
排除支持text-overflow/line-clamp的浏览器
目前,只有firefox和一些iOS safari版本似乎可以正确渲染省略号。
为了避免这些浏览器不必要的js处理,您可以包含一个功能检测:
型
当然,这并不适用于所有的firefox和safari版本。
至少它不使用任何浏览器嗅探。
如果背景颜色从蓝色变为橙子-则应用js修复。
oxiaedzo2#
**演示:**去年6月,我创建了一个小教程,比较了Codepen上的水平省略号和垂直线箝位,包括响应式大小调整和间距调整,以及一些你可以玩的滑块。演示中的内联JS仅用于控制 * 自定义变量 *,与您的问题无关。我为你的目的添加了
text-align
收音机。**解决方案:**将我的代码与您的代码进行比较,我认为您只需将您的
text-overflow: ellipsis;
(用于“好”或“坏”)更改为overflow: hidden
,根据需要设置您的text-align
,然后就可以开始了。direction
属性的值仅与text-align
的值相关。例如:body[dir="ltr"] p { text-align: right }
个body[dir="rtl"] p { text-align: left }
个但这是html文档的常见做法,似乎不是这里的问题。
下面的片段显示了使用 custom attribute
line-clamp
启动和运行所需的纯CSS,您可以将其用于任何需要行箝位的元素。如果你需要更详细的解释,请在评论中告诉我。
个字符
mwkjh3gx3#
我找到了一个解决上述问题的方法:
1.为div/p添加padding-right:20 px-->该数字为只显示三个点的硬编码
1.使用text-align:右
希望这种方式可以帮助您暂时解决这个问题。
个字符
tyg4sfes4#
如上所述,基于 chrome 的浏览器并没有像预期的那样实现
text-overflow: ellipsis;
和text-align: right;
,因此JavaScript解决方案是不可避免的。如果段落不包含HTML,而只包含文本(如您的示例所示),并且已知可能出现的空格字符(请参阅下面的
getLinebreakPosis
),则此答案有效。然而,在这个例子中,似乎只出现了平均的空格字符。如果你处理的是很长的单词,那么你也需要添加一个断字库。
pengsaosao5#
现在看来,这个问题只能在Chrome中重现。Firefox和Safari在多行钳制文本之后正确呈现
...
,即使使用text-align: right
也是如此。只有Chrome以某种奇怪的“绝对定位”方式在包含元素之外呈现省略号。我找到的Chrome解决方法是在clamped text元素上添加
padding-right: 1em
:个字符
mtb9vblg6#
direction: rtl;
将浏览器设置为更改方向。text-align:right
所以点也将出现在右边,按照预期的行为。个字符
s6fujrry7#
我已经添加了方向rtl坏类和点翻转,这是你所需要的。
的数据
还增加了溢出隐藏隐藏其余的文字。希望这对你有帮助。