移动端开发详解(2)手机开发

弹性布局Flexbox

百分比布局虽然灵活,但是各种宽度,间距的计算也会让人心累。还有一种更灵活的布局方式,即Flexbox,由于桌面端浏览器对Flexbox的支持还未普及,因此它没有成为桌面端页面的主流布局方式,而在移动端,当浏览器的兼容性已不再是最大的问题,Flexbox的机会来了。Flexbox对于移动端有着特别的意义,在传统的定位方式中充斥着各种float浮动属性,这些浮动对于移动端来说是对渲染性能的消耗,我们仍然以这个HTML代码作为范例

   <div class="common"> 
       <img src="sysuzhyupeng-1.png" alt="1"> 
       <h1>sysuzhyupeng1</h1> 
   </div> 
   <div class="common"> 
       <img src="sysuzhyupeng-2.png" alt="2"> 
       <h1>sysuzhyupeng2</h1> 
   </div> 
   <div class="common"> 
       <img src="sysuzhyupeng-3.png" alt="3"> 
       <h1>sysuzhyupeng3</h1> 
   </div> 
   <div class="common"> 
       <img src="sysuzhyupeng-4.png" alt="4"> 
       <h1>sysuzhyupeng4</h1> 
   </div> 
   <div class="common"> 
       <img src="sysuzhyupeng-5.png" alt="5"> 
       <h1>sysuzhyupeng5</h1> 
   </div> 
   <div class="common"> 
       <img src="sysuzhyupeng-6.png" alt="6"> 
       <h1>sysuzhyupeng6</h1> 
   </div>

要将它切换到Flexbox布局,需要div的父元素,即body加以设置

   body { 
      display: -webkit-flex; /* Webkit内核浏览器的兼容性写法 */ 
      display: flex; 
   }

Flexbox布局中有上下和左右两种排列方式。例如,我们希望div元素上下排列,可以设置flex-direction属性为column

   body { 
      /* WebKit内核浏览器的兼容性写法 */ 
      -webkit-flex-direction: column; 
      flex-direction: column; 
   }

现在div元素已经能够由上往下排列了。在flex-direction的属性后面添加-reverse,能够使元素反向排列

   body { 
      /* WebKit内核浏览器的兼容性写法 */ 
      -webkit-flex-direction: column-reverse; 
      flex-direction: column-reverse; 
   }

接着,我们希望布局从纵向更改为横向,修改flex-direction属性

   body { 
      /* 其他代码 */ 
      -webkit-flex-direction: row; 
      flex-direction: row; 
   }

现在body中的div元素从左向右排列,接下来我们还要指定这些div元素的伸缩方式,修改common类

   .common { 
       -webkit-flex: 1 1 auto; 
       flex: 1 1 auto; 
   }

Flex属性包含了3个参数,第一参数名为flex-grow,它用于决定伸缩元素可扩展空间的分配,在此设置为1,标识每个元素的可扩展空间大小相等。第二个参数名为flex-shrink,它用来定义当元素超过元素的大小后的压缩比例,在此定义为1,即每个元素的压缩能力相同。最后一个参数名为flex-basis,用于定义伸缩的基准值,在此设置为auto,即自动分配空间。由于浏览器的宽度不足以容纳所有的元素,因此元素被自动压缩,Flexbox尽量以最优化的形式分配元素的宽度,此时横向排列的元素都被分配了相同的空间。
我们不希望这么多元素挤在同一行,而是希望他们能够以更加灵活的方式进行排列,在此可以为父元素body设置Flexbox的换行属性,代码如下

   body { 
      -webkit-flex-wrap: wrap; 
      flex-wrap: wrap; 
   }

通过设置flex-wrap属性值为wrap,使得元素能够自动换行。现在,在不同屏幕下测试页面,将得到各种不同而灵活的布局效果。

Media Query

移动端的分辨率可以说是五花八门,在css3中提同了Media Query(媒体查询)的新特性,我们直接来看一个例子,代码如下:

   <link href="A.css" rel="stylesheet" media="screen and (max-width: 600px)">

screen代表的是电脑或者移动终端显示屏幕,(max-width: 600px)代表媒体的最大宽度为600像素,所以含义就是当屏幕宽度小于或等于600像素时,应用A.css

   <link href="A.css" rel="stylesheet" media="screen and (min-width: 400px) and (max-width: 600px)">

以上代码代表当屏幕像素小于等于600像素且大于等于400像素时,用用A.css
在同一个CSS文件中,也可以为不同分辨率指定不同样式

   @meadia (max-width: 480px){ 
       h1 { 
          font-size: 24px; 
       } 
   }

