小程序实现书籍翻页效果

做的小程序中突然加了一个相册,要求相册可以点击实现翻页,web能实现这种翻页效果的插件有很多,如turn.js,类似这种插件基本都是基于jQuery的,但是小程序是不支持jQ的。参考了网上大佬的代码,实现了一个最简单的翻页效果

 

基本结构:

<view class='container'>
    <view class='page_first'>家谱相册,点击图片翻页查看</view>
    <view class='page_last'>
        <block wx:for='{{imgArr}}' wx:key='{{index}}'>
            <view class="photo_item {{item.isturn?'left':'right'}} {{'zindex'+item.zIndex}}" data-index='{{index}}' bindtap='change' bindtransitionend='finish'>
                <image src='{{item.src}}' mode='aspectFill'></image>
            </view>
        </block>
    </view>
</view>

样式: 

.container{
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
}
.page_first,.page_last{
    width: 50%;
    height: 480rpx;
}
.page_first{
    display:flex;
    align-item:center;
    box-sizing:border-box;
    padding:0 20rpx;
    text-align:center;
}
.page_last{
    position:relative;
}
.photo_item{
    width:100%;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    box-sizing:border-box;
    border:1rpx solid #eee;
}
image{
    width:100%;
    height:100%;
}
.left,.right{
    transform-style:preserve-3d; /* 开启3d转换效果 */
    transform-origin:0% center;  /* 设置基点位置 */
    perspective:1000;  /* 定义3D元素距视图的距离 */
    transition:all 1.5s ease-in-out;
}
.left{
    transform:perspective(2000rpx) rotateY(-180deg);
}
.right{
    transform:perspective(2000rpx) rotateY(0deg);
}
.zindex1{
    z-index:1;
}
.zindex2{
    z-index:2;
}
.zindex3{
    z-index:3;
}

逻辑:

初始化时需要渲染的数据格式是固定,所以对请求回来的数据进行了改写。

import api from '../../../utils/api.js';
Page({
    data:{
        imgArr:[],
        flag:true,
        // 需要渲染的数据格式
        // list:[
        //     {src:'图片路径',isturn:false,zIndex:3},
        //     {src:'图片路径',isturn:false,zIndex:1},
        //     {src:'图片路径',isturn:false,zIndex:1},
        //     {src:'图片路径',isturn:false,zIndex:1},
        // ]
    },
    onLoad:function(options){
        // 获取列表图片信息
        api.photoDetail({
            query:{
                id:options.id
            }
        }).then(res =>{
            let arr = [];
            // 对返回的数据进行改写
            res.info.album.forEach((ele,index)=>{
                let obj = {};
                obj.isturn = false;
                obj.src = ele;
                if(!index){
                    obj.zIndex = 3
                }else{
                    obj.zIndex = 1
                }
            })
        })
    },
    // 点击图片切换类名来控制翻页效果
    change(e){
        if(this.data.flag){
            this.data.flag = true;
        
            let index=e.currentTarget.dataset.index;
            let imgs = that.data.imgArr;
            imgs.map((ele,i)=>{
                if(index==i){
                    imgs[i].isturn = !imgs[i].isturn;
                    imgs[i].zIndex = 3;
                }else{
                    imgs[i].zIndex = 1;
                }
            })
            if(index-1>=0){
                imgs[index-1].zIndex = 2;
            }
            if(index+1<imgs.length){
                imgs[index+1].zIndex = 2;
            }
        }
        this.setData({
            imgArr:imgs
        })
    },
    // transition动画结束
    finish(){
        this.data.flag=true;
    }
})

测试后发现开发工具上没有问题,但是在真机上就出现了小问题。发现当点击图片进行翻页时,下一张图片会有一下闪现。觉得应该是因为在进行初始化的时候,所有的图片容器都是定位在一起的,只有第一张的层级最高(这里设置的z-index是3),后面的图片容器的层级都是z-index为1,导致后面的图片会覆盖到前面的图片,即原本图片顺序应该是12345显示,现在是15432显示,点击图片执行事件需要时间,所以最后一张图片会闪现一下

效果图(真机):

修改 :确保要点击的图片的下一张图片的层级在剩余图片中最高,且要点击的图片后第二张的层级在剩余图片层级第二高。即ABCDE一组图片,在点击B之前,B图片层级为3(在BCDE中最高),C的层级为2(BCDE中第二高)

1、wxss新加样式

.zindex4{
    z-index:4;
}

