全栈开发学习(Node+Vue+Mongodb)(八)——移动端页面搭建(主页部分)

2023-10-27

前面我们完成了后台管理界面的基本功能,接下来就需要完成移动端页面的搭建与数据的展示。移动端的搭建主要以旧版王者荣耀官网主页样式为模板,本文主要介绍前端搭建的流程与一些基本组件的使用。

1 准备工作

  • 样式

    • 思路:使用SASS规范化我们的所有样式,安装:npm i -D sass sass-loader,并且将所有样式相关的内容放在style.scss中,再在main.js中应用

    • 样式重置

      /*reset*/
      *{
          box-sizing:border-box;
          outline: none;
       }
      html{
          font-size: 13px;
      }
      body{
          margin:0;
          font-family: Arial, Helvetica, sans-serif;
          line-height: 1.2em;
          background: #f1f1f1;
      }
      a{
          color: #999;
      }
      p{
          line-height: 1.5em;
      }
      
    • 色彩定义:主要分为字体颜色、背景颜色和边框色

      先定义好颜色变量

      $colors:(
          "primary":#db9e3f,
          "white":#fff,
         ...............
      );
      
      $border-color:map-get($colors, 'light-1' );  //边框色
      @each $colorKey,$color in $colors{
          .text-#{$colorKey}{   //字体颜色
              color:$color ;
          }
          .bg-#{$colorKey}{     //背景色
              background-color:$color;
          }
      }
      
    • 字体定义

      • 对齐方式

        //text-align
        @each $var in (left,center,right){
            .text-#{$var}{
                text-align: $var !important;
            }
        }
        
      • 字号

        @each $sizekey, $size in $font-sizes {
            .fs-#{$sizekey} {
             font-size: $size * $base-font-size;
            }
          }
        
      • 文字溢出

        //text-overflow
        .text-ellipsis{
            display: inline-block;
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;  //不要换行
        }
        
    • 边框定义

      //borders
      @each $dir in(top,right,bottom,left){
          .border-#{$dir}{
              border-#{$dir}:1px solid $border-color;
          }
      }
      
    • 通用flex布局定义

      • 设置弹性布局

        .d-flex{
            display: flex;
        }
        
      • 设置容器内元素的排列方向

        .flex-column{
            flex-direction: column; //垂直排列
        }
        
      • 设置容器内元素的换行

        .flex-wrap{
            flex-wrap: wrap; //元素换行
        }
        
      • 设置 元素在主轴(页面)上的排列

        @each $key, $value in $flex-jc {
          .jc-#{$key} {
            justify-content: $value;
          }
        }
        
      • 设置元素在主轴(页面)当前行的横轴(纵轴)方向上的对齐方式

        @each $key,$value in $flex-ai{
            .ai-#{$key}{
                align-items: $value;
            }
        } 
        
      • 设置自动拉伸

        .flex-1{
            flex:1;
        }
        .flex-grow-1{
            flex-grow: 1;
        }
        

      flex布局的具体使用详解参考文章:https://www.jianshu.com/p/d9373a86b748/

    • 按钮定义

    • 边距定义

      • margin

        @each $typeKey,$type in $spacing-types {
            //margin
            @each $directionKey,$direction in $spacing-directions{
                @each $sizeKey,$size in $spacing-sizes {
                     .#{$typeKey}-#{$sizeKey}{
                        #{$type}:$size*$spacing-base-size;
                     }
                    }
                }
             //margin-x,margin-y
                @each $sizeKey,$size in $spacing-sizes {
                     .#{$typeKey}x-#{$sizeKey}{
                        #{$type}-left:$size*$spacing-base-size;
                        #{$type}-right:$size*$spacing-base-size;
                     }
                     .#{$typeKey}y-#{$sizeKey}{
                        #{$type}-top:$size*$spacing-base-size;
                        #{$type}-bottom:$size*$spacing-base-size;
                     }
                    }
        
            //margin-top
            @each $directionKey,$direction in $spacing-directions{
                @each $sizeKey,$size in $spacing-sizes {
                     .#{$typeKey}#{$directionKey}-#{$sizeKey}{
                        #{$type}-#{$direction}:$size*$spacing-base-size;
                     }
                    }
                }
        }
        
      • padding 同上,只不过修改了$spacing-types为p

  • sprite图片

    使用在线图片定位工具:http://www.spritecow.com/,该工具可以获取一张大图中每个小图的位置信息

    根据获得色对图片的定义如下所示:

    &.sprite-news{
            width: 23px;
            height: 20px;
            background-position: 63.546% 15.517% ;
        }
    
  • iconfont字体图标

    在使用iconfont图标库里的图标时,将选用的图标集合下载,解压下载的文件夹并移入web/assets中

    使用图标方式:查看html文件,查看图标类名,直接在需要使用的地方引入该图标的类名

      <div class="iconfont icon-back text-blue-light" @click="$router.push('/')"></div>
  • 主页框架

    • 顶部提示条

      <div class="topbar bg-black py-2 px-3 d-flex ai-center" >
          <img src="../assets/images/logo.jpg" height="30">
        <div class="px-2 flex-1">
           <div class="text-white">王者荣耀</div>
           <div class="text-dark-1 fs-xs">团队成就更多</div>
         </div>
         <button type="button" class="btn bg-primary">立即下载</button>
        </div>
      
    • 导航栏

      <div class="bg-primary pt-3 pb-2">
          <div class="nav d-flex text-white jc-around pb-1" >
            <div class="nav-item active">
             <router-link to="/" class="nav-link" tag="div">首页</router-link>
            </div>
            <div class="nav-item">
             <router-link to="/" class="nav-link" tag="div">攻略中心</router-link>
            </div>
            <div class="nav-item">
             <router-link to="/" class="nav-link" tag="div">赛事中心</router-link>
            </div>
          </div>
        </div>
      

