如何制作动态 ascii 水平分隔符?
How to make a dynamic ascii horizontal divider?
代替水平线或 div 边框,我想做这样的事情:
我的标题
/*--------------------*/
我的内容
请注意标题和内容之间的 divider 实际上是斜杠、星号、破折号,然后是星号和斜杠结束(它应该看起来像代码)。
我很好奇我如何在流动布局上实现这种效果,divider 拉伸以填充 div 的整个宽度。另外,我不想为此使用任何艺术。只使用 ascii 就完美了。
总结:如何创建动态调整大小的自定义 ascii divider?我认为这可能必须主要在 Javascript 中完成,然后在每次 window 调整大小时轮询 div 的宽度,然后计算字符的长度(这是一个monospace 字体)需要填充 space。这是在正确的轨道上吗?
无需使用 JavaScript 和 white-space
CSS 属性:
#container {
width: 300px;
position: relative;
border: 1px dotted black;
}
#dashes {
white-space: nowrap;
width: 100%;
overflow: hidden;
}
#opencomment, #dashes, #closecomment {
position: absolute;
}
#opencomment, #closecomment {
background-color: #FFFFFF;
z-index: 10;
}
#closecomment {
right: 0px;
}
<div id='container'>
<h1>Title</h1>
<div id='opencomment'>/*</div>
<div id='dashes'>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div>
<div id='closecomment'>*/</div>
<!-- position:absolute elements don't affect the DOM, so we need to
"clear a line" -->
<div> </div>
<p>Content</p>
</div>
我只是使用了荒谬的破折号来填满宽屏幕。您可以更改 #container
的宽度以使其更宽或更窄,或者您可以完全删除 #container
元素。
多么好的问题,在制作这个 CSS 唯一的解决方案时玩得很开心。
(由于字距调整的差异,需要针对每个新字体系列进行调整,但它应该在同一系列的不同字体大小下表现得相当好。)
hr {
/* reset */
display: inline-block;
border: none;
/* sizing */
box-sizing: border-box;
width: 100%;
height: 0.1em;
/* dashes */
background-image: linear-gradient(90deg, rgba(0,0,0,0.8) 80%, transparent 80%); /* space */
background-size: 0.4em 0.4em; /* dash */
/* spacing between start/end */
padding: 0 0.7em;
background-clip: content-box;
/* anchor ::before/::after */
position: relative;
}
/* start/end */
hr::before,
hr::after {
position: absolute;
top: -0.5em;
}
hr::before {
content: '/*';
left: -0.1em;
}
hr::after {
content: '*/';
right: -0.1em;
}
<hr>
代替水平线或 div 边框,我想做这样的事情:
我的标题
/*--------------------*/
我的内容
请注意标题和内容之间的 divider 实际上是斜杠、星号、破折号,然后是星号和斜杠结束(它应该看起来像代码)。
我很好奇我如何在流动布局上实现这种效果,divider 拉伸以填充 div 的整个宽度。另外,我不想为此使用任何艺术。只使用 ascii 就完美了。
总结:如何创建动态调整大小的自定义 ascii divider?我认为这可能必须主要在 Javascript 中完成,然后在每次 window 调整大小时轮询 div 的宽度,然后计算字符的长度(这是一个monospace 字体)需要填充 space。这是在正确的轨道上吗?
无需使用 JavaScript 和 white-space
CSS 属性:
#container {
width: 300px;
position: relative;
border: 1px dotted black;
}
#dashes {
white-space: nowrap;
width: 100%;
overflow: hidden;
}
#opencomment, #dashes, #closecomment {
position: absolute;
}
#opencomment, #closecomment {
background-color: #FFFFFF;
z-index: 10;
}
#closecomment {
right: 0px;
}
<div id='container'>
<h1>Title</h1>
<div id='opencomment'>/*</div>
<div id='dashes'>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div>
<div id='closecomment'>*/</div>
<!-- position:absolute elements don't affect the DOM, so we need to
"clear a line" -->
<div> </div>
<p>Content</p>
</div>
我只是使用了荒谬的破折号来填满宽屏幕。您可以更改 #container
的宽度以使其更宽或更窄,或者您可以完全删除 #container
元素。
多么好的问题,在制作这个 CSS 唯一的解决方案时玩得很开心。
(由于字距调整的差异,需要针对每个新字体系列进行调整,但它应该在同一系列的不同字体大小下表现得相当好。)
hr {
/* reset */
display: inline-block;
border: none;
/* sizing */
box-sizing: border-box;
width: 100%;
height: 0.1em;
/* dashes */
background-image: linear-gradient(90deg, rgba(0,0,0,0.8) 80%, transparent 80%); /* space */
background-size: 0.4em 0.4em; /* dash */
/* spacing between start/end */
padding: 0 0.7em;
background-clip: content-box;
/* anchor ::before/::after */
position: relative;
}
/* start/end */
hr::before,
hr::after {
position: absolute;
top: -0.5em;
}
hr::before {
content: '/*';
left: -0.1em;
}
hr::after {
content: '*/';
right: -0.1em;
}
<hr>