>  기사  >  위챗 애플릿  >  WeChat 애플릿은 폭포식 흐름 레이아웃과 무제한 로딩을 구현합니다.

WeChat 애플릿은 폭포식 흐름 레이아웃과 무제한 로딩을 구현합니다.

PHPz
PHPz원래의
2017-04-04 11:57:173232검색

폭포 레이아웃은 널리 사용되는 페이지 레이아웃가장 일반적인 레이아웃입니다. 하나는 Pinterest.com입니다. 각 카드의 높이가 달라서 고르지 못한 아름다움을 형성합니다.

HTML5에서는 이를 기반으로 한 여러 가지 Waterfall 레이아웃 플러그인을 찾을 수 있습니다. 🎜>jQuery는 이러한 레이아웃을 쉽게 만들 수 있습니다. WeChat 미니 프로그램에서도 이 효과를 얻을 수 있지만 미니 프로그램 프레임워크로 인해 일부 기능에 대한 구현 아이디어에는 여전히 약간의 차이가 있습니다.

오늘은 미니 프로그램에서 이 폭포 흐름 레이아웃을 구현하는 방법을 살펴보겠습니다.

WeChat 애플릿은 폭포식 흐름 레이아웃과 무제한 로딩을 구현합니다.

미니 프로그램 폭포 흐름 레이아웃

구현하려는 것은 고정된 2열 레이아웃이며

그림 데이터를 이 두 열에 동적으로 로드합니다(로드하는 동안 들어오는 이미지는 왼쪽 열 또는 오른쪽 열에 배치됩니다). 열은 이미지의 실제 크기에 따라 다름)

/* 单个图片容器的样式 */
.img_item {
  width: 48%;
  margin: 1%;
  display: inline-block;
  vertical-align: top;
}
HTML에서는 이미지를 동적으로 로드하려면 일반적으로 <.>new

Image()가 이미지를 생성합니다. 객체 를 사용하여 URL이 가리키는 이미지를 동적으로 로드하고 이미지의 실제 크기 및 기타 정보를 얻습니다. 미니 프로그램 프레임워크에는 해당 JS가 제공되지 않습니다. 실제로는 wxml 구성요소를 사용하여 이러한 기능을 완성할 수 있지만 여전히 만족스럽습니다. >

<!-- 在页面上放一个隐藏区域,并用image组件去加载一个或多个图片资源 -->
<view style="display:none">
  <image wx:for="{{images}}" wx:key="id" id="{{item.id}}" src="{{item.pic}}" bindload="onImageLoad"></image>
</view>
데이터 바인딩을 통해 wxml에 로드할 이미지 정보를 전달하고 이미지 리소스를 로드하도록 할 수 있습니다. 그런 다음 이미지가 로드되면 추가 처리가 완료됩니다.

이벤트 처리

함수 를 통해 페이지 파일에 정의된 onImageLoad 함수를 살펴보겠습니다. 로드된 이미지의 실제 크기를 포함하여 들어오는 이벤트 개체 e의 구성 요소를 사용하여 페이지에 표시해야 하는 실제 크기에 따라 이미지를 계산합니다. 그런 다음 왼쪽 및 오른쪽 열의 현재 누적된 콘텐츠 높이를 기반으로 현재 로드된 이미지를 어느 쪽에 배치할지 결정할 수 있습니다.

let col1H = 0;
let col2H = 0;

Page({

    data: {
        scrollH: 0,
        imgWidth: 0,
        loadingCount: 0,
        images: [],
        col1: [],
        col2: []
    },

    onLoad: function () {
        wx.getSystemInfo({
            success: (res) => {
                let ww = res.windowWidth;
                let wh = res.windowHeight;
                let imgWidth = ww * 0.48;
                let scrollH = wh;

                this.setData({
                    scrollH: scrollH,
                    imgWidth: imgWidth
                });

                //加载首组图片
                this.loadImages();
            }
        })
    },

    onImageLoad: function (e) {
        let imageId = e.currentTarget.id;
        let oImgW = e.detail.width;         //图片原始宽度
        let oImgH = e.detail.height;        //图片原始高度
        let imgWidth = this.data.imgWidth;  //图片设置的宽度
        let scale = imgWidth / oImgW;        //比例计算
        let imgHeight = oImgH * scale;      //自适应高度

        let images = this.data.images;
        let imageObj = null;

        for (let i = 0; i < images.length; i++) {
            let img = images[i];
            if (img.id === imageId) {
                imageObj = img;
                break;
            }
        }

        imageObj.height = imgHeight;

        let loadingCount = this.data.loadingCount - 1;
        let col1 = this.data.col1;
        let col2 = this.data.col2;

        //判断当前图片添加到左列还是右列
        if (col1H <= col2H) {
            col1H += imgHeight;
            col1.push(imageObj);
        } else {
            col2H += imgHeight;
            col2.push(imageObj);
        }

        let data = {
            loadingCount: loadingCount,
            col1: col1,
            col2: col2
        };

        //当前这组图片已加载完毕,则清空图片临时加载区域的内容
        if (!loadingCount) {
            data.images = [];
        }

        this.setData(data);
    },

    loadImages: function () {
        let images = [
            { pic: "../../images/1.png", height: 0 },
            { pic: "../../images/2.png", height: 0 },
            { pic: "../../images/3.png", height: 0 },
            { pic: "../../images/4.png", height: 0 },
            { pic: "../../images/5.png", height: 0 },
            { pic: "../../images/6.png", height: 0 },
            { pic: "../../images/7.png", height: 0 },
            { pic: "../../images/8.png", height: 0 },
            { pic: "../../images/9.png", height: 0 },
            { pic: "../../images/10.png", height: 0 },
            { pic: "../../images/11.png", height: 0 },
            { pic: "../../images/12.png", height: 0 },
            { pic: "../../images/13.png", height: 0 },
            { pic: "../../images/14.png", height: 0 }
        ];

        let baseId = "img-" + (+new Date());

        for (let i = 0; i < images.length; i++) {
            images[i].id = baseId + "-" + i;
        }

        this.setData({
            loadingCount: images.length,
            images: images
        });
    }

})
여기 wxml 코드가 두 개 있습니다. 구성 요소에서 binscrolltolower를 사용하여 이벤트 수신 기능을 설정합니다. 맨 아래로 스크롤하면 다음 이미지 데이터 세트를 로드하기 위해 loadImages가 트리거되어 무한 로딩이 형성됩니다.

<scroll-view scroll-y="true" style="height:{{scrollH}}px" bindscrolltolower="loadImages">
  <view style="width:100%">
    <view class="img_item">
      <view wx:for="{{col1}}" wx:key="id">
        <image src="{{item.pic}}" style="width:100%;height:{{item.height}}px"></image>
      </view>
    </view>
    <view class="img_item">
      <view wx:for="{{col2}}" wx:key="id">
        <image src="{{item.pic}}" style="width:100%;height:{{item.height}}px"></image>
      </view>
    </view>
  </view>
</scroll-view>

알겠습니다. 아주 간단한 예입니다. 더 좋은 방법이 있으면 자유롭게 공유해 주세요.

위 내용은 WeChat 애플릿은 폭포식 흐름 레이아웃과 무제한 로딩을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.