【问题标题】:Take control of text styled with css columns attribute控制使用 css 列属性设置样式的文本
【发布时间】:2017-08-24 23:54:35
【问题描述】:

成分: div 包含一些我们不知道长度的文本。我们对文本的了解只是它包含一些关键字,例如'mango',并且这些关键字必须放在新列的开头(例如这些关键字是字幕)。

问题:有没有办法用 HTML5 + CSS3 实现这个目标(最好不使用 JS、jQuery 或一些 基于脚本的补丁 em>)?

实际情况(DEMO):

div {
  columns: 2;
  width: 100%;
  height: auto;
}
<div>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud MANGO ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

编辑:为了更好地理解这个问题,我补充说我们对将要显示的文本一无所知。所以它可能包含关键字(在本例中为mango)或不包含。该问题的目的是如何控制将要显示的文本。

【问题讨论】:

  • 这样做的目的是什么?您最终不会得到两列大小不同但向后的列(左侧的小列而不是右侧的小列)?
  • pourpouse 是为了避免在第一列的最后一行显示关键字(在本例中为 mango),以便控制将显示的文本用这种风格。如果关键字不存在,则不会发生任何事情。想象一下,关键字将是一个列表的副标题,如果标题显示为左栏中的最后一个单词,那不是很好,不是吗?
  • 哦,那么这是您在演示中使用的列表还是正文?
  • @Anthony 两者兼得!要显示的文本可以包含一个带有副标题的列表,但这不是强制性的:像我在演示中使用的文本主体是可以接受的。

标签: html css css-multicolumn-layout


【解决方案1】:

这是一种方法,其中一个替换大写的单词,以便将其与以下文本一起包装在一个元素中。

这样你还可以处理 2 个单词并获得 3 列等。

window.addEventListener("load", function() {
  var div = document.querySelector('div');
  div.innerHTML = '<span>' + div.innerHTML.replace(/(\b[A-Z]+\b)/g, '</span><span>$1') + '</span>'
});
div {
  -webkit-columns: 2;
  -moz-columns: 2;
  columns: 2;
  width: 100%;
  height: auto;
}

div span {
  display: block;
  -webkit-column-break-inside: avoid;
  page-break-inside: avoid;
  break-inside: avoid;
}
<div>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud MANGO ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

如果您在浏览器支持方面遇到问题,这里有一个 Flexbox 版本

window.addEventListener("load", function() {
  var div = document.querySelector('div');
  div.innerHTML = '<span>' + div.innerHTML.replace(/(\b[A-Z]+\b)/g, '</span><span>$1') + '</span>'
});
div {
  display: flex;
  width: 100%;
  height: auto;
}

div span + span {
  margin-left: 10px;
}
<div>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud MANGO ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

这是一个表格版本

window.addEventListener("load", function() {
  var div = document.querySelector('div');
  div.innerHTML = '<span>' + div.innerHTML.replace(/(\b[A-Z]+\b)/g, '</span><span>$1') + '</span>'
});
div {
  display: table;
  width: 100%;
  height: auto;
}
div span {
  display: table-cell;
}
<div>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud MANGO ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

如果您想单独设置样式和/或将大写单词放在一行中,只需将其包装一个额外的元素 '&lt;/span&gt;&lt;span&gt;&lt;span&gt;$1&lt;/span&gt;'

window.addEventListener("load", function() {
  var div = document.querySelector('div');
  div.innerHTML = '<span>' + div.innerHTML.replace(/(\b[A-Z]+\b)/g, '</span><span><span>$1</span>') + '</span>'
});
div {
  -webkit-columns: 2;
  -moz-columns: 2;
  columns: 2;
  width: 100%;
  height: auto;
}

div span {
  display: block;
  -webkit-column-break-inside: avoid;
  page-break-inside: avoid;
  break-inside: avoid;
}

div span span {
  /* display: inline-block;       uncomment this to avoid new line  */
  color: orange;
  font-weight: bold;
  font-style: italic;
}
<div>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud MANGO ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2013-10-03
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多