从零用VitePress搭建博客教程(4) – 如何自定义首页布局和主题样式修改?
接上一节:从零用VitePress搭建博客教程(3) - VitePress页脚、标题logo、最后更新时间等相关细节配置
六、首页样式修改
有时候觉得自带的样式不好看,想自定义,首先我们在docs/.vitePress新建一个theme文件夹,用来存放自定义布局和主题修改的相关文件,如下所示

theme下再新建custom.css 和 index.js
custom.css我们用来写修改样式的,当然也可以安装css预处理器来写样式。
index.js是入口文件,用来注册组件和配置自定义布局的。
VitePress 对 CSS 预处理器有内置支持:.scss、.sass、.less, .styl 和 .stylus 文件。 不需要为它们安装 Vite 特定的插件,但必须安装相应的预处理器
这里我们选择使用sass,安装即可
pnpm install -D sass
编写custom.scss
通过浏览器开发工具,找到对应的样式选择器,覆盖原本的CSS即可修改默认主题的样式。
/**
主题变量样式修改
**/
/* :root {
--vp-c-brand: #656dff;
--vp-c-brand-light: #757cff;
} */ /**
顶部导航模块样式修改
**/
.VPNav {
.VPNavBar {
background-color: #fff;
border-bottom: 1px solid rgba(60, 60, 67, 0.13);
}
.VPNavBar.has-sidebar{
.curtain {
bottom: -30px !important;
/* 导航的底部边框不显示问题修改 */
&::before {
margin-top: 2px !important;
}
}
}
.logo {
height: 40px;
}
} /**
内容模块样式修改
**/ .VPContent {
.VPDoc {
padding-left: 0 !important;
}
/* 内容左边距调整 */
.content-container {
margin-left: 20px !important;
}
/* 副标题样式修改 */
.container .text {
font-size: 46px !important;
}
} /**
暗黑模式样式修改
**/
.dark {
.VPNav .VPNavBar {
background-color: #1e1e20;
border-bottom: 1px solid #000;
}
}
index.js
import DefaultTheme from "vitepress/theme";
import "./custom.css"; export default {
...DefaultTheme,
NotFound: () => "404", // <- this is a Vue 3 functional component
enhanceApp({ app, router, siteData }) {
// app is the Vue 3 app instance from createApp()
// router is VitePress' custom router (see `lib/app/router.js`)
// siteData is a ref of current site-level metadata.
},
};
1、首页标题和图片渐变色调整
标题渐变色和logo背景渐变色调整
可参考https://vitepress.dev/、https://unocss.dev/等,根据情况调整成自己喜欢的样式
2、样式动态变化
参考https://unocss.dev/官网效果。
源码地址:https://github.com/unocss/unocss/blob/main/docs/.vitepress/theme/index.ts
引入import ‘./rainbow.css’,文字颜色等可以动态变化。
需要变化的地方加上如下变量即可,比如
border: 1px solid var(--vp-c-brand);
color: var(--vp-c-brand);
background: var(--vp-c-brand);
最终效果如下:

