此处记录本博客自建立以来进行的所有优化

如果您在浏览博客时发现任何的 bug 和影响使用体验的地方,或有着充满想象力的页面美化建议,请尽管在本页下方的评论区中留言

阿里嘎多! _(:з」∠)_

# 已知问题

  • 加载网页图片时有概率出现 304 错误导致图片无法加载,这种情况小概率发生
    初步定位为网页单次发送的图片请求过多触发了 gtihub 服务器的 block 机制,计划在图片请求失败时重新进行图片请求. github lozad, issue: enableAutoReload for background images

# 即将优化

  • 切换页面时背景图片将保持轮换不会从头加载
  • 网页懒加载图片时增加 placeholder background 预显示图片
  • 增加 画廊 页面
  • 加入更多的 css 动画

# 2024 年 3 月 28 日

  • 为主页文章卡片的标题添加 hover 悬浮动画,移除了文章卡片的 title 属性
    home_card_hover

# 2024 年 3 月 27 日

  • 为侧边栏 站点概览 添加显示动画
    sidebar_overview

    note

    image-20240327174818107

# 2024 年 3 月 26 日

  • 为侧边栏 文章目录->站点概览 添加了过渡动画
    sidebar

# 2024 年 3 月 20 日

  • 略微提高了背景图灰色蒙版的色值
  • 将主页 brand 修改为 svg logo 动画
    logo

# 2024 年 3 月 13 日

  • 现在回复的评论将会正确的显示在最新评论一栏
  • 现在回复的评论将会正确计入评论总数
  • 移除了评论脚本中的代码高亮 highlight.js 以减小 js 代码体积
  • MiniValine.min.js , MiniValine.visitor.min.js 的加载方式由 jsdelivr 加载更改为服务器加载
  • 将背景图和封面图转换成 webp 格式来提高加载效率

# 2024 年 1 月 27 日

  • 现在返回文章首页将会自动滚动到先前浏览到的位置

# 2024 年 1 月 26 日

  • 移除了文章开头的 breadcrumb 元素
detailed

将下图中左上角的元素进行移除

image-20240126041957239

  • 现在背景图片将不再随机以提高页面加载速度
  • 将 loading 动画修改为花瓣飞舞
关于jQuery的小芝士
  • 如果 $ 符号在 js 代码中冲突的话,可以将 $(b,c) 替换成最原始的写法 jQuery(b,c)
  • 可以使用 var jq_151 = $.noConflict(true); , var jq_171 = $.noConflict(true); 这样的赋值语句解决不同版本 jQuery 在 npm 包的兼容性问题
  • 移除了移动端打开网页后的烟花点击特效以提高网页访问性能
chrome手机调试本地网页

首先使用 USB 将电脑和手机相连

然后在电脑端的 chrome 打开 chrome://inspect/#devices

之后我们点击这个 Port forwarding 按钮配置端口转发

image-20240126182704322

例如我们测试网页的电脑本地地址为 http://localhost:4000/ , 我们希望在手机上访问 http://localhost:4000/ 也可以成功打开网页,那么这样配置即可

image-20240126182856396

之后我们在电脑上点一下 inspect

image-20240126183056824

就可以打开移动端的 devtool 愉快的调试了

image-20240126182956989

