demo:wx小程序电影banner,点击电影滚动

148 阅读3分钟

目标效果:模拟点击切换电影

image.png

第一步:布局

底层蓝色banner盒子,每个电影图片用film-item盒子包裹,然后所有的图片盒子放在filmbox盒子中。

最后移动的时候,就是控制filmbox的定位left属性。

image.png

第二步:给图片盒子写点击事件

image.png

这里点击事件做了3件事。

获得了被点击电影的下标indexA

计算出了被点盒子的左定位left

记录了当前电影的全部信息film,用于后续显示!

获取手机屏幕宽度

image.png

这里我们发现,想要计算left我们需要拿到屏幕的宽度

整体移动和图片变大

这里移动是给行内样式赋给了一个left变量,我们控制left变量的数值,即可控制整体移动。

图片变大也是类似的原理,但是我们需要判断点击盒子的下标是否是当前下标,换句话说,仅有当前被点的盒子才可以变大,这里使用了三元表达式。

image.png

难点

主要是很多细节需要考虑

比如首次进入,该放大哪个图片?这里需要结合filmId考虑。点击之后,盒子移动多少?这里需要仔细计算。

写的时候感觉有点复杂,但总结起来似乎没啥?

附上JS代码

// pages/cinemaDetail/index.js
import { getCinemaDetailAPI, getFilmsAPI } from "../service/cinema";
Page({

  /**
   * 页面的初始数据
   */
  data: {
    cinemaId: -1,
    filmId:-1,
    cinema: null,
    show: false,//遮罩层
    films: null,//存放轮播展示的电影数据
    screenW: -1,//屏幕的宽度
    left:"",
    indexA:0,//被点击图片的下标
    film:null,//被点击电影


  },
  // 获取影院详情
  async getCinemaDetail() {
    let res = await getCinemaDetailAPI({
      cinemaId: this.data.cinemaId,
      k: 1579384


    })
    console.log("影院详细:", res.data.data.cinema);
    this.setData({
      cinema: res.data.data.cinema,
    })
    console.log("影院详细:", this.data.cinema);
  },
  //影院服务的点击
  clickme() {
    console.log("预备弹出界面!");
    this.setData({ show: true });
  },
  //遮罩层测试
  onClickShow() {
    this.setData({ show: true });
  },

  onClickHide() {
    this.setData({ show: false });
  },
  //API引入该影院的影片进行轮播
  async getFilmData() {
    let res = await getFilmsAPI({
      cinemaId: this.data.cinemaId,
      k: 5283900
    })
    // console.log(res.data.data.films);
    this.setData({
      films: res.data.data.films,
      // name:this.data.films[0].name
    })
    console.log("轮播的影片情报", this.data.films);
     let index=this.data.films.findIndex(element => element.filmId == this.data.filmId);
    console.log("当前电影的下标",index);
    //获得films列表之后,立马取出当前页的film信息,将初始的indexA设置为当前电影下标index,这样初次进入就会在正确的位置
    this.setData({
      indexA:index,
      left:(this.data.screenW/2-36-100*index)+"px",
      film:this.data.films[index],
    })
  
  },
  //获取屏幕宽度
  getScreenWidth() {
    // console.log(wx.getSystemInfoSync().windowWidth, '宽')
    // console.log(wx.getSystemInfoSync().windowHeight, '长')
    this.setData({
      screenW:wx.getSystemInfoSync().windowWidth,
    })
    console.log("屏幕宽",this.data.screenW);
    // let index=this.data.films.findIndex(element => element.filmId === filmId);
    

  },
  //图片的点击事件
  clickimg(e){
    console.log("图片被点了",e);
    let index=e.currentTarget.dataset.indexa;
    this.setData({
      indexA:index
    })
    this.setData({
      left:(this.data.screenW/2-100*index-36)+"px",
      film:this.data.films[this.data.indexA],
      // imageH:"120px",
      // imageW:"72px"
    })
    console.log("indexA",this.data.indexA);
    

  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad({ cinemaId,filmId }) {

    console.log(cinemaId,filmId);
    this.setData({
      cinemaId: cinemaId,
      filmId:filmId
    })
    this.getCinemaDetail();
    this.getFilmData();
    this.getScreenWidth();
   
    
    
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    
    

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})