Electron-vue第七章:scss更改主题和圆角

 

第一步:使用fs创建窗口配置文件

main.js

import Vue from 'vue'
import axios from 'axios'
import App from './App'
import router from './router'
import store from './store'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

//创建窗口配置文件SetWin.json
var fs = require('fs')
var obj = {
	"data": {
		"WinTheme": "warning",
		"WinRadius": "mediumradius",
		"isMaximized": "0",
		"winsize": [
			880,
			780
		],
		"position": [
			519,
			166
		]
	}
}
obj = JSON.stringify(obj, null, 2);
//如果SetWin.json不存在则创建
var isexist = fs.existsSync("./SetWin.json")
if (isexist === false) {
	fs.writeFileSync("./SetWin.json", obj);
}

if (!process.env.IS_WEB) Vue.use(require('vue-electron'))
Vue.http = Vue.prototype.$http = axios
Vue.config.productionTip = false
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'
/* eslint-disable no-new */
new Vue({
	components: {
		App
	},
	router,
	store,
	template: '<App/>'
}).$mount('#app')

第二步:封装fs文件

assets/js/index.js

var fs = require("fs");

//新增文件
// funApi.AddJson(新增文件地址, "数组")
// 数组模板:
// 	var obj = {
// 		"data": {
// 			"text": ""
// 		}
// 	}
// obj = JSON.stringify(obj, null, 2);//转换数组格式
export function AddJson(path, json) {
	if (path != "") {
		if (json != "") {
			var writ = fs.writeFileSync(path, json);
			if (writ) {
				return false;
			} else {
				return true;
			}
		}
	}
}
//修改文件
// funApi.ChangeJson(需要修改内容的文件地址, "键", "值")
export function ChangeJson(path, name,newname) {
	if (path != "") {
		if (name != "") {
			var page = fs.readFileSync(path + "/")
			var person = page.toString();
			person = JSON.parse(person);
			var pagePerson = person.data; //限制只有data这个主键才能使用
			if (name != "" && newname != "") {
				pagePerson[name] = newname;
				var str = JSON.stringify(person, null, 2);
				var writ = fs.writeFileSync(path, str);
				if (writ) {
					return false;
				} else {
					return true;
				}
			}
		}
	}
}
//获取文件
// funApi.FieldJson(获取文件的地址)
export function FieldJson(path) {
	if (path != "") {
		var page = fs.readFileSync(path)
		var person = page.toString();
		person = JSON.parse(person);
		return person;
	}
}

第三步:新建scss文件

assets/scss/_themes.scss

// 主题颜色
$v-primary: #3B4864;
$v-primary-hover: #262F43;
$v-warning: #ff9800;
$v-warning-hover: #ffa726;
$v-success: #009688;
$v-success-hover: #26a69a;
$v-error: #ff5722;
$v-error-hover: #ff7043;
$v-info: #607d8b;
$v-info-hover: #78909c;
//窗口圆角
$v-mediumradius:30px;
$v-smallradius:20px;
$v-miniradius:10px;
$v-nullradius:0px;
//关闭按钮圆角
$v-mediumradius-close:0 30px 0 0;
$v-smallradius-close:0 20px 0 0;
$v-miniradius-close:0 10px 0 0;
$v-nullradius-close:0 0 0 0;
//背景颜色
@mixin bg_color($color) {
  background-color: $color;
  [data-theme="primary"] & {
	background-color: $v-primary;
  }
  [data-theme="warning"] & {
	background-color: $v-warning;
  }
  [data-theme="success"] & {
	background-color: $v-success;
  }
  [data-theme="error"] & {
	background-color: $v-error;
  }
  [data-theme="info"] & {
	background-color: $v-info;
  }
}
//控制按钮接触颜色
@mixin hover_color($color) {
  background-color: $color;
  [data-theme="primary"] & {
	background-color: $v-primary-hover;
  }
  [data-theme="warning"] & {
	background-color: $v-warning-hover;
  }
  [data-theme="success"] & {
	background-color: $v-success-hover;
  }
  [data-theme="error"] & {
	background-color: $v-error-hover;
  }
  [data-theme="info"] & {
	background-color: $v-info-hover;
  }
}
//窗口圆角
@mixin win_radius($size) {
  border-radius: $size;
  [data-sizeradius="mediumradius"] & {
	border-radius: $v-mediumradius;
  }
  [data-sizeradius="smallradius"] & {
  	border-radius: $v-smallradius;
  }
  [data-sizeradius="miniradius"] & {
  	border-radius: $v-miniradius;
  }
  [data-sizeradius="nullradius"] & {
  	border-radius: $v-nullradius;
  }
}

