You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
3.3 KiB
161 lines
3.3 KiB
![]()
2 months ago
|
<template>
|
||
|
<button
|
||
|
class="hover-button"
|
||
|
:class="{ 'hover-effect': hoverEffect }"
|
||
|
@mouseenter="isHovered = true"
|
||
|
@mouseleave="isHovered = false"
|
||
|
@click="$emit('click')"
|
||
|
>
|
||
|
<!-- 图片/图标部分 -->
|
||
|
<div class="button-icon">
|
||
|
<slot name="icon">
|
||
|
<img
|
||
|
v-if="defaultIcon || hoverIcon"
|
||
|
:src="isHovered && hoverIcon ? hoverIcon : defaultIcon"
|
||
|
:alt="iconAlt"
|
||
|
/>
|
||
|
<span v-else class="default-icon-placeholder"></span>
|
||
|
</slot>
|
||
|
</div>
|
||
|
|
||
|
<!-- 文字部分 -->
|
||
|
<span
|
||
|
class="button-text"
|
||
|
:style="{
|
||
|
color: isHovered && hoverTextColor ? hoverTextColor : defaultTextColor
|
||
|
}"
|
||
|
>
|
||
|
<slot>{{ buttonText }}</slot>
|
||
|
</span>
|
||
|
</button>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
export default {
|
||
|
name: 'HoverButton',
|
||
|
props: {
|
||
|
// 按钮文字
|
||
|
buttonText: {
|
||
|
type: String,
|
||
|
default: '按钮'
|
||
|
},
|
||
|
// 默认图标
|
||
|
defaultIcon: {
|
||
|
type: String,
|
||
|
default: ''
|
||
|
},
|
||
|
// 悬停图标
|
||
|
hoverIcon: {
|
||
|
type: String,
|
||
|
default: ''
|
||
|
},
|
||
|
// 图标alt文本
|
||
|
iconAlt: {
|
||
|
type: String,
|
||
|
default: '按钮图标'
|
||
|
},
|
||
|
// 默认文字颜色
|
||
|
defaultTextColor: {
|
||
|
type: String,
|
||
|
default: '#333333'
|
||
|
},
|
||
|
// 悬停文字颜色
|
||
|
hoverTextColor: {
|
||
|
type: String,
|
||
|
default: '#007bff'
|
||
|
},
|
||
|
// 是否启用悬停效果
|
||
|
hoverEffect: {
|
||
|
type: Boolean,
|
||
|
default: true
|
||
|
},
|
||
|
// 按钮类型 (primary, danger, success等)
|
||
|
type: {
|
||
|
type: String,
|
||
|
default: 'default',
|
||
|
validator: value => ['default', 'primary', 'danger', 'success', 'warning'].includes(value)
|
||
|
}
|
||
|
},
|
||
|
data() {
|
||
|
return {
|
||
|
isHovered: false
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|
||
|
|
||
|
<style scoped>
|
||
|
.hover-button {
|
||
|
font-family: Microsoft YaHei UI;
|
||
|
display: inline-flex;
|
||
|
align-items: center;
|
||
|
justify-content: center;
|
||
|
padding: 8px 16px;
|
||
|
border: 1px solid #ddd;
|
||
|
border-radius: 4px;
|
||
|
background-color: white;
|
||
|
cursor: pointer;
|
||
|
transition: all 0.3s ease;
|
||
|
font-size: 14px;
|
||
|
outline: none;
|
||
|
background: #F2F3F5;
|
||
|
border: 1px solid #BABDC2;
|
||
|
}
|
||
|
|
||
|
.hover-button.hover-effect:hover {
|
||
|
background: #F2F7FF;
|
||
|
border-color: #006AFF;
|
||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||
|
}
|
||
|
|
||
|
/* 按钮类型样式 */
|
||
|
.hover-button.primary {
|
||
|
background-color: #007bff;
|
||
|
border-color: #007bff;
|
||
|
color: white;
|
||
|
}
|
||
|
|
||
|
.hover-button.danger {
|
||
|
background-color: #dc3545;
|
||
|
border-color: #dc3545;
|
||
|
color: white;
|
||
|
}
|
||
|
|
||
|
.hover-button.success {
|
||
|
background-color: #28a745;
|
||
|
border-color: #28a745;
|
||
|
color: white;
|
||
|
}
|
||
|
|
||
|
.hover-button.warning {
|
||
|
background-color: #ffc107;
|
||
|
border-color: #ffc107;
|
||
|
color: #212529;
|
||
|
}
|
||
|
|
||
|
/* 图标样式 */
|
||
|
.button-icon {
|
||
|
display: inline-flex;
|
||
|
align-items: center;
|
||
|
margin-right: 8px;
|
||
|
}
|
||
|
|
||
|
.button-icon img {
|
||
|
width: 20px;
|
||
|
height: 20px;
|
||
|
transition: opacity 0.3s ease;
|
||
|
}
|
||
|
|
||
|
.default-icon-placeholder {
|
||
|
display: inline-block;
|
||
|
width: 20px;
|
||
|
height: 20px;
|
||
|
background-color: #ddd;
|
||
|
border-radius: 50%;
|
||
|
}
|
||
|
|
||
|
/* 文字样式 */
|
||
|
.button-text {
|
||
|
transition: color 0.3s ease;
|
||
|
}
|
||
|
</style>
|