微信小程序实现吸顶、网格、瀑布流布局

news2024/11/15 19:47:13

微信小程序开发通常是在webview模式下编写,但是对小程序的渲染性能有一定的追求,就需要使用Skyline模式进行渲染,同时在这种模式下有也有一些特殊的组件,可以轻松的实现想要的效果,本文将介绍在Skyline模式下如何实现吸顶、网格、瀑布流布局。

以下是具体的实现:

1. 修改渲染模式

1. 在app.json中添加如下配置:

"renderer": "skyline",  // 声明渲染模式
"lazyCodeLoading": "requiredComponents", // 声明依赖注入
"rendererOptions": {   
    "skyline": {
        "defaultDisplayBlock": true, // 默认为块布局
        "defaultContentBox": true,   // 默认开启盒模型
        "disableABTest": true        // 禁用AB测试
    }
},
"componentFramework": "glass-easel" // 使用的组件框架

2. 由于在Skyline模式下,不支持页面全局滚动,也不支持原生导航栏,所以在页面的json配置文件中还要添加如下配置:

{
  "usingComponents": {},
  "disableScroll": true,
  "navigationStyle": "custom"
}

2. 主要组件介绍

1. sticky-section 吸顶布局容器;

仅支持作为 <scroll-view type="custom"> 模式的直接子节点。

2. sticky-header 吸顶布局容器;

仅支持作为 <scroll-view type="custom"> 模式的直接子节点或 sticky-section 组件直接子节点。

3. grid-view 网格布局容器,可实现网格布局、瀑布流布局等;

仅支持作为 <scroll-view type="custom"> 模式的直接子节点。按需渲染节点,比 Webview 兼容实现具备更好的性能。

3. 所有代码实现

1. 以下是WXML文件代码

<!-- index.wxml -->
<scroll-view type="custom" scroll-y show-scrollbar="{{false}}" scroll-into-view="{{intoView}}" class="scroll-view" bindscrolltolower="bindSrollToLower" style="margin-top: {{menuTop}}px;">

    <sticky-section push-pinned-header="{{false}}">
        <sticky-header>
            <view class="sticky-header">
                <view class="search" style="height: {{menuHeight}}px;line-height: {{menuHeight}}px; margin-right: {{menuLeft}}px;">
                    <input placeholder="找找去哪儿玩~" />
                </view>
            </view>
        </sticky-header>
        <grid-view type="aligned" cross-axis-count="5">
            <view wx:for="{{topList}}" class="top-list">
                <image src="https://res.wx.qq.com/op_res/omjFJjgEk_ZZIDmlSIE1hpn57hHOlcHvbMy1jM-BwNFczaS8S_rFryt8b3c7VC4h0BUjX4bSyjoDNaPteTlYcw" mode="aspectFill"></image>
                <text>广州</text>
            </view>
        </grid-view>
    </sticky-section>

    <sticky-section push-pinned-header="{{false}}">
    
        <sticky-header>
            <view class="sticky-header">
                <view class="sticky-header-child">
                    <view class="mini-head current">自然风景</view>
                    <view class="mini-head">周边旅游</view>
                    <view class="mini-head">温泉</view>
                    <view class="mini-head">玩雪</view>
                    <view class="mini-head">海边</view>
                </view>
            </view>
        </sticky-header>

        <grid-view type="masonry" 
            cross-axis-count="{{crossAxisCount}}" 
            cross-axis-gap="{{crossAxisGap}}" 
            main-axis-gap="{{mainAxisGap}}">
            <view wx:for="{{bottomList}}" class="grid-box">

                <image src="{{item.image_url}}" mode="widthFix"></image>

                <view class="content-box">
                    <text>这里的风景好美~</text>

                    <view class="profile-text">
                        <view class="left">
                            <image  src="https://res.wx.qq.com/op_res/lS41C5Xp6y6mfUbelCW8PArEcMwWRuhSohPO46vAiELbhAf56_CwONEDgM2vIVxOlT5KDcSxCkV8xIJ6cg3x2Q"></image>
                            <text>binnie</text>
                        </view>
                        <view class="right">
                            <image  src="https://res.wx.qq.com/community/dist/community/images/disagree_icon_fab2b7.svg"></image>
                            <text>666</text>
                        </view>
                    </view>
                </view>
            </view>
        </grid-view>

    </sticky-section>

