前言
前端的界面基本完成之后,我们需要继续开始界面的高级美化工作。这里我们主要尝试完成引导页、全屏、暗黑模式几个功能。
引导页
效果如下:
引导页对于新用户来说有着很好的引导功能,我觉得还是一个非常实用和美观的,很有必要去实现。
实现思路如下:
使用drive.js第三方库。
官方地址:https://github.com/kamranahmedse/driver.js
也可以参考这个博客:
Vue 页面引导效果(首次登录新用户引导) driver.js 引导页
具体来说,在layout写好driver实例,创建step.js文件,在里面写好每一步的对象数组,在mounted函数挂好初始化,然后在子组件的按钮上调用父组件的方法(this.$parent.method()),即可开始引导页操作。
mounted() {
this.driver = new Driver({
opacity: 0.6,
animate: true,
doneBtnText: "我知道了",
closeBtnText: "跳过", // 关闭按钮文案
nextBtnText: "下一步", // 下一步的按钮文案
prevBtnText: "上一步", // 上一步的按钮文案
keyboardControl: true, // 允许通过键盘控制(退出关闭,箭头键移动)
});
console.log(this.driver);
},
下面是step文件。
// 定义介绍的步骤
const steps = [
{
element: '#guide-header',
stageBackground: '#fff',
popover: {
title: '头部',
description: '网页顶部',
position: 'bottom-center'
}
},
{
element: '#guide-dark',
stageBackground: '#fff',
popover: {
title: '夜间模式',
description: '点击切换日间和夜间模式',
position: 'bottom'
}
},
{
element: '#guide-screenfull',
stageBackground: '#fff',
popover: {
title: '切换全屏',
description: '点击切换是否全屏展示',
position: 'bottom'
}
},
{
element: '#guide-person',
stageBackground: '#fff',
popover: {
title: '个人中心',
description: '用户相关的页面',
position: 'bottom'
}
},
{
element: '#guide-aside',
stageBackground: '#fff',
popover: {
title: '侧边栏',
description: '这里是菜单导航区域',
position: 'right'
}
},
{
element: '#guide-collapse',
stageBackground: '#fff',
popover: {
title: '折叠菜单',
description: '点击折叠或展开菜单栏',
position: 'right'
}
},
全屏
点击图标后实现全屏。
<span id="guide-screenfull">
<el-icon :size="20" style="margin-right:17px;cursor:pointer;position: relative;top: 4.5px" @click="toggleFullscreen()"><FullScreen /></el-icon>
</span>
对应的点击后的函数比较重要,这里实现方式很多,我是这样实现的:
通过第三方库screenfull,点击后调用相关函数:
toggleFullscreen() {
if (screenfull.isEnabled) {
screenfull.toggle();
}
},
暗黑模式
暗黑模式也花了我很长时间。
暗黑模式的实现,最新版本的elementPlus官方是有的,参见:
https://element-plus.gitee.io/zh-CN/guide/dark-mode.html#%E9%80%9A%E8%BF%87-css
但是!官方的实现,在我们的环境里,有问题!
我在GitHub上也看到了类似的报错反馈,说明应该是有bug的。
我研究了很久的官方源码,发现原理并不复杂,把官方写好的CSS拿过来用就好了。于是自己动手实现了一遍。
CSS如下:
html.dark {
color-scheme: dark;
--el-color-primary: #409eff;
--el-color-primary-light-3: #3375b9;
--el-color-primary-light-5: #2a598a;
--el-color-primary-light-7: #213d5b;
--el-color-primary-light-8: #1d3043;
--el-color-primary-light-9: #18222c;
--el-color-primary-dark-2: #66b1ff;
--el-color-success: #67c23a;
--el-color-success-light-3: #4e8e2f;
--el-color-success-light-5: #3e6b27;
--el-color-success-light-7: #2d481f;
--el-color-success-light-8: #25371c;
--el-color-success-light-9: #1c2518;
--el-color-success-dark-2: #85ce61;
--el-color-warning: #e6a23c;
--el-color-warning-light-3: #a77730;
--el-color-warning-light-5: #7d5b28;
--el-color-warning-light-7: #533f20;
--el-color-warning-light-8: #3e301c;
--el-color-warning-light-9: #292218;
--el-color-warning-dark-2: #ebb563;
--el-color-danger: #f56c6c;
--el-color-danger-light-3: #b25252;
--el-color-danger-light-5: #854040;
--el-color-danger-light-7: #582e2e;
--el-color-danger-light-8: #412626;
--el-color-danger-light-9: #2b1d1d;
--el-color-danger-dark-2: #f78989;
--el-color-error: #f56c6c;
--el-color-error-light-3: #b25252;
--el-color-error-light-5: #854040;
--el-color-error-light-7: #582e2e;
--el-color-error-light-8: #412626;
--el-color-error-light-9: #2b1d1d;
--el-color-error-dark-2: #f78989;
--el-color-info: #909399;
--el-color-info-light-3: #6b6d71;
--el-color-info-light-5: #525457;
--el-color-info-light-7: #393a3c;
--el-color-info-light-8: #2d2d2f;
--el-color-info-light-9: #202121;
--el-color-info-dark-2: #a6a9ad;
--el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72);
--el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72);
--el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72);
--el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000;
--el-bg-color-page: #0a0a0a;
--el-bg-color: #141414;
--el-bg-color-overlay: #1d1e1f;
--el-text-color-primary: #E5EAF3;
--el-text-color-regular: #CFD3DC;
--el-text-color-secondary: #A3A6AD;
--el-text-color-placeholder: #8D9095;
--el-text-color-disabled: #6C6E72;
--el-border-color-darker: #636466;
--el-border-color-dark: #58585B;
--el-border-color: #4C4D4F;
--el-border-color-light: #414243;
--el-border-color-lighter: #363637;
--el-border-color-extra-light: #2B2B2C;
--el-fill-color-darker: #424243;
--el-fill-color-dark: #39393A;
--el-fill-color: #303030;
--el-fill-color-light: #262727;
--el-fill-color-lighter: #1D1D1D;
--el-fill-color-extra-light: #191919;
--el-fill-color-blank: transparent;
--el-mask-color: rgba(0, 0, 0, 0.8);
--el-mask-color-extra-light: rgba(0, 0, 0, 0.3)
}
html.dark .el-button {
--el-button-disabled-text-color: rgba(255, 255, 255, 0.5)
}
html.dark .el-card {
--el-card-bg-color: var(--el-bg-color-overlay)
}
html.dark .el-empty {
--el-empty-fill-color-0: var(--el-color-black);
--el-empty-fill-color-1: #4b4b52;
--el-empty-fill-color-2: #36383d;
--el-empty-fill-color-3: #1e1e20;
--el-empty-fill-color-4: #262629;
--el-empty-fill-color-5: #202124;
--el-empty-fill-color-6: #212224;
--el-empty-fill-color-7: #1b1c1f;
--el-empty-fill-color-8: #1c1d1f;
--el-empty-fill-color-9: #18181a
}
总的来说,相当于引入了一个官方写好的css文件。在index.html中引入,把类名写为dark,即可实现暗黑模式。
但是没办法切换?好办,给个按钮,能控制整个页面的类名就好了。
怎么控制?这里用Vue常规手段比较难实现,所以我动了一下脑子,决定简单粗暴,用最原始的HTML获取和操作DOM树的方法。获取整个DOM对象,然后用JavaScript的函数更改类名即可!
changeTheme(){
//这里用了很原始的dom树,不得已之举了属于是
if(this.dark){
document.getElementsByClassName("WholePage")[0].setAttribute("class","WholePage dark");
}
else{
document.getElementsByClassName("WholePage")[0].setAttribute("class","WholePage");
}
},
总结
在实训的最后一段时间,为了前端进一步美化,我先后实现了引导页、暗黑模式、全屏,都达到了预期的效果。收获颇丰。