请教一个css样式的问题

遇到的问题

请教大佬,我参考 typora 的orageheart 主题,效果是这样的


但是我的代码有一个问题,由于我是用 h2::after 来编制一条延长线,宽度我是用 62vw 来实现的,但是如果编辑窗口小于 整个窗口的62%,就会出现横向滚动条,
稍微有一点强迫症,想问下 这个css 代码,有没有什么改进的方案,

希望的效果

当编辑窗口宽度未占满整个软件的62%宽度时,延长线能根据窗口宽度适配,不产生滚动条

使用的代码

h2,
.cm-header-2 {
    display: inline-block;
    background-color: var(--interactive-accent); 
    padding-top: var(--size-2-3);
    padding-bottom: var(--size-2-3);
    padding-right: var(--size-4-2);
    padding-left: var(--size-4-2);
    border-bottom-width: calc(var(--border-width) * 2);
    border-bottom-style: solid;
    border-bottom-color: var(--interactive-accent);
    position: relative;
    box-shadow: 15px 6px 7px hsla(var(--interactive-accent-hsl), 0.3);
    border-top-left-radius: var(--radius-m);
    border-bottom-left-radius: var(--radius-m);
    border-top-right-radius: var(--radius-m);
    color: var(--text-on-accent) !important;
}

h2::after,
.cm-header-2::after {
    content: "";
    display: block;
    width: 62vw;
    height: calc(var(--border-width) * 2);
    background: linear-gradient(
        to right,
        hsla(var(--interactive-accent-hsl), 1),
        hsla(var(--interactive-accent-hsl), 0.9),
        hsla(var(--interactive-accent-hsl), 0.3),
        transparent
    );
    position: absolute;
    left: var(--radius-m);
    bottom: calc(var(--border-width) * -2);
}

这个 ::after 伪元素按理来说宽度应该和 .cm-header-2 的父元素 .HyperMD-header-2 宽度相同吧(整个笔记页面的宽度), 把它设置到 .cm-header-2 里面并设置 62vw 是有其他考虑吗?

如果没有的话可以设置到.HyperMD-header-2 里面,宽度设置为 100% 自动和笔记页面一样,就不会出现滚动条了。

如果有其他考虑必须这样的话,可以给 .HyperMD-header-2 加一个 overflow: hidden; ,让它宽度锁死在笔记页面宽度,::after 超出的部分会隐藏掉,同样不会有滚动条。

2 个赞

不行就用隐藏滚动条的css吧

::-webkit-scrollbar:not(pre code) {
  visibility: hidden;
  background-color: transparent;
  width: 10px;
}

::-webkit-scrollbar-thumb:not(pre code) {
  visibility: hidden;
}

::-webkit-scrollbar:hover {
  visibility: initial;
}

::-webkit-scrollbar-thumb:hover {
  visibility: initial;
}

或者不使用after伪元素,而是给h2元素加一个下划线或设定h2元素的下边框可见,大概是 border-bottom这个设置

1 个赞

是这样一个问题

如果宽度设置成 100%的话,那 box-shadow 就会被顶出 页面了,只能取消 盒阴影了,不取消盒阴影的话,那 after 长度 就会有100% 与元素 同宽的问题 :joy:

还有一种做法,是将 边框做在 父元素上,但是在预览模式或者导出成pdf时, h2 是没有父元素包裹的,那就会变成这样了,让我很是纠结

1 个赞

分别设置三种模式下的样式:

h2,
.cm-header-2 {
    display: inline-block;
    background-color: var(--interactive-accent); 
    padding-top: var(--size-2-3);
    padding-bottom: var(--size-2-3);
    padding-right: var(--size-4-2);
    padding-left: var(--size-4-2);
    border-bottom-width: calc(var(--border-width) * 2);
    border-bottom-style: solid;
    border-bottom-color: var(--interactive-accent);
    /* position: relative;  取消这里的 relative */
    box-shadow: 15px 6px 7px hsla(var(--interactive-accent-hsl), 0.3);
    border-top-left-radius: var(--radius-m);
    border-bottom-left-radius: var(--radius-m);
    border-top-right-radius: var(--radius-m);
    color: var(--text-on-accent) !important;
}

h2::after,
.cm-header-2::after {
    content: "";
    display: block;
    width: 100%;
    height: calc(var(--border-width) * 2);
    background: linear-gradient(
        to right,
        hsla(var(--interactive-accent-hsl), 1),
        hsla(var(--interactive-accent-hsl), 0.9),
        hsla(var(--interactive-accent-hsl), 0.3),
        transparent
    );
    position: absolute;
    left: var(--radius-m);
    bottom: calc(var(--border-width) * 0);
}

/* 编辑模式下,::after宽度遵从 .HyperMD-header-2 (.cm-header-2 的父元素)*/
.HyperMD-header-2 {
  position: relative;
}

/* 阅读模式下,::after宽度遵从 .el-h2 (h2 的父元素)*/
.el-h2 {
  position: relative;
  margin-bottom: 16px;
}

.markdown-rendered h2 {
  margin-bottom: 0;
}

/* 打印模式下,因为 h2 没有父元素,所以将 h2 设为 relative,::after 的位置遵从 h2,但宽度改为 100vw */
:not(.el-h2) > h2 {
    position: relative;
}

:not(.el-h2) > h2::after {
  width: 100vw;
  bottom: calc(var(--border-width) * -2);
}

这样实现在三种模式下,::after 的宽度都等于页面宽度:
image
image

因为::after 宽度不会超过页面宽度,也就不会有横向滚动条了

1 个赞

我试试,非常感谢