</scroll-view>

2. 以下是WXSS文件代码:

/* index.wxss */
.scroll-view {
    width: 100%;
    height: 100%;
}
 
.search {
    border: rgb(228, 226, 226) solid 1px;
    border-radius: 20px;
    margin: 0 10px;
    line-height: 30px;
    height: 30px;
}
 
.search input {
    padding: 0 10px;
    line-height: 30px;
    height: 30px;
}
 
 
.top-list {
    display: flex;
    text-align: center;
    justify-content: center;
    align-items: center;
    padding-top: 10px;
    flex-direction: column;
}
 
 
.top-list image {
    width: 15vw;
    height: 15vw;
    border-radius: 50%;
}
 
.top-list text {
    padding: 10px 0;
    font-size: 14px;
}
 
 
 
.sticky-header {
    background-color: #fff;
}
 
 
.sticky-header-child {
    display: flex;
    flex-direction: row;
}
 
 
.mini-head {
    display: flex;
    background-color: #f5f5f5;
    margin: 8px 6px;
    padding: 6px 8px;
    border-radius: 4px;
    font-size: 14px;
}
 
.current {
    background-color: #07c160;
    color: #fff;
}
 
.grid-box {
    padding: 10px;
    border-radius: 8px;
    background-color: #f5f5f5;
}
 
.grid-box image {
    width: 100%;
}
 
.content-box {
    padding-top: 10px;
}
 
.profile-text {
    display: flex;
    flex-direction: row;
    padding-top: 4px;
    align-items: center;
}
 
.profile-text view {
    display: flex;
    color: #888;
    font-size: 14px;
    flex-direction: row;
    align-items: center;
}
 
.profile-text .left {
    width: 70%;
}
 
.left image {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    margin-right: 4px;
}
 
 
.profile-text .right {
    text-align: right;
    color: #888;
    font-size: 14px;
}
 
.right image {
    width: 16px;
    height: 16px;
    background-size: cover;
    opacity: .5;
    color: rgba(0, 0, 0, .5);
    margin: 0 3px;
}

3. 以下是JavaScript文件代码:

// index.js

import { getLandscapeImages} from './data'

function getNewList() {
    const newList = new Array(20).fill(0);
    const imgUrlList = getLandscapeImages();
    let count = 0;
    for (let i = 0; i < newList.length; i++) {
        newList[i] = {
            id: i+1,
            title: `scroll-view`,
            desc: `默认只会渲染在屏节点,会根据直接子节点是否在屏来按需渲染`,
            time: `19:20`,
            like: 88,
            image_url: imgUrlList[(count++) % imgUrlList.length],
        }
    };
    return newList;
}

Page({

    data: {

        // 顶部列表数据
        topList: new Array(15).fill(0),
        // 底部列表数据
        bottomList: getNewList(),

        // 网络布局参数
        crossAxisCount: 2,
        crossAxisGap: 8,
        mainAxisGap: 8,

        // 顶部布局参数
        menuTop: 0,
        menuHeight:0,
        menuLeft:0
    
    },
    onLoad() {
        const res = wx.getMenuButtonBoundingClientRect();
        this.setData({
            menuTop: res.top,
            menuHeight: res.height,
            menuLeft: res.width + 10
        })
    },
    bindSrollToLower() {
        this.setData({
            bottomList: this.data.bottomList.concat(getNewList())
        })
    },


})

4. 以下是上面JavaScript代码中引入的本地模拟数据文件data.js代码:

// data.js

