前端基础之《Vue(20)—移动端REM布局》
摘要:WebApp是一种交互类似App但无需安装的H5页面。移动端布局方案包括rem、vw/vh等相对单位布局,不使用绝对单位px。通过rem.js动态设置根字体大小(屏幕宽度的1/10),实现适配不同屏幕。CSS中rem单位基于根字体尺寸,em基于父元素字体。UI稿尺寸转换示例(如750px→10rem),推荐使用pxtorem插件简化计算。文中还介绍了布局类型比较和常用CSS单位。
一、什么是webapp
1、长的像app,交互也像app的H5页面。
webapp不是App,不需要安装,手机网页直接打开。
二、移动端web的布局方案
1、例如:rem布局、vw/vh布局、flexible布局。
推荐使用rem布局,解决不同手机之间的样式兼容性问题。
2、原因
手机像素密度不一样,屏幕宽度、屏幕分辨率不一样。
在移动端写样式一般不用px做单位,px是绝对单位,要用相对单位去做。
3、rem.js
// 作用:重置html的font-size大小
// 让html根字体的大小,等于当前屏幕px像素的10分之1
function resetRootFZ() {
// 1.通过dom操作,找到html
var oHtml = document.querySelector('html')
// 2.获取这个html的宽度
var w = oHtml.getBoundingClientRect().width // px(当前屏幕的总宽度)
// 3.设置根字体的大小等于html节点的宽度的十分之一
oHtml.style.fontSize = w/10 + 'px'
}
// 调用这个方法
resetRootFZ()
// 当window窗口尺寸变化时,重新设置根字体的大小
window.addEventListener('resize', function(){
// 屏幕发生resize事件,重新设置根字体
resetRootFZ
})
4、在index.html的<head>引入
<script src="./rem.js"></script>
5、比较
(1)类型一
(2)类型二
6、css的单位
(1)rem: root font size
.box {
width: 2rem;
}
宽度是html根字体的两倍。
(2)em: 相对于最近一个父元素的fontSize
(3)px: 绝对单位
(4)vw vh
三、UI稿量尺寸
1、量稿子的单位是px
2、例如:移动端的UI稿,一个轮播图,宽度是750px,高度是352px
3、352px怎么转换成rem
750px对应10rem,352px则是:352*10/750 = 352/75
4、vscode里面,以后计算用插件“px to rem”
四、移动端组件库
1、ToC项目样式复杂,有设计稿,组件往往很难自己实现,引入第三方开源组件
2、vant-ui2是经典的移动端组件库,PC端不能用
3、安装
yarn add vant@latest-v2
4、按需加载组件
yarn add babel-plugin-import -D
安装成功后记录在package.json中,-D表示加到devDependencies环境需要的包中
dependencies:表示src代码目录中需要的包
devDependencies:表示环境中需要,src中用不到
5、配置按需加载组件
babel.config.js
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
],
// 支持vant-ui组件的按需加载
plugins: [
['import', {
libraryName: 'vant',
libraryDirectory: 'es',
style: true
}, 'vant']
]
}
6、按需导入代码
上线打包时,都建议按需求导入。一个一个导入并注册。
// 按需导入
import { Button } from 'vant'
Vue.use(Button)
7、本地开发
为了提高开发效率,不按需加载,先一次性注册。
// 本地开发
import Vant from 'vant'
import 'vant/lib/index.css'
Vue.use(Vant)
五、分析页面
1、按组件分析页面
搜索框
品类轮播图
商品轮播图
商品列表(懒加载,类似瀑布流,分页查询)
底部tabbar导航
2、外页内页
外页:通过tabbar、或者菜单就能访问到的页面
内页:在菜单上点不到,通过某些交互进去的,比如商品详情
六、代码方式组织
1、在src/components目录(公共组件目录)下建一个index.js
import JDtabbar from "./tabbar/JDtabbar.vue"
export {
JDtabbar
}
把所有的公共组件都放在这个目录中,统一的导入、导出:
import { JDtabbar } from '@/components'
路径中@表示src目录。
2、只有某个页面用到的组件,则在该页面下建立components目录
例如:src/pages/home/components
七、CSS处理
1、安装sass编译器
yarn add sass -D
yarn add sass-loader -D
八、栅格系统
1、Layout布局
栅格系统默认把当前row所占的屏幕分成24等份
2、栅格系统里row标签里只能放col标签,所以其他标签要么放在row外面,要么放在col里面
九、小技巧
(1)<template></template>标签中是单节点,一定要加一层<div></div>
(2)浏览器字体最小是12px
(3)导入方式
// 模块化导入
import { JDtabbar } from '@/components'
// 直接导入文件
import NoticeBar from './components/NoticeBar.vue'
(4)改变背景、颜色,能用属性解决就尽量不要用css样式
(5)改变组件结构,常识是用插槽
(6)如果要用插槽,组件标签要改成双闭合标签
(7)插槽建议用template标签包起来
例如:
<template #right-icon>
<div>xxxxxx</div>
</template>
(8)<style lang="scss">
lang="scss"表示可以使用scss代码
(9)scoped
<style lang="scss" scoped>,scoped属性是一个布尔值,等于真。scoped表示局部样式,这个样式只在当前组件中起作用
(10)组件样式可以用多个style
组件的样式用全局的,自己的样式用scpoed
(11)多个插槽是没有顺序的,随便放
(12)自定义事件是父组件传个事件给子组件,子组件通过emit触发
(13)存储本地数据
写数据:localStorage.setItem('noticeFlag', this.show)
读数据:localStorage.getItem('noticeFlag')
读出的数据格式都是string,布尔值要转换JSON.parse(xxx)
(14)组件内部居中,修改margin(外边距)
margin: 0 auto;
margin上下等于0,左右等于auto。
(15)子组件之间是有顺序的
<NoticeBar v-model='show'></NoticeBar>
<AdSwipe></AdSwipe>
<JDtabbar></JDtabbar>
(16)静态组件可以自己写,有交互感的组件一般不能自己写
(17)组件外面套一层div是二次封装
(18)改组件库的样式,先用全局,再用局部,看看有没有影响
因为很多组件库的样式用全局才能改,局部改不动
(19)ui设计师说你做的不好,在公司是不能打架的
(20)为什么商品列表用计算属性
商品列表是父组件调接口传过来的,对父组件props做计算
(21)有些组件复制不了,必须把逻辑搞明白
(22)拆解项目的能力,基础知识点的能力当成常识,表达能力
(23)扁平化开发:能用符号的尽量用符号,不要用文字
(24)浏览器上是模拟器,如何真机调试,用手机和电脑连同一个WIFI,手机访问http://IP:8080
(25)padding去掉后,就可以加行高和居中
(26)为什么display: block前面会空出来
display: block 元素会占据整行空间,其前后会自然换行,因此会在元素前产生空白
(27)只要是从列表页面进入到详情页面,一定涉及传参
(28)移动端跳转,可以绑以下几个事件
@click
@touchstart、@touchmove、@touchend
更多推荐
所有评论(0)