你想要的图片效果(动态实现)

news2024/9/23 3:32:10

一、前言

没有使用任何框架API,代码或逻辑在html或小程序都适用。主要实现图片随机位置、随机大小、不重叠,在页面上排布;还有扩展功能选定固定图片位置槽数、固定大小、不重叠,在页面上通过添加,图片随机排布。

二、实操效果(复制粘贴即可)

1、效果图

随机排序效果图:

在这里插入图片描述

固定排序效果图:

两张效果图:代表每次刷新位置都会改变。固定槽位置
在这里插入图片描述
在这里插入图片描述

2、随机排序完整代码

①简单讲解

list(初始化的数组) 和 arr(在初始化的基础上加上了随机定位的数据和随机的宽高) 是界面要遍历的数组,决定图片渲染数量,这个值也可以改成从后端获取。
数组格式
在这里插入图片描述

屏幕大小、图片数量可通过传参形式定义(后端)

var windowHeights = wx.getSystemInfoSync().windowHeight
var windowWidths = wx.getSystemInfoSync().windowWidth

for (let i = 0; i < 80; i++)  //定义数量

max 是图片最大值,min 是图片最小值

let max = 35;
let min = 12;

y_left 和 y_top 是对比之前遍历的定位数据和当前的定位数据,取到双方相差的绝对值(30),这里的30可以是前面的max(图片最大宽高),它会直接影响数据得出结果的效率,值越小得出结果越快。

if_Availability(left, top, arr) {
    let status = true
    for (let i = 0; i < arr.length; i++) {
      let y_left = Math.abs(arr[i].left - left)
      let y_top = Math.abs(arr[i].top - top)
      // console.log(y_left, y_top, arr);
      if (y_left < max && y_top < max) {
        status = false
      }
    }
    return status
  }

②完整代码

index.wxml

<scroll-view class="imagetext" scroll-x="true" style="width: 100%;height:100vh">
    <block wx:for="{{arr}}" wx:key="">
    <image src="/images/tj.png" style="height:{{item.item.height}}px;width:{{item.item.width}}px;left:{{item.left}}px;top:{{item.top}}px;">
    </image>
    </block>
    </scroll-view>

index.js

let max = 35;
let min = 12;
let windowWidth = 0;
let windowHeight = 0;
Page({
  data: {
    list: [],
    arr: []
  },
  onResize(e) {
    var windowHeights = wx.getSystemInfoSync().windowHeight //可使用屏幕高度
    var windowWidths = wx.getSystemInfoSync().windowWidth


    console.log('eeee', windowWidths)
    if (windowWidths < windowWidth) return
    windowHeight = windowHeights - max
    windowWidth = windowWidths - max
    console.log('windowHeight', windowHeight)


    let list = [],
      width, height;
    for (let i = 0; i < 80; i++) { //定义图片数量,可后端传参
      height = width = Math.floor(Math.random() * (max - min + 1) + min); //随机宽高
      list[i] = {
        i,
        height,
        width
      }
    }
    this.setData({
      list
    }, () => {
      var arr = [];
      for (let i = 0; i < this.data.list.length; i++) {
        var left = Math.floor(Math.random() * windowWidth); 
        var top = Math.floor(Math.random() * windowHeight);
        let obj = {
          left: left,
          top: top,
          item: this.data.list[i]
        };
        if (arr.length == 0) {
          arr.push(obj)
        } else {
          if (this.if_Availability(left, top, arr)) { 
            arr.push(obj)
            if (i == this.data.list.length - 1) this.setData({
              arr
            })
          } else {
            i--;
          }
        }
      }
    })
  },
  onLoad: function (options) {
    console.log('11111')
    this.onResize();


  },


  if_Availability(left, top, arr) {
    let status = true
    for (let i = 0; i < arr.length; i++) {
      let y_left = Math.abs(arr[i].left - left)
      let y_top = Math.abs(arr[i].top - top)
      // console.log(y_left, y_top, arr);
      if (y_left < max && y_top < max) {
        status = false
      }
    }
    return status
  }
})

index.wxss

image{
  position: absolute;
}

3、固定排序完整代码

①代码讲解

首先,要了解数据显示通过缓存或者后端进行传输,图片固定宽高,固定位置(也就是跟槽数有关)。由于偏于实践,有点击弹窗功能、长按删除功能(可忽略)。
随机12位整数,进行筛选

