Vue2.5仿去哪儿app 实战项目笔记
移动端适配 项目目录结构 轮播图 样式穿透 px与rem
参考页面:去哪儿网
效果演示:
项目展示:
仿去哪儿网-Vue.js移动webApp
移动端的适配
- 引入
reset.css
在进行页面开发的时候,需对css进行一些初始化的设置与重设,通过
reset.css
把浏览器提供的默认样式覆盖掉,统一不同浏览器的默认样式。 -
安装、使用stylus
Stylus 是一个CSS的预处理框架,可以创建健壮的、动态的、富有表现力的CSS。 Stylus默认使用 .styl 的作为文件扩展名,支持多样性的CSS语法。
安装:
npm install stylus
使用:
<style lang="stylus" scoped>
-
scoped的样式穿透
vue组件中的style标签标有scoped属性时,表明style里的css样式只适用于当前组件元素.
<style lang="stylus" scoped>
-
使用
varibles.styl
对于频繁使用的样式,可在varibles.styl
中定义,如$bgColor = #00bcd4
在其他css文件中,直接使用样式名即可生效。
@import '~styles/varibles.styl'
color: $dark-text-color
- 关于CSS中,px、em、rem的区别
本项目中使用rem,因为rem更能适配多种移动设备。
在reset.css
中,通过设置html:{fontsize:50px}
。所以1rem = html font-size =50px。
对于一个大小为86px的图片,因为原始图片都为二倍尺寸,故应为43px即0.86rem。这样,就使得一个原始像素1px=0.01rempx像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。
em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。
rem为元素设定字体大小时,仍然是相对大小,但相对的只是HTML根元素。
项目目录结构
路由配置
在router目录下的index.js中,对每一个页面进行配置
import home from '@/pages/home/home.vue'
export default new Router({
routes: [
{
path: '/',
name: 'home',
component: home
},
{
...
}
]
})
main.js
配置
在main.js
中,应该对项目所引进的所有依赖包进行import
例如:
import Vue from 'vue'
import App from './App'
import fastClick from 'fastClick'
import router from './router'
import 'styles/reset.css'
import 'styles/border.css'
import 'styles/iconfont.css'
import VueAwesomeSwiper from 'vue-awesome-swiper'
import 'swiper/dist/css/swiper.css'
组件化开发
在/src/pages
下,包括了项目中的所有页面。
对于Vue来说,可使用组件化开发,即将页面分为若干个小的,可复用的组件。
即每一个页面都包括了一个组件目录,一个整体vue页面。
在每一个组件页面中,进行组件的声明
<script>
export default {
name: 'homeHeader'
}
</script>
在整体页面中,import所有组件
<script>
import homeHeader from './components/header.vue'
import homeSwiper from './components/swiper.vue'
import homeIcons from './components/icons.vue'
export default {
name: 'home',
components: {
homeHeader,
homeSwiper,
homeIcons
}
}
</script>
并且使用组件名称,进行代码编写
<template lang="html">
<div class="">
<home-header></home-header>
<home-swiper></home-swiper>
<home-icons></home-icons>
</div>
</template>
组件中的data必须是函数
每个组件都是互相独立的,如果它们共用一个对象,在更改一个组件数据的时候,会影响其它组件。
如果是函数的话,每个组件都有都是又自己独立的数据,互相不会影响。
data() {
return {
...
}
}
轮播图
- 使用Vue-Awesome-Swiper插件
npm install vue-awesome-swiper@2.6.7 --save
- 在swiper组件中,定义
<div class="wrapper">
<!--最外层的div标签,是为了防止页面加载时间形成闪烁-->
<swiper :options="swiperOption">
<swiper-slide v-for="item of swiperList" :key='item.id'>
<img class="swiper-image" :src="item.imgUrl">
</swiper-slide>
<div class="swiper-pagination" slot="pagination"></div>
<!--pagination为轮播图下方的小圆点,并且所有的slot都需要在data中定义 -->
</swiper>
</div>
并在该组件的data中,定义
data () {
return {
swiperOption: {
pagination: '.swiper-pagination',
loop: true
//循环
},
swiperList: [{
id: '0001',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1806/de/df09fa61aed2d502.jpg_750x200_67472739.jpg'
}, {
id: '0002',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1808/5e/514ce60160e62602.jpg_750x200_9b0074e2.jpg'
}, {
id: '0003',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1807/66/e5a5cec881702f02.jpg_750x200_67bb5691.jpg'
}]
}
}
轮播图下的小圆点
默认样式的滚动小圆点是蓝色的,若想将其改为白色,第一反应是将其通过css改变样式。
.swiper-pagination-bullet-active:{
color: #fff;
}
经过运行后发现颜色没有改变,仍然为蓝色。 这是因为在css中,声明了scoped,使得该组件的css只能修饰当前组件样式,不会对其他组件产生任何的影响。而swiper-pagination实际是在swiper组件里的。 所以如果直接声明其样式,是不会起效果的。
样式穿透
当在组件中额外引用第三方组件时,若需要在组件中局部修改第三方组件的样式,而又不想去除scoped属性造成组件之间的样式污染。此时只能通过特殊的方式,穿透scoped。
.wrapper >>> .swiper-pagination-bullet-active
background: #fff
高度自适应
在进行页面加载时,通常文字比图片先加载出来。一开始,图片没有加载时高度是0,加载完才会把它撑开,所以会产生图片加载完成前后文字的位置改变,用户会有明显的抖动感。
解决方法:
在图片的最外层加一个div标签,并且使其高度自适应。
.wrapper
width: 100%
height:0
overflow: hidden
padding-bottom: 26.5%
.swiper-image
width:100%