|
@@ -1,9 +1,9 @@
|
|
|
<template>
|
|
<template>
|
|
|
<!-- 下锥形镂空罐 -->
|
|
<!-- 下锥形镂空罐 -->
|
|
|
- <div class="tank_body" :style="getTankBodyStyle">
|
|
|
|
|
|
|
+ <div class="tank_body">
|
|
|
<i class="icon iconfont-colour icon-tank1 tank_icon" :style="getTankStyle">
|
|
<i class="icon iconfont-colour icon-tank1 tank_icon" :style="getTankStyle">
|
|
|
<!-- 标题 -->
|
|
<!-- 标题 -->
|
|
|
- <div class="tank_title" v-if="title" :style="{ fontSize: titleFontSize }">
|
|
|
|
|
|
|
+ <div class="tank_title" v-if="title" :style="titleStyle">
|
|
|
{{ title }}
|
|
{{ title }}
|
|
|
</div>
|
|
</div>
|
|
|
</i>
|
|
</i>
|
|
@@ -29,40 +29,61 @@ const props = defineProps({
|
|
|
},
|
|
},
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-const iconSize = computed(() => props.iconSize ?? props.iconWidth)
|
|
|
|
|
-
|
|
|
|
|
-//罐体样式
|
|
|
|
|
-const getTankBodyStyle = computed(() => ({
|
|
|
|
|
- width: `${props.iconWidth ?? props.iconSize}px`,
|
|
|
|
|
- height: `${props.iconHeight ?? props.iconSize}px`,
|
|
|
|
|
- fontSize: `${props.iconSize ?? 200}px`,
|
|
|
|
|
-}))
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-// 罐子样式
|
|
|
|
|
-const getTankStyle = computed(() => {
|
|
|
|
|
- const style = {
|
|
|
|
|
- fontSize: iconSize.value + 'px',
|
|
|
|
|
- display: 'inline-block'
|
|
|
|
|
|
|
+const iconSize = computed(() => {
|
|
|
|
|
+ // 判断是否同时传入了width和height
|
|
|
|
|
+ if (props.iconWidth !== null && props.iconHeight !== null) {
|
|
|
|
|
+ return Math.min(props.iconWidth, props.iconHeight);
|
|
|
}
|
|
}
|
|
|
- //根据传进来的iconWidth和iconHeight来控制图标的大小
|
|
|
|
|
|
|
+ // 没传入,使用默认的iconSize
|
|
|
|
|
+ return props.iconSize;
|
|
|
|
|
+});
|
|
|
|
|
+// 计算图标缩放比例
|
|
|
|
|
+const scaleInfo = computed(() => {
|
|
|
const scaleX = props.iconWidth ? props.iconWidth / iconSize.value : 1
|
|
const scaleX = props.iconWidth ? props.iconWidth / iconSize.value : 1
|
|
|
const scaleY = props.iconHeight ? props.iconHeight / iconSize.value : 1
|
|
const scaleY = props.iconHeight ? props.iconHeight / iconSize.value : 1
|
|
|
-
|
|
|
|
|
- if (scaleX !== 1 || scaleY !== 1) {
|
|
|
|
|
- style.transform = `scale(${scaleX}, ${scaleY})`
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return style
|
|
|
|
|
|
|
+ return { scaleX, scaleY }
|
|
|
})
|
|
})
|
|
|
|
|
+// 罐子样式
|
|
|
|
|
+const getTankStyle = computed(() => ({
|
|
|
|
|
+ fontSize: `${iconSize.value}px`,
|
|
|
|
|
+ display: 'inline-block',
|
|
|
|
|
+ transform: `scale(${scaleInfo.value.scaleX}, ${scaleInfo.value.scaleY})`
|
|
|
|
|
+}))
|
|
|
|
|
+
|
|
|
// 根据标题长度动态设置字体大小
|
|
// 根据标题长度动态设置字体大小
|
|
|
-const titleFontSize = computed(() => {
|
|
|
|
|
|
|
+const titleStyle = computed(() => {
|
|
|
|
|
+ const { scaleX, scaleY } = scaleInfo.value
|
|
|
const len = props.title.length
|
|
const len = props.title.length
|
|
|
- if (len <= 4) return iconSize.value *0.15 + 'px'
|
|
|
|
|
- if (len <= 8) return iconSize.value *0.1 + 'px'
|
|
|
|
|
- if (len <= 12) return iconSize.value *0.08 + 'px'
|
|
|
|
|
- return iconSize.value *0.06 + 'px'
|
|
|
|
|
-})
|
|
|
|
|
|
|
+ // 先根据长度计算基础字体大小
|
|
|
|
|
+ let baseSize;
|
|
|
|
|
+ if (len <= 4) {
|
|
|
|
|
+ baseSize = iconSize.value * 0.1;
|
|
|
|
|
+ } else if (len <= 8) {
|
|
|
|
|
+ baseSize = iconSize.value * 0.09;
|
|
|
|
|
+ } else if (len <= 12) {
|
|
|
|
|
+ baseSize = iconSize.value * 0.08;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ baseSize = iconSize.value * 0.06;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 限制最大为30px,取计算值和30px中的较小值
|
|
|
|
|
+ const maxSize = 30;
|
|
|
|
|
+ const finalSize = Math.min(baseSize, maxSize);
|
|
|
|
|
+ return {
|
|
|
|
|
+ fontSize: `${finalSize}px`,
|
|
|
|
|
+ position: 'absolute',
|
|
|
|
|
+ top: '7%',
|
|
|
|
|
+ left: '50%',
|
|
|
|
|
+ // 核心:通过反向缩放抵消图标的缩放(1/scaleX 抵消 scaleX)
|
|
|
|
|
+ transform: `translate(-50%, -50%) scale(${1 / scaleX}, ${1 / scaleY})`,
|
|
|
|
|
+ color: '#e65100',
|
|
|
|
|
+ fontWeight: 'bold',
|
|
|
|
|
+ zIndex: 20,
|
|
|
|
|
+ pointerEvents: 'none',
|
|
|
|
|
+ textAlign: 'center',
|
|
|
|
|
+ //不换行
|
|
|
|
|
+ whiteSpace: 'nowrap'
|
|
|
|
|
+ }
|
|
|
|
|
+});
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|