mathRandom() {
    var maxTimes = 20;
    do {
      var num = Math.floor(Math.random() * 12) + 1;
      if (-1 == arrMath.indexOf(num)) {
        arrMath.push(num);
        return num;
      }
      maxTimes--;
    } while (maxTimes);
  },

数据格式
在这里插入图片描述
点击、长按方法

// item.item.memorandumsz.colorType 通过传过来的数据,动态选择图片(也就是红球、绿球、蓝球等)
<image src="/images/{{item.item.memorandumsz.colorType}}.png" style="height:{{item.item.height}}rpx;width:{{item.item.width}}rpx;left:{{item.left}}rpx;top:{{item.top}}rpx;">
  </image>
// bindtap="multipleTap" bindlongtap="longTap" 一个是点击弹窗方法,一个是长按删除方法;可忽略
  <text style="left:{{item.left+10}}rpx;top:{{item.top+40}}rpx;" data-content="{{item.item.memorandumsz.content}}" data-colorType="{{item.item.memorandumsz.colorType}}" bindtap="multipleTap" bindlongtap="longTap">{{item.item.memorandumsz.title}}</text>

②完整代码

index.wxml

<view class="head_bwl">
    <view class="balls_head">
    <scroll-view class="imagetext" scroll-x="true" style="width: 100%;height:100%">
    <block wx:for="{{arr}}" wx:key="index">
    <image src="/images/{{item.item.memorandumsz.colorType}}.png" style="height:{{item.item.height}}rpx;width:{{item.item.width}}rpx;left:{{item.left}}rpx;top:{{item.top}}rpx;">
    </image>
    <text style="left:{{item.left+10}}rpx;top:{{item.top+40}}rpx;" data-content="{{item.item.memorandumsz.content}}" data-colorType="{{item.item.memorandumsz.colorType}}" bindtap="multipleTap" bindlongtap="longTap">{{item.item.memorandumsz.title}}</text>
    </block>
    </scroll-view>
    </view>
    </view>

index.js