//关闭按钮圆角
@mixin win_radius_close($size) {
  border-radius: $size;
  [data-sizeradius="mediumradius"] & {
	border-radius: $v-mediumradius-close;
  }
  [data-sizeradius="smallradius"] & {
  	border-radius: $v-smallradius-close;
  }
  [data-sizeradius="miniradius"] & {
  	border-radius: $v-miniradius-close;
  }
  [data-sizeradius="nullradius"] & {
  	border-radius: $v-nullradius-close;
  }
}

第四步:主窗口代码index.vue

安装element,更换控制按钮图标

<template>
	<div class="shadow">
		<div :class="setwin">
			<el-container>
				<el-header height='44px' :class="setheader">
					<div style="float: right;text-align: center;">
						<div :class="setclose" @click="winclose">
							<i class="el-icon-close" style="font-weight: 600;color:#FFFFFF;"></i>
						</div>
						<div class="maximizeWin" @click="maximizeWin">
							<i :class="maxicon" style="font-weight: 600;color:#FFFFFF;"></i>
						</div>
						<div class="maximizeWin" @click="minimizeWin">
							<i class="el-icon-minus" style="font-weight: 600;color:#FFFFFF;"></i>
						</div>
						<div class="maximizeWin" @click="SetWinDialog = true">
							<i class="el-icon-s-tools" style="font-weight: 600;color:#FFFFFF;"></i>
						</div>
					</div>
				</el-header>
				<!-- header end -->
				<el-main :class="setmain">

				</el-main>
			</el-container>
			<!-- 新建书籍弹框 -->
			<el-dialog title="窗口配置" :visible.sync="SetWinDialog" :modal="false" center :show-close="false"
				:close-on-click-modal="false" width="540px">
				<div style="padding: 25px;">
					<el-form ref="form" :model="form" label-width="80px">
						<el-form-item label="窗口圆角">
							<el-radio-group v-model="form.WinRadius" @input="SetWinRadius">
								<el-radio-button label="mediumradius">大圆角</el-radio-button>
								<el-radio-button label="smallradius">中圆角</el-radio-button>
								<el-radio-button label="miniradius">小圆角</el-radio-button>
								<el-radio-button label="nullradius">无</el-radio-button>
							</el-radio-group>
						</el-form-item>
						<el-form-item label="窗口主题">
							<el-radio-group v-model="form.WinTheme" @input="SetTheme">
								<el-radio-button label="primary">默认</el-radio-button>
								<el-radio-button label="warning">橙黄</el-radio-button>
								<el-radio-button label="success">青绿</el-radio-button>
								<el-radio-button label="error">吉红</el-radio-button>
								<el-radio-button label="info">玄灰</el-radio-button>
							</el-radio-group>
						</el-form-item>
					</el-form>
				</div>

				<span slot="footer" class="dialog-footer">
					<el-button @click="SetWinDialog = false">确定</el-button>
				</span>
			</el-dialog>
		</div>
	</div>
</template>

