5.构建项目

5.构建项目

5.1 构建项目的基本结构

5.构建项目

 

安装重置样式表

yarn add normalize.css -S
// src/main.js 引入重置样式表
import Vue from 'vue'
import App from './App.vue'
import './registerServiceWorker'
import router from './router'
import store from './store'
// 引入重置样式表 yarn add normalize.css -S
import 'normalize.css/normalize.css'
​
Vue.config.productionTip = false
​
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
​

调整 src/App.vue ---- 主界面

按照上图布局

<template>
  <!-- div.container>div.box>header.header+div.content -->
  <div class="container">
    <div class="box">
      <header class="header">header</header>
      <div class="content">content</div>
    </div>
    <footer class="footer">footer</footer>
  </div>
</template>
<script>
export default {
​
}
</script>
​
<style lang="stylus">
html, body, .container
  height 100%
​
// 设置rem的基准值
html
  font-size 100px // 1rem = 100px
​
// 重置页面中的字体大小
body
  font-size 12px // 取决于设计稿中的最小的使用最多的字体的大小
// 移动端布局主要使用弹性盒布局
.container
  // 竖直方向弹性盒
  display flex
  flex-direction column
  .box
    flex 1
    display flex
    flex-direction column
    .header
      height 0.44rem
      background-color #ff6666
    .content
      flex 1
      overflow  auto // 内容高度大于目前屏幕的高度产生滚动条
  .footer
    height 0.5rem
    background-color #efefef
</style>
​

构建css - 预处理器 - stylus。---- 不要忘记审查元素

弹性盒布局:主流 - 默认 水平方向,可以调整为垂直方向

媒体查询:确定 横屏 还是 竖屏

<template>
<!-- div.container>div.box>header.header+div.content -->
<div class="container">
 <div class="box">
   <header class="header">header</header>
   <div class="content">content</div>
 </div>
 <footer class="footer">footer</footer>
 <div class="tip">请将屏幕竖向浏览</div>
</div>
</template>
<script>
export default {
​
}
</script>
​
<style lang="stylus">
html, body, .container
height 100%
​
// 设置rem的基准值
html
font-size 100px // 1rem = 100px
​
// 重置页面中的字体大小
body
font-size 12px // 取决于设计稿中的最小的使用最多的字体的大小
// 移动端布局主要使用弹性盒布局
.container
// 竖直方向弹性盒
display flex
flex-direction column
// 设置两边留白 ++++++++++++++++++++++++++++++++++++++++++++++++++++
max-width 1080px
margin 0 auto
.box
 flex 1
 display flex
 flex-direction column
 .header
   height 0.44rem
   background-color #ff6666
 .content
   flex 1
   overflow  auto // 内容高度大于目前屏幕的高度产生滚动条
.footer
 height 0.5rem
 background-color #efefef
.tip //  ++++++++++++++++++++++++++++++++++++++++++++++++++++
position fixed
top 0
left  0
right 0
bottom  0
background rgba(0, 0, 0, 0.5)
color #ffffff
font-size 30px
font-weight bold
display none // 默认不显示
justify-content center
align-items center
​
@media all and (orientation landscape) //  ++++++++++++++++++++++++++++++++++++++++++++++++++++
.tip
 display flex // 显示
</style>
​

rem布局:自适应

rem布局根据页面html根节点的字体的大小的改变而改变,比如设置html根节点的字体大小 为100px,那么以后你就可以理解为1rem=100px
rem布局根据页面当前节点的父节点的字体的大小的改变而改变,比如设置当前节点的父节点的字体大小 为100px,那么以后你就可以理解为1em=100px ---- 一般不推荐使用
​
**字体的大小具有继承性父元素的字体大小会继承到子元素,所以设置了html的字体大小后,一定要在body元素上修正字体大小**
​
引入布局方案中的 vw布局
<template>
<!-- div.container>div.box>header.header+div.content -->
<div class="container">
 <div class="box">
   <header class="header">header</header>
   <div class="content">content</div>
 </div>
 <footer class="footer">footer</footer>
 <div class="tip">请将屏幕竖向浏览</div>
