| @ -0,0 +1,404 @@ | |||
| <template> | |||
| <view class="book-container"> | |||
| <!-- 自定义顶部导航栏 --> | |||
| <uv-status-bar></uv-status-bar> | |||
| <view class="custom-navbar" :class="{ 'navbar-hidden': !showNavbar }"> | |||
| <uv-status-bar></uv-status-bar> | |||
| <view class="navbar-content"> | |||
| <view class="navbar-left" @click="goBack"> | |||
| <uv-icon name="arrow-left" size="20" color="#262626"></uv-icon> | |||
| </view> | |||
| <view class="navbar-title">{{ bookTitle }}</view> | |||
| <view class="navbar-right" @click="showMenu"> | |||
| <uv-icon name="more-dot-fill" size="20" color="#262626"></uv-icon> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <!-- Swiper内容区域 --> | |||
| <swiper | |||
| class="content-swiper" | |||
| :current="currentPage - 1" | |||
| @change="onSwiperChange" | |||
| > | |||
| <swiper-item | |||
| v-for="(page, index) in bookPages" | |||
| :key="index" | |||
| class="swiper-item" | |||
| > | |||
| <view class="content-area" @click="toggleNavbar"> | |||
| <!-- 图片卡片页面 --> | |||
| <view v-if="page.type === 'card'" class="card-content"> | |||
| <view class="card-line"> | |||
| <image src="/static/划重点图标.png" class="card-line-image" mode="aspectFill" /> | |||
| <text class="card-line-text">划线重点</text> | |||
| </view> | |||
| <image class="card-image" :src="page.image" mode="aspectFill"></image> | |||
| <text class="english-text">{{ page.englishText }}</text> | |||
| <text class="chinese-text">{{ page.chineseText }}</text> | |||
| </view> | |||
| <!-- 文本页面 --> | |||
| <view v-else-if="page.type === 'text'" class="text-content"> | |||
| <text class="content-text">{{ page.content }}</text> | |||
| </view> | |||
| <!-- 视频页面 --> | |||
| <view v-else-if="page.type === 'video'" class="video-content"> | |||
| <video :src="page.video" class="video-player" controls></video> | |||
| </view> | |||
| </view> | |||
| </swiper-item> | |||
| </swiper> | |||
| <!-- 自定义底部控制栏 --> | |||
| <view class="custom-tabbar" :class="{ 'tabbar-hidden': !showNavbar }"> | |||
| <view class="tabbar-content"> | |||
| <view class="tabbar-left"> | |||
| <view class="tab-button" @click="toggleSound"> | |||
| <image src="/static/课程图标.png" class="tab-icon" /> | |||
| <text class="tab-text">课程</text> | |||
| </view> | |||
| <view class="tab-button" @click="toggleSound"> | |||
| <image src="/static/音色切换图标.png" class="tab-icon" /> | |||
| <text class="tab-text">音色切换</text> | |||
| </view> | |||
| </view> | |||
| <view class="tabbar-right"> | |||
| <view class="page-controls"> | |||
| <view class="page-numbers"> | |||
| <view | |||
| v-for="(page, index) in bookPages" | |||
| :key="index" | |||
| class="page-number" | |||
| :class="{ 'active': (index + 1) === currentPage }" | |||
| @click="goToPage(index + 1)" | |||
| > | |||
| {{ index + 1 }} | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| </view> | |||
| <uv-safe-bottom></uv-safe-bottom> | |||
| </view> | |||
| </view> | |||
| </template> | |||
| <script> | |||
| export default { | |||
| data() { | |||
| return { | |||
| showNavbar: true, | |||
| currentPage: 1, | |||
| bookTitle: '看,乔治!', | |||
| bookPages: [ | |||
| { | |||
| type: 'card', | |||
| englishText: 'I ought to have judged by deeds and not by words.', | |||
| chineseText: '要对一个人下定论,不应听其言,而应观其行。', | |||
| image: '/static/画重点图片.png' | |||
| }, | |||
| { | |||
| type: 'video', | |||
| video: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4' | |||
| }, | |||
| { | |||
| type: 'text', | |||
| content: '索菲达以南几英里处,萨利和斯坦对着近旁河岸的斜坡流淌,水深且绿意盎然。水也很温暖,因为它在阳光下闪烁着,清澈黄色的沙子,才到达深深的池塘。河的一侧,金色的山丘斜坡向上蜿蜒,通往坚固多岩石的加比亚山脉,但在山谷一侧,水边排列着树木——柳树在春天新鲜而翠绿,它们的低垂接触处充满着各天的冰水残留物;还有枫树,它们现实的,白色的横枝条和树枝;吉他也是绿色的地塘,在河下游的河岸上,叶子能发出很大的啪啪声。傍晚时分,兔子们从灌木中出现,坐在沙子上,湖泊的平地上覆盖着沉重的夜晚迹,还有来自农场的狗的散布的垫子,以及前来暗黑中饮水的鹿的分裂形足迹。' | |||
| }, | |||
| { | |||
| type: 'text', | |||
| content: '有一条穿过柳树和榆树之间的路,这条路从农场下来的男孩们踏得又硬又深;他们来深池游泳,也被那些上游运送货物公路上下来的流浪汉使得又硬又深。他们在水边停歇,在一棵巨大的榆树低垂的水平树枝前,有一个由许多火堆形成的灰烬堆,核桃被坐在上面的人留下光滑。' | |||
| } | |||
| ] | |||
| } | |||
| }, | |||
| methods: { | |||
| toggleNavbar() { | |||
| this.showNavbar = !this.showNavbar | |||
| }, | |||
| goBack() { | |||
| uni.navigateBack() | |||
| }, | |||
| showMenu() { | |||
| console.log('显示菜单') | |||
| }, | |||
| toggleSound() { | |||
| console.log('音色切换') | |||
| }, | |||
| goToPage(page) { | |||
| this.currentPage = page | |||
| console.log('跳转到页面:', page) | |||
| }, | |||
| onSwiperChange(e) { | |||
| this.currentPage = e.detail.current + 1 | |||
| } | |||
| } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
| .book-container { | |||
| width: 100%; | |||
| height: 100vh; | |||
| background-color: #F8F8F8; | |||
| position: relative; | |||
| overflow: hidden; | |||
| } | |||
| .custom-navbar { | |||
| position: fixed; | |||
| top: 0; | |||
| left: 0; | |||
| right: 0; | |||
| background-color: #F8F8F8; | |||
| z-index: 1000; | |||
| transition: transform 0.3s ease; | |||
| &.navbar-hidden { | |||
| transform: translateY(-100%); | |||
| } | |||
| } | |||
| .navbar-content { | |||
| display: flex; | |||
| align-items: center; | |||
| justify-content: space-between; | |||
| padding: 20rpx 32rpx; | |||
| // padding-top: calc(20rpx + var(--status-bar-height, 0)); | |||
| height: 60rpx; | |||
| } | |||
| .navbar-left, | |||
| .navbar-right { | |||
| width: 80rpx; | |||
| display: flex; | |||
| align-items: center; | |||
| } | |||
| .navbar-right { | |||
| justify-content: flex-end; | |||
| } | |||
| .navbar-title { | |||
| flex: 1; | |||
| text-align: center; | |||
| font-family: PingFang SC; | |||
| font-weight: 500; | |||
| font-size: 32rpx; | |||
| color: #262626; | |||
| line-height: 48rpx; | |||
| } | |||
| .content-swiper { | |||
| flex: 1; | |||
| height: calc(100vh - 200rpx); | |||
| margin-top: 100rpx; | |||
| margin-bottom: 100rpx; | |||
| } | |||
| .swiper-item { | |||
| height: 100%; | |||
| } | |||
| .content-area { | |||
| flex: 1; | |||
| padding: 0 40rpx; | |||
| // background: linear-gradient(180deg, #DEFFFF 0%, #FBFEFF 22.65%, #F0FBFF 100%); | |||
| height: 100%; | |||
| box-sizing: border-box; | |||
| overflow-y: auto; | |||
| } | |||
| .card-content { | |||
| background: linear-gradient(180deg, #DEFFFF 0%, #FBFEFF 22.65%, #F0FBFF 100%); | |||
| display: flex; | |||
| flex-direction: column; | |||
| gap: 32rpx; | |||
| height: 1172rpx; | |||
| margin-top: 20rpx; | |||
| border-radius: 32rpx; | |||
| // height: 100%; | |||
| padding: 40rpx; | |||
| // margin: 0 | |||
| border: 1px solid #FFFFFF; | |||
| box-sizing: border-box; | |||
| .card-line { | |||
| display: flex; | |||
| align-items: center; | |||
| // margin-bottom: 20rpx; | |||
| } | |||
| .card-line-image { | |||
| width: 48rpx; | |||
| height: 48rpx; | |||
| margin-right: 16rpx; | |||
| } | |||
| .card-line-text { | |||
| font-family: PingFang SC; | |||
| font-weight: 600; | |||
| font-size: 30rpx; | |||
| line-height: 48rpx; | |||
| color: #3B3D3D; | |||
| } | |||
| .card-image { | |||
| width: 590rpx; | |||
| height: 268rpx; | |||
| border-radius: 24rpx; | |||
| // margin-bottom: 20rpx; | |||
| } | |||
| .english-text { | |||
| display: block; | |||
| font-family: PingFang SC; | |||
| font-weight: 600; | |||
| font-size: 32rpx; | |||
| line-height: 48rpx; | |||
| color: #3B3D3D; | |||
| // margin-bottom: 16rpx; | |||
| } | |||
| .chinese-text { | |||
| display: block; | |||
| font-family: PingFang SC; | |||
| // font-weight: 400; | |||
| font-size: 28rpx; | |||
| line-height: 48rpx; | |||
| color: #4F4F4F; | |||
| } | |||
| } | |||
| .video-content { | |||
| width: 100vw; | |||
| margin: 200rpx -40rpx 0; | |||
| height: 500rpx; | |||
| background-color: #FFFFFF; | |||
| padding: 40rpx; | |||
| border-radius: 24rpx; | |||
| display: flex; | |||
| align-items: center; | |||
| justify-content: center; | |||
| } | |||
| .text-content { | |||
| width: 100vw; | |||
| background-color: #F6F6F6; | |||
| height: 100%; | |||
| padding: 40rpx; | |||
| margin: -40rpx; | |||
| box-sizing: border-box; | |||
| } | |||
| .content-text { | |||
| font-family: PingFang SC; | |||
| // font-weight: 400; | |||
| font-size: 28rpx; | |||
| color: #3B3D3D; | |||
| line-height: 48rpx; | |||
| letter-spacing: 0; | |||
| text-align: justify; | |||
| word-break: break-all; | |||
| } | |||
| .custom-tabbar { | |||
| position: fixed; | |||
| bottom: 0; | |||
| left: 0; | |||
| right: 0; | |||
| background-color: #fff; | |||
| border-top: 1rpx solid #EEEEEE; | |||
| z-index: 1000; | |||
| transition: transform 0.3s ease; | |||
| &.tabbar-hidden { | |||
| transform: translateY(100%); | |||
| } | |||
| } | |||
| .tabbar-content { | |||
| display: flex; | |||
| align-items: center; | |||
| justify-content: space-between; | |||
| padding: 24rpx 62rpx; | |||
| // padding-bottom: calc(24rpx + env(safe-area-inset-bottom)); | |||
| height: 88rpx; | |||
| } | |||
| .tabbar-left { | |||
| display: flex; | |||
| align-items: center; | |||
| gap: 35rpx; | |||
| } | |||
| .tab-button { | |||
| display: flex; | |||
| align-items: center; | |||
| flex-direction: column; | |||
| gap: 8rpx; | |||
| } | |||
| .tab-icon { | |||
| width: 52rpx; | |||
| height: 52rpx; | |||
| } | |||
| .tab-text { | |||
| font-family: PingFang SC; | |||
| // font-weight: 400; | |||
| font-size: 22rpx; | |||
| color: #999; | |||
| line-height: 24rpx; | |||
| } | |||
| .tabbar-right { | |||
| flex: 1; | |||
| display: flex; | |||
| justify-content: flex-end; | |||
| } | |||
| .page-controls { | |||
| display: flex; | |||
| align-items: center; | |||
| } | |||
| .page-numbers { | |||
| display: flex; | |||
| align-items: center; | |||
| gap: 8rpx; | |||
| overflow-x: auto; | |||
| max-width: 400rpx; | |||
| &::-webkit-scrollbar { | |||
| display: none; | |||
| } | |||
| } | |||
| .page-number { | |||
| min-width: 84rpx; | |||
| height: 58rpx; | |||
| display: flex; | |||
| align-items: center; | |||
| justify-content: center; | |||
| border-radius: 100rpx; | |||
| font-family: PingFang SC; | |||
| // font-weight: 400; | |||
| font-size: 30rpx; | |||
| color: #3B3D3D; | |||
| background-color: transparent; | |||
| border: 1px solid #3B3D3D; | |||
| transition: all 0.3s ease; | |||
| &.active { | |||
| border: 1px solid $primary-color; | |||
| color: $primary-color; | |||
| } | |||
| } | |||
| </style> | |||