const landscapeList = [
    'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYfaqohk6ndcC6_CBkUZszfSpKbqUAV7S2xWRbAQ459YsPWAmLKkicEOPS1L3NmnnRA',
    'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYjda9Dp372N3T05q_nn3PgvoXBoReXvaXBfkthtXQLN7m5_YI6FoTre-xvJBDFLMA',
    'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYfa6mRnywhNbBFV5eAt7oTz3zjlNJeujfQx0PVA1ufenPHBvxYXRNJ5chyi6RPaE7A',
    'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYYY1OalScOn4EMcQpkPaJ1Sxhri8CScjnhqVfjAZnLuVFl0JAM4VziHhSzHLZXtAaQ',
    'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYZB1p48LLH-Pc7Rzr4nN0YF-uZg7FW7zksw_Kjp0BNDHcZp9R9SRKbg0rA1HBaeK3Q',
    'https://res.wx.qq.com/op_res/0-l2fyKjv3_BR62E3KwTJPRaN5CDI6NZFg_qbSxeqF8UBpM4lXJ_1o9S9bsOOxMpuXGLeKyAKleWlAXmVLmQOw',
    'https://res.wx.qq.com/op_res/7_miJnK0wxIrh5bV2QqvYRu0VRyVvePJ4pB4_Dvj0ytF-ovjQzMl6WMLyuCeKk3579HNjKLIeNrHE7OprTBx5w'
]
  
export function getLandscapeImages() {
  return landscapeList
}

5. 以下是页面配置文件代码:

