引言

首先说明一下,本文分享对象是涉世未深的移动开发者,至于有经验的开发者可以自行绕道。

说来惭愧,做了几年pc端的前端开发,很少接触到webapp的移动端开发。如今有机会参与webapp的开发,发现与pc端开发还是有一些区别的。

例如,移动端的浏览器要么是Android的chrome,要么是ios的safari;可以发现:他们都是基于webkit内核的。而也有使用windows phone的手机(ie的那一套),但是从市场使用上来看,其可以忽略不计。因此做移动端的前端开发有一些特别之处:

  • 不用像pc那样需要考虑兼容各种不同的浏览器及其同一浏览器的不同版本
  • H5和CSS3的可以大部分直接使用了

诚然,移动端开发不需要过多考虑浏览器的兼容性,但是它却有自己特有的问题:需要兼容各种不同品牌不同型号的机型设备,尤其是Android系统更是如此。 移动端兼容各种设备的技术不是本文谈论的问题,有兴趣的可以自行google。下文就分享一些移动端开发中涉及到的样式。

rem自适应布局

rem是css3的中一个样式属性,看到这个属性一定会想到em属性,二者极为类似:em为相对于父元素font-size大小而言的;而rem是相对于根元素html的font-size而言的。

通过rem,意味着一旦html元素的font-size大小确定,基于rem的页面元素相关属性就能确定,当然改变html元素的font-size大小,相对于它而言的元素大小跟着变化。

rem主要为web app下解决移动端响应式布局,实现自适应布局。那么,rem如何解决移动端不同设备因不同宽度而实现自适应布局的呢?

通过使用脚本来根据不同设备宽度来调整html的font-size大小就可以用rem实现自适应布局

一个基于iphone5设备宽度来计算html元素font-size大小的js脚本如下:

