Rumah applet WeChat Pembangunan program mini 微信小程序实现瀑布流布局和无限加载

微信小程序实现瀑布流布局和无限加载

Apr 04, 2017 am 11:57 AM

瀑布流布局是一种比较流行的页面布局方式,最典型的就是Pinterest.com,每个卡片的高度不都一样,形成一种参差不齐的美感。

HTML5中,我们可以找到很多基于jQuery之类实现的瀑布流布局插件,轻松做出这样的布局形式。在微信小程序中,我们也可以做出这样的效果,不过由于小程序框架的一些特性,在实现思路上还是有一些差别的。

今天我们就来看一下如何在小程序中去实现这种瀑布流布局:

微信小程序实现瀑布流布局和无限加载

小程序瀑布流布局

我们要实现的是一个固定2列的布局,然后将图片数据动态加载进这两列中(而加载进来的图片,会根据图片实际的尺寸,来决定到底是放在左列还是右列中)。

/* 单个图片容器的样式 */
.img_item {
  width: 48%;
  margin: 1%;
  display: inline-block;
  vertical-align: top;
}
Salin selepas log masuk

我们知道,在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>
Salin selepas log masuk

我们可以在Page中通过数据绑定,来传递要加载的图片信息到wxml中,让组件去加载图片资源,然后当图片加载完成的时候,通过bindload指定的事件处理函数来做进一步处理。

我们来看一下Page文件中定义的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
        });
    }

})
Salin selepas log masuk

这里是显示在两列图片的wxml代码,我们可以看到在组件上,我们通过使用bindscrolltolower设置了事件监听函数,当滚动到底部的时候,会触发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>
Salin selepas log masuk

好了,挺简单的一个例子,如果你有更好的方法,不吝分享一下哦。


Atas ialah kandungan terperinci 微信小程序实现瀑布流布局和无限加载. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk membina susun atur tatal dan aliran air terjun tanpa had menggunakan Vue? Bagaimana untuk membina susun atur tatal dan aliran air terjun tanpa had menggunakan Vue? Jun 27, 2023 pm 01:32 PM

