|
|
- <template>
- <view class="content">
- <!-- 小程序环境使用web-view加载StPageFlip -->
- <web-view
- :src="webviewUrl"
- @message="handleMessage"
- class="webview-container"
- ></web-view>
-
- <!-- 控制按钮
- <view class="controls">
- <button @click="prevPage" :disabled="currentPage <= 0" class="control-btn">上一页</button>
- <text class="page-info">{{ currentPage + 1 }} / {{ totalPages }}</text>
- <button @click="nextPage" :disabled="currentPage >= totalPages - 1" class="control-btn">下一页</button>
- </view> -->
- </view>
- </template>
-
- <script>
- export default {
- data() {
- return {
- // 当前页码
- currentPage: 0,
- // 总页数
- totalPages: 6,
- // webview URL - 需要部署到服务器或使用本地路径
- webviewUrl: 'https://hfllll.github.io/My/', // 请替换为实际的服务器地址
- // 本地测试可以使用: '/static/stpageflip.html'
- };
- },
- methods: {
- // 处理来自webview的消息
- handleMessage(e) {
- console.log('收到webview消息:', e.detail.data);
- const data = e.detail.data[0]; // 小程序webview消息格式
-
- if (data.type === 'pageFlip') {
- this.currentPage = data.currentPage;
- this.totalPages = data.totalPages;
- } else if (data.type === 'stateChange') {
- console.log('翻页状态变化:', data.state);
- if (data.state === 'flipping') {
- uni.showToast({
- title: '翻页中',
- duration: 500,
- icon: 'none'
- });
- }
- }
- },
-
- // 上一页
- prevPage() {
- this.sendMessageToWebview({
- type: 'prevPage'
- });
- },
-
- // 下一页
- nextPage() {
- this.sendMessageToWebview({
- type: 'nextPage'
- });
- },
-
- // 跳转到指定页面
- turnToPage(pageNumber) {
- this.sendMessageToWebview({
- type: 'turnToPage',
- pageNumber: pageNumber
- });
- },
-
- // 向webview发送消息
- sendMessageToWebview(data) {
- // 注意:小程序向webview发送消息需要特殊处理
- // 这里只是示例,实际可能需要其他方式
- console.log('向webview发送消息:', data);
- }
- },
-
- onLoad() {
- console.log('StPageFlip翻页组件加载完成');
- }
- }
- </script>
-
- <style lang="scss" scoped>
- page {
- width: 100%;
- height: 100%;
- }
-
- .content {
- width: 100%;
- height: 100vh;
- position: relative;
- background: #f5f5f5;
- }
-
- .webview-container {
- width: 100%;
- height: calc(100vh - 80px);
- }
-
- .controls {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- height: 80px;
- background: rgba(255, 255, 255, 0.95);
- backdrop-filter: blur(10px);
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0 30px;
- box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
- z-index: 1000;
- }
-
- .control-btn {
- padding: 12px 24px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
- border: none;
- border-radius: 25px;
- font-size: 16px;
- font-weight: 500;
- box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
- transition: all 0.3s ease;
- }
-
- .control-btn:active {
- transform: translateY(2px);
- box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
- }
-
- .control-btn:disabled {
- background: #bdc3c7;
- color: #7f8c8d;
- box-shadow: none;
- transform: none;
- }
-
- .page-info {
- font-size: 16px;
- font-weight: 500;
- color: #2c3e50;
- background: rgba(255, 255, 255, 0.8);
- padding: 8px 16px;
- border-radius: 20px;
- border: 1px solid #e0e0e0;
- }
- </style>
|