You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
4.2 KiB
169 lines
4.2 KiB
<script setup lang="ts">
|
|
import { ListItem } from "./data";
|
|
import { ref, PropType, nextTick } from "vue";
|
|
|
|
const props = defineProps({
|
|
noticeItem: {
|
|
type: Object as PropType<ListItem>,
|
|
default: () => {}
|
|
}
|
|
});
|
|
|
|
const titleRef = ref(null);
|
|
const titleTooltip = ref(false);
|
|
const descriptionRef = ref(null);
|
|
const descriptionTooltip = ref(false);
|
|
|
|
function hoverTitle() {
|
|
nextTick(() => {
|
|
titleRef.value?.scrollWidth > titleRef.value?.clientWidth
|
|
? (titleTooltip.value = true)
|
|
: (titleTooltip.value = false);
|
|
});
|
|
}
|
|
|
|
function hoverDescription(event, description) {
|
|
// currentWidth 为文本在页面中所占的宽度,创建标签,加入到页面,获取currentWidth ,最后在移除
|
|
let tempTag = document.createElement("span");
|
|
tempTag.innerText = description;
|
|
tempTag.className = "getDescriptionWidth";
|
|
document.querySelector("body").appendChild(tempTag);
|
|
let currentWidth = (
|
|
document.querySelector(".getDescriptionWidth") as HTMLSpanElement
|
|
).offsetWidth;
|
|
document.querySelector(".getDescriptionWidth").remove();
|
|
|
|
// cellWidth为容器的宽度
|
|
const cellWidth = event.target.offsetWidth;
|
|
|
|
// 当文本宽度大于容器宽度两倍时,代表文本显示超过两行
|
|
currentWidth > 2 * cellWidth
|
|
? (descriptionTooltip.value = true)
|
|
: (descriptionTooltip.value = false);
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div
|
|
class="notice-container border-b-[1px] border-solid border-[#f0f0f0] dark:border-[#303030]"
|
|
>
|
|
<el-avatar
|
|
v-if="props.noticeItem.avatar"
|
|
:size="30"
|
|
:src="props.noticeItem.avatar"
|
|
class="notice-container-avatar"
|
|
/>
|
|
<div class="notice-container-text">
|
|
<div class="notice-text-title text-[#000000d9] dark:text-white">
|
|
<el-tooltip
|
|
popper-class="notice-title-popper"
|
|
:disabled="!titleTooltip"
|
|
:content="props.noticeItem.title"
|
|
placement="top-start"
|
|
>
|
|
<div
|
|
ref="titleRef"
|
|
class="notice-title-content"
|
|
@mouseover="hoverTitle"
|
|
>
|
|
{{ props.noticeItem.title }}
|
|
</div>
|
|
</el-tooltip>
|
|
<el-tag
|
|
v-if="props.noticeItem?.extra"
|
|
:type="props.noticeItem?.status"
|
|
size="small"
|
|
class="notice-title-extra"
|
|
>
|
|
{{ props.noticeItem?.extra }}
|
|
</el-tag>
|
|
</div>
|
|
|
|
<el-tooltip
|
|
popper-class="notice-title-popper"
|
|
:disabled="!descriptionTooltip"
|
|
:content="props.noticeItem.description"
|
|
placement="top-start"
|
|
>
|
|
<div
|
|
ref="descriptionRef"
|
|
class="notice-text-description"
|
|
@mouseover="hoverDescription($event, props.noticeItem.description)"
|
|
>
|
|
{{ props.noticeItem.description }}
|
|
</div>
|
|
</el-tooltip>
|
|
<div class="notice-text-datetime text-[#00000073] dark:text-white">
|
|
{{ props.noticeItem.datetime }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<style>
|
|
.notice-title-popper {
|
|
max-width: 238px;
|
|
}
|
|
</style>
|
|
<style scoped lang="scss">
|
|
.notice-container {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
padding: 12px 0;
|
|
// border-bottom: 1px solid #f0f0f0;
|
|
|
|
.notice-container-avatar {
|
|
margin-right: 16px;
|
|
background: #fff;
|
|
}
|
|
|
|
.notice-container-text {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: space-between;
|
|
flex: 1;
|
|
|
|
.notice-text-title {
|
|
display: flex;
|
|
margin-bottom: 8px;
|
|
font-weight: 400;
|
|
font-size: 14px;
|
|
line-height: 1.5715;
|
|
cursor: pointer;
|
|
|
|
.notice-title-content {
|
|
flex: 1;
|
|
width: 200px;
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.notice-title-extra {
|
|
float: right;
|
|
margin-top: -1.5px;
|
|
font-weight: 400;
|
|
}
|
|
}
|
|
|
|
.notice-text-description,
|
|
.notice-text-datetime {
|
|
font-size: 12px;
|
|
line-height: 1.5715;
|
|
}
|
|
|
|
.notice-text-description {
|
|
display: -webkit-box;
|
|
text-overflow: ellipsis;
|
|
overflow: hidden;
|
|
-webkit-line-clamp: 2;
|
|
-webkit-box-orient: vertical;
|
|
}
|
|
|
|
.notice-text-datetime {
|
|
margin-top: 4px;
|
|
}
|
|
}
|
|
}
|
|
</style>
|