- <template>
- <uv-popup mode="bottom" ref="meaningPopup" round="32rpx" bg-color="#FFFFFF" :overlay="true" safeAreaInsetBottom>
- <view class="meaning-popup" v-if="currentWordMeaning">
- <view class="meaning-header">
- <view class="close-btn" @click="closeMeaningPopup">
- <text class="close-text">关闭</text>
- </view>
- <view class="meaning-title">释义</view>
- <view style="width: 80rpx;"></view>
- </view>
-
- <scroll-view class="meaning-scroll-container" scroll-y="true" :show-scrollbar="false" :enhanced="true">
- <view class="meaning-content">
- <image v-if="currentWordMeaning.image" class="meaning-image" :src="currentWordMeaning.image"
- mode="widthFix" />
-
- <view class="word-info">
- <view class="word-main">
- <text class="word-text">{{ currentWordMeaning.word }}</text>
- </view>
- <view class="phonetic-container">
- <uv-icon name="volume-fill" size="16" color="#007AFF" class="speaker-icon"
- @click="repeatWordAudio" v-if="currentWordMeaning.phonetic" />
- <text class="phonetic-text" v-if="currentWordMeaning.phonetic">{{ currentWordMeaning.phonetic }}</text>
- </view>
- <view class="word-meaning">
- <text class="part-of-speech" v-if="currentWordMeaning.partOfSpeech">{{ currentWordMeaning.partOfSpeech }}</text>
- <text class="meaning-text" v-if="currentWordMeaning.meaning">{{ currentWordMeaning.meaning }}</text>
- </view>
- </view>
-
- <view class="knowledge-gain" v-if="currentWordMeaning.knowledgeGain">
- <view class="knowledge-header">
- <image src="/static/knowledge-icon.png" class="knowledge-icon" mode="aspectFill" />
- <text class="knowledge-title">知识收获</text>
- </view>
- <text class="knowledge-content">{{ currentWordMeaning.knowledgeGain }}</text>
- </view>
- </view>
- </scroll-view>
- </view>
- </uv-popup>
- </template>
-
- <script>
- export default {
- name: 'MeaningPopup',
- props: {
- currentWordMeaning: {
- type: Object,
- default: null
- }
- },
- methods: {
- open() {
- if (this.$refs.meaningPopup) {
- this.$refs.meaningPopup.open()
- }
- },
- close() {
- if (this.$refs.meaningPopup) {
- this.$refs.meaningPopup.close()
- }
- },
- closeMeaningPopup() {
- this.$emit('close-meaning-popup')
- this.close()
- },
- repeatWordAudio() {
- this.$emit('repeat-word-audio')
- }
- }
- }
- </script>
-
- <style lang="scss" scoped>
- /* 释义弹窗样式 */
- .meaning-popup {
- background-color: #FFFFFF;
- overflow: hidden;
- display: flex;
- flex-direction: column;
- max-height: 80vh;
- }
-
- .meaning-scroll-container {
- flex: 1;
- height: 60vh;
- }
-
- .meaning-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 32rpx;
- border-bottom: 2rpx solid #EEEEEE;
- flex-shrink: 0;
- }
-
- .close-btn {
- width: 80rpx;
- }
-
- .close-text {
- font-family: PingFang SC;
- font-size: 32rpx;
- color: #8b8b8b;
- }
-
- .meaning-title {
- font-family: PingFang SC;
- font-weight: 500;
- font-size: 34rpx;
- color: #181818;
- }
-
- .meaning-content {
- padding: 32rpx;
- }
-
- .meaning-image {
- width: 670rpx;
- height: 268rpx;
- border-radius: 24rpx;
- margin-bottom: 32rpx;
- }
-
- .word-info {
- margin-bottom: 32rpx;
- }
-
- .word-main {
- display: flex;
- align-items: center;
- gap: 16rpx;
- margin-bottom: 8rpx;
- }
-
- .word-text {
- font-family: PingFang SC;
- font-weight: 500;
- font-size: 40rpx;
- color: #181818;
- }
-
- .phonetic-container {
- display: flex;
- gap: 24rpx;
- align-items: center;
-
- .speaker-icon {
- cursor: pointer;
- transition: opacity 0.2s ease;
- padding: 8rpx;
- border-radius: 8rpx;
-
- &:hover {
- opacity: 0.7;
- background-color: rgba(0, 122, 255, 0.1);
- }
- }
-
- .phonetic-text {
- font-family: PingFang SC;
- font-size: 28rpx;
- color: #262626;
- margin-bottom: 16rpx;
- }
- }
-
- .word-meaning {
- display: flex;
- gap: 16rpx;
- }
-
- .part-of-speech {
- font-family: PingFang SC;
- font-size: 28rpx;
- color: #262626;
- }
-
- .meaning-text {
- font-family: PingFang SC;
- font-size: 28rpx;
- color: #181818;
- flex: 1;
- }
-
- .knowledge-gain {
- background: linear-gradient(180deg, #DEFFFF 0%, #FBFEFF 22.65%, #F0FBFF 100%);
- border-radius: 24rpx;
- padding: 32rpx 40rpx;
- }
-
- .knowledge-header {
- display: flex;
- align-items: center;
- gap: 16rpx;
- margin-bottom: 20rpx;
- }
-
- .knowledge-icon {
- width: 48rpx;
- height: 48rpx;
- }
-
- .knowledge-title {
- font-family: PingFang SC;
- font-weight: 600;
- font-size: 30rpx;
- color: #3B3D3D;
- }
-
- .knowledge-content {
- font-family: PingFang SC;
- font-size: 28rpx;
- color: #4f4f4f;
- line-height: 48rpx;
- }
- </style>
|