EveSunMaple / Frosti

A clean, elegant, and fast static blog template! 🚀 Developed with Astro
https://frosti.saroprock.com
GNU General Public License v3.0
181 stars 30 forks source link

建议:优化代码块样式 #5

Closed guobao2333 closed 2 months ago

guobao2333 commented 3 months ago

出于直观和美观性,代码块里的三个点(看起来像是在模仿hexo的一个主题,但没有颜色啊……)和左边的行号,应该分别固定在左上角和左边。
在小屏/手机端当代码超过屏幕最大宽度时滑动会同时移动它,这个小细节希望能够调整。

由于我的ts/js/css技术太拉跨了,而且astro目前的结构我还没有看懂,所以很抱歉不能直接修改和推代码。
感谢您的开源工作!

EveSunMaple commented 3 months ago

出于直观和美观性,代码块里的三个点(看起来像是在模仿hexo的一个主题,但没有颜色啊……)和左边的行号,应该分别固定在左上角和左边

是这样的,我代码框的样式使用了https://daisyui.com/components/mockup-code/ 的样式,在 pre 的样式中 @apply mockup-code ,您可以看一下 daisyui 中的示例,其中它的 三个点 和行号本身就不是固定的。

同时,允许我解释下 Astro 与 Hexo 代码框的区别所在,即使我并没有开发过 Hexo 主题,但是从生成的 HTML 中就可以发现两者的区别:

在 Astro 中,不管是 Shiki 还是 Prism,生成的格式都是 pre 包在外面, code 在里面直接就是代码。得益于 Shiki 中用 span 添加属性 line 区分了每一行,使我可以直接通过 CSS 而不是 JS 直接生成行号。而 Hexo 中, 您可以发现上面的顶栏、行号是不同的元素,他们并不是 伪元素 ,而是实实在在的元素。一般来说是 figure 在最外面,然后是 table、td等等。如此,它们可以与代码元素区分开来,形成“滑动代码而不滑动顶栏、行号”的效果。

可以发现, Astro 本身生成的代码框就有局限性,无法做到元素的分离。这也就是为什么很多 Astro 主题都没有红绿灯样式、没有行号的原因。当然,如果您用 JS 改善页面也可以,但是这样显然太蠢了。我以前曾试图找到一种自定义构建的方法,但是没有找到,所以我不得不在 Astro 给我的默认格式上进行操作。

需要注意的是,仅仅通过伪元素做不到上方的红绿灯样式,我这里直接拿了 mockup-code 作为我的代码框样式,也通过下面的代码实现了行号 (这只对 Shiki 有效)

pre .line {
  counter-increment: line;
  padding-left: 2.5em;
}

pre :not(:last-child).line::before {
  content: counter(line);
  position: absolute;
  left: 0;
  width: 3em;
  text-align: right;
  margin-right: 10px;
  color: #888;
}

但无论如何,它们都是附着于代码元素之上的,与 Hexo 的方式有本质区别,所以做到这个可能有些困难。

当然,解决这个问题肯定更好,我现在有两种解决方案:

  1. 写一个非常厉害的 JS 直接把原有结构推翻。
  2. 自定义 Shiki 生成的格式直接写入。

第一种我大概率会无限期延迟(这太蠢了);第二种我不知道应该怎么做,这里添加一个 help 标签,如果有大佬看到可以指导一下。

至少目前我通过 daisyui 和伪元素实现了这两个功能,就我个人而言已经足够了(毕竟很多 Astro 主题并没有这些功能)。我不会关闭这个 issue,如果有解决这个问题的方法自然是最好……只是我目前无能力解决。

抱歉我这么久才回复,这几天比较忙,不知道能不能来得及解决上一个 issue 的问题……

最后感谢您的 issue!是你们让 Frosti 变得更好!😊

KazariEX commented 3 months ago

https://shiki.tmrs.site/guide/transformers

EveSunMaple commented 3 months ago

https://shiki.tmrs.site/guide/transformers

@KazariEX 非常感谢,过几天我学习一下再修改 ❤️

EveSunMaple commented 3 months ago

好的,我做出了一些成果,如下

QQ20240729-002114

可以看到三个元素已经分开了,滑动代码框不会影响行号

再写一下CSS移植按钮就完成了😊这里做一下情况汇报

EveSunMaple commented 3 months ago

预计明天早上(其实是今天7/29早上)或者晚上发布预览版本,届时请两位过目 @KazariEX @guobao2333

Help:这里我发现直接套用 Hexo 的 table 不能做到行号与代码的分离(无法限制宽度以使用 overflow-auto),所以我这里我都使用了 div。我不是专业人士,不知道这样有没有存在潜在的问题。

Other:学习这个确实花费了我一段时间,加上这几天在外面修改比较慢,请见谅。如果还存在问题或者有更好的建议,请及时联系我!

Thanks everyone!

guobao2333 commented 3 months ago

Help:这里我发现直接套用 Hexo 的 table 不能做到行号与代码的分离(无法限制宽度以使用 overflow-auto),所以我这里我都使用了 div。我不是专业人士,不知道这样有没有存在潜在的问题。

一般建议用语义化标签,但是需要一些自定义样式,这样除了直观简洁之外,还做到了结构清晰,代码部分的话,html原生提供了两个相关标签,code and pre,你可以在项目中尝试使用一下,但由于我对这个项目不太熟悉,这方面我只能提供一些建议。

对于其他部分,红绿灯的样式可以选择性去掉或者保留,语法名可以放在左侧,在右侧放一个复制按钮,红绿灯我觉得完全可以丢弃掉,以免被诟病模仿hexo的betterfly主题。而且在美观方面个人觉得没什么区别……

EveSunMaple commented 3 months ago

