<template> <view v-if="isShow" class="picker"> <!-- 日期选择器 --> <view v-if="type!='time'" class="picker-modal"> <view class="picker-modal-header"> <view class="picker-icon picker-icon-zuozuo" :hover-stay-time="100" hover-class="picker-icon-active" @click="onSetYear('-1')"></view> <view class="picker-icon picker-icon-zuo" :hover-stay-time="100" hover-class="picker-icon-active" @click="onSetMonth('-1')"></view> <text class="picker-modal-header-title">{{title}}</text> <view class="picker-icon picker-icon-you" :hover-stay-time="100" hover-class="picker-icon-active" @click="onSetMonth('+1')"></view> <view class="picker-icon picker-icon-youyou" :hover-stay-time="100" hover-class="picker-icon-active" @click="onSetYear('+1')"></view> </view> <swiper class="picker-modal-body" :circular="true" :duration="200" :skip-hidden-item-layout="true" :current="calendarIndex" @change="onSwiperChange"> <swiper-item class="picker-calendar" v-for="(calendar,calendarIndex2) in calendars" :key="calendarIndex2"> <view class="picker-calendar-view" v-for="(week,index) in weeks" :key="index - 7"> <view class="picker-calendar-view-item">{{week}}</view> </view> <view class="picker-calendar-view" v-for="(date,dateIndex) in calendar" :key="dateIndex" @click="onSelectDate(date)"> <!-- 背景样式 --> <view v-show="date.bgStyle.type" :class="'picker-calendar-view-'+date.bgStyle.type" :style="{background: date.bgStyle.background}"></view> <!-- 正常和选中样式 --> <view class="picker-calendar-view-item" :style="{opacity: date.statusStyle.opacity, color: date.statusStyle.color, background: date.statusStyle.background}"> <text>{{date.title}}</text> </view> <!-- 小圆点样式 --> <view class="picker-calendar-view-dot" :style="{opacity: date.dotStyle.opacity, background: date.dotStyle.background}"></view> <!-- 信息样式 --> <view v-show="date.tips" class="picker-calendar-view-tips">{{date.tips}}</view> </view> </swiper-item> </swiper> <view class="picker-modal-footer"> <view class="picker-modal-footer-info"> <block v-if="isMultiSelect"> <view class="picker-display"> <text>{{beginText}}日期</text> <text class="picker-display-text">{{BeginTitle}}</text> <view v-if="isContainTime" class="picker-display-link" :hover-stay-time="100" hover-class="picker-display-link-active" :style="{color}" @click="onShowTimePicker('begin')">{{BeginTimeTitle}}</view> </view> <view class="picker-display"> <text>{{endText}}日期</text> <text class="picker-display-text">{{EndTitle}}</text> <view v-if="isContainTime" class="picker-display-link" :hover-stay-time="100" hover-class="picker-display-link-active" :style="{color}" @click="onShowTimePicker('end')">{{EndTimeTitle}}</view> </view> </block> <block v-else> <view class="picker-display"> <text>当前选择</text> <text class="picker-display-text">{{BeginTitle}}</text> <view v-if="isContainTime" class="picker-display-link" :hover-stay-time="100" hover-class="picker-display-link-active" :style="{color}" @click="onShowTimePicker('begin')">{{BeginTimeTitle}}</view> </view> </block> </view> <view class="picker-modal-footer-btn"> <view class="picker-btn" :hover-stay-time="100" hover-class="picker-btn-active" @click="onCancel">取消</view> <view class="picker-btn" :style="{color}" :hover-stay-time="100" hover-class="picker-btn-active" @click="onConfirm">确定</view> </view> </view> </view> <!-- 时间选择器 --> <view v-if="showTimePicker" class="picker"> <view class="picker-modal picker-time"> <view class="picker-modal-header"> <text class="picker-modal-header-title">选择时间</text> </view> <picker-view class="picker-modal-time" indicator-class="picker-modal-time-item" :value="timeValue" @change="onTimeChange"> <picker-view-column> <view v-for="(v,i) in 24" :key="i">{{i<10?'0'+i:i}}时</view> </picker-view-column> <picker-view-column> <view v-for="(v,i) in 60" :key="i">{{i<10?'0'+i:i}}分</view> </picker-view-column> <picker-view-column v-if="showSeconds"> <view v-for="(v,i) in 60" :key="i">{{i<10?'0'+i:i}}秒</view> </picker-view-column> </picker-view> <view class="picker-modal-footer"> <view class="picker-modal-footer-info"> <!-- <view class="picker-display"> <text>当前选择</text> <text class="picker-display-text">{{PickerTimeTitle}}</text> </view> --> </view> <view class="picker-modal-footer-btn"> <view class="picker-btn" :hover-stay-time="100" hover-class="picker-btn-active" @click="onCancelTime">取消</view> <view class="picker-btn" :style="{color}" :hover-stay-time="100" hover-class="picker-btn-active" @click="onConfirmTime">确定</view> </view> </view> </view> </view> </view> </template> <script> /** * 工具函数库 */ const DateTools = { /** * 获取公历节日 * @param date Date对象 */ getHoliday(date) { let holidays = { '0101': '元旦', '0214': '情人', '0308': '妇女', '0312': '植树', '0401': '愚人', '0501': '劳动', '0504': '青年', '0601': '儿童', '0701': '建党', '0801': '建军', '0903': '抗日', '0910': '教师', '1001': '国庆', '1031': '万圣', '1224': '平安', '1225': '圣诞' }; let value = this.format(date, 'mmdd'); if (holidays[value]) return holidays[value]; return false; }, /** * 解析标准日期格式 * @param s 日期字符串 * @return 返回Date对象 */ parse: s => new Date(s.replace(/(年|月|-)/g, '/').replace(/(日)/g, '')), /** * 比较日期是否为同一天 * @param a Date对象 * @param b Date对象 * @return Boolean */ isSameDay: (a, b) => a.getMonth() == b.getMonth() && a.getFullYear() == b.getFullYear() && a.getDate() == b.getDate(), /** * 格式化Date对象 * @param d 日期对象 * @param f 格式字符串 * @return 返回格式化后的字符串 */ format(d, f) { var o = { "m+": d.getMonth() + 1, "d+": d.getDate(), "h+": d.getHours(), "i+": d.getMinutes(), "s+": d.getSeconds(), "q+": Math.floor((d.getMonth() + 3) / 3), }; if (/(y+)/.test(f)) f = f.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(f)) f = f.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return f; }, /** * 用于format格式化后的反解析 * @param s 日期字符串 * @param f 格式字符串 * @return 返回Date对象 */ inverse(s, f) { var o = { "y": '', "m": '', "d": '', "h": '', "i": '', "s": '', }; let d = new Date(); if (s.length != f.length) return d; for (let i in f) if (o[f[i]] != undefined) o[f[i]] += s[i]; if (o.y) d.setFullYear(o.y.length < 4 ? (d.getFullYear() + '').substr(0, 4 - o.y.length) + o.y : o.y); o.m && d.setMonth(o.m - 1, 1); o.d && d.setDate(o.d - 0); o.h && d.setHours(o.h - 0); o.i && d.setMinutes(o.i - 0); o.s && d.setSeconds(o.s - 0); return d; }, /** * 获取日历数组(42天) * @param date 日期对象或日期字符串 * @param proc 处理日历(和forEach类似),传递一个数组中的item * @return Array */ getCalendar(date, proc) { let it = new Date(date), calendars = []; it.setDate(1); it.setDate(it.getDate() - ((it.getDay() == 0 ? 7 : it.getDay()) - 1)); //偏移量 for (let i = 0; i < 42; i++) { let tmp = { dateObj: new Date(it), title: it.getDate(), isOtherMonth: it.getMonth() < date.getMonth() || it.getMonth() > date.getMonth() }; calendars.push(Object.assign(tmp, proc ? proc(tmp) : {})); it.setDate(it.getDate() + 1); } return calendars; }, /** * 获取日期到指定的月份1号(不改变原来的date对象) * @param d Date对象 * @param v 指定的月份 * @return Date对象 */ getDateToMonth(d, v) { let n = new Date(d); n.setMonth(v, 1); return n; }, /** * 把时间数组转为时间字符串 * @param t Array[时,分,秒] * @param showSecinds 是否显示秒 * @return 字符串 时:分[:秒] */ formatTimeArray(t, s) { let r = [...t]; if (!s) r.length = 2; r.forEach((v, k) => r[k] = ('0' + v).slice(-2)); return r.join(':'); } }; export default { props: { //颜色 color: { type: String, default: '#409eff' }, //是否显示秒 针对type为datetime或time时生效 showSeconds: { type: Boolean, default: false }, //初始的值 value: [String, Array], //类型date time datetime range rangetime type: { type: String, default: 'range' }, //是否显示 show: { type: Boolean, default: false }, //初始格式 format: { type: String, default: '' }, //显示公历节日 showHoliday: { type: Boolean, default: true }, //显示提示 showTips: { type: Boolean, default: false }, //开始文案 针对type为范围选择时生效 beginText: { type: String, default: '开始' }, //结束文案 针对type为范围选择时生效 endText: { type: String, default: '结束' } }, data() { return { isShow: false, //是否显示 isMultiSelect: false, //是否为多选 isContainTime: false, //是否包含时间 date: {}, //当前日期对象 weeks: ["一", "二", "三", "四", "五", "六", "日"], title: '初始化', //标题 calendars: [[],[],[]], //日历数组 calendarIndex: 1, //当前日历索引 checkeds: [], //选中的日期对象集合 showTimePicker: false, //是否显示时间选择器 timeValue: [0, 0, 0], //时间选择器的值 timeType: 'begin', //当前时间选择的类型 beginTime: [0, 0, 0], //当前所选的开始时间值 endTime: [0, 0, 0], //当前所选的结束时间值 }; }, methods: { //设置值 setValue(value) { this.date = new Date(); this.checkeds = []; this.isMultiSelect = this.type.indexOf('range') >= 0; this.isContainTime = this.type.indexOf('time') >= 0; //将字符串解析为Date对象 let parseDateStr = (str) => (this.format ? DateTools.inverse(str, this.format) : DateTools.parse(str)); if (value) { if (this.isMultiSelect) { Array.isArray(value) && value.forEach((dateStr, index) => { let date = parseDateStr(dateStr); let time = [date.getHours(), date.getMinutes(), date.getSeconds()]; if (index == 0) this.beginTime = time; else this.endTime = time; this.checkeds.push(date); }); } else { if (this.type == 'time') { let date = parseDateStr('2019/1/1 ' + value); this.beginTime = [date.getHours(), date.getMinutes(), date.getSeconds()]; this.onShowTimePicker('begin'); } else { this.checkeds.push(parseDateStr(value)); if (this.isContainTime) this.beginTime = [ this.checkeds[0].getHours(), this.checkeds[0].getMinutes(), this.checkeds[0].getSeconds() ]; } } if (this.checkeds.length) this.date = new Date(this.checkeds[0]); } else { if (this.isContainTime) { this.beginTime = [this.date.getHours(), this.date.getMinutes(), this.date.getSeconds()]; if (this.isMultiSelect) this.endTime = [...this.beginTime]; } this.checkeds.push(new Date(this.date)); } if (this.type != 'time') this.refreshCalendars(true); else this.onShowTimePicker('begin'); }, //改变年份 onSetYear(value) { this.date.setFullYear(this.date.getFullYear() + parseInt(value)); this.refreshCalendars(true); }, //改变月份 onSetMonth(value) { this.date.setMonth(this.date.getMonth() + parseInt(value)); this.refreshCalendars(true); }, //时间选择变更 onTimeChange(e) { this.timeValue = e.detail.value; }, //设置时间选择器的显示状态 onShowTimePicker(type) { this.showTimePicker = true; this.timeType = type; this.timeValue = type == 'begin' ? [...this.beginTime] : [...this.endTime]; }, //处理日历 procCalendar(item) { //定义初始样式 item.statusStyle = { opacity: 1, color: item.isOtherMonth ? '#ddd' : '#000', background: 'transparent' }; item.bgStyle = { type: '', background: 'transparent' }; item.dotStyle = { opacity: 1, background: 'transparent' }; item.tips = ""; //标记今天的日期 if (DateTools.isSameDay(new Date(), item.dateObj)) { item.statusStyle.color = this.color; if (item.isOtherMonth) item.statusStyle.opacity = 0.3; } //标记选中项 this.checkeds.forEach(date => { if (DateTools.isSameDay(date, item.dateObj)) { item.statusStyle.background = this.color; item.statusStyle.color = '#fff'; item.statusStyle.opacity = 1; if (this.isMultiSelect && this.showTips) item.tips = this.beginText; } }); //节假日或今日的日期标点 if (item.statusStyle.background != this.color) { let holiday = this.showHoliday ? DateTools.getHoliday(item.dateObj) : false; if (holiday || DateTools.isSameDay(new Date(), item.dateObj)) { item.title = holiday || item.title; item.dotStyle.background = this.color; if (item.isOtherMonth) item.dotStyle.opacity = 0.2; } } else { item.title = item.dateObj.getDate(); } //有两个日期 if (this.checkeds.length == 2) { if (DateTools.isSameDay(this.checkeds[0], item.dateObj)) { //开始日期 item.bgStyle.type = 'bgbegin'; } if (DateTools.isSameDay(this.checkeds[1], item.dateObj)) { //结束日期 if (this.isMultiSelect && this.showTips) item.tips = item.bgStyle.type ? this.beginText + ' / ' + this.endText : this.endText; if (!item.bgStyle.type) { //开始日期不等于结束日期 item.bgStyle.type = 'bgend'; } else { item.bgStyle.type = ''; } } if (!item.bgStyle.type && (+item.dateObj > +this.checkeds[0] && +item.dateObj < +this.checkeds[1])) { //中间的日期 item.bgStyle.type = 'bg'; item.statusStyle.color = this.color; } if (item.bgStyle.type) { item.bgStyle.background = this.color; item.dotStyle.opacity = 1; item.statusStyle.opacity = 1; } } }, //刷新日历 refreshCalendars(refresh = false) { let date = new Date(this.date); let before = DateTools.getDateToMonth(date, date.getMonth() - 1); let after = DateTools.getDateToMonth(date, date.getMonth() + 1); if (this.calendarIndex == 0) { if(refresh) this.calendars.splice(0, 1, DateTools.getCalendar(date, this.procCalendar)); this.calendars.splice(1, 1, DateTools.getCalendar(after, this.procCalendar)); this.calendars.splice(2, 1, DateTools.getCalendar(before, this.procCalendar)); } else if (this.calendarIndex == 1) { this.calendars.splice(0, 1, DateTools.getCalendar(before, this.procCalendar)); if(refresh) this.calendars.splice(1, 1, DateTools.getCalendar(date, this.procCalendar)); this.calendars.splice(2, 1, DateTools.getCalendar(after, this.procCalendar)); } else if (this.calendarIndex == 2) { this.calendars.splice(0, 1, DateTools.getCalendar(after, this.procCalendar)); this.calendars.splice(1, 1, DateTools.getCalendar(before, this.procCalendar)); if(refresh) this.calendars.splice(2, 1, DateTools.getCalendar(date, this.procCalendar)); } this.title = DateTools.format(this.date, 'yyyy年mm月'); }, //滑块切换 onSwiperChange(e) { this.calendarIndex = e.detail.current; let calendar = this.calendars[this.calendarIndex]; this.date = new Date(calendar[22].dateObj); //取中间一天,保证是当前的月份 this.refreshCalendars(); }, //选中日期 onSelectDate(date) { if (~this.type.indexOf('range') && this.checkeds.length == 2) this.checkeds = []; else if (!(~this.type.indexOf('range')) && this.checkeds.length) this.checkeds = []; this.checkeds.push(new Date(date.dateObj)); this.checkeds.sort((a, b) => a - b); //从小到大排序 this.calendars.forEach(calendar => { calendar.forEach(this.procCalendar); //重新处理 }); }, //时间选择取消 onCancelTime() { this.showTimePicker = false; this.type == 'time' && this.onCancel(); }, //时间选择确定 onConfirmTime() { if (this.timeType == 'begin') this.beginTime = this.timeValue; else this.endTime = this.timeValue; this.showTimePicker = false; this.type == 'time' && this.onConfirm(); }, //取消 onCancel() { this.$emit('cancel', false); }, //确定 onConfirm() { let result = { value: null, date: null }; //定义默认格式 let defaultFormat = { 'date': 'yyyy/mm/dd', 'time': 'hh:ii' + (this.showSeconds ? ':ss' : ''), 'datetime': '' }; defaultFormat['datetime'] = defaultFormat.date + ' ' + defaultFormat.time; console.log(defaultFormat) let fillTime = (date, timeArr) => { date.setHours(timeArr[0], timeArr[1]); if (this.showSeconds) date.setSeconds(timeArr[2]); }; if (this.type == 'time') { let date = new Date(); fillTime(date, this.beginTime); result.value = DateTools.format(date, this.format ? this.format : defaultFormat.time); result.date = date; console.log(result) } else { if (this.isMultiSelect) { let values = [], dates = []; if (this.checkeds.length < 2) return uni.showToast({ icon: 'none', title: '请选择两个日期' }); this.checkeds.forEach((date, index) => { let newDate = new Date(date); if (this.isContainTime) { let time = [this.beginTime, this.endTime]; fillTime(newDate, time[index]); } values.push(DateTools.format(newDate, this.format ? this.format : defaultFormat[this.isContainTime ? 'datetime' : 'date'])); dates.push(newDate); }); result.value = values; result.date = dates; } else { let newDate = new Date(this.checkeds[0]); if (this.isContainTime) { newDate.setHours(this.beginTime[0], this.beginTime[1]); if (this.showSeconds) newDate.setSeconds(this.beginTime[2]); } result.value = DateTools.format(newDate, this.format ? this.format : defaultFormat[this.isContainTime ? 'datetime' : 'date']); result.date = newDate; } } this.$emit('confirm', result); } }, computed: { BeginTitle() { let value = '未选择'; if (this.checkeds.length) value = DateTools.format(this.checkeds[0], 'yy/mm/dd'); return value; }, EndTitle() { let value = '未选择'; if (this.checkeds.length == 2) value = DateTools.format(this.checkeds[1], 'yy/mm/dd'); return value; }, PickerTimeTitle() { return DateTools.formatTimeArray(this.timeValue, this.showSeconds); }, BeginTimeTitle() { return this.BeginTitle != '未选择' ? DateTools.formatTimeArray(this.beginTime, this.showSeconds) : ''; }, EndTimeTitle() { return this.EndTitle != '未选择' ? DateTools.formatTimeArray(this.endTime, this.showSeconds) : ''; } }, watch: { show(newValue, oldValue) { newValue && this.setValue(this.value); this.isShow = newValue; }, value(newValue, oldValue) { setTimeout(()=>{ this.setValue(newValue); }, 0); } } } </script> <style lang="scss" scoped> $z-index: 100; $cell-spacing: 20upx; $calendar-size: 630upx; $calendar-item-size: 90upx; .picker { position: fixed; z-index: $z-index; background: rgba(0, 0, 0, .2); left: 0; top: 0; width: 100%; height: 100%; font-size: 28upx; &-btn { padding: $cell-spacing*0.5 $cell-spacing; border-radius: 12upx; color: #666; &-active { background: rgba(0, 0, 0, .1); } } &-display { color: #666; &-text { color: #000; margin: 0 $cell-spacing*0.5; } &-link { display: inline-block; &-active { background: rgba(0, 0, 0, .1); } } } &-time { width: $calendar-size - 80upx !important; left: ((750upx - $calendar-size) / 2 + 40upx) !important; } &-modal { background: #fff; position: absolute; top: 50%; left: (750upx - $calendar-size) / 2; width: $calendar-size; transform: translateY(-50%); box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.1); border-radius: 12upx; &-header { text-align: center; line-height: 80upx; font-size: 32upx; &-title { display: inline-block; width: 40%; } .picker-icon { display: inline-block; line-height: 50upx; width: 50upx; height: 50upx; border-radius: 50upx; text-align: center; margin: 10upx; background: #fff; font-size: 36upx; &-active { background: rgba(0, 0, 0, .1); } } } &-body { width: $calendar-size !important; height: $calendar-size !important; position: relative; } &-time { width: 100%; height: 180upx; text-align: center; line-height: 60upx; } &-footer { display: flex; justify-content: space-between; align-items: center; padding: $cell-spacing; &-info { flex-grow: 1; } &-btn { flex-shrink: 0; display: flex; } } } &-calendar { position: absolute; left: 0; top: 0; width: 100%; height: 100%; display: flex; align-items: center; flex-wrap: wrap; &-view { position: relative; width: $calendar-item-size; height: $calendar-item-size; text-align: center; &-bgbegin, &-bg, &-bgend, &-item, &-dot, &-tips { position: absolute; transition: .2s; } &-bgbegin, &-bg, &-bgend { opacity: .15; height: 80%; } &-bg { left: 0; top: 10%; width: 100%; } &-bgbegin { border-radius: $calendar-item-size 0 0 $calendar-item-size; top: 10%; left: 10%; width: 90%; } &-bgend { border-radius: 0 $calendar-item-size $calendar-item-size 0; top: 10%; left: 0%; width: 90%; } &-item { left: 5%; top: 5%; width: 90%; height: 90%; border-radius: $calendar-item-size; display: flex; align-items: center; justify-content: center; } &-dot { right: 10%; top: 10%; width: 12upx; height: 12upx; border-radius: 12upx; } &-tips { bottom: 100%; left: 50%; transform: translateX(-50%); background: #4E4B46; color: #fff; border-radius: 12upx; padding: 10upx 20upx; font-size: 24upx; width: max-content; margin-bottom: 5px; pointer-events: none; &:after { content: ""; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); width: 0; height: 0; border-style: solid; border-width: 5px 5px 0 5px; border-color: #4E4B46 transparent transparent transparent; } } } } } @font-face { font-family: "mxdatepickericon"; src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMYAAsAAAAACBgAAALMAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDIgqDRIJiATYCJAMUCwwABCAFhG0HSRvfBsg+QCa3noNAyAQ9w6GDvbwpNp2vloCyn8bD/x+y+/5qDhtj+T4eRVEcbsCoKMFASzCgLdDkmqYDwgxkWQ6YH5L/YnppOlLEjlnter43YRjU7M6vJ3iGADVAgJn5kqjv/wEii23T86UsAQT+04fV+o97VTMx4PPZt4DlorLXwIQiGMA5uhaVrBWqGHfQXcTEiE+PE+g2SUlxWlLVBHwUYFMgrgwSB3wstTKSGzqF1nOyiGeeOtNjV4An/vvxR58PSc3AzrMViyDvPo/7dVEUzn5GROfIWAcU4rLXfMFdhte56y4We9gGNEVIezkBOOaQXUrbTf/hJVkhGpDdCw7dSOEzByMEn3kIic98hMxnAfeFPKWCbjRcA148/HxhCEkaA94eGWFaGolsblpaWz8/Po2WVuNHh1fmBpZHIpqal9fOjizhTteY+RZ9rv02I/pq0W6QVH3pSncBz3m55r9ZIPycHfmenvxe4uyutIgfT5u4bgkDusl9gcF0rnfnz+b2NpSaQWBFeu8GIL1xQj5AH/6FAsEr/50F28e/gA9ny6KjLrxIp0TE+UucmQOl5AFNLXkzZufWamWHYEI39PEP2If97CMdm51N6DSmIekwAVmneXTBr0PVYx+aTgfQbU3p+R4jKHdRurBq0oEw6AKSfm+QDbpGF/w3VOP+oBnMHbqdx409FjP4RRHHkAj5IWgQiBUjHfMTuQ1Icpg5avI4sQVRu8EHdWptM1aKrIjuscfeL+kZwxBTYoElztOQ2UygjRIjEphaZsyWodHgvm9SC8QC/JygEA6DiCDeEMhAQFhhOpvxa/18A0TiYMahIy0L2hYIZWeYH9JR085Al4qts1re5St2/SR6DINBGEVYQCWOETHDMAHZ+pcZIQJGTV4RtMmg8UbhuWL1+VLLA2RFHYC71kiRo0SNpjwQh8pj2EFU3oTNmS1WqgIA') format('woff2'); } .picker-icon { font-family: "mxdatepickericon" !important; } .picker-icon-you:before { content: "\e63e"; } .picker-icon-zuo:before { content: "\e640"; } .picker-icon-zuozuo:before { content: "\e641"; } .picker-icon-youyou:before { content: "\e642"; } </style>