我可以根据换行动态隐藏 html 字符吗?
Can I dynamically hide html characters based on the line wrap?
我连续有几个数据(比如姓名、地址、电话号码、电子邮件地址),因为它们占据了网页的薄页脚。
它们由空格-破折号-空格结构分隔,如下所示(但居中):
Name - address - phone - mail address
在小屏幕上,整个页面较小,文本换行。我已经在利用不间断的空格和自动换行来确保一切都到位,但结果并不令人满意。
我得到的是:
Name - address -
phone - mail
我想要的是:
Name - address
phone - mail
对于CSS或JS,如果某些字符恰好位于行的开头或结尾,有什么方法可以动态隐藏它们?
如果没有,请随时提出不涉及更改文本原始格式的不同解决方案。如果我找不到解决方案,我会选择:
- Name -- address -- phone -- mail -
变成:
- Name -- address -
- phone -- mail -
或类似的东西。
晚了:)但我认为纯 CSS 解决方案可能存在。请参阅下面截取的代码。
关键是列表项(第一个除外)的左侧边距为负边距,右侧为正边距相同。结果,这些边距湮灭了在同一行上,但提供了第二行和进一步行的负缩进。容器的"溢出:隐藏;"隐藏了左侧的额外分隔符。在这里,分隔线具有固定宽度很重要。
ul {
list-style: none;
padding: 0;
overflow: hidden;
}
li {
display: inline;
white-space: nowrap;
margin-right: 0.66em;
margin-left: -0.66em;
}
li::before {
display: inline-block;
content: "-";
width: 0.66em;
}
li:first-child {
margin-left: 0;
}
li:first-child::before {
content: none;
}
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
<li>Item 7</li>
<li>Item 8</li>
<li>Item 9</li>
<li>Item 10</li>
<li>Item 11</li>
<li>Item 12</li>
<li>Item 13</li>
<li>Item 14</li>
<li>Item 15</li>
<li>Item 16</li>
<li>Item 17</li>
<li>Item 18</li>
<li>Item 19</li>
</ul>
破折号之间的<span>
元素上添加一个 CSS 类,如下所示:
Name - address <span class="toHideOnMobile"> - </span> phone - mail address
然后对像这样的小型设备使用 CSS:
@media (max-width: 767px){
.toHideOnMobile { display: none; }
}
纯 CSS 无法做到这一点,除非您只想在某些屏幕尺寸下将列表设置为垂直堆叠并从文档中动态删除-
。
Javascript是可能的,但是如果在页面上大量使用,或者如果屏幕大小调整很多,我想出的解决方案可能会非常昂贵,因为它可以触发复杂布局上相当广泛的重新绘制。
Javascript 解决方案
首先,这些元素中的每一个,如"名称"、"地址"、"电话"等,都必须是内联块元素,而它旁边的-
字符必须是::after
伪元素。然后,您可以浏览这些inline-block
元素中的每一个,当您找到页面上垂直位置低于其前一个元素的元素时,您将[the one before its pseudo-element]
设置为display: none
并在页面大小调整时重置。
.HTML
<div>
<ul class='tacky'>
<li>Name</li>
<li>Address</li>
<li>Email</li>
<li>Phone</li>
</ul>
</div>
爪哇语
需要 jQuery
handleList = function(c, e){
var last;
var lastHeight;
$("li", e).each(function(count, listItem){
var height = $(listItem).offset().top;
if(typeof last !== 'undefined'){
if(lastHeight < height){
$(last).addClass("no-tack");
}else{
$(last).removeClass("no-tack");
}
}
last = listItem;
lastHeight = height;
});
};
// jQuery event bindings for load
// and resize
$(document).ready(function(){
$(".tacky").each(handleList);
});
$(window).resize(function(){
$(".tacky").each(handleList);
});
.CSS
CSS在这里,所以我们可以使Javascript更轻量级。
.tacky
{
margin: 0;
padding: 0;
list-style-type: none;
}
.tacky li
{
display: inline-block;
}
// add tack as a psuedo element
.tacky li:after
{
content: "-";
margin: 0 5px;
}
.tacky li:last-of-type:after
{
content: "";
margin: 0;
}
.tacky li.no-tack:after
{
content: "";
margin: 0;
display: none;
}
CSS解决方案
为此,您只需选择一个屏幕尺寸(或一系列屏幕尺寸),在该尺寸下菜单不再有钉子。这不是那么动态,但是使用所有CSS的折衷方案。
.CSS
.tacky
{
margin: 0;
padding: 0;
list-style-type: none;
}
.tacky li
{
display: inline-block;
}
.tacky li:not(:last-of-type):after
{
content: "-";
padding: 0 5px;
}
// Media selector to hide tack characters.
//
// 768 is the max screen width this will
// be visible on.
@media (max-width: 768px){
.tacky li:after
{
display: none;
}
}
如果你知道你想要它分裂什么。您可以通过更改 CSS 显示属性来选择下一行的内容,并使用 CSS 内容属性根据显示的大小添加和删除短划线。
<style>
p > span {display: inline-block;}
p > span:after{ content: " -";}
p > span:last-of-type:after {content: "";}
@media (max-width: 500px){
p > span.street {display: block;}
p > span.street:after{ content: "";}
}
@media (max-width: 300px){
p > span {display: block;}
p > span:after{ content: "";}
}
</style>
<p>
<span class="street">1600 Pennsylvannia Ave.</span>
<span>Washington</span>
<span>DC</span>
<span>1-555-555-5555</span>
</p>
这是一个小提琴:https://jsfiddle.net/ae9j994j/4/
我认为你不能直接做到这一点,但这里有一个可能适合你的技巧:
如果文本text-align: left
则可以强制在-
符号之前发生中断,然后执行视觉剪辑(overflow: hidden
)以隐藏每行最左侧的一两个字符。
演示:https://jsfiddle.net/h4t96hav/
因此,每行的开头确实有"-"符号,但您看不到它,因为内部div 向左移动了两个字符,外部剪辑。
要让它与可变宽度的字体一起工作需要一点捏造,但我认为有一个相当大的误差余地(因为有一个空格)。
请注意,我将块设置为display: inline-block
,因此换行不会发生在数字的左侧。
类似的技巧当然可以用于text-align: right
但我想不出处理居中文本的方法。
- 正在转义javascript数组中的html字符
- AngularJs正在解码HTML字符(不需要)
- 如何在不支持HTML字符的邮件正文中发送%签名
- 如何使用 html 字符解析 javascript 中的字符串
- 转义我的 HTML 字符
- 在某些浏览器中,jquery.html()正在取消转义html字符
- 使用 JQuery 插入 HTML 字符实体
- 使用 Javascript 和正则表达式替换 HTML 字符
- JavaScript 不会转换特殊的 HTML 字符
- 我可以根据换行动态隐藏 html 字符吗?
- 将句点替换为 HTML 字符
- 在谷歌修饰的前元素中保留 html 字符
- 加载 tinyMCE 时的默认 html 字符
- Javascript替换HTML字符
- CKEDITOR getData()返回html字符实体(unicode),但如何获得未翻译的字符
- 如何使用angularjs在CSS伪元素中显示HTML字符实体
- 使用JavaScript拆分字符串,但忽略其中的HTML字符
- jQuery(或JS)解码字符串中的HTML字符实体
- Javascript/jQuery:如何将字符串转换为HTML字符代码
- 转换特殊的HTML字符代码,如"到正常的字符