用Alpinejs完成主题切换功能
2024-04-17
终于把网站的主题切换功能做好了,这次的实现相当满意。
并且我联动了几个主题颜色比较特别的博友,他们分别有:雅余(黄色)、昱行(粉色)、风清(蓝色),大家可以在本站左侧菜单栏选择自己喜欢的配色浏览本站,欢迎给出意见和分享感受。
之前虽然也写过主题切换功能,但是思路没有这次完整,所以索性写一篇博文介绍一下整体实现思路和流程。
这次11ty-book我采用了Alpinejs作为网页的主js框架(真的挺好用的...),这个框架有中文文档 ,官方地址为:https://alpinejs.dev/。
- Alpine.js 通过很低的成本提供了与 Vue 或 React 这类大型框架相近的响应式和声明式特性。
- 你可以继续操作 DOM,并在需要的时候使用 Alpine.js。
- 可以理解为 JavaScript 版本的 Tailwind。
js部分
在主js文件中使用import的方式引入alpinejs文件,并将主题要用到的json数据对象放入Alpine.data对象中(data是alpinejs的数据主要传输方式)。
具体代码作用见下方代码片断。
css部分
我使用了sass来编写主题文件,在并定义了多个主题,通过 @include
引入进css文件,届时只需要切换html标签的 class
名称为对应的主题名称即可切换不同的主题配色。
我定义的几个主题
模板部分
首先需要在网页的head部分增加以下代码,作用是在网页加载之前初始化好主题的状态,逻辑为:
- 获取本地设置的主题
- 如果上面这个判断失败,如theme为空,则设置为自适应,
这段代码似乎还可以优化?
<script>
const theme = localStorage.theme;
if (localStorage.theme != 'auto') {
document.documentElement.classList.add(theme);
localStorage.theme = theme;
}
localStorage.name = localStorage.name || '自适应';
localStorage.theme = theme || 'auto';
</script>
然后设置主题列表。
在Alpinejs中,我们使用 x-data
属性标识一个标签是动态标签,我这里设置 <ul class="book-theme" x-data="theme">
标签为主动态标签,并且这里还可以指定这个标签需要用到的数据对象,这里我将 x-data
设为上面js中设置的 theme
既js代码中 Alpine.data("theme", () => ({...));
定义的数据部分。
设置完后给再span标签设置 x-text
属性为 themeName
,这个 themeName
我们在js中添加的theme对象中设置的,完整代码为 <span x-text="themeName"></span>
,在页面初始化时Aplinejs会用这个变量初始化该标签的text属性,既显示的文本内容。
之后我这里用liquid的模板语法将我在11ty中设置的主题列表遍历出来,通过 {{ theme.name }}
将遍历输出到网页上。这部分可以根据个人情况来操作,你可以用其他模板框架生成,也可以直接写死在网页上。
并用 @click
属性给他绑定一个点击事件,并调用在js文件中注册的 changeTheme
函数,并传入主题英文名称和中文名称,并调用 setName
函数更新 <span x-text="themeName"></span>
中显示的主题中文名称。
完整代码:
完成
Enjoy~!
加入评论