2 轮播图组件

  • 安装:github上搜索vue-swiper,执行 npm install vue-awesome-swiper --save

  • 全局引用与使用:

    //swiper组件
    import VueAwesomeSwiper from 'vue-awesome-swiper'
    import 'swiper/dist/css/swiper.css'  //引用样式
    Vue.use(VueAwesomeSwiper, /* { default global options } */)
  • 在Home组件中引用:

    <swiper :options="swiperOption">
          <swiper-slide>
            <img class="w-100" src="../assets/images/b9905b35bb0afa9050d9ddbe04d82d29.jpeg">
          </swiper-slide>
          <swiper-slide>
            <img class="w-100" src="../assets/images/210794580bb9303653804bb7b482f2a4.jpeg">
          </swiper-slide>
          <swiper-slide>
            <img class="w-100" src="../assets/images/ddc8c8922cbb694dfb73c86bb03fce22.jpeg">
          </swiper-slide>
        <div class="swiper-pagination pagination-home text-right px-3 pb-2" 
        slot="pagination"></div>
       </swiper>
    
    data(){
            return{
                 swiperOption: {
                   pagination: {
                   el: '.swiper-pagination'
                  }
               }, 
                newsCats:[],
                heroCats:[],
            }
        },
  • 小圆点的样式可以在该组件的样式下进行自定义

3 卡片组件

卡片组件在移动端使用得非常频繁,我们可以根据需求自定义组件的封装,给其他卡片组件作为一个公共的组件来复用。

定义全局组件,之后可以用m-card标签对其进行引用:

//card
import Card from './components/Card.vue'
Vue.component('m-card',Card)//定义全局组件

卡片组件的元素组成(可根据不同情况传入不同的参数达到复用的效果):

  • title(组件标题)
  • icon(组件图标)
  • plain(是否有“更多”的图标可供用户点击)
<div class="card bg-white p-3 mt-3 pb-3">
        <div class="card-header d-flex ai-center fs-lg "
         :class="{'border-bottom': !plain, 'pb-3': !plain}">
        <div class="border-bottom" v-if="!plain"></div>
            <i class="iconfont" :class="`icon-${icon}`"></i>
            <div class="fx-xl flex-1 px-2"><strong>{{title}}</strong></div>
            <i class="iconfont icon-menu1" v-if="!plain"></i>
        </div>
        <div class="card-body pt-3">
            <slot></slot>
        </div>
    </div>

4 列表卡片组件

列表卡片组件实际上就是在空白的卡片组件上进行一个扩展,其内部包含了m-card组件。同样也要对其进行全局的定义。

