|
@@ -0,0 +1,144 @@
|
|
|
|
+<template>
|
|
|
|
+ <div :data-tag-id="props.tag.sid" class="tag-item">
|
|
|
|
+ <div class="tag-icon">
|
|
|
|
+ <span>{{ props.index }}</span>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+<script setup>
|
|
|
|
+const props = defineProps({
|
|
|
|
+ tag: {
|
|
|
|
+ type: Object,
|
|
|
|
+ required: true,
|
|
|
|
+ },
|
|
|
|
+ index: {
|
|
|
|
+ type: Number,
|
|
|
|
+ required: true,
|
|
|
|
+ },
|
|
|
|
+})
|
|
|
|
+console.log(props)
|
|
|
|
+const emits = defineEmits(['action'])
|
|
|
|
+
|
|
|
|
+const onClick = () => {
|
|
|
|
+ emits('action', { event: 'focus', sid: props.tag.sid, tag: props.tag })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+</script>
|
|
|
|
+<style lang="scss" scoped>
|
|
|
|
+.tag-item {
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ pointer-events: all;
|
|
|
|
+ display: none;
|
|
|
|
+ position: absolute;
|
|
|
|
+ width: 26px;
|
|
|
|
+ height: 26px;
|
|
|
|
+ margin-left: -13px;
|
|
|
|
+ margin-top: -13px;
|
|
|
|
+ z-index: 1;
|
|
|
|
+ &.active {
|
|
|
|
+ .tag-icon {
|
|
|
|
+ background-color: green;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.tag-item.focus {
|
|
|
|
+ z-index: 2;
|
|
|
|
+}
|
|
|
|
+.tag-item.focus .tag-body {
|
|
|
|
+ transform: translateY(-50%) scale(1);
|
|
|
|
+}
|
|
|
|
+.tag-item.fixed {
|
|
|
|
+ z-index: 3;
|
|
|
|
+}
|
|
|
|
+.tag-item.active {
|
|
|
|
+ z-index: 4;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.tag-item .tag-icon {
|
|
|
|
+ position: relative;
|
|
|
|
+ display: block;
|
|
|
|
+ width: 26px;
|
|
|
|
+ height: 26px;
|
|
|
|
+ border-radius: 0 50% 50% 50%;
|
|
|
|
+ border: 1px solid #fff;
|
|
|
|
+ transform: rotate(-135deg);
|
|
|
|
+ background-color: #0076f6;
|
|
|
|
+ span {
|
|
|
|
+ display: block;
|
|
|
|
+ transform: rotate(135deg);
|
|
|
|
+ margin-top: 3px;
|
|
|
|
+ margin-left: -1px;
|
|
|
|
+ text-align: center;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.tag-item .tag-icon.animate {
|
|
|
|
+ animation: tag-animate-zoom 3s -1s linear infinite;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.tag-item .tag-body {
|
|
|
|
+ position: fixed;
|
|
|
|
+ right: 0;
|
|
|
|
+ top: 50%;
|
|
|
|
+ margin-right: 70px;
|
|
|
|
+ width: 200px;
|
|
|
|
+ height: 200px;
|
|
|
|
+ transform: translateY(-50%) scale(1);
|
|
|
|
+ transform-origin: calc(100% + 40px) -50%;
|
|
|
|
+ background: rgba(27, 27, 28, 0.8);
|
|
|
|
+ border-radius: 4px;
|
|
|
|
+ min-width: 400px;
|
|
|
|
+ padding: 30px 20px;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.tag-item .tag-body::before {
|
|
|
|
+ content: '';
|
|
|
|
+ position: absolute;
|
|
|
|
+ width: 40px;
|
|
|
|
+ height: 100%;
|
|
|
|
+ top: 0;
|
|
|
|
+ right: -40px;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.tag-item .tag-body::after {
|
|
|
|
+ content: '';
|
|
|
|
+ position: absolute;
|
|
|
|
+ top: 50%;
|
|
|
|
+ right: -39px;
|
|
|
|
+ width: 0;
|
|
|
|
+ height: 0;
|
|
|
|
+ border-top: 15px solid transparent;
|
|
|
|
+ border-bottom: 15px solid transparent;
|
|
|
|
+ border-left: 40px solid rgba(27, 27, 28, 0.8);
|
|
|
|
+ transform: translateY(-50%);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@keyframes tag-animate-zoom {
|
|
|
|
+ 0% {
|
|
|
|
+ transform: scale(1);
|
|
|
|
+ }
|
|
|
|
+ 50% {
|
|
|
|
+ transform: scale(0.7);
|
|
|
|
+ }
|
|
|
|
+ 100% {
|
|
|
|
+ transform: scale(1);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.tag-item .v-enter-from,
|
|
|
|
+.tag-item .v-leave-to {
|
|
|
|
+ opacity: 0;
|
|
|
|
+ transform: translateY(50%) scale(0);
|
|
|
|
+}
|
|
|
|
+.tag-item .v-enter-active,
|
|
|
|
+.tag-item .v-leave-active {
|
|
|
|
+ will-change: transform;
|
|
|
|
+ transition: all 0.25s cubic-bezier(0.35, 0.32, 0.65, 0.63);
|
|
|
|
+}
|
|
|
|
+.tag-item .v-enter-to,
|
|
|
|
+.tag-item .v-leave-from {
|
|
|
|
+ opacity: 1;
|
|
|
|
+ transform: translateY(-50%) scale(1);
|
|
|
|
+}
|
|
|
|
+</style>
|