Files
legado/modules/web/src/components/PopCatalog.vue

137 lines
3.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div
:class="{ 'cata-wrapper': true, visible: popCataVisible }"
:style="popupTheme"
>
<div class="title">目录</div>
<virtual-list
style="height: 300px; overflow: auto"
:class="{ night: isNight, day: !isNight }"
ref="virtualListRef"
data-key="index"
wrap-class="data-wrapper"
item-class="cata"
:data-sources="virtualListdata"
:data-component="CatalogItem"
:estimate-size="40"
:extra-props="{ gotoChapter, currentChapterIndex }"
/>
</div>
</template>
<script setup>
import VirtualList from "vue3-virtual-scroll-list";
import settings from "../config/themeConfig";
import "../assets/fonts/popfont.css";
import CatalogItem from "./CatalogItem.vue";
const store = useBookStore();
const {
catalog,
popCataVisible, miniInterface
} = storeToRefs(store);
//主题
const isNight = computed(() => store.theme);
const theme = computed(() => store.theme);
const popupTheme = computed(() => {
return {
background: settings.themes[theme.value].popup,
};
});
//虚拟列表 数据源
const virtualListdata = computed(() => {
let catalogValue = catalog.value;
if (miniInterface.value) return catalogValue;
// pc端 virtualListIitem有2个章节
let length = Math.ceil(catalogValue.length / 2);
let virtualListDataSource = new Array(length);
let i = 0;
while (i < length) {
virtualListDataSource[i] = {
index: i,
catas: catalogValue.slice(2 * i, 2 * i + 2),
};
i++;
}
return virtualListDataSource;
});
//打开目录 计算当前章节对应的虚拟列表位置
const virtualListRef = ref();
const currentChapterIndex = computed({
get: () => store.readingBook.index,
set: (value) => (store.readingBook.index = value),
});
const virtualListIndex = computed(() => {
let index = currentChapterIndex.value;
if (miniInterface.value) return index;
// pc端 virtualListIitem有2个章节
return Math.floor(index / 2);
});
onUpdated(() => {
// dom更新触发ResizeObserver更新虚拟列表内部的sizes Map
if (!popCataVisible.value) return;
virtualListRef.value.scrollToIndex(virtualListIndex.value);
});
// 点击加载对应章节内容
const emit = defineEmits(["getContent"]);
const gotoChapter = (note) => {
const chapterIndex = catalog.value.indexOf(note);
currentChapterIndex.value = chapterIndex;
store.setPopCataVisible(false);
store.setContentLoading(true);
store.saveBookProgress();
emit("getContent", chapterIndex);
};
</script>
<style lang="scss" scoped>
.cata-wrapper {
margin: -16px;
padding: 18px 0 24px 25px;
// background: #ede7da url('../assets/imgs/themes/popup_1.png') repeat;
.title {
font-size: 18px;
font-weight: 400;
font-family: FZZCYSK;
margin: 0 0 20px 0;
color: #ed4259;
width: fit-content;
border-bottom: 1px solid #ed4259;
}
:deep(.data-wrapper) {
.cata {
//width: 50%;
height: 40px;
cursor: pointer;
font:
16px / 40px PingFangSC-Regular,
HelveticaNeue-Light,
"Helvetica Neue Light",
"Microsoft YaHei",
sans-serif;
}
}
.night {
:deep(.cata) {
border-bottom: 1px solid #666;
}
}
.day {
:deep(.cata) {
border-bottom: 1px solid #f2f2f2;
}
}
}
</style>