该组件具体的定义结构如下(此结构包含导航栏和列表轮播):

 <m-card :icon="icon" :title="title" >
       <div class="nav1 nav  jc-between">
        <div class="nav-item" :class="{active:active === i}"
        v-for="(category,i) in categories" :key="i"
        @click="$refs.list.swiper.slideTo(i)">
          <div class="nav-link">{{category.name}}</div>
        </div>
      </div>
      <div class="pt-3">
        <swiper ref="list"  :options="{autoHeight:true}" @slide-change="()=>active=$refs.list.swiper.realIndex">
        <swiper-slide v-for="(category,i) in categories" :key="i">
            <slot name="items" :category="category"></slot>
        </swiper-slide>
        </swiper>
      </div>
   </m-card>

在Main.vue中我们这样使用(其中包含可以点击跳转的文章列表链接,文章数据从后台获取):

<m-list-card icon="menu" title="新闻资讯" :categories="newsCats">
    <template #items="{category}">
      <router-link 
        tag="div"
        :to="`/articles/${news._id}`"
         class="py-2 d-flex" 
         v-for="(news,i) in category.newsList" :key="i">
            <span class="text-blue">[{{news.categoryName}}]</span>
            <span class="px-2">|</span>
            <span class="flex-1 text-dark-1 text-ellipsis pr-2">{{news.title}}</span>
            <span class="text-grey ">{{news.createdAt | date}}</span>
      </router-link>
    </template>
  </m-list-card>
  <!--end if 新闻资讯-->

5 其他细节问题

  • px转rem工具

    在扩展程序中搜索px to rem,安装; 安装完成后可以设置的默认字体大小,之后选中具体的数值,alt+z可转换为rem格式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全栈开发学习(Node+Vue+Mongodb)(八)——移动端页面搭建(主页部分) 的相关文章

