# 移动开发 ## 常见分辨率 | 设备 | 尺寸(英寸) | 物理分辨率 | 开发尺寸(px) | 物理像素与CSS像素比(dpr) | | -------------------- | ------ | --------- | -------- | ---------------- | | iPhone 3GS | 3.5 | 320*480 | 320*480 | 1 | | iPhone 4/4s | 3.5 | 640*960 | 320*480 | 2 | | iPhone 5/5s | 4 | 640*1136 | 320*568 | 2 | | iPhone 6/6s | 4.7 | 750*1334 | 375*667 | 2 | | iPhone6 Plus/6s Plus | 5.5 | 1242*2208 | 414*736 | 3 | ## viewport 视口 * layout viewport 布局视口: 早期解决 pc 网页在手机上展示的问题, 一般是 980 px * visual viewport 视觉视口: 用户能看到的网站区域 * ideal viewport 理想视口: 讲布局视口为视觉视口, 通过 meta 标签通知浏览器 ```html "" ``` 最标准的viewport设置 * 视口宽度和设备保持一致 * 视口的默认缩放比例1.0 * 不允许用户自行缩放 * 最大允许的缩放比例1.0 * 最小允许的缩放比例1.0 ### 移动端的特殊样式 ```css /*CSS3盒子模型*/ box-sizing: border-box; -webkit-box-sizing: border-box; /*点击高亮我们需要清除 设置为transparent 完成透明*/ -webkit-tap-highlight-color: transparent; /*在移动端浏览器默认的外观在iOS上加上这个属性才能给按钮和输入框自定义样式*/ -webkit-appearance: none; /*禁用长按页面时的弹出菜单*/ img,a { -webkit-touch-callout: none; } ``` ## 移动端常见布局 * 流式布局: 也就是百分比布局 * flex 弹性布局 * less + res 媒体查询 * 混合布局 ### 百分比布局 ### vw vh * vw viewport width 视口宽度 * vh viewport height 视口高度 ### flex 布局 https://ruanyifeng.com/blog/2015/07/flex-grammar.html #### 容器的属性 * flex-direction:设置主轴的方向 * `flex-direction: row | row-reverse | column | column-reverse;` * flex-wrap:设置子元素是否换行 * `flex-wrap:nowrap | wrap | wrap-reverse; * flex-flow:复合属性,相当于同时设置了 flex-direction 和 flex-wrap * `flex-flow: || ;` * justify-content:设置主轴上的子元素排列方式 * `justify-content: flex-start | flex-end | center | space-between | space-around;` * between 是左中右, around 是三等距 * align-items:设置侧轴上的子元素排列方式(单行) * `align-items: flex-start | flex-end | center | baseline | stretch;` * align-content:设置侧轴上的子元素的排列方式(多行) * `align-content: flex-start | flex-end | center | space-between | space-around | stretch; #### 项目的属性 * `flex-grow: ;` 项目的放大比例 (===占用剩余的比例===), 默认 0 * 如果一个项目为 2, 其它为 1, 那么它占用剩余空间的比例是其它的两倍 * `flex-shrink: ;` 项目的缩小比例, 默认为 1 * 如果空间不足, 该项目将缩小. * 如果多个项目都为 1, 那么空间部足将等比缩小. * 如果一个为 0, 其它为 1, 那么空间不足, 为 0 的不缩小 * `flex-basis: | auto;` 在分配多余空间之前,项目占据的主轴空间,默认值 auto * 可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间 * `flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ];` 是 flex-grow flex-shrink flex-basis 的缩写 * 有两个快捷值 auto (1 1 auto) 和 none (0 0 auto), 建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值 * `order: int;` 属性定义子项的排列顺序, 默认为 0, 数值越小, 越靠前 * `align-self: auto | flex-start | flex-end | center | baseline | stretch;` 控制子项自己在侧轴的排列方式, 覆盖掉 `align-items` ### rem 布局 > root em 相对 html 根字体大小的百分比 > 根元素(html)设置font-size=12px; 非根元素设置width: 2rem; 则换成px表示就是24px #### 媒体查询 ```css @media mediatype and|not|only (media feature) { CSS-Code; } ``` * 查询类型: `all` 所有设备 `print` 打印机 `scree` 电脑平板手机 * 关键字 `and not only` 将媒体类型或多个媒体特性连接到一起做为媒体查询的条件 * 特性: width min-width max-width 书写顺序: 从低分辨率到高(推荐), 或者从高到低. ```css /* 第一档x<540, 第二档540==970 */ @media screen and (max-width: 539px) { body { background-color: pink; } } @media screen and (min-width: 540px) { body { background-color: green; } } @media screen and (min-width: 970px) { body { background-color: green; } } /* screen and 不能省略 */ /* 媒体查询最好从小到大*/ ``` #### 淘宝的方案 flexible **有 vw vh, 不再需要了** > 10 等分, 每一份 rem 等于视口的 1/10 px github地址:https://github.com/amfe/lib-flexible * 需要装 vscode 插件 cssrem 自动转换 ```less /* 为了整体的效果更佳的美观,我们需要写死小于320px屏幕 大于750px 的字体大小 */ @media screen and (max-width: 320px) { html { font-size: 32px !important; } } @media screen and (min-width: 750px) { html { font-size: 75px !important; } } ``` ### bootstrap 响应式布局 中文网: http://www.bootcss.com/ 官网: http://getbootstrap.com/ 推荐网站 http://bootstrap.css88.com/ #### 栅格系统 特点: * 媒体查询从小到大写 * 小屏幕的样式写了, 宽屏幕的样式没写, 切换到宽屏幕时会应用小屏幕的样式 * 小屏幕的样式写了, 宽屏幕的样式也写了, 切换到宽屏幕时只会应用宽屏幕的样式 规则: * 按照不同屏幕划分为1~12 等份 * 行(row) 可以去除父容器作用15px的边距 * xs-extra small:超小; sm-small:小; md-medium:中等; lg-large:大; * 列(column)大于 12,多余的"列(column)"所在的元素将被作为一个整体另起一行排列 * 每一列默认有左右15像素的 padding * 可以同时为一列指定多个设备的类名,以便划分不同份数 例如 class="col-md-4 col-sm-6"