如何判断当前网页是否被移动端访问?
  1. navigator.userAgentnavigator.platform

    JS 通过 navigator.userAgent 属性拿到这个字符串,只要里面包含 mobiandroidiphone 等关键字,就可以认定是移动设备,不过该属性可以被伪造

    if (/Mobi|Android|iPhone/i.test(navigator.userAgent)) {
      // 当前设备是移动设备
    }
    // 另一种写法
    if (
      navigator.userAgent.match(/Mobi/i) ||
      navigator.userAgent.match(/Android/i) ||
      navigator.userAgent.match(/iPhone/i)
    ) {
      // 当前设备是移动设备
    }

    同时 navigator.userAgent 仅与 Chromium 兼容,与 SafiriFirefox 不兼容

    可以使用已经废除但是全浏览器支持的属性 navigator.platform 来达到和 navigator.userAgent 相同的效果

    if (/Android|iPhone|iPad|iPod/i.test(navigator.platform)) {
      // 当前设备是移动设备
    }

    然而在我的实际测试中, navigator.platform 的值根本没有出现 Android|iPhone|iPad 这样的特征字符串
    image-20240126181640768
    navigator.userAgent 出现的 Android 的特征倒还多一些

    image-20240126181813275

  2. touch 事件

    手机浏览器的 DOM 元素可以通过 ontouchstart 属性,为 touch 事件指定监听函数。桌面设备没有这个属性。

    function isMobile() { 
      return ('ontouchstart' in document.documentElement); 
    }
    // 另一种写法
    function isMobile() {
      try {
        document.createEvent("TouchEvent"); return true;
      } catch(e) {
        return false; 
      }
    }
  3. window.matchMedia()

    • CSS 媒介查询屏幕宽度

      CSS 通过 media query(媒介查询)为网页指定响应式样式。如果某个针对手机的 media query 语句生效了,就可以认为当前设备是移动设备。
      window.matchMedia() 的参数是一个 CSS 查询语句,表示只对屏幕宽度不超过 700 像素的设备生效。它返回一个对象,该对象的 matches 属性是一个布尔值。如果是 true ,就表示查询生效,当前设备是手机。

      let isMobile = window.matchMedia("only screen and (max-width: 760px)").matches;
    • 指针的精确性

      CSS 语句 pointer:coarse 表示当前设备的指针是不精确的。由于手机不支持鼠标,只支持触摸,所以符合这个条件。

      有些设备支持多种指针,比如同时支持鼠标和触摸。 pointer:coarse 只用来判断主指针

      let isMobile = window.matchMedia("(pointer:coarse)").matches;

      此外还有一个 any-pointer 命令判断所有指针,只要有一个指针是不精确的,就符合查询条件。

      let isMobile = window.matchMedia("(any-pointer:coarse)").matches;
  4. window.screenwindow.innerWidth
    window.screen 可以通过计算屏幕的宽度来判断是否是手机,但是手机如果处在横屏的状态,这个方法就无法判断了

    if (window.screen.width < 500) {
      // 当前设备是移动设备 
    }

    另一个属性 window.innerWidth 返回浏览器窗口里面的网页可见部分的宽度,比较适合指定网页在不同宽度下的样式。

    const getBrowserWidth = function() {
      if (window.innerWidth < 768) {
        return "xs";
      } else if (window.innerWidth < 991) {
        return "sm";
      } else if (window.innerWidth < 1199) {
        return "md";
      } else {
        return "lg";
      }
    };
  5. window.orientation 属性
    window.orientation 属性用于获取屏幕的当前方向,只有移动设备才有这个属性,桌面设备会返回 undefined

    if (typeof window.orientation !== 'undefined') {
      // 当前设备是移动设备 
    }

    Safiri 设备不兼容该属性

  • 为博客添加了隐藏文章功能

# 2024 年 1 月 1 日

  • 修复了在移动端打开博客后,右侧主菜单的部分内容无法显示
  • 优化了 站点概览 的布局,当在 PC 端打开网页时将不会显示 menu
  • 为站点内的文章添加了 open_graphmeta 标签

# 2023 年 12 月 26 日

  • 增加了 日常 页面,推文的源为 twitter, 如果你也想实现这个功能,请查看 twitter 官方文档

# 2023 年 12 月 23 日

  • 为域名 oacia.dev 续费四年,现在的到期时间是 2028 年 12 月

# 2023 年 12 月 12 日

  • 将博客的域名由 oacia.cc 更换成了 oacia.dev

# 2023 年 11 月 13 日

  • 修复了音乐播放器列表无法正确更新的 bug

# 2023 年 10 月 24 日

  • 调整了 scrollbar 的宽度及颜色
  • 将顶部菜单的 hover line 的宽度修改成与文字宽度相同