<script>
	import {
		remote
	} from 'electron';
	import * as funApi from "@/assets/js/index.js";
	export default {
		data() {
			return {
				setwin: 'win', //动态窗口样式
				setheader: 'header', //设置头部最大化后可否移动
				maxicon: 'el-icon-full-screen', //设置最大化图标
				setclose: 'closeWin', //设置关闭按钮样式
				setmain:'main',
				isMaximized: "", //窗口是否最大化
				winsize: '', //窗口大小
				position: '', //窗口位置
				form: {
					WinTheme: '', //主题名称
					WinRadius: '' //窗口大小
				},
				SetWinDialog: false //窗口配置弹框
			}
		},
		methods: {
			minimizeWin() {
				remote.getCurrentWindow().minimize(); // 窗口最小化
			},
			maximizeWin() {
				//窗口最大化
				var getWin = funApi.FieldJson("./SetWin.json")
				if (this.isMaximized == "0") {
					this.winsize = remote.getCurrentWindow().getSize() //获取当前窗口大小
					this.position = remote.getCurrentWindow().getPosition() //获取当前窗口位置
					remote.getCurrentWindow().maximize() //窗口最大化
					this.setwin = 'maxwin' //更改窗口样式为最大化
					this.setclose = 'closeWinmax' //更改关闭按钮样式
					this.setheader = 'maxheader' //设置头部最大化后可否移动
					this.maxicon = 'el-icon-copy-document' //设置最大化后图标
					this.setmain = "maxmain"//设置main样式
					funApi.ChangeJson("./SetWin.json", "winsize", this.winsize)
					funApi.ChangeJson("./SetWin.json", "position", this.position)
					funApi.ChangeJson("./SetWin.json", "isMaximized", "1")
					this.isMaximized = "1" //为最大化
					remote.getCurrentWindow().setResizable(false) //禁止拉伸窗口
				} else { //恢复窗口最大化
					remote.getCurrentWindow().setResizable(true) //启用拉伸窗口,前置条件,要排在第一位
					remote.getCurrentWindow().setSize(getWin.data.winsize[0], getWin.data.winsize[
						1]) //恢复之前窗口大小
					remote.getCurrentWindow().setPosition(getWin.data.position[0], getWin.data.position[
						1]) //恢复之前窗口位置
					this.setclose = 'closeWin' //更改关闭按钮样式
					this.setwin = 'win' //恢复透明圆角窗口
					this.setheader = 'header' //设置头部最大化后可否移动
					this.setmain = "main"//设置main样式
					this.maxicon = 'el-icon-full-screen' //设置最大化后图标
					this.isMaximized = "0" //正常窗口
					funApi.ChangeJson("./SetWin.json", "isMaximized", "0")
				}
			},
			winclose() {
				setTimeout(() => {
					undefined
					remote.getCurrentWindow().close(); // 关闭窗口,也结束了所有进程
				}, 10)
			},
			//主题进行切换 
			SetTheme() {
				funApi.ChangeJson("./SetWin.json", "WinTheme", this.form.WinTheme)
				document.documentElement.setAttribute('data-theme', this.form.WinTheme);
			},
			//窗口圆角切换
			SetWinRadius() {
				funApi.ChangeJson("./SetWin.json", "WinRadius", this.form.WinRadius)
				document.documentElement.setAttribute('data-sizeradius', this.form.WinRadius);
			}
		},
		created: function() {
			var getWin = funApi.FieldJson("./SetWin.json")
			// 延迟执行
			setTimeout(() => {
				undefined
				//获取当前窗口配置
				if (getWin.data.isMaximized == "1") {
					//窗口最大化
					remote.getCurrentWindow().maximize() //窗口最大化
					this.setwin = 'maxwin' //更改窗口样式为最大化
					this.setclose = 'closeWinmax' //更改关闭按钮样式
					this.setheader = 'maxheader' //设置头部最大化后可否移动
					this.maxicon = 'el-icon-copy-document' //设置最大化后图标
					this.isMaximized = "1" //为最大化
					remote.getCurrentWindow().setResizable(false) //禁止拉伸窗口
				} else {
					//恢复窗口最大化
					remote.getCurrentWindow().setResizable(true) //启用拉伸窗口,前置条件,要排在第一位
					remote.getCurrentWindow().setSize(getWin.data.winsize[0], getWin.data.winsize[
						1]) //恢复之前窗口大小
					remote.getCurrentWindow().setPosition(getWin.data.position[0], getWin.data.position[
						1]) //恢复之前窗口位置
					this.setclose = 'closeWin' //更改关闭按钮样式
					this.setwin = 'win' //恢复透明圆角窗口
					this.setheader = 'header' //设置头部最大化后可否移动
					this.maxicon = 'el-icon-full-screen' //设置最大化后图标
					this.isMaximized = "0" //正常窗口
				}
				//获取主题
				this.form.WinTheme = getWin.data.WinTheme
				document.documentElement.setAttribute('data-theme', getWin.data.WinTheme);
				//获取窗口圆角
				this.form.WinRadius = getWin.data.WinRadius
				document.documentElement.setAttribute('data-sizeradius', getWin.data.WinRadius);
			}, 10)
		}
	}