</div>
</template>
<script>
export default {
​
}
</script>
​
<style lang="stylus">
html, body, .container
height 100%
​
// 设置rem的基准值
html
// font-size 100px // 1rem = 100px
// 如果设计稿是以 iphone6 为基础设计的,那么 设置为  100 / 375 * 100 = 26.6666666vw
// 如果设计稿是以 iphone5 为基础设计的,那么 设置为  100 / 320 * 100 = 31.25vw
font-size 26.6666666vw // +++++++++++++++++++++++++++++++++++++++++
​
@media all and (min-width 960px) // +++++++++++++++++++++++++++++++++++++++++
html
 font-size 100px
​
// 重置页面中的字体大小
body
font-size 12px // 取决于设计稿中的最小的使用最多的字体的大小
// 移动端布局主要使用弹性盒布局
.container
// 竖直方向弹性盒
display flex
flex-direction column
// 设置两边留白
max-width 1080px
margin 0 auto
.box
 flex 1
 display flex
 flex-direction column
 .header
   height 0.44rem
   background-color #ff6666
 .content
   flex 1
   overflow  auto // 内容高度大于目前屏幕的高度产生滚动条
.footer
 height 0.5rem
 background-color #efefef
.tip
position fixed
top 0
left  0
right 0
bottom  0
background rgba(0, 0, 0, 0.5)
color #ffffff
font-size 30px
font-weight bold
display none // 默认不显示
justify-content center
align-items center
​
@media all and (orientation landscape)
.tip
 display flex // 显示
</style>
​

5.2 构建项目的基本页面

创建首页,分类,购物车,我的 四个基本页面 --- 文件最后一行要添加空行

5.构建项目

 

5.3 配置 基本路由

如果多次使用的组件,推荐 先引入后调用

如果只使用一次,推荐使用懒加载

如果需要分割代码,/* webpackChunkName: "about" */ yarn build 体验

// src/router/index.js
import Home from '../views/Home.vue'
// path name component 。。。。。
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home // 先引入,然后再调用
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    // 路由的懒加载 --- 需要的时候再加载 /* webpackChunkName: "about" */
    // /* webpackChunkName: "about" */ 可以通过  运行 yarn build 之后 dist/js 观察变化
    component: () => import(/* webpackChunkName: "about" */'../views/About.vue')
  }
]

转换为如下代码

import Vue from 'vue'
import VueRouter from 'vue-router'
​
import Home from '../views/home/index.vue'
import Kind from '../views/kind/index.vue'
import Cart from '../views/cart/index.vue'
import User from '../views/user/index.vue'
​
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location) {
  return originalPush.call(this, location).catch((err) => err)
}
​
Vue.use(VueRouter)
​
const routes = [
  {
    path: '/home',
    name: 'home',
    component: Home
  },
  {
    path: '/kind',
    name: 'kind',
    component: Kind
  },
  {
    path: '/cart',
    name: 'cart',
    component: Cart
  },
  {
    path: '/user',
    name: 'user',
    component: User
  }
]
​
const router = new VueRouter({
  mode: 'hash',
  base: process.env.BASE_URL,
  routes
})
​
export default router
​

5.4 添加路由组件渲染容器到对应组件中

<template>
  <!-- div.container>div.box>header.header+div.content -->
  <div class="container">
    <!-- <div class="box">
      <header class="header">header</header>
      <div class="content">content</div>
    </div> -->
    <router-view></router-view>
    <footer class="footer">footer</footer>
    <div class="tip">请将屏幕竖向浏览</div>
  </div>
</template>

浏览器访问。/home /kind /cart /user 分别查看效果

发现当用户什么也不输入的时候,显示不正常 ----- 什么都不输入,来一个默认的跳转地址

5.5 路由的重定向 以及 404页面

路由的匹配时从上到下匹配

// views/error/notFound.vue
<template>
  <div class="box">
    <header class="header">404 header</header>
    <div class="content">404 content</div>
  </div>
</template>
​