# 2023 年 10 月 18 日

  • 为代码块右上方的三个操作按钮添加了提示文字 换行不换行复制全屏退出全屏

  • 增加了代码块的最大显示行数

  • 修复了当全屏代码块,并返回博客的上一级网页后,网页无法使用滚轮上下滑动的问题

    detail

    定位到代码块全屏点击事件,当代码块全屏时,添加一个返回到上一级的网页监听事件 popstate , 如果监听到返回到上一级网页,则优先执行退出全屏操作
    image-20231018112211729

  • 将字体的加载策略从 google fonts 修改成服务器加载

    detailed

    首先从 Google webfonts helper 中下载我们想要的字体,一般一个常规的字体和一个加粗的字体就够了
    image-20231018115917757
    随后将字体我们的字体放到 E:\blog\Hexo\source\fonts 文件夹中

    image-20231018120211107

    之后来到 E:\blog\Hexo\themes\shoka\source\css\_fonts.styl , 把 Google webfonts helper 自动生成的 css 放到这个文件中,字体路径就填我们放字体文件的位置

    image-20231018130644098

    image-20231018130713584

    我们需要到 E:\blog\Hexo\themes\shoka\source\css\app.styl 中将 _fonts.styl 导入进来

    image-20231018131527219

    之后来到 E:\blog\Hexo\themes\shoka\scripts\helpers\asset.js , 将 _vendor_font 函数直接返回

    image-20231018130845156

  • 将阿里云矢量图库由 cdn 加载修改为服务器加载

  • 删除了源码中的部分延迟函数,加快了博客的打开速度

  • 将字体粗细统一设置为 400 或 700

# 2023 年 10 月 17 日

  • 修复了在网站子目录点击刷新后,loading 图片无法加载的问题
  • 将 title 的字体从 Noto Serif JP 替换成 Noto Serif SC 来加快博客加载速度
  • 增加了更多的背景图片

# 2023 年 9 月 26 日

  • 消除了图片懒加载过程中产生的布局抖动
    detail

    首先我们来到 E:\blog\Hexo\node_modules\hexo-asset-image\index.js , 导入这两个包

    image-20230926140918545

    随后使用 image-size 包读取图片的长和宽,并为 img 添加 aspect-ratio 属性并计算图片的纵横比,代码如下

    image-20230926164747808

    这样就不会出现页面抖动啦~

# 2023 年 9 月 19 日

  • 将博客封面由图床更改为本地
detail

首先将我们想要当作封面的图片放在 E:\blog\Hexo\source\picture 目录下

image-20230919143746655

来到 E:\blog\Hexo\themes\shoka\scripts\generaters\config.js , 修改一下 image_list 的读取路径为 source/picture

image-20230919151104013

随后来到 E:\blog\Hexo\themes\shoka\scripts\helpers\engine.js , 添加下列函数

const randomBG_oacia = function(count = 1, image_list = []) {
  var shuffled = image_list.slice(0), i = image_list.length, min = i - count, temp, index;
  while (i-- > min) {
    index = Math.floor((i + 1) * Math.random());
    temp = shuffled[index];
    shuffled[index] = shuffled[i];
    shuffled[i] = temp;
  }
  return shuffled.slice(min);
}

同时我们也要调用这个函数

image-20230919150347369

  • 修改了博客的随机封面图片

# 2023 年 9 月 8 日

  • 将博客入场动画 loading cat 更换成了爱丽丝摇
detail

最近进自己的博客,看着这个 loading cat, 总感觉自己不是很喜欢,所以想要换一个新的入场动画

image-20230908181016658

正好最近看到有个爱丽丝摇超级火,就想着能不能把这个当作自己博客的入场动画嘞,那就试试看吧!

在这位 up 主的动态找到了现成的透明背景 GIF, 好耶!

alice-shake-810k

E:\blog\Hexo\themes\shoka\source\images 把我们的 gif 放进去

image-20230919141426450

随后来到 E:\blog\Hexo\themes\shoka\layout\_partials\layout.njk , 注释掉 cat 类,并新增 alice 类如下图所示

image-20230919141531272

之后来到 E:\blog\Hexo\themes\shoka\source\css\_common\components\third-party\loading.styl , 增加 alice 相关的 css 代码

