• 微信小程序进阶——Flex弹性布局&轮播图&会议OA项目(首页)


    目录

    一、Flex弹性布局

    1.1 什么是Flex弹性布局

    1.1.1 详解

    1.1.2 图解 

    1.1.3 代码演示效果

    1.2 Flex弹性布局的核心概念

    1.3 Flex 弹性布局的常见属性

    1.4 Flex弹性布局部分属性详解

    1.4.1 flex-direction属性

    1.4.2 flex-wrap属性

    1.4.3 flex-flow属性

    1.4.4 justify-content属性

    1.4.5 align-items属性

    1.4.6 align-content属性

    二、轮播图后台数据获取及组件使用

    三、首页布局


    一、Flex弹性布局

    学习地址如下:Flex 布局语法教程 | 菜鸟教程网页布局(layout)是CSS的一个重点应用。 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C提出了一种新的方案—-Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 Flex布局将成为未来布..icon-default.png?t=N7T8http://www.runoob.com/w3cnote/flex-grammar.html

    1.1 什么是Flex弹性布局

    1.1.1 详解

    Flex 弹性布局是一种用于网页布局的现代 CSS 技术,旨在更灵活地管理容器内的元素排列和分布,以实现响应式设计和更好的页面布局控制。Flex 布局基于弹性盒子模型,通过使用 display: flex 属性,你可以将一个容器转变为一个弹性容器,从而控制其内部子元素的排列方式。

    1.1.2 图解 

    1.1.3 代码演示效果

    在进行Flex弹性布局属性的代码预演前,我们需进行小程序会议OA项目大致架子的搭建,具体操作如下:

    先建立一个新的Js项目模板,把pages下的所有目录清空,然后在app.json中加入以下代码:

    1. {
    2. "pages": [
    3. "pages/index/index",
    4. "pages/meeting/list/list",
    5. "pages/vote/list/list",
    6. "pages/ucenter/index/index"
    7. ],
    8. "window": {
    9. "backgroundTextStyle": "light",
    10. "navigationBarBackgroundColor": "#fff",
    11. "navigationBarTitleText": "Weixin",
    12. "navigationBarTextStyle": "black"
    13. },
    14. "tabBar": {
    15. "list": [
    16. {
    17. "pagePath": "pages/index/index",
    18. "text": "首页",
    19. "iconPath": "/static/tabBar/coding.png",
    20. "selectedIconPath": "/static/tabBar/coding-active.png"
    21. },
    22. {
    23. "pagePath": "pages/meeting/list/list",
    24. "iconPath": "/static/tabBar/sdk.png",
    25. "selectedIconPath": "/static/tabBar/sdk-active.png",
    26. "text": "会议"
    27. },
    28. {
    29. "pagePath": "pages/vote/list/list",
    30. "iconPath": "/static/tabBar/template.png",
    31. "selectedIconPath": "/static/tabBar/template-active.png",
    32. "text": "投票"
    33. },
    34. {
    35. "pagePath": "pages/ucenter/index/index",
    36. "iconPath": "/static/tabBar/component.png",
    37. "selectedIconPath": "/static/tabBar/component-active.png",
    38. "text": "设置"
    39. }
    40. ]
    41. },
    42. "style": "v2",
    43. "sitemapLocation": "sitemap.json"
    44. }

    接着把static静态资源复制到存放代码的区间中,如下:

    然后我们的微信开发者工具中就会自动生成目标目录,如下:

    到这里我们的会议OA项目架子就搭建好了,效果展示如下:

    架子搭好之后我们需要在tab上(一级菜单)演示一下弹性布局到底是什么来帮助大家理解,我们在投票界面来给大家展示一下,首先在list.wxml中插入以下代码:

    1. <view class="box">
    2. <view>1view>
    3. <view>2view>
    4. <view>3view>
    5. <view>4view>
    6. <view>5view>
    7. <view>6view>
    8. <view>7view>
    9. <view>8view>
    10. <view>9view>
    11. <view>10view>
    12. <view>11view>
    13. <view>12view>
    14. view>

    然后在list.wxss中加入样式来帮助大家更直观的看到效果,代码如下:

    1. /* pages/vote/list/list.wxss */
    2. .box{
    3. height:750rpx;
    4. width:750rpx;
    5. background-color: rgb(24, 230, 185);
    6. }
    7. view{
    8. height: 100rpx;
    9. width: 100rpx;
    10. border: 1px solid red;
    11. }

    模拟器展示页面如下:

    紧接着我们在list.wxss页面中.box样式代码块下加入关键代码(Flex弹性布局),如下:

    display: flex;

    然后我们接着打开模拟器观察页面,如下:

    在没有加入flex的时候view块状元素是超出了我们的box盒范围的。但是加入了之后,就可以非常直观的看到我们每一个块状元素设置的大小都是100rpx,12个view块状元素加起来就是1200rpx,但是页面的总宽高设置的是750rpx,但是意外的是750rpx的页面承载了12个view快状元素,这个就是Flex弹性布局的特点

    1.2 Flex弹性布局的核心概念

    Flex 弹性布局(Flexbox,也称为弹性盒子布局)是一种用于网页布局的现代 CSS 技术,它引入了一些核心概念,以便更灵活地排列和分布页面上的元素。以下是 Flex 弹性布局的核心概念:

    1. Flex 容器 (Flex Container):

      • Flex 布局始于一个容器。这个容器的 CSS 属性值设为 display: flex 或 display: inline-flex。它会成为一个 Flex 容器,其中的子元素(也叫做 Flex 项)会根据容器的规则进行排列。
    2. Flex 项 (Flex Items):

      • Flex 容器内部的直接子元素称为 Flex 项。这些项会根据容器的规则进行排列和分布。
    3. 主轴 (Main Axis):

      • Flex 容器内有一个主轴,通常是水平方向或垂直方向。主轴的方向由 flex-direction 属性控制。水平主轴对应于 row 和 row-reverse 值,而垂直主轴对应于 column 和 column-reverse 值。
    4. 交叉轴 (Cross Axis):

      • 交叉轴是与主轴垂直的轴,它的方向由主轴的方向决定。例如,如果主轴是水平的,那么交叉轴是垂直的。
    5. 主轴起点和终点:

      • 主轴的起点是 Flex 容器的起始位置,而主轴的终点是容器的结束位置。这取决于主轴的方向,可以使用 justify-content 属性控制主轴上的元素如何在容器内分布。
    6. 交叉轴起点和终点:

      • 交叉轴的起点和终点是与主轴垂直的轴上的位置,可以使用 align-items 属性控制交叉轴上的元素如何对齐。
    7. 伸缩性 (Flexibility):

      • Flex 项具有伸缩性,它们可以根据可用空间按比例分配或缩小。这由 flex-grow 和 flex-shrink 属性控制。
    8. 初始尺寸 (Flex Basis):

      • Flex 项的初始尺寸由 flex-basis 属性控制。这表示项在分配额外空间之前的尺寸。
    9. Flex 值 (Flex Value):

      • flex 属性是一个缩写属性,用于同时设置 flex-growflex-shrink 和 flex-basis
    10. 排列顺序 (Order):

      • 通过 order 属性,可以为每个 Flex 项指定一个整数值,以控制它们的排列顺序。

    这些核心概念使得 Flex 弹性布局非常有用,因为它提供了更灵活的布局方式,允许容器内的元素根据容器的大小和方向进行动态排列。这对于实现响应式设计和解决布局问题非常有帮助。

    1.3 Flex 弹性布局的常见属性

    Flex 弹性布局常见属性包括:

    1. display:

      • 定义一个容器为 Flex 容器。
      • 可以取值为 flex 或 inline-flex
    2. flex-direction:

      • 定义 Flex 容器的主轴方向。
      • 可以取值为 row(水平方向)、row-reverse(反向水平方向)、column(垂直方向)或 column-reverse(反向垂直方向)。
    3. flex-wrap:

      • 定义 Flex 容器的项是否换行。
      • 可以取值为 nowrap(不换行)、wrap(换行)或 wrap-reverse(反向换行)。
    4. justify-content:

      • 定义 Flex 容器内 Flex 项在主轴上的对齐方式。
      • 可以取值为 flex-startflex-endcenterspace-betweenspace-around 或 space-evenly
    5. align-items:

      • 定义 Flex 容器内 Flex 项在交叉轴上的对齐方式。
      • 可以取值为 flex-startflex-endcenterbaseline 或 stretch
    6. align-content:

      • 定义多根交叉轴线的对齐方式。
      • 仅在容器有多行的情况下有效。
      • 可以取值为 flex-startflex-endcenterspace-betweenspace-around 或 stretch
    7. flex:

      • 是 flex-growflex-shrink 和 flex-basis 的缩写。
      • 用于设置 Flex 项的伸缩性。
    8. flex-grow:

      • 定义了 Flex 项在容器内分配额外空间的能力。
      • 值为一个非负整数,表示相对于其他 Flex 项的放大比例。
    9. flex-shrink:

      • 定义了 Flex 项在容器内收缩的能力。
      • 值为一个非负整数,表示相对于其他 Flex 项的收缩比例。
    10. flex-basis:

      • 定义了 Flex 项在分配额外空间之前的初始尺寸。
      • 可以设置为一个长度值或百分比。
    11. order:

      • 定义了 Flex 项的排列顺序。
      • 值为一个整数,决定了项的排列顺序,值越小越靠前。

    这些属性是使用 Flex 弹性布局时常用的一些关键属性,通过合理地组合和设置这些属性,可以实现各种不同的布局效果。

    1.4 Flex弹性布局部分属性详解

    1.4.1 flex-direction属性

    flex-direction属性决定主轴的方向(即项目的排列方向)。

    在list.wxss中.box样式代码块下加入以下代码:

    flex-direction: column;

    加入后模拟器展示如下所示:

    1.4.2 flex-wrap属性

    默认情况下,项目都排在一条线(又称”轴线”)上。flex-wrap属性定义,如果一条轴线排不下,如何换行。

    注:它可能取三个值。分别如下:

    (1)nowrap(默认):不换行。

    (2)wrap:换行,第一行在上方。

    (3)wrap-reverse:换行,第一行在下方。

    把flex-derection属性的代码注释后,在list.wxss中加入以下代码:

    flex-wrap: wrap;

     模拟器效果演示:

    1.4.3 flex-flow属性

    flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。

    跟前面一样,把上一个效果的代码注释掉之后,加入以下代码:

    flex-flow: row wrap;

    模拟器展示效果如下:

    1.4.4 justify-content属性

    justify-content属性定义了项目在主轴上的对齐方式。 

    它可能取5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。

    • flex-start(默认值):左对齐
    • flex-end:右对齐
    • center: 居中
    • space-between:两端对齐,项目之间的间隔都相等。
    • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

    在list.wxss中加入以下代码:

    justify-content: flex-end;

    右对齐展示效果如下:

    1.4.5 align-items属性

    align-items属性定义项目在交叉轴上如何对齐。

    它可能取5个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。

    • flex-start:交叉轴的起点对齐。
    • flex-end:交叉轴的终点对齐。
    • center:交叉轴的中点对齐。
    • baseline: 项目的第一行文字的基线对齐。
    • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

    在list.wxss中加入以下代码:

    align-items: flex-end;

    模拟器展示效果如下:

    1.4.6 align-content属性

    align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

    该属性可能取6个值。分别如下:

    • flex-start:与交叉轴的起点对齐。
    • flex-end:与交叉轴的终点对齐。
    • center:与交叉轴的中点对齐。
    • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
    • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
    • stretch(默认值):轴线占满整个交叉轴。

    二、轮播图后台数据获取及组件使用

    思路:用Mock模拟后台给前台响应数据

    新建一个名为config的文件夹,文件夹下新建api.js专门放接口地址, 如下:

    建好之后在api.js中加入以下代码:

    1. // 以下是业务服务器API地址
    2. // 本机开发API地址
    3. var WxApiRoot = 'http://localhost:8080/demo/wx/';
    4. // 测试环境部署api地址
    5. // var WxApiRoot = 'http://192.168.0.101:8070/demo/wx/';
    6. // 线上平台api地址
    7. //var WxApiRoot = 'https://www.oa-mini.com/demo/wx/';
    8. module.exports = {
    9. IndexUrl: WxApiRoot + 'home/index', //首页数据接口
    10. SwiperImgs: WxApiRoot+'swiperImgs', //轮播图
    11. MettingInfos: WxApiRoot+'meeting/list', //会议信息
    12. };

    然后在index.js中加入以下代码:

    1. const api = require("../../config/api")
    2. data: {
    3. imgSrcs:[]
    4. },
    5. loadSwiperImgs(){
    6. let that=this;
    7. wx.request({
    8. url: api.SwiperImgs,
    9. dataType: 'json',
    10. success(res) {
    11. console.log(res)
    12. that.setData({
    13. imgSrcs:res.data.images
    14. })
    15. }
    16. })
    17. },

    加入之后我们重新编译代码,发现报错了,错误信息如下:

    这样的问题是因为微信开发者程序默认是校验合法域名的,所以我们需要设置以下,如下:

    但是在此后,我们发现它又报了另一个错误,如下:

    这个问题是因为我们请求后台服务器时出现错误,但是我们并没有启动后台服务器,因为是用Mock模拟后台给前台响应数据,所以这里我们启用一下Mock就可以了,具体操作如下:

    JSON数据包代码如下:

    1. {
    2. "data": {
    3. "images":[
    4. {
    5. "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner1.png",
    6. "text": "1"
    7. },
    8. {
    9. "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner2.png",
    10. "text": "2"
    11. },
    12. {
    13. "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner3.png",
    14. "text": "3"
    15. },
    16. {
    17. "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner4.png",
    18. "text": "4"
    19. },
    20. {
    21. "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner5.png",
    22. "text": "5"
    23. },
    24. {
    25. "img": "https://cdn-we-retail.ym.tencent.com/tsr/home/v2/banner6.png",
    26. "text": "6"
    27. }
    28. ]
    29. },
    30. "statusCode": "200",
    31. "header": {
    32. "content-type":"applicaiton/json;charset=utf-8"
    33. }
    34. }

    然后我们重新编译代码,控制器效果图如下:

    到这里就算拿到我们的后台数据了。接着继续优化我们的代码,如下:

    在index.wxml中加入以下代码:

    1. <view>
    2. <swiper indicator-dots="true" autoplay="true" >
    3. <block wx:for="{{imgSrcs}}" wx:key="*text">
    4. <swiper-item>
    5. <image src=" {{item.img}}">image>
    6. swiper-item>
    7. block>
    8. swiper>
    9. view>

    模拟器展示效果如下:

    三、首页布局

    轮播图我们已经弄好了,接下来就是会议信息等代码了,如下:

    先在index.wxml中加入以下代码:

    1. <view class="mobi-title">
    2. <text class="mobi-icon">text>
    3. <text>会议信息text>
    4. view>
    5. <block wx:for-items="{{lists}}" wx:for-item="item" wx:key="item.id">
    6. <view class="list" data-id="{{item.id}}">
    7. <view class="list-img">
    8. <image class="video-img" mode="scaleToFill" src="{{item.image}}">image>
    9. view>
    10. <view class="list-detail">
    11. <view class="list-title"><text>{{item.title}}text>view>
    12. <view class="list-tag">
    13. <view class="state">{{item.state}}view>
    14. <view class="join"><text class="list-num">{{item.num}}text>人报名view>
    15. view>
    16. <view class="list-info"><text>{{item.location}}text>|<text>{{item.starttime}}text>view>
    17. view>
    18. view>
    19. block>
    20. <view class="section bottom-line">
    21. <text>到底啦text>
    22. view>

    然后在index.wxss中加入以下样式代码,如下:

    1. /* pages/index/index.wxss */
    2. .mobi-title{
    3. background-color: lightgray;
    4. padding: 10px;
    5. }
    6. .mobi-icon{
    7. border: 1rpx solid rgb(250, 126, 126);
    8. margin-right: 5px;
    9. }
    10. .mobi-title text{
    11. font-weight: 700;
    12. color: lightslategrey;
    13. }
    14. .list{
    15. display: flex;
    16. align-items: center;
    17. border-bottom: 3px solid lightgray;
    18. }
    19. .list-img{
    20. padding: 0 10px;
    21. }
    22. .video-img{
    23. height: 80px;
    24. width: 80px;
    25. }
    26. .list-title{
    27. font-weight: 700;
    28. margin: 3px 0;
    29. }
    30. .list-tag{
    31. display: flex;
    32. align-items: center;
    33. }
    34. .state{
    35. border: 2px solid lightblue;
    36. padding: 3px 6px;
    37. color: lightblue;
    38. margin: 0 5px 10px 0;
    39. }
    40. .join{
    41. color: lightgray;
    42. }
    43. .list-num{
    44. color: red;
    45. font-weight: 700;
    46. }
    47. .list-info{
    48. color: lightgray;
    49. font-size: 12px;
    50. }

    最后模拟器演示效果如下:


    最后微信小程序进阶——Flex弹性布局&轮播图&会议OA项目(首页)就到这里,祝大家在敲代码的路上一路通畅!

    感谢大家的观看 !

  • 相关阅读:
    巧用.bat批处理文件
    设计模式学习笔记 - 面向对象 - 5.接口和抽象类的区别
    igraph load 无法读取保存的graph attr
    资深程序员必备技能-如何对软件系统做技术规划
    yolov5剪枝实战1: 论文及yolov5剪枝实战项目介绍
    【QT】回调函数的实现
    通过mybatis-plus的自定义拦截器实现控制 mybatis-plus的全局逻辑删除字段的控制 (修改其最终执行的sql中的where条件)
    STM32的中断
    C语言中short和unsigned short的取值问题和计算机组成原理
    剑指Offer || 041.数据流中的移动平均值
  • 原文地址:https://blog.csdn.net/weixin_74263417/article/details/133881775