移动端开发基础总结
移动端学习总结 (适合于复习)
移动端基础
技术选型:
-
单独制作移动端页面(主流)
- 流式布局(百分比布局)
flex弹性布局(强烈推荐)less+rem+媒体查询布局- 混合布局
-
响应式页面兼容移动端(其次)
- 媒体查询
BootStrap
meta视口标签
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalabel=no, maximum-scale=1.0, minimum-scale=1.0">
一些特殊样式:
/*CSS3盒子模型*/
box-sizing: border-box;
-webkit-box-sizing: border-box;/*点击高亮我们需要清除,设置为transparent透明色*/
* {-webkit-tap-highlight-color: transparent;
}/*移动端浏览器IOS,加上这个属性才能给按钮和输入框自定义样式*/
input {-webkit-appearance: none;
}/*禁用长按页面时的弹出菜单*/
img, a {-webkit-touch-callout: none;
}
less基础
Less(Leaner Style Sheets 的缩写)是一种向后兼容的 CSS 语言扩展。 这是 Less 语言和 Less.js 的官方文档,Less.js 是将 Less 样式转换为 CSS 样式的 JavaScript 工具。
因为 Less 看起来就像 CSS,所以学习起来很容易。 Less 只对 CSS 语言做了一些方便的补充,这也是它可以学得这么快的原因之一。
less安装
安装less
npm install less -g查看安装版本
lessc -v编译less文件
lessc style.less style.cssvscode安装easy less插件
保存就会自动编译为css文件vscode安装插件cssrem,可以让px单位自动转换为rem单位
当让我们需要在 设置 -> 拓展设置 -> cssRem config -> 修改默认的根字体大小 (也就是你的设计稿尺寸/划分的份数)
less变量
@变量名:值;
命名规范:
- 必须有
@为前缀 - 不能包含特殊字符
- 不能以数字开头
- 大小写敏感
@color: rgb(0, 0, 0);
@height: 200px;
@baseFont: 50px;div {background-color: hotpink;height: @height;color: @color;
}
less嵌套和计算
/*最新版的less在使用除法运算时,需要加 英文括号 或者使用 ./ */
* {padding: 0; margin: 0 auto;}
html {font-size: @baseFont}
//less嵌套
.outer {font-size: 16px;height: 6rem;width: (300rem / @baseFont);//width: 300rem ./ @baseFont;margin: 0 auto;border: 1px solid antiquewhite;background-color: olive;border-radius: 10%;padding: 10px;.inner {background-color: #9198e5;height: 1rem;width: 50px;margin: 0 auto;border-radius: 10%;text-align: center;a {color: @color;display: inline-block;text-decoration: none;transition: all 0.2s linear;//给a标签添加鼠标悬浮样式&:hover {color: #ff96ce;transform: scale(1.2);}}//给inner类添加鼠标悬浮样式&:hover {}}
}
布局方式
流式布局
也就是百分比布局,你想让这个元素占用父元素的多大宽度,直接设置相应的宽度百分比即可
优点:
优点很明显,可以适应屏幕宽度的变化,父盒子宽度的变化,自身的宽度也会相应的去改变,避免了留白
缺点:
因为宽度是由百分比来定义的,高度和文字大小使用px来设定的,所以在大屏幕的手机下显示效果会变成有些页面元素宽度被拉的很长,但是高度﹑文字大小还是和原来一样(即,这些东西无法变得“流式”),显示非常不协调
媒体查询
语法规范:
- 用
@media开头,注意@符号 mediatype媒体类型(screen、print)- 关键字
and、not、only media feature媒体特性,要有括号包裹
示例:
嵌入在<style>标签里面:
@media screen|print and|not|only (max-width=320px) {}
引入资源:
<!--在符合这个媒体条件时引入相应的样式文件-->
<link rel="stylesheet" href="index.css" media="screen and (min-width=750px)">
通过媒体查询改变html font-size大小,从而实现页面使用rem为单位的元素也相应的缩放改变,从而实现适配不同宽度的设备
简单地例子:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>* {padding: 0;margin: 0 auto;}html, body {font-size: 50px;}.outer {height: 500px;width: 500px;background-color: khaki;border: 1px solid cadetblue;border-radius: 5%;padding: 5px;}.inner {height: 2rem;width: 2rem;background-color: #e66465;}/*当屏幕宽度大于等于900px时,应用以下样式,配合html根元素的font-size的大小改变,使用rem单位的元素大小也会相应的变化*/@media screen and (min-width: 700px) {.inner {background-color: linen;}html {font-size: 70px;}}@media screen and (min-width: 800px) {.inner {background-color: #f5bb84;}html {font-size: 100px;}}@media screen and (min-width: 900px) {.inner {background-color: #ef7b05;}html {font-size: 120px;}}</style>
</head>
<body>
<div class="outer"><div class="inner"></div>
</div>
</body>
</html>
flex弹性布局
通过设置元素的display属性为flex(块状元素)或者inline-flex(内联元素),便可以将一个盒子指定为伸缩盒子,其子元素也都便成为伸缩项目,子元素的float、clear和vertical-align属性将失效, 伸缩子元素也可通过设置display:flex指定成伸缩盒子,也就是伸缩盒子可以嵌套 。
注意:并不是所有的浏览器都能支持伸缩盒子,IE11+、Firefox20.0+、Opera12.1+、Chrome21.0+以及Safari6.1+能支持。
父元素所具有的属性
1. 主轴方向flex-direction: row (default) / column / row-reverse / column-reverse2. 主轴排列方式justify-content: flex-start (default) / flex-end / center / space-between / space-around / space-evenly3. 纵轴排列方式(针对纵轴只有单行有效)align-items: flex-start / flex-end / center / stretch(default) / space-between / space-around / baselinestretch:子元素未设置高度或者是高度为auto,那么,子元素将被拉伸以适应容器,是默认值4. 纵轴排列方式(针对纵轴有多行有效)align-content: flex-start / flex-end / center (default) / space-between / space-around / space-every5. 主轴宽度不够是否可以换行(默认不可换行)flex-wrap: wrap / no-wrap (default) / wrap-reverse6. 复合属性简化 主轴方向 和是否 可换行flex-flow: flex-direction flex-wrap
子元素所具有的的属性
1. 子项顺序order: 0(默认)
用整数值来定义伸缩容器子元素的排列顺序,默认是0,可以为负值,数值越小越排在前面2. 子项伸缩复合属性flex: 0 (默认) / 自己可以给各个子项划分份数来达到自定义布局的需求3. 子项自身纵向排布(默认继承align-items的值,单独设置覆盖,此时局域底部)align-self: flex-start / flex-end / center
rem布局
先来聊聊 em 和 rem 的区别
em相对于父元素的fontsize大小来设置大小的,设置的值为父元素的fontsize大小的几倍
em参考的是它的父级font-size大小
rem参考的是html根元素的font-size大小
rem实际开发适配方案
- 根据设备宽度的不同,动态的计算并设置
html根标签的font-size大小(可以使用媒体查询在到达某个宽度值时,设置对应的font-size;也可以使用flexible.js) CSS中,设计稿元素的宽、高相对位置等的取值,按照同等比例换算为rem为单位的值(配合less的计算可以很方便)
rem实际开发适配方案1
原理:动态设置html根标签的 font-size 大小
- 假设给定的设计稿是
750px - 我们可以把整个屏幕划分为
15等分(划分标准不一,也可以是20份或10份都可以) - 每一份作为
html字体的大小,这里就是750px / 15 = 50px - 那么在
320px设备的时候,字体大小就是320 / 15 = 21.33px - 用我们页面元素的大小(
document.documentElement.clientWidth)除以不同的html字体大小会发现他们比例还是相同的
比如我们以750为标准设计稿:
- 一个100*100像素的页面元素在750屏幕下,就是100/50 = 2rem => 2rem * 2rem比例是1:1
- 在320屏幕下,html的字体大小为21.33则2rem = 42.66px,此时宽高都是2rem = 42.66px,宽高仍是1:1
- 可以实现在不同屏幕下页面元素盒子等比缩放的效果
元素大小取值方法
最后的公式:页面元素的rem值 = 页面的宽度 / (屏幕宽度 / 划分的份数)
屏幕宽度/划分份数就是html font-size的大小
也就是:页面元素的rem值 = 页面的宽度 / html font-size字体大小
市场主流rem适配方案
-
rem+less+ 媒体查询
-
flexible.js+rem
两种方案都存在,方案二更简单。
flexible.js
手机淘宝团队开发的简洁高效 移动端适配库
我们咋也不需要写不同屏幕的媒体查询,因为js里面做了处理
原理:
把当前设备的宽度划分为10等份,根据不同的设备的宽度尺寸来改变html font-size的大小,从而来达到页面元素随之变化,适配不同宽度设备的目的
比如当前的设计稿是750px,那我们只需要把html文字大小设置为75px(750px/10)就可以了
页面里元素的rem值:设计稿元素的像素值px/75
接下来,在不同尺寸的设备就交给flexible.js去改变html font-size的值就好了
flexible.js源码
(function flexible (window, document) {var docEl = document.documentElementvar dpr = window.devicePixelRatio || 1// adjust body font sizefunction setBodyFontSize () {if (document.body) {document.body.style.fontSize = (12 * dpr) + 'px'}else {document.addEventListener('DOMContentLoaded', setBodyFontSize)}}setBodyFontSize();// set 1rem = viewWidth / 10function setRemUnit () {var rem = docEl.clientWidth / 10docEl.style.fontSize = rem + 'px'}setRemUnit()// reset rem unit on page resizewindow.addEventListener('resize', setRemUnit)window.addEventListener('pageshow', function (e) {if (e.persisted) {setRemUnit()}})// detect 0.5px supportsif (dpr >= 2) {var fakeBody = document.createElement('body')var testElement = document.createElement('div')testElement.style.border = '.5px solid transparent'fakeBody.appendChild(testElement)docEl.appendChild(fakeBody)if (testElement.offsetHeight === 1) {docEl.classList.add('hairlines')}docEl.removeChild(fakeBody)}
}(window, document))
响应式布局开发
响应式需要一个父级做为布局容器,来配合子级元素来实现变化效果
原理就是在不同屏幕下,通过媒体查询来改变这个布局容器的大小,再改变里面子元素的排列方式和大小,从而实现不同屏幕下,看到不同的页面布局和样式变化。
特点:一套代码响应多端(手机端、平板端、PC端共用一套代码)
平时我们的响应式尺寸划分
- 超小屏幕(手机,小于768px):设置宽度为100%;
- 小屏幕(平板,大于等于768px):设置宽度为750px;
- 中等屏幕(桌面显示器,大于等于992px):宽度设置为970px;
- 大屏幕(大桌面显示器,大于等于1200px):宽度设置为1170px;
我们也可以根据实际自己自定义划分
响应式开发简单示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>* {padding: 0; margin: 0;}html, body {height: 100%;width: 100%;}/* 超小屏幕:小于768px 设置宽度为100%(手机)小屏幕:大于768px,设置宽度为750px(平板)中等屏幕:大于992px,设置宽度为970px(桌面显示器)大屏幕:大于1200px, 设置宽度为1170px(大屏显示器)*/.container {background-color: #9198e5;width: 100%;min-width: 320px;height: 70%;margin: 0 auto;display: flex;flex-flow: row wrap;padding: 10px 10px;box-sizing: border-box;text-align: center;/*align-content: flex-start;*/}.container div {width: 100%;/*border: 1px solid #e66465;*/border-radius: 20px;box-sizing: border-box;/*margin: 10px 0;*/padding: 10px;background-clip: content-box;background-color: #e66465;/*height: 100px;*/}@media screen and (min-width: 768px){.container {width: 750px;}.container div {width: 50%;}}@media screen and (min-width: 992px){.container {width: 970px;}.container div {width: 33.33%;}}@media screen and (min-width: 1200px){.container {width: 1170px;}.container div {width: 25%;}}</style>
</head>
<body><div class="container"><div>导航1</div><div>导航2</div><div>导航3</div><div>导航4</div><div>导航5</div><div>导航6</div><div>导航7</div><div>导航8</div></div>
</body>
</html>
响应式UI框架 BootStrap
相关文章:
移动端开发基础总结
移动端学习总结 (适合于复习) 移动端基础 技术选型: 单独制作移动端页面(主流) 流式布局(百分比布局)flex弹性布局(强烈推荐)lessrem媒体查询布局混合布局 响应式页面兼容移动端(…...
小X学游泳(深搜)
第一题 题目描述 小X想要学游泳。 这天,小X来到了游泳池,发现游泳池可以用N行M列的格子来表示,每个格子的面积都是1,且格子内水深相同。 由于小X刚刚入门,他只能在水深相同的地方游泳。为此,他把整个游泳池…...
分布式协议与算法——拜占庭将军问题
拜占庭将军问题 背景:以战国时期为背景 战国时期,齐、楚、燕、韩、赵、魏、秦七雄并立,后来秦国的势力不断强大起来,成了东方六国的共同威胁。于是,这六个国家决定联合,全力抗秦,免得被秦国各个…...
MySQL数据库管理的基本原则和技巧
MySQL数据库是一种常用的关系型数据库管理系统,用于存储和管理大量的数据。在进行MySQL数据库管理时,有一些基本原则和技巧可以帮助我们更有效地管理数据库。 数据库设计原则: 合理规划数据表结构: 根据数据之间的关系和业务需求…...
SQL-每日一题【1193. 每月交易 I】
题目 Table: Transactions 编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。 以 任意顺序 返回结果表。 查询结果格式如下所示。 示例 1: 解题思路 1.题目要求我们查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数…...
探析青少年口才训练在个人发展中的重要性与影响
论文题目:探析青少年口才训练在个人发展中的重要性与影响 摘要: 本论文旨在探讨青少年口才训练对个人发展的重要性和影响。通过对相关文献的综述和实证研究的分析,论文将阐述口才训练对青少年自信心、表达能力和思维能力的提升,以…...
HTML 元素的 class 和 id 属性有何区别?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 唯一性⭐ 选择器权重⭐ JS操作⭐ CSS和JavaScript引用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏…...
关于GKPhoto点击放大没有图片只有缺省图
GKPhoto,点进去看看,人家可传递的不止有url,还有UiImage NSString *photo self.detailModel.teacherModel.teacher_picture; NSString *placeHoldStr "ing_morentouxiang"; NSMutableArray *photos [NSMutableArray new]; GKPhoto *phot…...
建议收藏!总结了 42 种前端常用布局方案
对 CSS 布局掌握程度决定你在Web开发中的开发页面速度。随着Web技术的不断革新,实现各种布局的方式已经多得数不胜数了。 本篇文章总结了四十二种CSS的常见布局,这四十二种布局可以细分为如下几类: 水平居中垂直居中水平垂直居中两列布局三…...
spring AOP两种动态代理
本文开始 1.什么是动态代理? 动态代理:本来是通过直接访问目标对象的,但是找个代理对象替你进行访问目标对象,这就是动态代理过程; 例如:买饭作为目标对象,自己不想亲自跑腿,就点个…...
英语——副词
副词是指在句子中表示行为或状态特征的词,常用来修饰动词、形容词、其他副词或者句子等,表示时间、地点、方式和程度等,在句子中作状语。 第一节 副词的基本形式 一、副词的构成 1.许多副词都是由形容词变化而来。 (1)大部分副词由相应形容词直接加-ly构成。quick→q…...
Vue 本地应用 记事本 v-on v-model v-for使用
新增功能 vue当中如何生成列表结构?使用的指令是v-for,同时要有一个可以生成列表的数据,常用的是数组。记事本里面的内容并不复杂,所以这里使用字符串数组就行了。 获取用户输入的内容使用绑定v-model,双向数据绑定&a…...
智能质检技术的核心环节:语音识别和自然语言处理
随着呼叫中心行业的快速发展和客户服务需求的不断提高,越来越多的企业开始采用智能质检技术,以提高呼叫中心的质量和效率。而在智能质检技术中,语音识别和自然语言处理是其核心环节,对于提高质检的准确性和效率具有重要作用。 语音…...
Python 中的值传递 和 引用传递
在 Python 当中的函数调用当中, numpy 和 torch.tensor 都 是按照 引用传递 传到函数里面的,也就是说 修改 传入函数的 形参,也会导致 未传入之前的形参 发生 变化。 position 是一个 tensor; 下面这段代码第一行,如果在函数里面…...
【雕爷学编程】Arduino动手做(200)---WS2812B幻彩LED灯带6
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...
ChatGPT在工作中的七种用途
1. 用 ChatGPT 替代谷歌搜索引擎 工作时,你一天会访问几次搜索引擎?有了 ChatGPT,使用搜索引擎的频率可能大大下降。 据报道,谷歌这样的搜索引擎巨头,实际上很担心用户最终会把自己的搜索工具换成 ChatGPT。该公司针对…...
redis 持久化 与 键淘汰策略
redis运维核心: aof日志(全持久化 增量) 、 rdb(半持久化/全量备份) 、 键淘汰策略 、 高可用 1、Redis是基于内存的,一旦Redis重启/退出/故障,内存的数据将会全部丢失。故而有了持久化。 2、持久化:将内存中的数据存于磁盘中&am…...
PyCharm新手入门指南
安装好Pycharm后,就可以开始编写第一个函数:Hello World啦~我们就先来学习一些基本的操作,主要包含新建Python文件,运行代码,查看结果等等。 文章主要包含五个部分: 一、界面介绍 主要分为菜单栏、项目目录…...
【图像去噪】基于混合自适应(EM 自适应)实现自适应图像去噪研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
[保研/考研机试] KY102 计算表达式 上海交通大学复试上机题 C++实现
描述 对于一个不存在括号的表达式进行计算 输入描述: 存在多组数据,每组数据一行,表达式不存在空格 输出描述: 输出结果 示例1 输入: 6/233*4输出: 18思路: ①设立运算符和运算数两个…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