当屏幕小于等于480px的时候,h1的样式是如此。
[email protected]

   <style type="text/css" media="screen"> 
       @import url("A.css") 
   </style>

图标字体

雪碧图完美解决了多个图片文件造成的http请求压力问题,但雪碧图的大小,阴影等效果不太容易调整,一旦有大的变动,同时会带来图片和CSS两方面的工作量,现今比较流行的另一种呈现icon图标的技巧——图标字体(Icon Font),则能有效解决以上问题。
图标字体虽然叫做字体,但显示的却不是字母或数字,而是各种图标,现在很多大的图标字体提供网站,如国内的阿里巴巴矢量图标库(http://iconfont.cn/)和国外的Font Awesome(http://fontawesome.github.io)。
图标字体的字体制作比较复杂,如果希望定制个性化图标,则有两种途径,一种是使用现成的在线生成工具,如国内阿里的iconfont,以及国外的IconMoon等。
接下来讲解图标字体的应用

   <h1>sysuzhyupeng</h1>

首先下载一套图标字体,字体文件名分别为icon-font.ttf,icon-font.eot,iconfont.woff

   @font-face { 
      font-family: 'icon-font'; 
      src: url('icon-font.ttf'), url('icon-font.eot'), url('iconfont.woff'); 
   }

定义好icon-font字体后,就可以在h1的标题before伪类中设置字体和文字内容了,在此可以指定unicode编码来指定字符,如心形图形的字符编码为’/e626’

   h1::before { 
      font-family: 'icon-font'; 
      content: "/e626"; 
   }

图标的更换也非常简单,改变content就可以。

移动端交互

在桌面端,点击了一个按钮,可以使用以下js代码

   var button = document.getElementById('button'); 
   button.onclick = function(){ 
       //... 
   }

然而在iphoe这样的移动端测试时,我们会发现onclick事件大约有半秒的延迟,这是因为IOS系统需要等待一段时间来判断用户是单击还是拖动,要使得用户在移动端的交互更加流畅,则需要使用到Touch事件

   button.addEventListener('touchstart', buttonBehavior); 
   function buttonBehavior(){ 
       // ... 
   }

在触发touchstart事件时,也会同时产生一个event对象,在这个对象中包括触摸行为的各种信息,如可以用以下代码来输出触摸点的个数

   function buttonBehavior(e){ 
       console.log(e.touches.length); 
       // 触摸点的x,y位置属性 
       console.log(e.touches[0].pageX); 
       console.log(e.touches[0].pageY); 
   }

注意,在桌面端浏览器中不支持触摸事件,如果正在制作页面是响应式页面,那么需要考虑对浏览器环境做检测,然后根据设备种类的不同来绑定不同的交互事件
除touch事件外,在IOS设备中还提供了gesture事件,即多指操作,当用户将第一根手指放在按钮上时,触发了touch,第二根手指也放到按钮上时,触发了gesture事件

   button.addEventListener('gesturestart', buttonBehavior); 
   function buttonBehavior(e){ 
       //... 
   }

当两根或多根手指在屏幕中移动时,则会不断出发gestureChange事件,通过事件对象参数传回手指的旋转度,缩放等数值

   button.addEventListener('gesturestart', buttonBehavior); 
   function buttonBehavior(e){ 
       console.log(e.rotation); 
       console.log(e.scale); 
   }

其他技巧

以下代码是一种兼容性写法,能够输出当前设备的横屏或竖屏状态:

   console.log(window.orientation || screen.orientation);

以下meta代码能够使用户在使用IOS设备从主屏直接启动某一个页面时,显示一副启动图像

   <link rel="apple-touch-startup-image" href="A.png" />

在IOS设备中按住一个页面元素时,IOS会自动在元素周围显示橙色的外框,这一高亮效果可以用以下CSS代码去除

   * { 
      /* 设为完全透明 */ 
      -webkit-tap-highlight-color:rgba(0, 0, 0, 0); 
   }

以下CSS代码能够避免在横竖屏切换时,移动设备对页面中的文字大小进行自动调整

   html { 
      -webkit-text-size-adjust: 100%; 
      -ms-text-size-adjust: 100%; 
      text-size-adjust: 100%; 
   }

另一个常见问题是页面高度渲染问题,当页面设置高度为100%时,将系统自带的导航栏计算到其中,可以用一段js代码来修正这个问题

   document.documentElement.style.height = window.innerHeight + 'px';

当站点有配套的Apple Store App,还可以通过添加以下标签,将应用链接显示在页面顶部

   <meta name="apple-itunes-app" content="app-id=570931840">

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/6038.html

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论