我想要的
侧注。首要关注的是,当然是将它们放置在相对于引用它们的文本的高度上。我可以使用JavaScript来完成这个任务,查看侧注参考的offsetTop
属性,但那样我就必须处理视口大小调整和缩放,而CSS解决方案则将其留给浏览器。因此,CSS解决方案更可取。
背景和动机
这是博客响应式设计的一部分。如果边栏有足够的空间,便会显示侧注;否则,它们将显示为脚注。这篇文章详细解释了这个问题。请记住,过了一定的宽度,我们仍然会有边距,因为如果要保持可读性,文本行不能超过一定长度,所以我们也可以利用那些未被使用的空间。Tufte是这种解决方案的知名支持者。
我尝试过的方法
到目前为止,我已经尝试了两种方法。它们都使用标记(一个<sup>
)的相对定位,以便能够将注释(一个<span>
)与引用文本的顶部偏移量相关联。
我第一次尝试使用绝对定位:
article {
width: 50%;
margin-left: auto;
margin-right: auto;
}
sup {
/* Needed to position sidenotes */
position: relative;
}
.sidenote {
width: 20%;
position: absolute;
/* BTW: This should be proportional to the note's height,
so as to make its vertical center align with the text
referencing it */
top: -100%;
}
/* How could I set the notes' horizontal position relative to the margin or to an element other than the enclosing <sup>? */
.sidenote.l {
right: 0;
}
.sidenote.r {
left: 15vw;
}
<article>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat<sup>1<span class="sidenote r">Several variations of this sentence are known.</span></sup>. 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.
</p>
</article>
<sup>
,所以设置旁注靠近边缘变得棘手。可能可以使用JavaScript解决,但每次视口大小调整时都需要更新偏移量,这让人不感兴趣。
这篇文章提出了类似的方法,但没有展示哪个父元素应该使用相对定位作为参考。如果使用<p>
,那么每个段落每侧只能有一个注意事项,这是我想避免的限制。
我的第二次尝试围绕着CSS网格进行:
article {
display: grid;
grid-template-columns: 15% auto 15%;
}
p {
grid-column: 2;
}
sup {
position: relative;
}
.sidenote.l {
grid-column: 1;
}
.sidenote.r {
grid-column: 3;
}
<article>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat<sup>1<span class="sidenote r">Several variations of this sentence are known.</span></sup>. 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.
</p>
</article>
然而,似乎不可能将子元素(<span>
)放在与父元素(<sup>
)所属的不同网格列中。