前端移动端开发技巧之HTML与CSS

简介: 前端移动端开发技巧之HTML与CSS

### HTML方向

##### 调用系统功能

使用`<a>`能快速调用移动设备的`电话/短信/邮件`三大通讯功能,使用`<input>`能快速调用移动设备的的`图库/文件`。

这些功能方便了页面与系统的交互,关键在于调用格式一定要准确,否则会被`移动端浏览器`忽略。

```

<!-- 拨打电话 -->

<a href="tel:10086">拨打电话给10086小姐姐</a>

<!-- 发送短信 -->

<a href="sms:10086">发送短信给10086小姐姐</a>

<!-- 发送邮件 -->

<a href="mailto:young.joway@aliyun.com">发送邮件给JowayYoung</a>

<!-- 选择照片或拍摄照片 -->

<input type="file" accept="image/*">

<!-- 选择视频或拍摄视频 -->

<input type="file" accept="video/*">

<!-- 多选文件 -->

<input type="file" multiple>

```

##### 忽略自动识别

有些`移动端浏览器`会自动将数字字母符号识别为`电话/邮箱`并将其渲染成上述**调用系统功能**里的`<a>`。虽然很方便却有可能违背需求。

```

<!-- 忽略自动识别电话 -->

<meta name="format-detection" content="telephone=no">

<!-- 忽略自动识别邮箱 -->

<meta name="format-detection" content="email=no">

<!-- 忽略自动识别电话和邮箱 -->

<meta name="format-detection" content="telephone=no, email=no">

```

##### 弹出数字键盘

使用`<input type="tel">`弹起数字键盘会带上`#`和`*`,适合输入电话。推荐使用`<input pattern="\d*">`弹起数字键盘,适合输入验证码等纯数字格式。

```

<!-- 纯数字带#和* -->

<input type="tel">

<!-- 纯数字 -->

<input pattern="\d*">

```

##### 唤醒原生应用