Help:这里我发现直接套用 Hexo 的 table 不能做到行号与代码的分离(无法限制宽度以使用 overflow-auto),所以我这里我都使用了 div。我不是专业人士,不知道这样有没有存在潜在的问题。

一般建议用语义化标签,但是需要一些自定义样式,这样除了直观简洁之外,还做到了结构清晰,代码部分的话,html原生提供了两个相关标签,code and pre,你可以在项目中尝试使用一下,但由于我对这个项目不太熟悉,这方面我只能提供一些建议。

代码部分我当然是使用 codepre 的,只是三个元素用 div 包裹使用了 flex 样式

已经发布 v2.5.0-beta

EveSunMaple commented 3 months ago

嗯,我又做了一点小修改,您可以访问 https://frosti.saroprock.com/ 查看效果 @guobao2333

还有问题与建议请留言 😊

EveSunMaple commented 3 months ago

对于其他部分,红绿灯的样式可以选择性去掉或者保留,语法名可以放在左侧,在右侧放一个复制按钮,红绿灯我觉得完全可以丢弃掉,以免被诟病模仿hexo的betterfly主题。而且在美观方面个人觉得没什么区别……

是的,我就是这么做的,您应该看得见

guobao2333 commented 3 months ago

@EveSunMaple 不知道您是否已在小屏/手机端测试过,在图片中的代码块显得很小,也就是说代码块在上一层的包裹中,panding值应该更小(代码块的边缘更加靠近屏幕边缘)

其次将代码向左划动到尾部,代码内容应与边缘存在一定空间,一般可以添加5~10px,这通常也是最佳做法。 Screenshot_2024-07-29-09-45-08-59_40deb401b9ffe8e1df2f1cc5ba480b12

guobao2333 commented 3 months ago

在首次访问时的时间会在2-10秒,后续访问其他页面速度确实会更快,我觉得应该先为用户展示一个加载页面,不知道您对此看法如何? @EveSunMaple 有时这会让我认为我的网络出了问题……甚至我在本地开发访问时也是这样,这不由得让我怀疑我的设备坏掉了(开玩笑😆)

EveSunMaple commented 3 months ago

@EveSunMaple 不知道您是否已在小屏/手机端测试过,在图片中的代码块显得很小,也就是说代码块在上一层的包裹中,panding值应该更小(代码块的边缘更加靠近屏幕边缘)

看过的,我个人觉得还好,整个页面看起来还是挺可爱的(奇怪的形容)

Screenshot_20240729_100323.jpg

不过 padding 确实可以再缩 1em 比较好,下一个版本会改的

其次将代码向左划动到尾部,代码内容应与边缘存在一定空间,一般可以添加5~10px,这通常也是最佳做法。

👍 这个好,了解了

Screenshot_2024-07-29-09-45-08-59_40deb401b9ffe8e1df2f1cc5ba480b12

EveSunMaple commented 3 months ago

在首次访问时的时间会在2-10秒,后续访问其他页面速度确实会更快,我觉得应该先为用户展示一个加载页面,不知道您对此看法如何? @EveSunMaple 有时这会让我认为我的网络出了问题……甚至我在本地开发访问时也是这样,这不由得让我怀疑我的设备坏掉了(开玩笑😆)

好主意,还可以用来掩盖样式没有加载完全时的丑陋界面()不过这个又要我研究研究再说了

EveSunMaple commented 3 months ago

对了,开发环境和部署环境差别很大的,测速建议 build 之后用 dist 中压缩过的文件测,npm run dev 会慢得多得多

EveSunMaple commented 3 months ago

已修改:https://github.com/EveSunMaple/Frosti/releases/tag/v2.5.0-beta.2

有关于"代码内容应与边缘存在一定空间"这个我发现在实践中会有点问题,暂时先不修改了

KazariEX commented 3 months ago

这里我看俩 <pre> 外面的 <div> 都可以扬了,减少嵌套,同时能使 padding 生效

EveSunMaple commented 3 months ago

@KazariEX 感谢建议,已更改!❤️ v2.5.0-beta.3

EveSunMaple commented 3 months ago

已发布 rc 版本,还有问题请留言。若一切顺利,将在稳定版发布时关闭此 issue。

nick-cjyx9 commented 3 months ago

IMG_20240801_225204.jpg

加粗并同代码字体一致大小的语言标识有点喧宾夺主了,可以参考这个设计

EveSunMaple commented 3 months ago

IMG_20240801_225204.jpg

加粗并同代码字体一致大小的语言标识有点喧宾夺主了,可以参考这个设计

其实语言标识的大小比代码字体大

整个主题的风格就是干净利落的,尽量强调对比的同时弱化笔画头尾粗细变化带来的视觉影响。代码字体是 Cascadia Code 无衬线体(Sans-serif)字体,引入衬线体破坏了整体的协调,而且小字体细笔画在低分辨率的屏幕下的表现会很糟糕,两个元素之间的颜色对比过小也不太好。

nick-cjyx9 commented 3 months ago

字体方面现有的配置我比较喜欢,主要指的是语言标识会不会太大了

EveSunMaple commented 3 months ago

字体方面现有的配置我比较喜欢,主要指的是语言标识会不会太大了

现有顶栏中的语言标识与复制按钮的svg配合的很好,而复制按钮我觉得不能再小了

guobao2333 commented 3 months ago

加粗并同代码字体一致大小的语言标识有点喧宾夺主了,可以参考这个设计

现有样式已经几乎无可挑剔了,不知道你为什么会觉得喧宾夺主,我觉得语言标识可能在这个主题中明显一点再好不过了,不过主题目前在小屏端确实还有待调整,这个就是整体一致性问题了,后面可能需要按比例缩放布局(响应式布局……)

EveSunMaple commented 2 months ago

我觉得这个 issue 可以关闭了,若有其他问题,请再开 issue。