(function (doc, win) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
recalc = function () {
var clientWidth = docEl.clientWidth;
if (!clientWidth) return;
docEl.style.fontSize = 20 * (clientWidth / 320) + 'px';
}; if (!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

这样就可以根据不同设备来调整html的font-size了,如iphone6设备宽度为375px,则iphone6下的1rem = 23.4375px(即20*(375/320) );

有关rem的,可以参考这篇文章rem是如何实现自适应布局的?

flex布局

flex布局是W3C于2009年提出的一个新的布局方案,传统布局方案display + position + float三者配合能够解决大部分的布局,但是对那些特殊布局如垂直居中布局就有些不方便;为此flex的提出则可以简便、完整、响应式地实现各种页面布局。

一个容器设置display:flex后,该容器就成了flex布局,那么容器中的所有子元素的floatclearvertical-align等属性将失效

设置了flex布局后,其子元素就成了flex item,那么flex布局容器就有了两个轴:主轴交叉轴默认水平方向为主轴,垂直方向为交叉轴

一个默认的flex布局容器盒子是下面这样的:

通常,flex相关的属性配置比较多,引用到容器上的有以下几个:

  • flex-direction: 设置主轴的方向,有四个值row(水平方向,默认值)、row-reverse(水平反方向)、column(垂直方向)、column-reverse

  • flex-wrap: 设置flex item在主轴上排不下时如何换行,nowrap(不换行,默认值)、wrap、wrap-reverse

  • flex-flow:它是flex-direction和flex-wrap的简写形式

  • justify-content定义了项目在主轴上的对齐方式,有5个值:flex-start、flex-end、center、space-between、space-around

  • align-items定义项目在交叉轴上的对齐方式,也有5个值:flex-start、flex-end、center、baseline、stretch;

  • align-content:定义多个轴线的对齐方式

flex容器可以设置上面6个flex相关的属性,flex item也有6个可以设置的与flex相关的属性:

  • order: 定义项目的排列顺序。数值越小,排列越靠前,默认为0。

  • flex-grow: 定义项目的放大比例,默认为0,即即使存在多余空间也不放大; 项目都设置为1的话,则等比例放大

  • flex-shrink: 定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小;若设置0则不会缩小

  • flex-basis: 定义了在分配多余空间之前,项目占据的主轴空间;默认为auto,即项目本来大小,也可以设置某个具体的值

  • flex: 它是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

  • align-self:允许某个项目与其他项目不一样的交叉轴对齐方式,会覆盖继承自父元素设置align-items属性对齐方式,其值有 auto(默认)以及与align-items相同的值

有关flex布局,可以参考阮老师的这篇文章Flex 布局教程:语法篇

在开发过程中,使用flex时,一定要注意一个问题:** 主轴所在的方向,主轴并不一定是水平方向,尽管默认是水平方向**。所以:

flex-direction设置主轴的方向,那么justify-content就代表主轴方向对齐方式,不要先入为主的认为,主轴方向就是水平方向,justify-content就一直代表水平方式的对齐方式;

通过flex-direction可以将主轴设为垂直方向,那么justify-content就代表的是垂直方向的对齐方式

元素placeholder样式:-webkit-input-placeholder

-webkit-input-placeholder是一个伪元素,可用来设置表单元素的placeholder文字的展现样式。从名字上可以看出,这个属性只支持webkit内核的情况,由于移动端的特殊性,知道webkit内核可以使用它即可。

考虑这样一种case:表单input元素的placeholder在没有内容时显示一种样式,有内容时是另一种样式,例如下图这样:

这个时候,不知道表单元素的placeholder可以配置伪元素样式-webkit-input-placeholder时可能会这样实现:根据input元素的值是否为空来添加不同的样式class。

这种实现不仅要改css还要改js代码,明显效率低下。换成-webkit-input-placeholder来实现,明显感觉big格高大上有没有。上图对应代码如下:

input::-webkit-input-placeholder{
font-size: 16px;
color: #fc9153;
}

除了上面设置placeholder的字体、颜色,你甚至还可以设置其动画效果。但是需要注意一点:

-webkit-input-placeholder是非标准的placeholder样式设置属性,如果在Firefox和ie某些情况下使用,他们也有对应的配置属性。 Firefox使用 ::-moz-placeholder设置;IE支持的placeholder情况下可以使用:-ms-input-placeholder设置。

例如上面代码在Firefox和ie下实现如下:

input:-ms-input-placeholder{
font-size: 16px;
color: #fc9153;
} input::-moz-placeholder{
font-size: 16px;
color: #fc9153;
}

文本溢出省略样式:text-overflow

text-overflow是css3中出现的一个设置文本样式属性的,相信大家都知道它的用法,即容器元素内的文本元素超过容器指定的宽度后设置文本溢出显示方式,默认是剪切文本内容。

其中,text-overflow属性值有3个:

  • clip: 溢出的文本被剪切掉,默认的值
  • ellipsis: 溢出的文本用省略号显示
  • string: 用给定的字符串来显示溢出的省略号,这项各浏览器支持的不是很好,一般不用

当然移动端最常用的还是文本溢出时,用省略号显示溢出的内容。使用该css样式的父元素还需要配合以下几个样式来实现溢出文本省略号显示,具体如下:

overflow: hidden; /*超过容器指定范围隐藏*/
text-overflow: ellipsis; /*设置溢出内容省略号显示*/
white-space: nowrap; /*容器不换行*/

看到上面的问题,你可能以为你掌握了该属性用法,但是有一个地方很容易被忽略,即:

text-overflow属性用来设置的是块元素内的直接子内联元素的文本或者直接的文本内容。换句话说,应用该属性的块元素内部没有直接子内联元素或者直接的文本信息,子元素都是其他块元素的话,即使文本溢出,设置的省略号也不会起作用。

例如下面代码中container容器块设置的ellipsis根本不起作用,因为其直接子元素都是块元素没有一个内联元素的文本。

<style>
.container{
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 50px;
}
.container span{
display: inline-block;
}
</style>
<p class="container">
<span>...</span>
<span>...</span>
<span>...</span>
</p>

中文chrome浏览器设置小于12px字体的样式:-webkit-transform

chrome对于简体中文版浏览限制最小字体大小为12px,font-size样式设置小于12px字体时都是无法生效的。

在chrome27版本之前,可以使用webkit内核的私有属性-webkit-text-size-adjust为none来解决。但是可能由于-webkit-text-size-adjust属性经常被滥用,导致页面放大后页面字体不能随之改变,导致可用性降低;为此chrome不在支持该属性。

既然无法再通过-webkit-text-size-adjust来控制设置字体大小,那么就应该有其他方式来解决这一问题,不过目前并没有官方的解决方案,通常的做法是通过css3的transform: scale()缩放来实现设置小于12px的字体。例如下面例子:

<style>
.mini-font{
font-size: 10px;
transform: scale(0.8);
-webkit-transform: scale(0.8);
}
</style>
<p class="mini-font">这是小于12px的字体</p>

这样,就可以设置页面中小于12px的字体了,不过使用css3的transform属性时需要注意以下2点:

1、transform不支持行内元素,因为只能对具有宽和高的元素设置缩放。

2、transform设置小于12px字体后,展示效果上会存在一部分边距,因为应用transform属性的元素虽然展示内容缩小了,但是该元素还是会占有未缩放前的实际大小,这时需要配合margin或者padding来设置展示效果。

inline-block元素之间的空格或换行导致的间距问题

inline-block行级块元素在宽度允许的话会一行显示,它不会像块元素独自占用一行,除此之外其与块元素的表现是一样的,设置块元素的css样式它都适用。

不过在使用inline-block元素时,相信大家会遇到这样的问题:inline-block元素间会莫名其妙的产生一定的间距。

借用去除inline-block元素间间距的N种方法讲述的列子来说明,可能会产生下面的情况:

<input /> <input type="submit" />

或者

<input />
<input type="submit" />

这是怎么情况,看到这节的标题也能知道,引起这种情况的主要原因是:

inline-block元素间有空格或者换行时会导致这些元素之间存在莫名其妙的间距

那么,既然知道了是什么导致这个问题,那么就可以对症下药了,大概方法有:

  • 想办法移除元素间的空格或者换行

  • 使用margin负值

  • font-size方法:设置inline-block元素自己的font-size和其父元素的 font-size:0

  • letter-spacing: 设置inline-block元素自己的letter-spacing: 0和其父元素的 letter-spacing为具体的某个负值

  • word-spacing, 方法同letter-spacing

这篇文章去除inline-block元素间间距的N种方法描述了很多方法,具体可以参考这篇文章。

-webkit-tap-highlight-color

-webkit-tap-highlight-color用于去掉链接等可点击元素在移动端产生的背景或者边框。ios或者andriod在点击一个链接或者其他可以点击的元素时会出现一个边框或者半透明的灰色遮罩,这时可以使用该样式来禁用掉这个背景或者半透明灰色遮罩。

-webkit-tap-highlight-color: rgba(0,0,0,0);

-webkit-appearance

-webkit-appearance可以覆盖webkit浏览器默认元素默认的外观展示,这样就可以为元素设置自定义的外观展示。

如,可以对链接设置button的外观展示:

<style type="text/css">
.button {
-webkit-appearance: button;
text-decoration: none;
color: #000;
padding: 5px;
}
</style>
<a class="button" href="http://www.baidu.com">前往百度</a>

最终,生成的a链接样式如下图所示:

补充:

有关H5下面的常见问题及其解决方案,可以参考这篇文章,不过需要翻墙哦。H5项目常见问题汇总及解决方案

webapp开发之需要知道的css细节的更多相关文章

  1. 12个很少被人知道的CSS事实

    之前没有认真的研究过,padding-bottom的值如果是百分比,那么它的实际值是根据父类的宽度来调整的.我还以为是根据这个元素的本身的宽度来定义呢?汗..padding-top/padding-l ...

  2. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  3. C#开发人员应该知道的13件事情

    本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方.使用工具可以帮助你在发布之后,解决掉一些问题. 编码标准 遵照编码标准可以编 ...

  4. 对于JavaScript的函数.NET开发人员应该知道的11件事

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天小感冒今天重感冒,也不能长篇大论.如果你是.NET开发人员,在进入前端开发领域的时候,对 ...

  5. 12个你未必知道的CSS小知识

    虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...

  6. 每个Web开发人员应该知道的12个终端命令

    Tips 原文作者:Danny Markov 原文地址:12 Terminal Commands Every Web Developer Should Know About 终端是开发人员的武器库中最 ...

  7. 你务必知道的css简写

    欢迎加入前端交流群来py:749539640   简写属性是可以让你同时设置其他几个 CSS 属性值的 CSS 属性.使用简写属性,Web 开发人员可以编写更简洁.更具可读性的样式表,节省时间和精力. ...

  8. C#程序员开发WinForm必须知道的 Window 消息大全

    不要以为下面的东西只有C++中才会用到哦! 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用 ...

  9. C#程序员开发WinForm必须知道的 Window 消息大全(转)

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.  消息本身是作为一个记录传递给应用程 ...

随机推荐

  1. 你的项目真的需要Session吗?

    在web开发中,Session这个东西一直都很重要,至少伴随我10年之久, 前一段时间发生一个性能问题,因为Redis session 问题,后来想想 其实我的项目session 是不需要的. 先看看 ...

  2. Lucene 4.X 倒排索引原理与实现: (1) 词典的设计

    词典的格式设计 词典中所保存的信息主要是三部分: Term字符串 Term的统计信息,比如文档频率(Document Frequency) 倒排表的位置信息 其中Term字符串如何保存是一个很大的问题 ...

  3. iOS开发- UICollectionView详解+实例

    本章通过先总体介绍UICollectionView及其常用方法,再结合一个实例,了解如何使用UICollectionView. UICollectionView 和 UICollectionViewC ...

  4. TNSNAMES.ORA 配置

    上面的sqlnet.ora文件说明:SQLNET.AUTHENTICATION_SERVICES= (NTS)——这个表示采用os认证,在数据库服务器上,可以利用sqlplus “/ as sysdb ...

  5. Hadoop - Mac OSX下配置和启动hadoop以及常见错误解决

    0. 安装JDK 参考网上教程在OSX下安装jdk 1. 下载及安装hadoop a) 下载地址: http://hadoop.apache.org b) 配置ssh环境 在terminal里面输入: ...

  6. sonar的安装与代码质量检测实例

    说明:sonar依赖数据库. mysql优化 1.笔者使用的是mysql数据库.首先对mysql做简单的优化配置. [root@localhost bin]# cat /etc/my.cnf [mys ...

  7. C# inline-hook / api-hook

    我查阅了一下相关C#方面的资料,却没有发现有提供过关于api-hook方面的资 料包括应用库由此本人编写一套inline-hook的库用于支持x64.x86上的基于在 clr的公共语言,如: c#.c ...

  8. Visual Studio 2013 prerequisites

    http://www.visualstudio.com/zh-cn/products/visual-studio-ultimate-with-msdn-vs#Fragment_SystemRequir ...

  9. CSS3学习笔记--transform中的Matrix(矩阵)

    transform: matrix(a,b,c,d,e,f) ,如下图矩阵所示,任意点(x,y,1)经过matrix变化为(ax+cy+e,bx+dy+f,1),由此可以知道,matrix参数与tra ...

  10. Win7 安装Apache 2.2.4报错:<OS 5>拒绝访问. :Failed to open the WinNT service manager

    Apache 2.2安装档与win7的“用户账户控制”冲突,所以只要先关闭,安装完后再开启即可. 重启,然后再重新安装Apache2.2.4,没有出现错误.然后再把上述设置改回去. 参考:http:/ ...