.alice {
  position: relative;
  display: block;
  width: 27em; /* 你的宽度值 */
  height: 80%;
  margin: 0 auto; /* 水平居中 */
  text-align: center; /* 文本内容水平居中 */
  display: flex; /* 使用 Flexbox 布局 */
  justify-content: center; /* 水平居中 */
  align-items: center; /* 垂直居中 */
}

image-20230908211248168

好耶

image-20230908211317994

# 2023 年 9 月 5 日

  • 修复了标题在 E:\blog\Hexo\themes\shoka\_config.yml 修改标题字体不生效的问题
detail

来到 E:\blog\Hexo\themes\shoka\source\css\_variables.styl , 注释掉这三行代码即可

image-20230905124057319

  • 修改了 subtitle 的字体和大小
detail

E:\blog\Hexo\themes\shoka\_config.yml 的 font 中加上 subtitle 相关的配置

image-20230905120537533

E:\blog\Hexo\themes\shoka\source\css\_variables.styl 处加上这两行 subtitle 相关的字体设定

image-20230905120647726

同时修改该文件内最下方的 site meta

image-20230905120822256

来到 E:\blog\Hexo\themes\shoka\source\css\_common\outline\header\brand.styl , 在 .meta 增加 font-family: $font-family-subtitle; 这行代码

image-20230905121141729

# 2023 年 9 月 3 日

  • 在社交链接处新增了 telegram, 现在你可以通过 TG 联系我啦
  • 修改了部分文章的标题,移除了 hxp2022-reverse-required 这篇文章
  • 修改了代码区块的字体和网站全局字体为 Lucida Console , 将文章主体内容字体修改为 Noto Serif SC
  • 修改了复制时出现 copyright 的逻辑,现在即使复制大段的代码段,粘贴板前也不会出现 copyright 啦
detail

检测复制事件的函数位于 E:\blog\Hexo\themes\shoka\source\js\_app\page.js

在此处添加自定义的逻辑即可,我设置的逻辑是如果复制的中文个数大于 30 个并且中文个数大于其他字符的个数就出现 copyright, 怎么样,这是不是酷~

image-20231017141636411

  • 将文章 page 展示方式由需要翻页切换成滚轮到底~不用翻页的感觉真舒服呀

  • 修复了文章目录当节点过长导致内容显示不全的问题,简单修改了目录的样式和布局

detail

每次当我看文章目录看到这个前面这个序号,感觉有些碍眼,看看能不能去掉吧

image-20230904022321442

来到 E:\blog\Hexo\themes\shoka\layout\_macro\sidebar.njk 中,在此处添加 {list_number: page.toc.number}

image-20230904133758902

随后来到根目录的 E:\blog\Hexo\_config.yml , 添加 number: false 如图

image-20230904133843568

修改完成后,标号确实去掉了,但是子锚点的缩进似乎有些小,让着一二级目录分辨起来不是十分清晰

image-20230904134008027

这应该与容器相关吧,看看 css 布局,我们找到 shoka 主题中与 TOC 相关的 CSS E:\blog\Hexo\themes\shoka\source\css\_common\outline\sidebar\toc.styl , 在这里的 css 中, padding 属性的四个值分别设置了元素的内边距(上、右、下、左), 所以为了让缩进的值大一些,我们可以修改第四个值

ol {
    padding: 0 .125rem .3125rem .625rem;
    text-align: left;
    >ol {
        padding-left: 0;
    }
}
.toc-item {
    font-size: $font-size-medium;
    line-height: 1.8;
    overflow: hidden;//内容会被修剪,并且其余内容是不可见的。
    text-overflow: ellipsis;//溢出的文本用...代替
    white-space: nowrap;//文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。
}

修改后是这样的,我还加粗了字体,并且允许溢出,感觉更美观了

ol {
    padding: 0 .125rem .3125rem 1.1rem;
    text-align: left;
    >ol {
      padding-left: 0;
    }
  }
.toc-item {
    font-weight:530;
    font-size: $font-size-medium;
    line-height: 1.6;
    overflow: visible;
    text-overflow: ellipsis;
    white-space: nowrap;
}

