Browse Source

阻止冒泡

pull/53/head
zq 2 weeks ago
parent
commit
5f1f8fa442
  1. 298
      src/components/HoverButton.vue

298
src/components/HoverButton.vue

@ -1,161 +1,169 @@
<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>
<button
class="hover-button"
:class="{ 'hover-effect': hoverEffect }"
@mouseenter="isHovered = true"
@mouseleave="isHovered = false"
@click="handleClick"
type="button"
>
<!-- 图片/图标部分 -->
<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>
<!-- 文字部分 -->
<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)
}
<script>
export default {
name: 'HoverButton',
props: {
//
buttonText: {
type: String,
default: '按钮'
},
//
defaultIcon: {
type: String,
default: ''
},
//
hoverIcon: {
type: String,
default: ''
},
// alt
iconAlt: {
type: String,
default: '按钮图标'
},
data() {
return {
isHovered: false
}
//
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
}
},
methods:{
handleClick(e) {
e.preventDefault();
e.stopPropagation();
this.$emit('click', e);
}
}
</script>
}
</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;
}
<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.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.primary {
background-color: #007bff;
border-color: #007bff;
color: white;
}
.hover-button.danger {
background-color: #dc3545;
border-color: #dc3545;
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.success {
background-color: #28a745;
border-color: #28a745;
color: white;
}
.hover-button.warning {
background-color: #ffc107;
border-color: #ffc107;
color: #212529;
}
.hover-button.warning {
background-color: #ffc107;
border-color: #ffc107;
color: #212529;
}
/* 图标样式 */
.button-icon {
display: inline-flex;
align-items: center;
margin-right: 8px;
}
/* 图标样式 */
.button-icon {
display: inline-flex;
align-items: center;
margin-right: 8px;
}
.button-icon img {
width: 20px;
height: 20px;
transition: opacity 0.3s ease;
}
.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%;
}
.default-icon-placeholder {
display: inline-block;
width: 20px;
height: 20px;
background-color: #ddd;
border-radius: 50%;
}
/* 文字样式 */
.button-text {
transition: color 0.3s ease;
}
</style>
/* 文字样式 */
.button-text {
transition: color 0.3s ease;
}
</style>
Loading…
Cancel
Save