123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- <template>
- <view v-if="show" class="u-badge" :class="[
- isDot ? 'u-badge-dot' : '',
- size == 'mini' ? 'u-badge-mini' : '',
- type ? 'u-badge--bg--' + type : ''
- ]" :style="[{
- top: offset[0] + 'rpx',
- right: offset[1] + 'rpx',
- fontSize: fontSize + 'rpx',
- position: absolute ? 'absolute' : 'static',
- color: color,
- backgroundColor: bgColor
- }, boxStyle]"
- >
- {{showText}}
- </view>
- </template>
- <script>
- /**
- * badge 角标
- * @description 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。
- * @tutorial https://www.uviewui.com/components/badge.html
- * @property {String Number} count 展示的数字,大于 overflowCount 时显示为 ${overflowCount}+,为0且show-zero为false时隐藏
- * @property {Boolean} is-dot 不展示数字,只有一个小点(默认false)
- * @property {Boolean} absolute 组件是否绝对定位,为true时,offset参数才有效(默认true)
- * @property {String Number} overflow-count 展示封顶的数字值(默认99)
- * @property {String} type 使用预设的背景颜色(默认error)
- * @property {Boolean} show-zero 当数值为 0 时,是否展示 Badge(默认false)
- * @property {String} size Badge的尺寸,设为mini会得到小一号的Badge(默认default)
- * @property {Array} offset 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,单位rpx。absolute为true时有效(默认[20, 20])
- * @property {String} color 字体颜色(默认#ffffff)
- * @property {String} bgColor 背景颜色,优先级比type高,如设置,type参数会失效
- * @property {Boolean} is-center 组件中心点是否和父组件右上角重合,优先级比offset高,如设置,offset参数会失效(默认false)
- * @example <u-badge type="error" count="7"></u-badge>
- */
- export default {
- name: 'u-badge',
- props: {
- // primary,warning,success,error,info
- type: {
- type: String,
- default: 'error'
- },
- // default, mini
- size: {
- type: String,
- default: 'default'
- },
- //是否是圆点
- isDot: {
- type: Boolean,
- default: false
- },
- // 显示的数值内容
- count: {
- type: [Number, String],
- },
- // 展示封顶的数字值
- overflowCount: {
- type: Number,
- default: 99
- },
- // 当数值为 0 时,是否展示 Badge
- showZero: {
- type: Boolean,
- default: false
- },
- // 位置偏移
- offset: {
- type: Array,
- default: () => {
- return [20, 20]
- }
- },
- // 是否开启绝对定位,开启了offset才会起作用
- absolute: {
- type: Boolean,
- default: true
- },
- // 字体大小
- fontSize: {
- type: [String, Number],
- default: '24'
- },
- // 字体演示
- color: {
- type: String,
- default: '#ffffff'
- },
- // badge的背景颜色
- bgColor: {
- type: String,
- default: ''
- },
- // 是否让badge组件的中心点和父组件右上角重合,配置的话,offset将会失效
- isCenter: {
- type: Boolean,
- default: false
- }
- },
- computed: {
- // 是否将badge中心与父组件右上角重合
- boxStyle() {
- let style = {};
- if(this.isCenter) {
- style.top = 0;
- style.right = 0;
- // Y轴-50%,意味着badge向上移动了badge自身高度一半,X轴50%,意味着向右移动了自身宽度一半
- style.transform = "translateY(-50%) translateX(50%)";
- } else {
- style.top = this.offset[0] + 'rpx';
- style.right = this.offset[1] + 'rpx';
- style.transform = "translateY(0) translateX(0)";
- }
- // 如果尺寸为mini,后接上scal()
- if(this.size == 'mini') {
- style.transform = style.transform + " scale(0.8)";
- }
- return style;
- },
- // isDot类型时,不显示文字
- showText() {
- if(this.isDot) return '';
- else {
- if(this.count > this.overflowCount) return `${this.overflowCount}+`;
- else return this.count;
- }
- },
- // 是否显示组件
- show() {
- // 如果count的值为0,并且showZero设置为false,不显示组件
- if(this.count == 0 && this.showZero == false) return false;
- else return true;
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- @import "../../libs/css/style.components.scss";
-
- .u-badge {
- /* #ifndef APP-NVUE */
- display: inline-flex;
- /* #endif */
- justify-content: center;
- align-items: center;
- line-height: 24rpx;
- padding: 4rpx 8rpx;
- border-radius: 100rpx;
- z-index: 9;
-
- &--bg--primary {
- background-color: $u-type-primary;
- }
-
- &--bg--error {
- background-color: $u-type-error;
- }
-
- &--bg--success {
- background-color: $u-type-success;
- }
-
- &--bg--info {
- background-color: $u-type-info;
- }
-
- &--bg--warning {
- background-color: $u-type-warning;
- }
- }
-
- .u-badge-dot {
- height: 16rpx;
- width: 16rpx;
- border-radius: 100rpx;
- line-height: 1;
- }
-
- .u-badge-mini {
- transform: scale(0.8);
- transform-origin: center center;
- }
-
- // .u-primary {
- // background: $u-type-primary;
- // color: #fff;
- // }
-
- // .u-error {
- // background: $u-type-error;
- // color: #fff;
- // }
-
- // .u-warning {
- // background: $u-type-warning;
- // color: #fff;
- // }
-
- // .u-success {
- // background: $u-type-success;
- // color: #fff;
- // }
-
- // .u-black {
- // background: #585858;
- // color: #fff;
- // }
-
- .u-info {
- background-color: $u-type-info;
- color: #fff;
- }
- </style>
|