不过看起来还是有文字被截断了

image-20230904170850238

既然这样,来到 E:\blog\Hexo\themes\shoka\source\css\_common\outline\sidebar\sidebar.styl , 修改此处 overflow , overflow-xoverflow-y 的值为 visible

image-20230904171157395

修复完成咯~

image-20230904171237979

# 2023 年 8 月 16 日

  • 进入站内的文章归档页面后,将会显示所有已写的文章
detail

在这之前,进入文章的归档页面之后,不会显示我所写的文章的标题,这… 要是有朋友想来我的博客去看看我以前写的所有文章,这该多么麻烦!

必须要让小伙伴点一下 归档 就可以列出我写的所有文章

image-20230816005811677

chromeF12 抓抓元素看看

image-20230816010230775

知道了 classitem section , 那么就要定位源码的位置

经过我高超的定位技术 (其实是全局搜索), 定位到了这个文件 Hexo\themes\shoka\layout\archive.njk , 这种前端布局相关的代码想都不用想,肯定是在 layout 里面啦,代码不多,最主要的就是一个 for 循环,基本思想就是遍历所有发布的文章,获取日期,然后进行排序和展示

在康康我们的需求,在小伙伴们点击 归档 后,直接列出所有文章,那便改成这样子好咯,如果年份或月份发生了变化,就加上一个锚点

image-20230816024339649

NICE~ 完美解决

image-20230816023809396

# 2023 年 8 月 2 日

  • 为近期 CTF 的 writeup 增加了题目附件,现在你可以下载通过附件来复现赛题啦

# 2023 年 7 月 30 日

  • 为网站添加了 robots.txt

# 2023 年 7 月 1 日

  • 为每篇文章添加了标签

  • 缩短了站内文章的链接

  • 将博客网址收入谷歌,必应,百度

  • 向谷歌和百度提交了本站的站点地图

    detail

    安装 sitemap 插件

    在 hexo 根目录执行下面两个命令

    npm install hexo-generator-sitemap --save
    npm install hexo-generator-baidu-sitemap --save

    修改博客配置文件

    hexo 根节点的 _config.yml 中添加如下代码

    # 自动生成 sitemap
    sitemap: 
      path: sitemap.xml
    baidusitemap: 
      path: baidusitemap.xml

    执行 hexo g -d 命令,发现在根目录 \public 文件夹下新增了 sitemap.xmlbaidusitemap.xml 这两个文件

    • sitemap.xml : 用于谷歌站点地图验证
    • baidusitemap.xml : 用于百度站点地图认证

    提交谷歌站点地图

    进入谷歌站点,提交网站的站点地图 sitemap.xml

    image-20230701031640962

    提交百度站点地图

    进入谷歌站点,提交网站的站点地图 baidusitemap.xml

    image-20230701031955711