七、自定义首页模板
当然如果你想自定义首页内容,你可以编写Vue组件的方式实现,首先要安装Vue
pnpm i -D vue
然后自定义编写好组件后,然后在index.md引入即可
比如我们这里简单写一个home.vue试试
<template>
<div class="ui-home">
<h2 class="ui-title">前端开源项目推荐</h2>
<ul class="ui-project">
<li class="item" v-for="v in siteData" :key="v.name">
<a class="link" :href="v.link" target="_blank">
<h3 :class="['title', v.className]">{{ v.name }}</h3>
<p class="desc">{{ v.desc }}</p>
</a>
</li>
</ul>
</div>
</template>
<script setup>
import { siteData } from '../model/siteData.js' </script>
<style lang="scss">
.color-pink1 {background: #90f;}
.color-red {background: #b91d47;}
.color-blue-deep4 {background: #3360a3;}
.color-blue-light6 {background: #2db7f5;}
.color-green-gradient1{
background: -webkit-linear-gradient(120deg, #86b91a 30%, #edd532);
background: linear-gradient(120deg, #86b91a 30%, #edd532);
}
.color-green-gradient2{
background: -webkit-linear-gradient(315deg, #42d392 25%, #647eff);
background: linear-gradient(315deg, #42d392 25%, #647eff);
}
.color-green-gradient3{
background: -webkit-linear-gradient(315deg, #51a256 25%, #f7d336);
background: linear-gradient(315deg, #51a256 25%, #f7d336);
}
.color-pink-gradient {
background: -webkit-linear-gradient(120deg, #bd44fe 35%, #42d1ff);
background: linear-gradient(120deg, #bd44fe 35%, #42d1ff);
} /**首页网址推荐**/
.ui-home {
width: 1152px;
margin: 20px auto;
.ui-title {
display: flex;
align-items: center;
justify-content: center;
height: 60px;
font-size: 26px;
}
}
.ui-project {
display: grid;
gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(224px, 1fr));
justify-content: space-between;
margin-top: 20px;
.item,
.link {
height: 220px;
}
.item {
.link {
display: block;
color: #333;
background: #fff;
border: 1px solid #f1f1f1;
border-radius: 6px;
transition: all .4s;
}
.link:hover {
-webkit-filter: brightness(1.2);
box-shadow: 0 15px 30px rgba(0, 0, 0, .1);
transform: rotateY(-0.1deg) scale(1.03) translateZ(0);
}
.title {
height: 80px;
padding-top: 25px;
font-size: 24px;
color: #fff;
text-align: center;
border-radius: 6px 6px 0 0;
}
.desc {
line-height: 2;
padding: 0 12px;
margin-top: 14px;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
}
}
</style>
在theme/index.js注册为全局组件,然后在index.md 直接引用即可
<Home />
效果

github项目地址:https://github.com/msyuan/vitePress-project
在线预览效果:https://msyuan.github.io/vitePress-project
原文地址:http://www.qianduan8.com/2041.html
从零用VitePress搭建博客教程(4) – 如何自定义首页布局和主题样式修改?的更多相关文章
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(四)-使用Travis自动部署Hexo(2)
前言 前面一篇文章介绍了Travis自动部署Hexo的常规使用教程,也是个人比较推荐的方法. 前文最后也提到了在Windows系统中可能会有一些小问题,为了在Windows系统中也可以实现使用Trav ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)
前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置
前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置
前言 有朋友问了我关于博客系统搭建相关的问题,由于是做开发相关的工作,我给他推荐的是使用github的gh-pages服务搭建个人博客. 推荐理由: 免费:github提供gh-pages服务是免费的 ...
- Hexo搭建博客教程(1) - 安装环境与本地搭建
前言 搭建个人博客一般有两种选择,一个是使用WordPress,但是需要将博客搭建在服务器上,不过搭建好后写文章方便,适合没有程序基础的人使用.另一个是使用Hexo,相对简洁高效,不需要服务器,既可以 ...
- Hexo+NexT(零):最全Hexo+Next搭建博客教程
快速.简洁且高效的博客框架 有位大神说,喜欢写博客的人的人,折腾博客会经历三个阶段.找到一个免费空间,搭建一个博客,很欣喜,很有成就感,此为一阶段:受限免费空间各种限制,自己买空间和域名,实现对博客的 ...
- Hexo搭建博客教程(2) - 博客的简单个性化配置
本章主要讲博客的个性化,譬如站点的基本配置(语言.头像.站点图标等).安装新的Hexo主题(NexT主题)以及主题的配置. 1. 修改站点配置 打开站点配置文件 ,找到: # Site title: ...
- Hexo搭建博客教程(3) - 远程部署到GitHub Pages
本章讲的是如何将本地的个人项目远程部署到 GitHub Pages,涉及到GitHub的项目仓库.Git的使用,以及Hexo的远程部署等. 1. 安装 hexo-deployer-git 插件 想要将 ...
- 用 Sphinx 搭建博客时,如何自定义插件?
之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建. 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清 ...
- 转载一遍比较好的,django2.1搭建博客教程
非常感谢这位博主,找了几个星期终于找到了 https://www.dusaiphoto.com/article/article-detail/4/
随机推荐
- WAMP apache 无法运行 报错could not execult menu item
wamp:could not execult menu item (internal error)[exception]counld not perform service action:服务器没有及 ...
- 2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数。 输入:n = 100。 输出:10。
2023-07-11:给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字的正整数的个数. 输入:n = 100. 输出:10. 答案2023-07-11: 函数的主要思路如下: ...
- WebSSH远程管理Linux服务器、Web终端窗口自适应(二)
上一篇:Gin+Xterm.js实现WebSSH远程Kubernetes Pod 支持用户名密码认证 支持SSH密钥认证 支持Web终端窗口自适应 支持录屏审计 Go SSH golang.org/x ...
- ApiPost: Error:ESOCKETTIMEDOUT
原因 apipost设置响应时间过短 解决方案
- [windows]远程桌面失败提示CredSSP加密修正
前言 windows远程桌面失败,提示"CredSSP加密--" 远程桌面服务器的系统版本:Windows Server 2016 本地电脑的系统版本:Windows 10 方式1 ...
- form 表单恢复初始数据
1 表单数据的保存和恢复方法 1.1 前端数据保存方法 在前端,我们可以使用两种方法来保存表单数据:LocalStorage 和 Cookie. 使用 LocalStorage 保存数据:LocalS ...
- WPF中非递归(无后台代码)动态实现TreeView
在UI界面中,树形视图是比较常用的表示层级结构的方式,WPF中提供了TreeView控件.对于TreeView控件的基本使用已经有很多文章.大都是介绍如何在XAML中使用硬编码的固定信息填充Treev ...
- Visual Studio Code(vscode)下载慢 插件安装失败解决方案
目录 一.系统环境 二.前言 三.Visual Studio Code(vscode)简介 四.解决Visual Studio Code(vscode)下载慢的问题 4.1 问题描述 4.2 解决方案 ...
- 如何获取和分析Java堆信息
引言 在Java应用程序的开发和维护过程中,了解和分析Java堆信息是一项重要的任务.本文将介绍如何获取Java堆信息的不同方法,并提供一些分析堆信息的实用技巧. 获取Java堆信息的方法 Java虚 ...
- 2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中连续的一段全变成0,你希望数组整体的累加和尽可能大。 你有两个魔法卷轴,
2023-08-30:用go语言编写.两个魔法卷轴问题. 给定一个数组arr,其中可能有正.负.0, 一个魔法卷轴可以把arr中连续的一段全变成0,你希望数组整体的累加和尽可能大. 你有两个魔法卷轴, ...