2、逻辑上的处理

    data:{
        imgArr:[],
        // 需要渲染的数据格式
        // list:[
        //     {src:'图片路径',isturn:false,zIndex:4},
        //     {src:'图片路径',isturn:false,zIndex:3},
        //     {src:'图片路径',isturn:false,zIndex:1},
        //     {src:'图片路径',isturn:false,zIndex:1},
        //     {src:'图片路径',isturn:false,zIndex:1},
        // ]
    },
    // 获取数据列表
    api.photoDetail({
        query:{
            id:options.id
        }
    }).then(res =>{
        let arr = [];
        // 对返回的数据进行改写
        res.info.album.forEach((ele,index)=>{
            let obj = {};
            obj.isturn = false;
            obj.src = ele;
            if(!index){
                obj.zIndex = 4
            // 在数据初始化的时候就把第二张图片的层级提升
            }else if(index==1){
                obj.zIndex = 3
            }else{
                obj.zIndex = 1
            }
            arr.push(obj)
        })
        this.setData({
            imgArr:arr
        })
    }),
    // 点击图片切换类名来控制翻页效果
    change(e){
        if(this.data.flag){
            this.data.flag = true;
            let index=e.currentTarget.dataset.index;
            let imgs = this.data.imgArr;
            imgs.map((ele,i)=>{
                if(index==i){
                    imgs[i].isturn = !imgs[i].isturn;
                    imgs[i].zIndex = 4;
                }else{
                    imgs[i].zIndex = 1;
                }
            })
            if(index-1>=0){
                imgs[index-1].zIndex = 3;
            }
            if(index+1<imgs.length){
                imgs[index+1].zIndex = 3;
            }
            if(index-2>=0){
                imgs[index - 2].zIndex = 2;
            }
            if(index+2<imgs.length){
                imgs[index + 2].zIndex = 2;
            }
            this.setData({
                imgArr:imgs
            })
        }
    }

  • 7
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
翻页效果,导入源码即可运行。 package sf.hmg.turntest; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PointF; import android.graphics.Region; import android.graphics.drawable.GradientDrawable; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class PageWidget extends View { private static final String TAG = "hmg"; private int mWidth = 480; private int mHeight = 800; private int mCornerX = 0; // 拖拽点对应的页脚 private int mCornerY = 0; private Path mPath0; private Path mPath1; Bitmap mCurPageBitmap = null; // 当前页 Bitmap mCurPageBackBitmap = null; Bitmap mNextPageBitmap = null; PointF mTouch = new PointF(); // 拖拽点 PointF mBezierStart1 = new PointF(); // 贝塞尔曲线起始点 PointF mBezierControl1 = new PointF(); // 贝塞尔曲线控制点 PointF mBeziervertex1 = new PointF(); // 贝塞尔曲线顶点 PointF mBezierEnd1 = new PointF(); // 贝塞尔曲线结束点 PointF mBezierStart2 = new PointF(); // 另一条贝塞尔曲线 PointF mBezierControl2 = new PointF(); PointF mBeziervertex2 = new PointF(); PointF mBezierEnd2 = new PointF(); float mMiddleX; float mMiddleY; float mDegrees; float mTouchToCornerDis; ColorMatrixColorFilter mColorMatrixFilter; Matrix mMatrix; float[] mMatrixArray = { 0, 0, 0, 0, 0, 0, 0, 0, 1.0f }; boolean mIsRTandLB; // 是否属于右上左下 // for test float mMaxLength = (float) Math.hypot(480, 800); int[] mBackShadowColors; int[] mFrontShadowColors; GradientDrawable mBackShadowDrawableLR; GradientDrawable mBackShadowDrawableRL; GradientDrawable mFolderShadowDrawableLR; GradientDrawable mFolderShadowDrawableRL; GradientDrawable mFrontShadowDrawableHBT; GradientDrawable mFrontShadowDrawableHTB; GradientDrawable mFrontShadowDrawableVLR; GradientDraw
实现微信小程序中的书籍翻页功能,可以使用小程序的 `swiper` 组件。 `swiper` 组件可以实现类似于图片轮播的效果,也可以用来实现书籍翻页效果。 具体步骤如下: 1. 在 `wxml` 文件中,使用 `swiper` 组件创建一个容器,将每一页的内容放在 `swiper-item` 组件中: ```html <swiper class="book-swiper" duration="{{500}}" current="{{current}}" bindchange="swiperChange"> <swiper-item> <!-- 第一页的内容 --> </swiper-item> <swiper-item> <!-- 第二页的内容 --> </swiper-item> <!-- 其他页的内容 --> </swiper> ``` 2. 在 `wxss` 文件中,设置 `swiper-item` 组件的样式,使其填满整个容器: ```css .swiper-item { width: 100%; height: 100%; } ``` 3. 在 `js` 文件中,设置 `current` 变量,表示当前显示的页码: ```javascript Page({ data: { current: 0, // 当前页码 }, // ... }) ``` 4. 在 `js` 文件中,监听 `swiper` 组件的 `bindchange` 事件,更新 `current` 变量的值: ```javascript Page({ data: { current: 0, // 当前页码 }, swiperChange: function (e) { this.setData({ current: e.detail.current }) }, // ... }) ``` 5. 在 `js` 文件中,提供翻页的方法,用于修改 `current` 变量的值: ```javascript Page({ data: { current: 0, // 当前页码 }, // 翻到下一页 nextPage: function () { this.setData({ current: this.data.current + 1 }) }, // 翻到上一页 prevPage: function () { this.setData({ current: this.data.current - 1 }) }, // ... }) ``` 6. 在 `wxml` 文件中,添加翻页按钮,并绑定对应的方法: ```html <view class="page-buttons"> <button class="prev-page" bindtap="prevPage">上一页</button> <button class="next-page" bindtap="nextPage">下一页</button> </view> ``` 7. 在 `wxss` 文件中,设置翻页按钮的样式: ```css .page-buttons { position: absolute; bottom: 20rpx; left: 0; right: 0; text-align: center; } .prev-page, .next-page { display: inline-block; padding: 10rpx 20rpx; margin: 0 10rpx; border: 1rpx solid #ccc; border-radius: 20rpx; font-size: 28rpx; color: #333; background-color: #fff; box-shadow: 0 2rpx 5rpx rgba(0, 0, 0, 0.1); } ``` 这样就可以实现微信小程序中的书籍翻页功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值