{
    "usingComponents": {},
    "disableScroll": true,
    "navigationStyle": "custom"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单项选择题标准化考试系统设计

工程链接放在这里 https://download.csdn.net/download/Samature/88805471使用 注意事项 登录 在这里插入图片描述 登录有初始账号&#xff1a;yzb 密码&#xff1a;123456 后续可以自己加 保存的用户信息位置和题目 problems是题目 users是用户名 可能遇到的bug CMake Er…

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git

20240203在Ubuntu20.04.6下配置stable-diffusion-webui.git 2024/2/3 11:55 【结论&#xff1a;在Ubuntu20.04.6下&#xff0c;生成512x512分辨率的图像&#xff0c;大概需要11秒钟&#xff01;】 前提条件&#xff0c;可以通过技术手段上外网&#xff01;^_首先你要有一张NVID…

苹果CMS挖片网升级版视频主题模版源码

自适应视频站正版高级挖片网收录模板&#xff0c;模板不错&#xff0c;是挖片网的升级版。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88799583 更多资源下载&#xff1a;关注我。

软件测试--接口自动化

接口自动化测试框架 目录结构 7 部分&#xff08;5个目录、2个文件&#xff09;&#xff1a; api/: 存储接口对象层&#xff08;自己封装的 接口&#xff09; scripts/: 存储测试脚本层 &#xff08;unittest框架实现的 测试类、测试方法&#xff09; data/: 存储 .json 数据…

Python基础知识:Python序列以及序列的索引、切片、相乘和相加

索引 索引就是序列中的每个元素所在的位置&#xff0c;可以通过从左往右的正数索引&#xff0c;也可以通过从右往左的负数索引。 从左往右的正数索引&#xff1a;在python序列中&#xff0c;第一个元素的索引值为0&#xff0c;第二个元素的索引值为1&#xff0c;以此类推&…

python+PyQt5实现指示灯检查

UI: 源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file CheckImageWinFrm.ui # # Created by: PyQt5 UI code generator 5.15.2 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again…

ICA:独立成分分析

1.意义 两个假设&#xff1a;一个是假设源信号是相互统计独立的,另一个是假设己知源信号的统计分布特征。 另一个假设是信号的非高斯性,现实世界的许多信号,诸如绝大多数的语音信号和图像信号即是服从非高斯分布的这个假设的可应用性,带来了独立成分分析的重要特征,即实际信号的…

N-142基于springboot,vue停车场管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本项目分为普通用户和管理员…

Flutter实现轮播图功能

一、在pubspec.yaml中添加&#xff1a; dependencies:# 轮播图card_swiper: ^3.0.1card_swiper: ^3.0.1&#xff0c;要获取最新版本&#xff1a;https://pub-web.flutter-io.cn/packages/card_swiper/versions&#xff0c;这个里面有文档可以看&#xff0c;如下图&#xff1a;…

创建一个Vue项目(含npm install卡住不动的解决)

目录 1 安装Node.js 2 使用命令提示符窗口创建Vue 2.1 打开命令提示符窗口 2.2 初始Vue项目 2.2.1 npm init vuelatest 2.2.2 npm install 3 运行Vue项目 3.1 命令提示符窗口 3.2 VSCode运行项目 1 安装Node.js 可以看我的这篇文章《Node.js的安装》 2 使用命令提示…

Pytorch学习02_TensorBoard使用01

更换编辑器 找到自己的Anaconda安装路径下envs\pytorch01中的oython.exe&#xff0c;pytorch01是笔者自己创建的pytorch环境名 选择好后&#xff0c;点击确定 点击 “应用”&#xff0c;再点击“确定” 在pytorch环境下安装tensorboard pip install pytorch 安装结束 writer.ad…

css1文本属性

一.颜色&#xff08;color&#xff09;&#xff08;一般用16进制&#xff09; 二.对齐&#xff08;text-align) 三.装饰&#xff08;text-decoration&#xff09; 四.缩进&#xff08;text-indent&#xff09;&#xff08;一般用2em&#xff09;&#xff08;有单位&#xff09;…

Android开发--实时监测系统+部署故障诊断算法

0.项目整体思路介绍&#xff1a; 搭建无人装备模拟实验平台&#xff0c;使用采集器对数据进行采集&#xff0c;通过网络通信Udp协议发送到安卓端&#xff0c;安卓端作界面显示&#xff0c;算法使用matlab仿真后&#xff0c;用C语言实现。将采集器采集到的数据经过处理后训练&a…

docker入门教程之将应用程序容器化

将应用程序容器化 在本指南的其余部分中&#xff0c;您将使用在 Node.js 上运行的简单待办事项列表管理器。如果您不熟悉 Node.js&#xff0c;请不要担心。本指南不需要任何 JavaScript 经验。 先决条件 您已安装最新版本的 Docker Desktop。您已经安装了 Git 客户端。您可以…

树莓派与Win11通信【一对一】(四)

树莓派与Win11通信【一对一】&#xff08;四&#xff09; 树莓派与Win11通信【一对一】&#xff08;四&#xff09;的代码优化版&#xff0c; 最近给代码添加了打开摄像头与否的验证&#xff0c;以及文件的保存&#xff0c;定时拍摄 1.Server端 import socket import time …

解决浏览器端 globalThis is not defined 报错

解决浏览器端 globalThis is not defined 报错 前言解决办法&#xff1a; 前言 在使用低版本火狐浏览器出现报错globalThis is not defined 解决办法&#xff1a; 在vue的index.html 中添加 this.globalThis || (this.globalThis this) <head><script>this.g…

vue3-自定义指令

自定义指令 vue 除了内置的制指令&#xff08;v-model v-show 等&#xff09;之外&#xff0c;还允许我们注册自定义的指令。 vue 复用代码的方式&#xff1a; 组件&#xff1a;主要是构建模块。 组合式函数&#xff1a;侧重有状态的逻辑。 自定义指令&#xff1a;主要是为…

day10笔记

API 显示->索引->搜索框输入->回车查看信息 字符串 直接赋值进串池(会先找,有复用) new出来的在堆里面 字符串比较 ""引用数据类型比较的是地址值 一模一样的比较 忽略大小写的比较 Scanner输入的数据是new出来的 遍历字符串 public class StringDe…

【ELK】logstash快速入门

1.概述 1.1.什么是logstash&#xff1f; 之前我们聊了es&#xff0c;并且用docker搭建了一个eskibana的环境。es目前最普遍的用法是用来存储日志的&#xff0c;然后结合kibana对日志做一些可视化的工作。既然要收集日志&#xff0c;就面临着一个问题&#xff1a; 各个系统的…

微信小程序(三十三)promise异步写法

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.promise异步与普通异步的写法区别 2.promise异步的优势 源码&#xff1a; index.wxml <view class"preview" bind:tap"onChoose"><image src"{{avatar}}" mode"…