Page({
  data: {
    memorandumsz: [],
    list: [],
    arr: []

  },
  onResize() {
    let list = [],
      width, height;
    // 缓存提取,也可自行造模拟数据,直接写入data中即可
    var memorandumszs = wx.getStorageSync('memorandumsz');
    for (let i = 0; i < memorandumszs.length; i++) {
      //功能不需要随机的宽高
      height = 280;
      width = 180;
      let memorandumsz = memorandumszs[i];
    //根据不同数据,进行赋值,代表不同图片
      switch (memorandumsz.colorType) {
        case 1:
          memorandumsz.colorType = "hq";
          break;
        case 2:
          memorandumsz.colorType = "lq";
          break;
        case 3:
          memorandumsz.colorType = "lsq";
          break;
        case 4:
          memorandumsz.colorType = "hsq";
          break;
      }
      list[i] = {
        i,
        height,
        width,
        memorandumsz
      }
    }

    this.setData({
      list
    }, () => {
      var arr = [];
      var left = 0;
      var top = 20;

      for (let i = 0; i < this.data.list.length; i++) {
        //考虑 间距+本身 进行逐一加长度  然后就可以适应内容了 宽度:5+100 高度:5+120
        //如果随机12个槽,进行重复判断,然后随机补充
        var num = this.mathRandom();
        switch (num) {
          case 1:
            left = 0;
            top = 20;
            break;
          case 2:
            left = 190;
            top = 20;
            break;
          case 3:
            left = 380;
            top = 20;
            break;
          case 4:
            left = 570;
            top = 20;
            break;
          case 5:
            left = 0;
            top = 320;
            break;
          case 6:
            left = 190;
            top = 320;
            break;
          case 7:
            left = 380;
            top = 320;
            break;
          case 8:
            left = 570;
            top = 320;
            break;
          case 9:
            left = 0;
            top = 620;
            break;
          case 10:
            left = 190;
            top = 620;
            break;
          case 11:
            left = 380;
            top = 620;
            break;
          case 12:
            left = 570;
            top = 620;
            break;
        }

        let obj = {
          left: left,
          top: top,
          item: this.data.list[i]
        };
        arr.push(obj);
        if (i == this.data.list.length - 1) this.setData({
          arr
        })
      },
  mathRandom() {
    var maxTimes = 20;
    do {
      var num = Math.floor(Math.random() * 12) + 1;
      if (-1 == arrMath.indexOf(num)) {
        arrMath.push(num);
        return num;
      }
      maxTimes--;
    } while (maxTimes);
  },
  onLoad: function (options) {
    console.log('11111')
    this.onResize();
  },


})

index.wxss

.head_bwl {
  position: absolute;
  left: 0rpx;
  top: 0rpx;
  width: 100%;
  height: 100%;
  background: rgba(251, 192, 1, 0.42);
}
.balls_head {
  position: relative;
  width: 100%;
  height: 88%;
}
.head_bwl .balls_head image {
  position: absolute;
}
.head_bwl .balls_head .imagetext text {
  position: absolute;
  width: 160rpx;
  height: 140rpx;
  text-align: center;
}

三、总结

样式中、可能有许多瑕疵,比如说性能方面,代码臃肿等。作为参考,希望共同进步,同样也可以搞些扩展炫酷画面,例如,背景星空,图片星星、通过延迟秒数的形式,逐渐增多,或者消失显示(一闪一亮);或者搞自己女朋友名字,进行乱序乱入,纵向横行,配上星星点缀。
在这里插入图片描述

各位看官》创作不易,点个赞!!!
诸君共勉:万事开头难,只愿肯放弃。

免责声明:本文章仅用于学习参考

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

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

相关文章

我的创作纪念日(4周年)

机缘 回想当初&#xff0c;博主2017年底从北京中石油&#xff08;沙河总部&#xff09;辞职&#xff0c;一心想回到自己的家乡成都工作、不想在北京待了&#xff0c;在总部赵总的推荐下来到四川中石油工作&#xff08;刚好这边有人离职&#xff0c;所谓一个萝卜一个坑&#xf…

C语言入门(二)——常量,变量和表达式

继续Hello World 常量 变量 赋值 表达式 字符类型与字符编码 继续Hello World 前一个章节已经对Hello World程序做各种改动程序做各种改动看编译运行结果&#xff0c;其中有些改动会导致编译出错&#xff0c;有些改动会影响程序的输出&#xff0c;有些改动则没有任何影响…

C++:类的内存布局

文章目录1、虚的含义2、单基继承2.1、单继承2.2、单虚继承2.3、单虚继承 虚函数2.4、测试代码3、多基继承3.1、多继承 虚函数3.2、虚拟多继承 虚函数3.3、测试代码4、菱形继承4.1、菱形继承4.2、菱形虚拟继承4.3、测试代码5、效率分析建议先了解 C 继承与多态的相关知识&…

12.10 二叉搜索树与内部类

目录 一.二叉搜索树 1 概念 2 操作-查找 3.插入 4.删除(难点) 1.cur.leftnull 2.cue.rightnull 3.最复杂的情况 cur.left!null&&cur.right!null 6 性能分析 7 和 java 类集的关系 二.内部类 1.本地内部类 2.实例内部类 1.不可以定义静态 因为静态表示属于…

踩坑记录1——RK3588编译OpenCV

这两天有在板卡上跑代码的需求&#xff0c;拿到了一块RK3588CPU的板子&#xff0c;型号是HINLINK的HK88. 以后记录一下调试这个板子的问题&#xff0c;便于以后查看 0. 基本信息 板卡系统&#xff1a;ArmBian&#xff0c;基于Ubuntu20.04 OpenCV版本&#xff1a;3.4.5 采用方法…

Java项目:SSM公司人力资源管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为后台管理系统,分为管理员与普通员工两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,员工账号管理,部门管理,员工…

陆拾肆- 时序数据的特征化

一、前期大数据状况 进行客户域大数据运营时&#xff0c;一般是在当前状态计算客户的行为特征。 如会建立特征为 近7天是否有登录昨天是否有登录近7天销售情况点击主页后是否有点击下层页面哪个页面点击购买总浏览电子产品的次数占访问次数占比不进行商品浏览&#xff0c;只进…

Codeforces Round #772 (Div. 2) D. Infinite Set

翻译&#xff1a; 给定一个数组&#x1d44e;&#xff0c;该数组由&#x1d45b;个不同的正整数组成。 让我们考虑一个无限整数集&#x1d446;&#xff0c;它包含至少满足以下条件之一的所有整数&#x1d465;: 对于某些1≤&#x1d456;≤&#x1d45b;&#xff0c;&#…

微服务框架 SpringCloud微服务架构 微服务保护 33 授权规则 33.2 自定义异常结果

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护33 授权规则33.2 自定义异常结果33.2.1 自定义异常结果33.2.2 总结33 授权规则 33.2 自定义异常结…

十种类型电感概述

1、工字型电感 它的前身是挠线式贴片电感,工字型电感是它们的改良, 挡板有效加强储能能力,改变EMI方向和大小,亦可降低RDC。它亦可说是讯号通讯电感跟POWER电感的一种妥协。 工字型电感的缺点,仍是开磁路,有EMI的问题, 另外,噪音的问题比挠线式贴片电感大。 2、色环电感 色环电…

java计算机毕业设计ssm学生学习评价与分析系统8ql42(附源码、数据库)

java计算机毕业设计ssm学生学习评价与分析系统8ql42&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

C++11标准模板(STL)- 算法(std::set_union)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 数据结构的堆物理结构是数…

IOC 操作 Bean 管理( Bean 的生命周期)

生命周期 从对象创建到对象销毁的过程 Bean 的生命周期 通过构造器创建 Bean 实例&#xff08;无参构造&#xff09;为 Bean 的属性设置值和对其他 Bean 引用&#xff08;调用 set 方法&#xff09;调用 Bean 的初始化的方法&#xff08;需要进行配置&#xff09;Bean 可以使…

Java项目:SSM校园班级同学通讯录管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,修改管理员资料,用户管理,公告管理,系别信息管理,班级管理,学生通讯录管理等功能。 用户角色包…

微信小程序框架(一)-全面详解(学习总结---从入门到深化)

目录 小程序与普通网页开发的区别 体验小程序 微信小程序账号申请 微信小程序开发者工具 下载安装 创建项目 开发者工具说明 小程序目录结构 描述整体的 app 描述各自页面的 page 全局配置_Pages Pages配置 entryPagePath 快捷生成页面方案 全局配置_window 常用属性…

太卷了,5年Java程序员竟答不出应届生字节二面?

11.22一面过 11.23二面挂 上一个部门寄了&#xff0c;给我换了个流程唉 一面 面试官问我&#xff0c;三面面评这么好为啥不继续了&#xff0c;我纳闷了&#xff0c;不是你们挂的我吗 介绍项目&#xff0c;点赞是怎么考量的&#xff0c;热度点赞问题怎么解决&#xff0c;具体…

【混合网络】

A Novel Adaptive Hybrid Fusion Network for Multiresolution Remote Sensing Images Classificatio &#xff08;一种新的自适应混合融合网络在多分辨率遥感图像分类中的应用&#xff09; 随着对地观测技术的快速发展&#xff0c;全色&#xff08;PAN&#xff09;和多光谱&…

【OpenCV-Python】教程:4-6 FAST (Features from Accelerated Segment Test)算法角点检测

OpenCV Python FAST&#xff08;Features from Accelerated Segment Test&#xff09; 算法角点检测 【目标】 理解FAST算法的理论基础&#xff1b;用OpenCV里的FAST 检测角点&#xff1b; 【理论】 我们看到了几个特征检测器&#xff0c;其中很多都非常好。但是从实时应用…

预训练语言模型

一、预训练 对于一个具有少量数据的任务 A&#xff0c;首先通过一个现有的大量数据搭建一个 CNN 模型 A&#xff0c;由于 CNN的浅层学到的特征通用性特别强&#xff0c;因此在搭建一个 CNN 模型 B&#xff0c;其中模型 B 的浅层参数使用模型 A 的浅层参数&#xff0c;模型 B 的…

Android Studio Dolphin logct日志台新版特性及老版本恢复

Android Studio Dolphin logct日志台新版特性及老版本恢复 日志台在此版本进行了更新&#xff0c;本文按官网描述简要汇总了其新特性和使用方法&#xff0c;以及老版本的日志如何恢复。 老版本日志台恢复 如果是习惯了老版本日志台的仁兄&#xff0c;可按下方截图操作进入Se…