mand-mobile/components/tip/tip.vue

152 lines
2.8 KiB
Vue

<template>
<div class="md-tip" :class="wrapperCls">
<div class="md-tip-content">
<template v-if="!$slots.default">
<md-icon
v-if="icon"
class="content-icon"
:name="icon"
:svg="iconSvg"
/>
<div class="content-text" v-text="content"></div>
</template>
<template v-else>
<slot></slot>
</template>
<md-icon
v-if="closable"
name="close"
size="md"
@click.native="$_onClose"
/>
</div>
<div class="md-tip-bg"></div>
</div>
</template>
<script>
import Icon from '../icon'
export default {
name: 'md-tip-content',
components: {
[Icon.name]: Icon,
},
props: {
placement: {
type: String,
},
closable: {
type: Boolean,
default: true,
},
icon: {
type: String,
},
iconSvg: {
type: Boolean,
},
content: {
type: [String, Number],
},
name: {
type: [String, Number],
},
},
computed: {
wrapperCls() {
return {
'has-close': this.closable,
[`is-${this.placement}`]: ['left', 'bottom', 'right'].indexOf(this.placement) !== -1,
[this.name]: !!this.name,
}
},
},
methods: {
$_onClose() {
this.$emit('close')
},
},
}
</script>
<style lang="stylus">
.md-tip
position relative
display inline-block
// max-width 400px
z-index tip-zindex
.md-tip-content
clearfix()
position relative
padding tip-padding
color tip-color
font-size tip-font-size
line-height 1.2
z-index 2
.content-icon
float left
margin-right 14px
.content-text
float left
margin-top 2px
.md-tip-bg
position absolute
absolute-pos()
border-radius tip-radius
background-color tip-fill
box-shadow tip-shadow
opacity tip-fill-opacity
&::after
content ''
position absolute
bottom -10px
left 50%
margin-left -11px
width 0
height 0
border-style solid
border-width 10px 11px 0 11px
border-color tip-fill transparent transparent transparent
.md-tip
&.has-close
.md-tip-content
padding-right 60px
&.is-bottom
.md-tip-bg::after
bottom auto
top -10px
border-width 0 11px 10px 11px
border-color transparent transparent tip-fill transparent
&.is-left
.md-tip-bg::after
top 50%
right -6px
left auto
margin-top -11px
border-width 11px 0 11px 10px
border-color transparent transparent transparent tip-fill
&.is-right
.md-tip-bg::after
top 50%
left 4px
margin-top -11px
border-width 11px 10px 11px 0
border-color transparent tip-fill transparent transparent
.md-icon.md-icon-close
position absolute
right 16px
top 50%
width tip-close-size
height tip-close-size
transform translateY(-50%)
</style>