- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
CSS display: inline
带有文本的元素“流动”到一行的末尾,然后当容器对它们不够大时继续下一行。
我想实现同样的水平环绕效果,但使用可以控制宽度的 block 元素。
如果我使用 display: inline-block
这使我可以控制 block 的宽度,但是它可以防止换行。
我似乎找不到任何允许我包装和控制元素宽度的 CSS 设置。但是,这似乎应该是可能的。大概浏览器自己的布局引擎在内部计算各种文本字符串的宽度后就会这样做。
我考虑过两种变通方法,它们可以为我提供所需的视觉输出:
let tags = document.getElementsByClassName("js");
let currentLeft = 0;
for (let i=0; i<tags.length; i++) {
let tag = tags[i];
// dont know how to get the "width this would be if it was not inline cleanly".
tag.style.display="inline-block";
let requestedWidth = tag.offsetWidth;
tag.style.display="inline";
let parentWidth = tag.parentNode.offsetWidth;
console.log("requestedWidth:" + requestedWidth);
console.log("parentWidth:" + parentWidth);
console.log("currentLeft:" + currentLeft);
//FIXME: handle spanning over arbitary number of lines.
if ((currentLeft + requestedWidth) < parentWidth) {
// Got plenty of space for this element on this line so just make it a inline-block
tag.style.display = "inline-block";
currentLeft += requestedWidth;
console.log("Just setting inline-block, its wide enough");
} else {
// This element needs breaking up into two elements, one for the part that fits on this
// line, and another for the remainder on the next line.
let part1Width = parentWidth - currentLeft;
let part1 = document.createElement("span");
part1.style.display = "inline-block"
part1.style.width = part1Width + "px";
part1.style.verticalAlign = "top";
part1.style.height = "16px";
let part2Width = requestedWidth - part1Width;
let part2 = document.createElement("span");
part2.style.display = "inline-block"
part2.style.width = part2Width + "px";
part2.style.verticalAlign = "top";
part2.style.height = "16px";
currentLeft = 0 + part2Width;
tag.appendChild(part1);
tag.appendChild(part2);
console.log("Adding two fixed width children: " + part1Width + " " + part2Width);
}
}
.container {
width: 200px;
background-color: lightblue;
}
span {
word-break: break-all;
font-family: monospace;
}
.bad {
display: inline-block;
height: 16px;
}
.stuffed {
line-height:22px;
}
.js {
height: 15px;
vertical-align: top;
}
.color1 {
background-color: hsl(0, 80%, 50%);
}
.color2 {
background-color: hsl(20, 80%, 50%);
}
.color3 {
background-color: hsl(40, 80%, 50%);
}
.color4 {
background-color: hsl(60, 80%, 50%);
}
.color1.stuffed {
color: hsl(0, 80%, 50%);
}
.color2.stuffed {
color: hsl(20, 80%, 50%);
}
.color3.stuffed {
color: hsl(40, 80%, 50%);
}
.color4.stuffed {
color: hsl(60, 80%, 50%);
}
<html>
<body>
<p>Inline elements with text in them "flow" over the end of a line
and then carry on the next line when the container isn't large enough for them.
</p>
<div class="container">
<span class="good color1">These inline</span><span class="good color2">spans will wrap over</span><span class="good color3">the end of the container</span><span class="good color4">exactly how i would like them to</span>
</div>
<br/>
<p>
However i want to do the same layout but with block elements that i can set
the width of. Using inline-block allows me to control the block width however
it seems to prevent line-breaking from working.
</p>
<div class="container">
<span class="bad color1" style="width:96px"></span><span class="bad color2" style="width:160px"></span><span class="bad color3" style="width:192px"></span><span class="bad color4" style="width:256px"></span>
</div>
<p>
Obviously i can acheieve something of the same behaviour by stuffing my inline
elements with hidden text, but that seems sub-optimal
</p>
<div class="container">
<span class="stuffed color1">████████████</span><span class="stuffed color2">████████████████████</span><span class="stuffed color3">████████████████████████</span><span class="stuffed color4">████████████████████████████████</span>
</div>
<p>
Finally, it is ofc also possible to fix this problem in javascript, but i'm tenative
to do layout in javascript when the browser already clearly have a well optimised
layout engine for doing this on text already.
</p>
<div class="container">
<span class="js color1" style="width:96px"></span><span class="js color2" style="width:160px"></span><span class="js color3" style="width:192px"></span><span class="js color4" style="width:256px"></span>
</div>
<br/>
<br/>
<br/>
</body>
</html>
最佳答案
如果这只是为了视觉目的,那么您可能有一种方法可以使用跨度元素来应用多个渐变。
这是一个不言自明的例子:
.container {
width: 200px;
padding:5px;
background-color: lightblue;
text-align:justify;
}
span {
padding:0;
background-image:
linear-gradient(hsl(0, 80%, 50%),hsl(0, 80%, 50%)),
linear-gradient(hsl(20, 80%, 50%),hsl(20, 80%, 50%)),
linear-gradient(hsl(40, 80%, 50%),hsl(40, 80%, 50%)),
linear-gradient(hsl(60, 80%, 50%),hsl(60, 80%, 50%));
background-size:
100px 100%, /* 1st color width = 100px */
280px 100%, /* 2nd color width = 280px - 100px = 180px */
450px 100%, /* 3rd color width = 450px - 280px = 170px */
520px 100%; /* 4th color width = 520px - 450px = 70px */
background-repeat:no-repeat;
}
/* we fill the span with content */
span::before,
span::after{
content:"█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █";
color:transparent;
}
<div class="container">
<span ></span>
</div>
.container {
height: 120px; /* this will define the visual width of container */
column-width: 20px; /* this will define the visual height of rows*/
display: inline-block;
column-gap: 4px; /* gap between rows */
/* this transformation will invert everything like we want */
transform-origin: top left;
transform: rotate(90deg) scaleY(-1);
/**/
}
span {
display: block;
}
span:hover {
filter: invert(1);
}
/* all the height below will define the visual width */
span:nth-child(1) {
background: hsl(0, 80%, 50%);
height: 80px;
}
span:nth-child(2) {
background: hsl(20, 80%, 50%);
height: 100px;
}
span:nth-child(3) {
background: hsl(40, 80%, 50%);
height: 80px;
}
span:nth-child(4) {
background: hsl(60, 80%, 50%);
height: 200px;
}
<div class="container">
<span></span>
<span></span>
<span></span>
<span></span>
</div>
关于html - 是否可以像行内文本一样使行内 block 元素换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62433455/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!