通过`location.href`与原生应用建立通讯渠道,这种页面与客户端的通讯方式称为**URL Scheme**,其基本格式为`scheme://[path][?query]`,笔者曾经发表过[《H5与App的通讯方式》](https://juejin.cn/post/6844904020201455624)讲述`URL Scheme`的使用。

*   **scheme**:应用标识,表示应用在系统里的唯一标识

*   **path**:应用行为,表示应用某个页面或功能

*   **query**:应用参数,表示应用页面或应用功能所需的条件参数

`URL Scheme`一般由前端与客户端共同协商。唤醒原生应用的前提是必须在移动设备里安装了该应用,有些`移动端浏览器`即使安装了该应用也无法唤醒原生应用,因为它认为`URL Scheme`是一种潜在的危险行为而禁用它,像`Safari`和`微信浏览器`。还好`微信浏览器`可开启白名单让`URL Scheme`有效。

若在页面引用第三方原生应用的`URL Schema`,可通过抓包第三方原生应用获取其`URL`。

```

<!-- 打开微信 -->

<a href="weixin://">打开微信</a>

<!-- 打开支付宝 -->

<a href="alipays://">打开支付宝</a>

<!-- 打开支付宝的扫一扫 -->

<a href="alipays://platformapi/startapp?saId=10000007">打开支付宝的扫一扫</a>

<!-- 打开支付宝的蚂蚁森林 -->

<a href="alipays://platformapi/startapp?appId=60000002">打开支付宝的蚂蚁森林</a>

```

##### 禁止页面缩放

在智能手机的普及下,很多网站都具备`桌面端`和`移动端`两种浏览版本,因此无需双击缩放查看页面。禁止页面缩放可保障`移动端浏览器`能无遗漏地展现页面所有布局。

```

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">

```

##### 禁止页面缓存

**Cache-Control**指定请求和响应遵循的缓存机制,不想使用浏览器缓存就禁止呗!

```

<meta http-equiv="Cache-Control" content="no-cache">

```

##### 禁止字母大写

有时在输入框里输入文本会默认开启首字母大写纠正,就是输入首字母小写会被自动纠正成大写,特么的烦。直接声明`autocapitalize=off`关闭首字母大写功能和`autocorrect=off`关闭纠正功能。

```

<input autocapitalize="off" autocorrect="off">

```

##### 针对Safari配置

贴一些`Safari`较零散且少用的配置。

```

<!-- 设置Safari全屏,在iOS7+无效 -->

<meta name="apple-mobile-web-app-capable" content="yes">

<!-- 改变Safari状态栏样式,可选default/black/black-translucent,需在上述全屏模式下才有效 -->

<meta name="apple-mobile-web-app-status-bar-style" content="black">

<!-- 添加页面启动占位图 -->

<link rel="apple-touch-startup-image" href="pig.jpg" media="(device-width: 375px)">

<!-- 保存网站到桌面时添加图标 -->

<link rel="apple-touch-icon" sizes="76x76" href="pig.jpg">

<!-- 保存网站到桌面时添加图标且清除默认光泽 -->

<link rel="apple-touch-icon-precomposed" href="pig.jpg">

```

##### 针对其他浏览器配置

贴一些其他浏览器较零散且少用的配置,主要是常用的`QQ浏览器`、`UC浏览器`和`360浏览器`。

```

<!-- 强制QQ浏览器竖屏 -->

<meta name="x5-orientation" content="portrait">

<!-- 强制QQ浏览器全屏 -->

<meta name="x5-fullscreen" content="true">

<!-- 开启QQ浏览器应用模式 -->

<meta name="x5-page-mode" content="app">

<!-- 强制UC浏览器竖屏 -->

<meta name="screen-orientation" content="portrait">

<!-- 强制UC浏览器全屏 -->

<meta name="full-screen" content="yes">

<!-- 开启UC浏览器应用模式 -->

<meta name="browsermode" content="application">

<!-- 开启360浏览器极速模式 -->

<meta name="renderer" content="webkit">

```

##### 让:active有效,让:hover无效

有些元素的`:active`可能会无效,而元素的`:hover`在点击后会一直处于点击状态,需点击其他位置才能解除点击状态。给`<body>`注册一个空的`touchstart事件`可将两种状态反转。

```

<body ontouchstart></body>

```

### CSS方向

##### 自动适应布局

针对移动端,笔者通常会结合JS依据`屏幕宽度`与`设计图宽度`的比例动态声明`<html>`的`font-size`,以`rem`为长度单位声明所有节点的几何属性,这样就能做到大部分移动设备的页面兼容,兼容出入较大的地方再通过`媒体查询`做特别处理。

笔者通常将`rem布局比例`设置成`1rem=100px`,即在设计图上`100px`长度在CSS代码上使用`1rem`表示。

```

function AutoResponse(width = 750) {

   const target = document.documentElement;

   if (target.clientWidth >= 600) {

       target.style.fontSize = "80px";

   } else {

       target.style.fontSize = target.clientWidth / width * 100 + "px";

   }

}

AutoResponse();

window.addEventListener("resize", () => AutoResponse());

```

当然还可依据`屏幕宽度`与`设计图宽度`的比例使用`calc()`动态声明`<html>`的`font-size`,这样就能节省上述代码。不对,是完全代替上述代码。

```

html {

   font-size: calc(100vw / 7.5);

}

```

若以`iPad Pro`分辨率`1024px`为移动端和桌面端的断点,还可结合`媒体查询`做断点处理。`1024px`以下使用`rem布局`,否则不使用`rem布局`。

```

@media screen and (max-width: 1024px) {

   html {

       font-size: calc(100vw / 7.5);

   }

}

```

##### 自动适应背景

使用`rem布局`声明一个元素背景,多数情况会将`background-size`声明为`cover`。可能在设计图对应分辨率的移动设备下,背景会完美贴合显示,但换到其他分辨率的移动设备下就会出现左右空出`1px`到`npx`的空隙。

此时将`background-size`声明为`100% 100%`,跟随`width`和`height`的变化而变化。反正`width`和`height`都是量好的实际尺寸。

```

.elem {

   width: 1rem;

   height: 1rem;

   background: url("pig.jpg") no-repeat center/100% 100%;

}

```

##### 监听屏幕旋转

你还在使用JS判断横屏竖屏调整样式吗?那就真的`Out`了。

```

/* 竖屏 */

@media all and (orientation: portrait) {

   /* 自定义样式 */

}

/* 横屏 */

@media all and (orientation: landscape) {  

/* 自定义样式 */  

}

```

##### 支持弹性滚动

在苹果系统上非`<body>`元素的滚动操作可能会存在卡顿,但安卓系统不会出现该情况。通过声明`overflow-scrolling:touch`调用系统原生滚动事件优化`弹性滚动`,增加页面滚动的流畅度。

```

body {

   -webkit-overflow-scrolling: touch;

}

.elem {

   overflow: auto;

}

```

##### 禁止滚动传播

与`桌面端浏览器`不一样,`移动端浏览器`有一个奇怪行为。当页面包含多个滚动区域时,滚完一个区域后若还存在滚动动量则会将这些剩余动量传播到下一个滚动区域,造成该区域也滚动起来。这种行为称为**滚动传播**。

若不想产生这种奇怪行为可直接禁止。

```

.elem {

   overscroll-behavior: contain;

}

```

##### 禁止屏幕抖动

对于一些突然出现滚动条的页面,可能会产生左右抖动的不良影响。在一个滚动容器里,打开弹窗就隐藏滚动条,关闭弹窗就显示滚动条,来回操作会让屏幕抖动起来。提前声明滚动容器的`padding-right`为滚动条宽度,就能有效消除这个不良影响。

每个`移动端浏览器`的滚动条宽度都有可能不一致,甚至不一定占位置,通过以下方式能间接计算出滚动条的宽度。`100vw`为视窗宽度,`100%`为滚动容器内容宽度,相减就是滚动条宽度,妥妥的动态计算。

```

body {

   padding-right: calc(100vw - 100%);

}

```

##### 禁止长按操作

有时不想用户长按元素呼出菜单进行`点链接`、`打电话`、`发邮件`、`保存图片`或`扫描二维码`等操作,声明`touch-callout:none`禁止用户长按操作。

有时不想用户`复制粘贴`盗文案,声明`user-select:none`禁止用户长按操作和选择复制。

```

* {

   /* pointer-events: none; */ /* 微信浏览器还需附加该属性才有效 */

   user-select: none; /* 禁止长按选择文字 */

   -webkit-touch-callout: none;

}

```

但声明`user-select:none`会让`<input>`和`<textarea>`无法输入文本,可对其声明`user-select:auto`排除在外。

```

input,

textarea {

   user-select: auto;

}

```

##### 禁止字体调整

旋转屏幕可能会改变字体大小,声明`text-size-adjust:100%`让字体大小保持不变。

```

* {

   text-size-adjust: 100%;

}

```

##### 禁止高亮显示

触摸元素会出现半透明灰色遮罩,不想要!

```

* {

   -webkit-tap-highlight-color: transparent;

}

```

##### 禁止动画闪屏

在移动设备上添加动画,多数情况会出现闪屏,给动画元素的父元素构造一个`3D环境`就能让动画稳定运行了。

```

.elem {

   perspective: 1000;

   backface-visibility: hidden;

   transform-style: preserve-3d;

}

```

##### 美化表单外观

表单元素样式太丑希望自定义,`appearance:none`来帮你。

```

button,

input,

select,

textarea {

   appearance: none;

   /* 自定义样式 */

}

```

##### 美化滚动占位

滚动条样式太丑希望自定义,`::-webkit-scrollbar-*`来帮你。记住以下三个关键词就能随机应变了。

*   [x]  **::-webkit-scrollbar**:滚动条整体部分

*   [x]  **::-webkit-scrollbar-track**:滚动条轨道部分

*   [x]  **::-webkit-scrollbar-thumb**:滚动条滑块部分

```

::-webkit-scrollbar {

   width: 6px;

   height: 6px;

   background-color: transparent;

}

::-webkit-scrollbar-track {

   background-color: transparent;

}

::-webkit-scrollbar-thumb {

   border-radius: 3px;

   background-image: linear-gradient(135deg, #09f, #3c9);

}

```

##### 美化输入占位

输入框占位文本太丑,`::-webkit-input-placeholder`来帮你。

```

input::-webkit-input-placeholder {

   color: #66f;

}

```

##### 对齐输入占位

有强迫症的同学总会觉得输入框文本位置整体偏上,感觉未居中心里就痒痒的。`桌面端浏览器`里声明`line-height`等于`height`就能解决,但`移动端浏览器`里还是未能解决,需将`line-height`声明为`normal`才行。

```

input {

   line-height: normal;

}

```

##### 对齐下拉选项

下拉框选项默认向左对齐,是时候改改向右对齐了。

```

select option {

   direction: rtl;

}

```

##### 修复点击无效

在苹果系统上有些情况下非可点击元素监听`click事件`可能会无效,针对该情况只需对不触发`click事件`的元素声明`cursor:pointer`就能解决。

```

.elem {

   cursor: pointer;

}

```

##### 识别文本换行

多数情况会使用JS换行文本,那就真的`Out`了。若接口返回字段包含`\n`或`<br>`,千万别替换掉,可声明`white-space:pre-line`交由浏览器做断行处理。

```

* {

   white-space: pre-line;

}

```

##### 开启硬件加速

想动画更流畅吗,开启`GPU硬件加速`呗!

```

.elem {

   transform: translate3d(0, 0, 0);

   /* transform: translateZ(0); */

}

```

##### 描绘像素边框

万年话题,如何描绘`一像素边框`?

```

.elem {

   position: relative;

   width: 200px;

   height: 80px;

   &::after {

       position: absolute;

       left: 0;

       top: 0;

       border: 1px solid #f66;

       width: 200%;

       height: 200%;

       content: "";

       transform: scale(.5);

       transform-origin: left top;

   }

}

```

##### 控制溢出文本

万年话题,如何控制文本做`单行溢出`和`多行溢出`?

```

.elem {

   width: 400px;

   line-height: 30px;

   font-size: 20px;

   &.sl-ellipsis {

       overflow: hidden;

       text-overflow: ellipsis;

       white-space: nowrap;

   }

   &.ml-ellipsis {

       display: -webkit-box;

       overflow: hidden;

       text-overflow: ellipsis;

       -webkit-line-clamp: 3;

       -webkit-box-orient: vertical;

   }

}

```

相关文章
|
5月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
伪类:伪类这个叫法源自于它们跟类相似,但实际上并没有类会附加到标记中的标签上。 伪类分为两种(以及新增的伪类选择器): UI伪类:会在HTML元素处于某种状态时(例如:鼠标指针位于连接上),为该元素应用CSS样式。 :hover 结构化伪类:会在标记中存在某种结构上的关系时 例如: 某元素是一组元素中的第一个或最后一个,为该元素应用CSS样式。 :not和:target(CSS3新增的两个特殊的伪类选择器)
483 2
|
5月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
transform变形 css3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的 功能。 CSS3的变形功能可以对HTML组件执行位移、旋转、缩放、倾斜4种几何变换,这样的变换可以控制HTML组件 呈现出丰富的外观。 借助于位移、旋转、缩放、倾斜这4种几何变换,CSS3提供了transition动画。 transition动画比较简单,只要指定HTML组件的哪些CSS属性需要使用动画效果来执行变化,并指定动画时间,就可保证动画播放。 比transitio
262 1
|
5月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
386 0
|
5月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
盒模型 盒模型: 所谓盒模型,就是浏览器为页面中的每个HTML元素生成的矩形盒子。 这些盒子们都要按照可见板式模型在页面上排布。 可见的板式模型主要由三个属性控制:position 属性、display 属性和 float属性。 position属性控制页面上元素间的位置关系。 display属性控制元素是堆叠、并排或者不在页面上显示。 float属性提供控制的方法,以便于把元素组成成多栏布局。 盒模型讲解: 在默认的情况下,每个盒子的边框是不可见的,背景也是透明的。 所以我们 不能直接的看到页面中的盒
543 0
|
7月前
|
JSON 监控 前端开发
AMIS:百度开源的前端低代码神器,18.4k star 背后的开发效率提升利器
AMIS(前端低代码框架)是百度开源的低代码前端框架,基于纯 JSON 配置即可生成完整后台页面,包括表单、表格、图表、CRUD 列表,支持可视化拖拽编辑。,星标数已达 18.4k,百度内部已沉淀超过 5 万个页面,广泛应用于审核系统、数据管理后台、模型监控等落地场景
1292 0
|
9月前
|
存储 自然语言处理 前端开发
抖音快手小红书虚拟评论截图生成器,模拟对话制作工具,html+js+css
这是一款纯前端实现的多平台虚拟评论生成器,支持抖音、快手、小红书风格,适用于产品演示与UI设计。采用Vanilla JS与Flexbox布局,利用IndexedDB存储数据,CSS Variables切换主题。
|
6月前
|
人工智能 前端开发 JavaScript
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
844 18
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
|
5月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
Animation属性 css3为Animation动画提供的几个属性如下: 属性名 属性值 animation-name 指定动画名称,该属性指定一个已有的关键帧定义。 animation-duration 指定动画持续时间。 animation-timing-funtion 指定动画变化速度。 animation-delay 指定动画延迟多长时间才开始执行。 animation-iteration-count 指定动画的循环执行次数。 animation:这是一个复合属性。
379 3
|
5月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
position定位(核心) 我们讲盒模型的时候,提到了3个属性可以用来控制页面排版。 三大属性:position属性,display属性,float属性。 position 属性控制页面上元素间的位置关系。 display 属性控制页面元素是否显示或者是堆叠还是并排显示。 float 属性提供控制方法。 通过float这种控制方法,可以实现多栏布局,导航菜单等等。 position属性是干嘛用的?怎么用?有哪些属性值? position属性控制页面上元素间的位置关系,也就是排版。 怎么用?要知道怎么用
568 1
|
5月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
继承 我们的CSS中很多的属性也是可以继承的,其中相当一部分是跟文字的相关的,比如说颜色、字体、字号。 当然还有一部分是不能继承的。 例如边框、内外边距。 层叠 层叠是CSS的核心机制。 层叠的工作机制: 当元素的同一个样式属性有多种样式值的时候,CSS就是靠层叠机制来决定最终应用哪种样式。 层叠规则: 层叠规则一:找到应用给每个元素和属性的声明。 说明:浏览器在加载每个页面时,都会据此查找到每条CSS规则, 并标识出所有受到影响的HTML元素。
183 0