随机推荐

  • Hadoop命令大全

    目录 基本语法 一 上传 二 下载 三 其他增删改查操作 3 1 增 3 2 删 3 3 改 3 4 查 基本语法 hadoop fs 和 hdfs dfs hadoop fs和hdfs dfs命令等效 hdfs dfs 只能操作HDFS文
  • FISCO-BCOS学习——区块链浏览器搭建

    注意 本系列文章遇到的问题都可以参考查找 官方文档 或 本系列问题总结 FISCO BCOS 及 WeBase 问题记录 FISCO BCOS 官方文档 WeBase 官方文档 FISCO BCOS区块链浏览器搭建 前提条件 环境 版本 J
  • STM32的HAL库SPI操作(master 模式)-根据时序图配置SPI

    SPI相关基础知识 SPI基本概念请自行百度 参考 百度百科SPI简介 我们讲重点和要注意的地方 master模式下要关注的地方 接线一一对应 也就是说主控的MISO MOSI SCLK CSn 分别和设备的MISO MOSI SCLK C
  • 数据清洗之朝阳医院2018年销售数据分析

    朝阳医院2018年销售数据分析 所用到的数据提取地址 gt 戳这里下载 或私我 过程 整体代码 导入库 import pandas as pd import numpy as np import matplotlib pyplot as p
  • STM32F103ZET6---【硬件篇】定时器

    STM32的TIM1 TIM8为高级定时器 TIM2 TIM3 TIM4 TIM5为通用定时器 TIM6 TIM7为基本定时器 各个定时器引脚如下 TIM1和TIM8定时器的功能包括 16位向上 向下 向上 下自动装载计数器 16位可编程
  • RealBasicVSR训练(三)用自己的数据集训练

    由于上一篇中的方法只能用1个gpu训练 故重新采取之前的训练方法 第一步 RealBasicVSR master mim train mmedit configs realbasicvsr wogan c64b20 2x30x8 lr1e
  • 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于HTML5的流浪动物领养平台yww0b

    很多大学生 成考 自考 全日制本科 大专的学生都因为毕设没有完成而延时毕业的情况 现在分享给大家选题 下面有2023年做的选题 最后面有选题 源码 论文下载网站给大家学习 如今计算机技术的飞速发展 大约三 四年前 软件工程是市场的热门领域
  • 电荷泵电路(Charge Pump)用于升压的解析

    升压的电荷泵电路 Charge Pump 也称为开关电容转换器 Switched Capacitor Converter 老粉丝都知道 公众号很久之前就发布了一篇阐述电感 电容 二极管构成的BOOST升压方案的文章 那为什么还要讨论电荷泵方
  • 小谈类机制相关

    小谈类机制相关 本文主要涉及类相关的一些常见面试问题 以及相关特性 包括 this 指针 拷贝构造函数相关以及类机制 一 this指针 编译器在编译普通成员函数时 会隐式的分配一个形参指针 即this指针 并且当实例化对象调用该成员函数时
  • Python 时间比较大小 并从dataframe中提取满足时间条件的量

    之前一直用时间数据相互加减然后判断是否大于0来判断大小 但是发现时间数据居然可以直接比较 Python 时间比较大小 可以直接用比较运算符 gt lt 输出bool类型 True False 先定义一个包含时间数据的dataframe t1
  • python None理解与应用

    官方文档 None是NoneType类型的唯一值 所以None既不是空列表 也不是空字符串 None通常用来代表空值 或者表示函数默认没有入参 如下图 None不能被赋值 否则会报错 它跟True False一样也是built in con
  • android Intent 全面点的介绍

    第一种方式 用action来跳转 1 使用Action跳转 如果有一个程序的AndroidManifest xml中的某一个Activity的IntentFilter段中 定义了包含了相同的Action那么这个Intent就与这个目标Act
  • Linux线程

    目录 1 进程线程区别 2 线程 创建退出等待 3 互斥量 锁 3 什么是死锁 4 条件 5 线程初始化宏 6 生产者消费者 1 进程线程区别 1 进程占内存 比如父子进程copy内存空间 线程共享内存空间 2 线程切换和创建速度比进程快
  • 主板24pin接口详图_工控电脑一般需要几个供电接口

    工控电脑也叫做工控机 是使用在工业上的计算机 由机箱 主板 CPU 内存 硬盘和电源等硬件设备所组成 既然工控电脑是计算机的一种 那它工作的时候肯定是需要供电才能启动 那么工控电脑一般需要几个供电接口 一定要说工控电脑一般需要几个供电接口
  • 雷军的开源情怀

    2007 年 iPhone 发布 智能手机时代真正拉开帷幕 2009 年 Google 发布了开源的手机操作系统 Android 同年 9 月 第一款 Android 手机 G1 发布 尽管当时 Android 手机体验还很粗糙 但我认为
  • (MySql) InnoDB索引的本质和快速查询过程

    本文涉及的范围包括 1 到底什么是InnoDB引擎的索引 它的本质是什么 是如何实现的 实现的思路是什么 2 根据索引的实现思路 当我们要查询一条数据 行记录 时 查询语句的查询过程是什么 说到数据库引擎的索引 我们都知道它的作用是提高数据
  • MATLAB 中的randn函数

    matlab函数 randn 产生正态分布的随机数或矩阵的函数 randn 产生均值为0 方差 2 1 标准差 1的正态分布的随机数或矩阵的函数 用法 Y randn n 返回一个n n的随机项的矩阵 如果n不是个数量 将返回错误信息 Y
  • ESP8266和腾讯云的使用

    1 ESP8266简介 在乐鑫官网 ESP芯片技术厂家 可以看到 乐鑫把ESP8266称之为面向物联网应用的高性价比 高度集成的 Wi Fi MCU 简单来说 ESP8266可以有两种功能 一是WiFi模块 二是32位MCU WiFi模块
  • 向量与矩阵的相乘

    在学习计算机图形学的时候 最常遇到的就是矩阵的乘法了 下面我们就简单的介绍下 使用程序如何编写两个矩阵的相乘呢 其实这个问题 大一的孩子都会写的 不是很难的 但是呢 为了构建一个完整的学习过程 还是记录一下基础知识 1 向量乘以矩阵 如上图
  • 全栈开发学习(Node+Vue+Mongodb)(八)——移动端页面搭建(主页部分)

    前面我们完成了后台管理界面的基本功能 接下来就需要完成移动端页面的搭建与数据的展示 移动端的搭建主要以旧版王者荣耀官网主页样式为模板 本文主要介绍前端搭建的流程与一些基本组件的使用 1 准备工作 样式 思路 使用SASS规范化我们的所有样式