</script>

<style lang="scss" scoped>
	@import "@/assets/scss/_themes.scss";

	.shadow {
		body {
			background-color: rgba(0, 0, 0, 0); //将整体背景色设置为透明,依靠组件底色来设置底色
		}

		.win {
			//正常窗口样式,圆角为20px
			width: calc(100% - 10px); //去除左右间距各5px
			height: calc(100vh - 10px); //去除上下间距各5px
			@include bg_color($v-primary); //设置主题
			@include win_radius($v-mediumradius); //设置圆角
			box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
			margin: 5px; //将外间距设置为5px
		}

		.maxwin {
			//窗口最大化后无圆边框
			width: 100%;
			height: 100vh;
			@include bg_color($v-primary);
		}

		//header
		.header {
			height: 44px;
			line-height: 44px;
			padding: 0;
			-webkit-app-region: drag; //可拖动窗口
			border-radius: 20px 20px 0 0;
		}

		.maxheader {
			height: 44px;
			line-height: 44px;
			padding: 0;
			-webkit-app-region: no-drag; //不可拖动窗口,防止拖动窗口后执行窗口恢复,无法判断是否圆边框
			@include bg_color($v-primary);
		}

		.closeWin {
			//正常窗口,关闭按钮有圆角
			float: right;
			width: 40px;
			height: 44px;
			line-height: 44px;
			font-weight: 600;
			@include win_radius_close($v-mediumradius-close); //设置圆角
			-webkit-app-region: no-drag; //可以操作按钮
			cursor: pointer; //更改鼠标指针形状
		}

		.closeWin:hover {
			//关闭按钮正常窗口选中
			@include hover_color($v-primary);
		}

		.closeWinmax {
			//最大化后关闭按钮无圆角
			float: right;
			width: 40px;
			height: 44px;
			line-height: 44px;
			font-weight: 600;
			-webkit-app-region: no-drag;
			cursor: pointer;
		}

		.closeWinmax:hover {
			//关闭按钮最大化后选中
			@include hover_color($v-primary);
		}

		//最小化和最大化按钮样式
		.maximizeWin {
			float: right;
			width: 40px;
			height: 44px;
			line-height: 44px;
			font-weight: 600;
			-webkit-app-region: no-drag;
			cursor: pointer;
		}

		.maximizeWin:hover {
			@include hover_color($v-primary);
		}

		//header-end

		//main
		.main {
			height: calc(100vh - 54px);
			// border-radius: 0 0 30px 30px;
			padding: 0;
		}
		.maxmain {
			height: calc(100vh - 44px);
			padding: 0;
		}
		
		//main-end

		//单选框
		/deep/.el-form-item__label {
			font-size: 16px;
		}

		//弹框窗口配置
		/deep/ .el-dialog {
			border-radius: 20px;
		}

		/deep/ .el-dialog__header {
			border-bottom: 1px solid #E7EAEC;
			border-radius: 20px 20px 0 0;
			padding: 20px 20px 20px;
		}

		/deep/ .el-dialog__footer {
			border-top: 1px solid #E7EAEC;
			padding: 12px 20px 12px;
		}

		/deep/ .el-dialog--center .el-dialog__body {
			padding: 0px;
		}
		
		.el-button{
			border-radius: 10px;
			width: 100px;
		}


	}
</style>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悍司命

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值