# 2023 年 6 月 30 日

  • 修复了图片无法正常显示的问题

    detail

    bug 描述

    当使用 hexo g 命令后,会产生下列报错:

    image-20230630011311566

    定位代码

    使用 visual code 全局搜索 no src attr, skipped... , 定位到 npm 包 hexo-asset-image

    image-20230630011446501

    这个包的作用可以理解为将 md 中图片的相对路径转换成网站中图片的相对路径

    比如我在 md 文件中使用了 /pic/1.png , 这个文章的标题为 这是一个测试.md 那么经过这段 hexo-asset-image 代码之后,图片相对路径就变成了 这是一个测试/1.png , 因为图片与 html 是存在同一级文件下面的.

    任意打开一个 hexo g 生成的 index.html, 发现 img 中的元素为 data-src, 然而代码中的 $(this).attr('src') 匹配的是 src , 所以理所当然的报错 * no src attr, skipped…* 了

    image-20230630014154572

    所以我们需要修改的地方就是将所有正则查找 src 改成 data-src

    修改之后 html 文件为这个样式,中间需要再加上文章的名称才可以显示出图片来

    image-20230630020001142

    这个问题可以由下方的例子进行理解:

    https://oacia.github.io/2023/04/16/TODOlist/ 中提取 2023/04/16/TODOlist

    由上图看出我们没有截取全部的 link, 这个 endPos 实际上对于我来说是错误的,不应该匹配最后一个 . , 所以需要在此处进行修改,将匹配最后一个 . 改成匹配最后一个 / 如图

    image-20230630024511229

    修复后的完整代码如下

    'use strict';
    var cheerio = require('cheerio');
    // http://stackoverflow.com/questions/14480345/how-to-get-the-nth-occurrence-in-a-string
    function getPosition(str, m, i) {
      return str.split(m, i).join(m).length;
    }
    hexo.extend.filter.register('after_post_render', function(data){
      var config = hexo.config;
      if(config.post_asset_folder){
        var link = data.permalink;
        
        var beginPos = getPosition(link, '/', 3) + 1;
        var appendLink = '';
        // In hexo 3.1.1, the permalink of "about" page is like ".../about/index.html".
        // if not with index.html endpos = link.lastIndexOf('.') + 1 support hexo-abbrlink
        if(/.*\/index\.html$/.test(link)) {
          // when permalink is end with index.html, for example 2019/02/20/xxtitle/index.html
          // image in xxtitle/ will go to xxtitle/index/
          appendLink = 'index/';
          var endPos = link.lastIndexOf('/');
        }
        else {
          var endPos = link.lastIndexOf('/');
        }
        link = link.substring(beginPos, endPos) + '/' + appendLink;
        var toprocess = ['excerpt', 'more', 'content'];
        for(var i = 0; i < toprocess.length; i++){
          var key = toprocess[i];
          var $ = cheerio.load(data[key], {
            ignoreWhitespace: false,
            xmlMode: false,
            lowerCaseTags: false,
            decodeEntities: false
          });
          $('img').each(function(){
            if ($(this).attr('data-src')){
              // For windows style path, we replace '\' to '/'.
              var src = $(this).attr('data-src').replace('\\', '/');
              if(!(/http[s]*.*|\/\/.*/.test(src)
                || /^\s+\//.test(src)
                || /^\s*\/uploads|images\//.test(src))) {
                // For "about" page, the first part of "src" can't be removed.
                // In addition, to support multi-level local directory.
                var linkArray = link.split('/').filter(function(elem){
                  return elem != '';
                });
                var srcArray = src.split('/').filter(function(elem){
                  return elem != '' && elem != '.';
                });
                if(srcArray.length > 1)
                srcArray.shift();
                src = srcArray.join('/');
                $(this).attr('data-src', config.root + link + src);
                //console.info&&console.info("update link as:-->"+config.root + link + src);
              }
            }else{
              console.info&&console.info("no src attr, skipped...");
              console.info&&console.info($(this));
            }
          });
          data[key] = $.html();
        }
      }
    });

# 2023 年 5 月 1 日

  • 修复了一个 bug, 这个 bug 曾导致音乐播放器无法正确加载

    detail

    bug 描述

    使用如下 md 语法生成音乐播放器

    {% media audio %}
      
      - title: song~
        list:
        - https://music.163.com/#/playlist?id=2958479556
      
      {% endmedia %}
    

    生成 html 后,无法正确解析 json 字符串

    <div class="player" data-type="audio" data-src="[{" title":"列表1","list":["https:="" music.163.com="" #="" playlist?id="2943811283&quot;,&quot;https://music.163.com/#/playlist?id=2297706586&quot;]},{&quot;title&quot;:&quot;列表2&quot;,&quot;list&quot;:[&quot;https://music.163.com/#/playlist?id=2031842656&quot;]}]&quot;"><audio></audio></div>
    

    经过排查,原因在于双引号 " 无法被正确转义为 &quot;

    解决方式

    修改该文件 "Hexo\themes\shoka\scripts\tags\media.js" , 将其中的解析后的 json 字符串中所有的双引号 " 转义为 &quot;

    switch(args[0]) {
        case 'video':
        case 'audio':
          // console.log(JSON.stringify(list));
          var repair = JSON.stringify(list);
          repair = repair.replaceAll("\"", "&quot;");
          console.log(repair);
          return `<div class="media-container"><div class="player" data-type="${args[0]}" data-src='${repair}'></div></div>`;
          break;
      }

# 2023 年 4 月 30 日

  • TODOlist小站更新日志移动至顶部菜单栏
  • 修复了搜索功能失效的问题,现在你可以成功的进行搜索了
  • 为评论区自己的回复添加了头像,如果你发现自己的评论没有头像,前往 Gravatar 使用自己评论所使用的邮箱注册账号后配置个人头像即可

# 2023 年 4 月 24 日

  • 修改了网页左上角的小图标为本人的头像
  • 移除了再次进入文章后的加载动画,现在再次进入文章将会更加流畅
  • 现在重新进入相同的文章将不会再自动滚动到上一次浏览后的位置
  • 将侧边导航栏移动到了右侧
  • 增加了评论区
  • 增加了友链

# 2023 年 2 月 26 日

由于原先的 particlex 主题并不能支持代码高亮 (预览的时候可以,打开自己网站就没有代码高亮了), 所以决定更换本博客的主题为 shoka

# 2023 年 2 月 24 日

  • 对网站的背景图片进行了优化

    detail

    存在的问题

    可以发现下面的网站背景图片,图片最上面的部分并没有显示出来

    image-20230224142804249

    解决方案

    通过对 hexo 的 theme 主题 particlex_config.yml 配置页面进行排查,找到了背景图片所指向的变量

    image-20230224143136215

    home_background 在 vscode 中进行内容搜索后,在 index.ejs 中找到对 home_background 的引用

    image-20230224143247450

    相关代码如下:

    <div id="home-head">
        <div id="home-background" style="background-image: url(<%- theme.home_background %>)"></div>

    看得出来这个容器的 id 是 home-background , 直接去 css 里面去找一下这个 id

    image-20230224143657854

    接下来需要做的就是对 home-background 属性进行修改就可以了

    因为主页的背景图片是一个正方形,但是一般在网页访问的时候整个背景是一个长方形的形状,所以现在我的想法是将图片位置的顶部和背景容器位置的顶部

    随后我将 background-position 的属性修改为 top, 效果如图

    image-20230224151645652

    可以发现现在图片的顶部已经露出来了,但是下面的部分依然无法看到,所以考虑修改一下容器的高 (因为 background-size 的填充方式为 cover )

    在网页看看这个背景图片呆在哪个容器里面

    image-20230224151844742

    然后去看一下 home-head 的 css 属性

    #home-head {
        width: 100%;
        height: calc(100vh + 50px);
        position: relative;
        display: -webkit-box;
        display: -webkit-flex;
        display: -moz-box;
        display: -ms-flexbox;
        display: flex;
        top: 0;
        left: 0;
    }

    看来修改一下高度就可以了

    但是这个 calc(100vh + 50px) 看起来十分陌生

    查一查资料

    image-20230224152207516

    奇怪的是将高度改成 calc(50vh + 50px) 后,仅仅是下面的容器下面变短了而已,

    image-20230224155310391

    后来我意识到 home-background 背景图片,需要将 home-head 这个容器铺满才可以,但是这个代码不是说明的是 home-backgroundhome-head 容器里面的吗?

    <div id="home-head">
        <div id="home-background" style="background-image: url(<%- theme.home_background %>)"></div>

    确实是这样的,我感觉这是我对 background-sizecover 属性不够熟悉,看了对 cover 的注释我才明白这是 cover 的问题

    image-20230224160656566

    cover
    

    缩放背景图片以完全覆盖背景区,可能背景图片部分看不见。和 contain 值相反, cover 值尽可能大的缩放背景图像并保持图像的宽高比例(图像不会被压扁)。该背景图以它的全部宽或者高覆盖所在容器。当容器和背景图大小不同时,背景图的 左 / 右 或者 上 / 下 部分会被裁剪。

    cover 值改成 contain 之后会变成什么样呢?

    image-20230224161509537

    可以发现变成了现在这样,之后改一下 background-repeat 的值为 repeat-x (背景图像将在水平方向重复)

    image-20230429232101076

    ok 效果还行.

更新于 阅读次数