import Vue from 'vue'
import VueRouter from 'vue-router'
​
import Home from '../views/home/index.vue'
import Kind from '../views/kind/index.vue'
import Cart from '../views/cart/index.vue'
import User from '../views/user/index.vue'
​
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location) {
  return originalPush.call(this, location).catch((err) => err)
}
​
Vue.use(VueRouter)
​
const routes = [
  {// ++++++++++++++++++++++++++
    path: '/', // 路由的重定向 
    redirect: '/home'
  },
  {
    path: '/home',
    name: 'home',
    component: Home
  },
  {
    path: '/kind',
    name: 'kind',
    component: Kind
  },
  {
    path: '/cart',
    name: 'cart',
    component: Cart
  },
  {
    path: '/user',
    name: 'user',
    component: User
  },
  {// ++++++++++++++++++++++++++
    path: '*', // 404   ----   路由懒加载  ---- 一般用不到
    component: () => import(/* webpackChunkName: 'error' */'../views/error/notFound.vue')
  }
]
​
const router = new VueRouter({
  mode: 'hash',
  base: process.env.BASE_URL,
  routes
})
​
export default router
​

5.6 设计页面底部的导航并且跳转路由

打开 图标库 -> 选择图标-> 加入购物车->点击购物车-> 添加至项目-> font-class

打开public/index.html ---- iconfont 官网目前搞事情 --- 字体的协议改成 https

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
    <link rel="stylesheet" href="//at.alicdn.com/t/font_3120366_9utchxxpyz.css">
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
​

App.vue

<template>
  <!-- div.container>div.box>header.header+div.content -->
  <div class="container">
    <!-- <div class="box">
      <header class="header">header</header>
      <div class="content">content</div>
    </div> -->
    <router-view></router-view>
    <footer class="footer">
      <ul>
        <router-link to="/home" tag="li">
          <span class="iconfont icon-shouye"></span>
          <p>首页</p>
        </router-link>
        <router-link to="/kind" tag="li">
          <span class="iconfont icon-fenlei"></span>
          <p>分类</p>
        </router-link>
        <router-link to="/cart" tag="li">
          <span class="iconfont icon-gouwuche"></span>
          <p>购物车</p>
        </router-link>
        <router-link to="/user" tag="li">
          <span class="iconfont icon-My"></span>
          <p>我的</p>
        </router-link>
      </ul>
    </footer>
    <div class="tip">请将屏幕竖向浏览</div>
  </div>
</template>
<script>
export default {
​
}
</script>
​
<style lang="stylus">
html, body, .container
  height 100%
​
// 设置rem的基准值
html
  // font-size 100px // 1rem = 100px
  // 如果设计稿是以 iphone6 为基础设计的,那么 设置为  100 / 375 * 100 = 26.6666666vw
  // 如果设计稿是以 iphone5 为基础设计的,那么 设置为  100 / 320 * 100 = 31.25vw
  font-size 26.6666666vw
​
@media all and (min-width 960px)
  html
    font-size 100px
​
// 重置页面中的字体大小
body
  font-size 12px // 取决于设计稿中的最小的使用最多的字体的大小
// 移动端布局主要使用弹性盒布局
.container
  // 竖直方向弹性盒
  display flex
  flex-direction column
  // 设置两边留白
  max-width 1080px
  margin 0 auto
  .box
    flex 1
    display flex
    flex-direction column
    .header
      height 0.44rem
      background-color #ff6666
    .content
      flex 1
      overflow  auto // 内容高度大于目前屏幕的高度产生滚动条
  .footer
    height 0.5rem
    background-color #efefef
    ul
      list-style none
      height 100%
      display flex
      margin 0
      padding 0
      li
        flex 1
        height 100%
        display flex
        flex-direction column
        justify-content center
        align-items center
​
        &.router-link-active
          color #f66
        span
          font-size 0.20rem
        p
          font-size 12px
          margin 0
          margin-top  5px
.tip
  position fixed
  top 0
  left  0
  right 0
  bottom  0
  background rgba(0, 0, 0, 0.5)
  color #ffffff
  font-size 30px
  font-weight bold
  display none // 默认不显示
  justify-content center
  align-items center
​
@media all and (orientation landscape)
  .tip
    display flex // 显示
</style>
​
上一篇:Html5 打砖块游戏,加入道具和速通模式(含源码)


下一篇:浏览器是怎么对HTML5的离线存储资源进行管理和加载的呢