Vue.js ialah rangka kerja JavaScript popular yang membolehkan pembangun membuat aplikasi web yang dinamik dan responsif dengan mudah. Antaranya, ia amat digemari oleh pembangun kerana keupayaan pembangunan komponennya yang berkuasa. Tatal tak terhingga dan susun atur aliran air terjun telah menjadi salah satu ciri yang sangat diperlukan dalam pembangunan web moden. Artikel ini bertujuan untuk memperkenalkan cara menggunakan Vue.js, digabungkan dengan beberapa perpustakaan pihak ketiga, untuk melaksanakan fungsi susun atur tatal tak terhingga dan aliran air terjun. Capai tatal tak terhingga tatal tak terhingga (Infinit

Cara menggunakan HTML dan CSS untuk melaksanakan reka letak paparan produk aliran air terjun Cara menggunakan HTML dan CSS untuk melaksanakan reka letak paparan produk aliran air terjun Oct 21, 2023 am 09:25 AM

Cara menggunakan HTML dan CSS untuk melaksanakan reka letak paparan produk aliran air terjun ialah kaedah reka bentuk web biasa, yang dicirikan dengan mempersembahkan kesan visual yang rumit, dinamik dan teratur. Menggunakan reka letak aliran air terjun pada halaman web paparan produk boleh meningkatkan kesan paparan produk dan menarik perhatian pengguna. Artikel ini akan memperkenalkan cara menggunakan HTML dan CSS untuk melaksanakan reka letak paparan produk aliran air terjun dan memberikan contoh kod khusus. 1. Struktur HTML Pertama, kita perlu membina struktur HTML asas untuk menampung

Bagaimana untuk menggunakan sifat fleksibel CSS3 untuk mencipta kesan susun atur aliran air terjun? Bagaimana untuk menggunakan sifat fleksibel CSS3 untuk mencipta kesan susun atur aliran air terjun? Sep 09, 2023 am 08:39 AM

Bagaimana untuk menggunakan sifat fleksibel CSS3 untuk mencipta kesan susun atur aliran air terjun? Dalam reka bentuk web, Waterfall Layout ialah kaedah susun atur halaman yang biasa dan popular. Ia dicirikan dengan mempersembahkan kandungan dalam lajur dan ketinggian baris yang tidak teratur, mewujudkan estetik seperti air terjun. Pada masa lalu, melaksanakan reka letak air terjun diperlukan menggunakan kod JavaScript yang kompleks untuk mengira kedudukan dan saiz elemen. Walau bagaimanapun, dengan pembangunan CSS3, kita boleh menggunakan sifat flex yang berkuasa untuk menjadikannya lebih mudah

Petua untuk melaksanakan reka letak aliran air terjun kad responsif menggunakan CSS Petua untuk melaksanakan reka letak aliran air terjun kad responsif menggunakan CSS Nov 21, 2023 am 08:26 AM

Petua untuk Melaksanakan Reka Letak Air Terjun Kad Responsif Menggunakan CSS Dengan populariti peranti mudah alih dan kepelbagaian kandungan web, reka bentuk responsif telah menjadi salah satu keperluan asas pembangunan web moden. Antaranya, susun atur kad dan susun atur air terjun secara beransur-ansur menjadi gaya reka bentuk yang popular. Artikel ini akan memperkenalkan cara menggunakan CSS untuk melaksanakan reka letak air terjun kad responsif dan memberikan contoh kod khusus. 1. Struktur HTML Pertama, kita perlu mentakrifkan struktur set kad dalam HTML, seperti menggunakan &lt;ul&gt;

Cara menggunakan susun atur CSS Flex untuk melaksanakan susun atur aliran air terjun Cara menggunakan susun atur CSS Flex untuk melaksanakan susun atur aliran air terjun Sep 27, 2023 pm 04:22 PM

Cara menggunakan susun atur elastik CSSFlex untuk melaksanakan reka letak aliran air terjun Dengan pembangunan berterusan reka bentuk web, reka letak aliran air terjun telah menjadi kaedah susun atur halaman yang sangat popular. Tidak seperti susun atur grid tradisional, susun atur aliran air terjun boleh menyesuaikan diri dengan saiz skrin dan memberikan deria aliran yang unik. Dalam artikel ini, kami akan memperkenalkan cara menggunakan reka letak anjal CSSFlex untuk melaksanakan reka letak aliran air terjun dan memberikan contoh kod khusus. Reka letak anjal CSSFlex ialah model susun atur berkuasa yang digunakan di

Gunakan uniapp untuk mencapai kesan susun atur aliran air terjun Gunakan uniapp untuk mencapai kesan susun atur aliran air terjun Nov 21, 2023 am 10:25 AM

Gunakan Uniapp untuk mencapai kesan reka letak aliran air terjun ialah bentuk reka letak halaman web yang biasa ialah kandungannya disusun dalam lajur tidak teratur untuk membentuk kesan seperti aliran air terjun. Dalam pembangunan mudah alih, rangka kerja Uniapp boleh digunakan untuk mencapai kesan susun atur aliran air terjun dengan mudah. Artikel ini akan memperkenalkan cara menggunakan Uniapp untuk melaksanakan reka letak air terjun dan memberikan contoh kod khusus. 1. Buat projek Uniapp Pertama, kita perlu memasang alat pembangunan HbuilderX pada komputer.

Bagaimana untuk melaksanakan reka letak aliran air terjun menggunakan HTML dan CSS Bagaimana untuk melaksanakan reka letak aliran air terjun menggunakan HTML dan CSS Oct 24, 2023 am 09:33 AM

Cara menggunakan HTML dan CSS untuk melaksanakan susun atur aliran air terjun (Susun Letak Air Terjun) ialah kaedah susun atur laman web yang boleh menjadikan kandungan halaman web kelihatan seperti aliran air terjun laman web kelihatan lebih cantik dan penuh aksi. Dalam artikel ini, kami akan memperkenalkan cara menggunakan HTML dan CSS untuk melaksanakan reka letak air terjun, dengan contoh kod khusus. Mula-mula, mari kita lihat struktur HTML yang diperlukan. Untuk melaksanakan susun atur aliran air terjun, kita perlu menggunakan

Bagaimana untuk menyelesaikan masalah pemuatan kotak carian yang tidak terhingga dalam win10 Bagaimana untuk menyelesaikan masalah pemuatan kotak carian yang tidak terhingga dalam win10 Dec 26, 2023 pm 10:05 PM

Apabila pengguna menggunakan kotak carian menang, item carian terus dimuatkan dan tiada item dipaparkan Secara amnya, masalah itu boleh diselesaikan dengan membuka Windows PowerShell (pentadbir) dan memasukkan arahan kotak carian win10. Kotak carian win10 dimuatkan tanpa had: 1. Klik menu Mula - cari folder Windows PowerShell. 2. Klik fail WindowsPowerShell - klik kanan WindowsPowerShell - pilih Jalankan sebagai pentadbir. 3. Keluarkan arahan dalam tetingkap arahan. Dapatkan-AppXPackage-NameMicrosoft.Windows.

See all articles