按钮右上方显示文字(组件封装)

效果预览

在这里插入图片描述
在这里插入图片描述
代码实现

<template>
	<div
		class="main"
		ref="btn"
		:class="{ active }"
		@click="$emit('change', active)"
	>
		<span>{{ name }}</span>
	</div>
</template>
<script>
	export default {
		data() {
			return {};
		},
		methods: {},
		props: {
			//是否获取焦点 || 是否被选中
			active: {
				type: Boolean,
				default: false
			},
			//按钮类型,1辅助,0核心
			type: {
				type: [String, Number],
				default: 1
			},
			//按钮文字
			name: {
				type: String,
				default: ""
			}
		},

		mounted() {
		    
			//元素绑定的行内css
			let style = "";
			const map = new Map();
			//这里处理上方绑定的css,name为按钮右上方小文字,color为整体主题色
			const set_data = (name, color) => {
				style = `--name:"${name}";--color:${color}`;
			};
			//我这边需要根据类型渲染不同的name、color,不需要的删掉,写死即可,或者只写一种类型
			//文字不宜过多,一般两个就可以,太多会溢出
			//类型为 0 时,渲染核心dom的css
			map.set(0, () => {
				set_data("核心", "#409eff");
			});
			//类型为 1 时,渲染辅助dom的css
			map.set(1, () => {
				set_data("辅助", "#aa324e");
			});
			//依据type设置对应的行内css,
			map.get(this.type)();
			if (style) {
				//渲染至虚拟dom
				this.$refs["btn"].style = style;
			}
		}
	};
</script>
<style lang="scss" scoped>
	.main {
		//边框和伪类背景色
		--color: #aa324e;
		//行高
		--size: 2em;
		//上下间距
		--padding_: 0.1em;
		//伪类缩放
		--scale: 0.6;
		//外边距
		--margin: 0.5em 0.4em;
		//伪类标签文字
		--name: "默认文字";
		//正常文字大小,覆盖项目的14px文字大小
		font-size: 16px;
		user-select: none;
		transition: all 0.2s ease-in-out;
		margin: var(--margin);
		color: var(--color);
		cursor: pointer;
		border-radius: 5px;
		position: relative;
		border: 1px solid var(--color);
		display: inline-block;
		padding: var(--padding_) var(--size);
		line-height: var(--size);
		white-space: nowrap;
		overflow: hidden;
		&::after {
			content: var(--name);
			position: absolute;
			color: #fff;
			// transform-origin: center center;
			transform: rotate(45deg) scale(0.6);
			z-index: 99;
			top: -1.2em;
			right: -1em;
			height: calc((var(--size) + var(--padding_) * 2) / var(--scale));
			line-height: calc((var(--size) + var(--padding_) * 2) / var(--scale));
			display: block;
			width: calc(var(--size) / var(--scale));
			text-align: center;
		}
		&::before {
			content: "";
			right: 0;
			position: absolute;
			top: 0;
			width: 0;
			height: 0;
			font-size: inherit;
			border-style: solid;
			border-color: var(--color);
			border-width: calc((var(--size) + var(--padding_) * 2) / 2);
			border-left-color: transparent;
			border-bottom-color: transparent;
		}
		&:hover {
			//阴影
			box-shadow: 0px 0px 4px 0px var(--color);
		}
	}
	//被选中时的css
	.active {
		background-color: var(--color);
		color: #fff;
	}
</style>
  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值