<template> <view class="uni-card" :class="{ 'uni-card--full': isFull, 'uni-card--shadow': isShadow,'uni-card--border':border}" :style="{'margin':isFull?0:margin,'padding':spacing,'box-shadow':isShadow?shadow:''}"> <!-- 封面 --> <slot name="cover"> <view v-if="cover" class="uni-card__cover"> <image class="uni-card__cover-image" mode="widthFix" @click="onClick('cover')" :src="cover"></image> </view> </slot> <slot name="title"> <view v-if="title || extra" class="uni-card__header"> <!-- 卡片标题 --> <view class="uni-card__header-box" @click="onClick('title')"> <view v-if="thumbnail" class="uni-card__header-avatar"> <image class="uni-card__header-avatar-image" :src="thumbnail" mode="aspectFit" /> </view> <view class="uni-card__header-content"> <text class="uni-card__header-content-title uni-ellipsis">{{ title }}</text> <text v-if="title&&subTitle" class="uni-card__header-content-subtitle uni-ellipsis">{{ subTitle }}</text> </view> </view> <view class="uni-card__header-extra" @click="onClick('extra')"> <slot name="extra"> <text class="uni-card__header-extra-text">{{ extra }}</text> </slot> </view> </view> </slot> <!-- 卡片内容 --> <view class="uni-card__content" :style="{padding:padding}" @click="onClick('content')"> <slot></slot> </view> <view class="uni-card__actions" @click="onClick('actions')"> <slot name="actions"></slot> </view> </view> </template> <script> /** * Card 卡片 * @description 卡片视图组件 * @tutorial https://ext.dcloud.net.cn/plugin?id=22 * @property {String} title 标题文字 * @property {String} subTitle 副标题 * @property {Number} padding 内容内边距 * @property {Number} margin 卡片外边距 * @property {Number} spacing 卡片内边距 * @property {String} extra 标题额外信息 * @property {String} cover 封面图(本地路径需要引入) * @property {String} thumbnail 标题左侧缩略图 * @property {Boolean} is-full = [true | false] 卡片内容是否通栏,为 true 时将去除padding值 * @property {Boolean} is-shadow = [true | false] 卡片内容是否开启阴影 * @property {String} shadow 卡片阴影 * @property {Boolean} border 卡片边框 * @event {Function} click 点击 Card 触发事件 */ export default { name: 'UniCard', emits: ['click'], props: { title: { type: String, default: '' }, subTitle: { type: String, default: '' }, padding: { type: String, default: '10px' }, margin: { type: String, default: '15px' }, spacing: { type: String, default: '0 10px' }, extra: { type: String, default: '' }, cover: { type: String, default: '' }, thumbnail: { type: String, default: '' }, isFull: { // 内容区域是否通栏 type: Boolean, default: false }, isShadow: { // 是否开启阴影 type: Boolean, default: true }, shadow: { type: String, default: '0px 0px 3px 1px rgba(0, 0, 0, 0.08)' }, border: { type: Boolean, default: true } }, methods: { onClick(type) { this.$emit('click', type) } } } </script> <style lang="scss"> $uni-border-3: #EBEEF5 !default; $uni-shadow-base:0 0px 6px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; $uni-main-color: #3a3a3a !default; $uni-base-color: #6a6a6a !default; $uni-secondary-color: #909399 !default; $uni-spacing-sm: 8px !default; $uni-border-color:$uni-border-3; $uni-shadow: $uni-shadow-base; $uni-card-title: 15px; $uni-cart-title-color:$uni-main-color; $uni-card-subtitle: 12px; $uni-cart-subtitle-color:$uni-secondary-color; $uni-card-spacing: 10px; $uni-card-content-color: $uni-base-color; .uni-card { margin: $uni-card-spacing; padding: 0 $uni-spacing-sm; border-radius: 4px; overflow: hidden; font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif; background-color: #fff; flex: 1; .uni-card__cover { position: relative; margin-top: $uni-card-spacing; flex-direction: row; overflow: hidden; border-radius: 4px; .uni-card__cover-image { flex: 1; // width: 100%; /* #ifndef APP-PLUS */ vertical-align: middle; /* #endif */ } } .uni-card__header { display: flex; border-bottom: 1px $uni-border-color solid; flex-direction: row; align-items: center; padding: $uni-card-spacing; overflow: hidden; .uni-card__header-box { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex: 1; flex-direction: row; align-items: center; overflow: hidden; } .uni-card__header-avatar { width: 40px; height: 40px; overflow: hidden; border-radius: 5px; margin-right: $uni-card-spacing; .uni-card__header-avatar-image { flex: 1; width: 40px; height: 40px; } } .uni-card__header-content { /* #ifndef APP-NVUE */ display: flex; /* #endif */ flex-direction: column; justify-content: center; flex: 1; // height: 40px; overflow: hidden; .uni-card__header-content-title { font-size: $uni-card-title; color: $uni-cart-title-color; // line-height: 22px; } .uni-card__header-content-subtitle { font-size: $uni-card-subtitle; margin-top: 5px; color: $uni-cart-subtitle-color; } } .uni-card__header-extra { line-height: 12px; .uni-card__header-extra-text { font-size: 12px; color: $uni-cart-subtitle-color; } } } .uni-card__content { padding: $uni-card-spacing; font-size: 14px; color: $uni-card-content-color; line-height: 22px; } .uni-card__actions { font-size: 12px; } } .uni-card--border { border: 1px solid $uni-border-color; } .uni-card--shadow { position: relative; /* #ifndef APP-NVUE */ box-shadow: $uni-shadow; /* #endif */ } .uni-card--full { margin: 0; border-left-width: 0; border-left-width: 0; border-radius: 0; } /* #ifndef APP-NVUE */ .uni-card--full:after { border-radius: 0; } /* #endif */ .uni-ellipsis { /* #ifndef APP-NVUE */ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; /* #endif */ /* #ifdef APP-NVUE */ lines: 1; /* #endif */ } </style>