phone6及iphone6plus已经出来一段时间了。很多移动端网站,以前写死body为320px的,现在估计也忙着做适配了。
大屏幕手机其实一直有,只是以前大家没怎么重视,移动端的H5页面大部分都以320px为基准宽度进行布局,那些大屏屌丝android用户也懒得去理,而现在iphone也搞起多屏幕,老板们重视程度就不一样了。
回归正题,兼容iphone各版本机型最佳的方式就是自适应。
1、viewport简单粗暴的方式:
<metaname="viewport"content="width=320,maximum-scale=1.3,user-scalable=no">
直接设置viewport为320px的1.3倍,将页面放大1.3倍。
为什么是1.3?
目前大部分页面都是以320px为基准的布局,而iphone6的宽度比是375/320=1.171875,iphone6+则是414/320=1.29375
那么以1.29倍也就约等于1.3了。
2、ip6+的CSSmediaquery
@media(min-device-width:375px)and(max-device-width:667px)and(-webkit-min-device-pixel-ratio:2){
/*iphone6*/
}
@media(min-device-width:414px)and(max-device-width:736px)and(-webkit-min-device-pixel-ratio:3){
/*iphone6plus*/
}
PS:也可以直接使用实际的device-width:如device-width:375px
在原有页面的基础上,再针对相应的屏幕大小单独写样式做适配。
3、REM布局
REM是CSS3新增的一种单位,并且移动端的支持度很高,android2.x+,ios5+都支持。
REM是相对于dom结构的根元素来设置大小,也就是html这个元素。相较于em单位,rem使用上更容易理解及运用。
REM与PX的换算可以查看网址:https://offroadcode.com/prototypes/rem-calculator/
假设,html我们设置font-size:12px;也就是说12px相对于1rem,那么18px也就是18/12=1.5rem。
那么我们以320px的设计布局为基准,将html设置为font-size:100px,即100px=1rem。(设置100px是为了方便计算)那么可以将大部分px单位除以100就可以直接改成rem单位了。
REM如何做响应式布局?
1、如果仅仅是适配ip6+设备,那么使用mediaquery就行。
伪代码如下:
/*320px布局*/
html{font-size:100px;}
body{font-size:0.14rem/*实际相当于14px*/}
/*iphone6*/
@media(min-device-width:375px)and(max-device-width:667px)and(-webkit-min-device-pixel-ratio:2){
html{font-size:117.1875px;}
}
/*iphone6plus*/
@media(min-device-width:414px)and(max-device-width:736px)and(-webkit-min-device-pixel-ratio:3){
html{font-size:129.375px;}
}
这样,在ip6下,也就将页面内的元素放大了1.17倍,ip6+下也就是放大了1.29倍。
2、如果是完全自适应,那么可以通过JS来控制。
(function(doc,win){
vardocEl=doc.documentElement,
resizeEvt='orientationchange'inwindow?'orientationchange':'resize',
recalc=function(){
varclientWidth=docEl.clientWidth;
if(!clientWidth)return;
docEl.style.fontSize=100*(clientWidth/320)+'px';
};
//AbortifbrowserdoesnotsupportaddEventListener
if(!doc.addEventListener)return;
win.addEventListener(resizeEvt,recalc,false);
doc.addEventListener('DOMContentLoaded',recalc,false);
})(document,window);
页面初始化的时候计算font-size,然后再绑定resize事件。这种效果就和百分比布局一样了。
那么用REM做单位与百分比做单位有什么优势?
主要优势在于能更好的控制元素大小。(一般百分比应用在布局层,一般常见设置为50%,33.3%,25%之类的整数居多,难以运用在复杂的页面小部件内)。
但是相比百分比布局,需要借助JS或mediaquery实现,略有一点瑕疵。
DEMO地址
4、图片自适应
刚说完REM布局,那么用百分比布局也能实现一样的效果,但是用百分比布局,必须要面临一个问题:图片宽度100%,页面加载时会存在高度塌陷的问题。.
那么可以用padding-top设置百分比值来实现自适应。
公式如下:
padding-top=(ImageHeight/ImageWidth)*100%
原理:padding-top值为百分比时,取值是是相对于宽度的。
相关代码实现:
<divclass="cover">
<imgsrc="http://www.hmttv.cn/uploadfile/2024/0807/20240807031317792.jpg"alt=""/>
</div>
.cover{position:relative;padding-top:100%;height:0;overflow:hidden;}
.coverimg{position:absolute;top:0;width:100%;}
DEMO地址,缩放浏览器窗口看看。
5、图片高清化
大家都知道,iphone6plus是3倍高清图了,它的devicePixelRatio=3。
在ios8下,已经开始支持img的srcset属性了(目前移动端也就ios8开始支持),也就是说,可以对一张图片设置2个URL,浏览器自动加载对应的图片。
黄色表示仅支持旧的srcset规范,绿色表示支持全新的srcset规范,包括sizes属性,w描述符。这里不展开,详细了解可自行google。
不过目前前端这边图片的实现基本都用lazyload的方式实现。srcset的图片加载方式在实际项目中运用还比较少。
6、背景图高清化
mediaquery实现高清化
img标签的高清化,可以通过JS判断devicePixelRatio的值来加载不同尺寸的图片,但是对于背景图,写在CSS中的,用JS来判断就略麻烦了,还好CSS通过mediaquery也能判断dpr。
目前兼容性最好的背景图高清化实现方式,使用mediaquery的-webkit-min-device-pixel-ratio做判断:
/*普通显示屏(设备像素比例小于等于1)使用1倍的图*/
.css{
background-image:url(img_1x.png);
}
/*高清显示屏(设备像素比例大于等于2)使用2倍图*/
@mediaonlyscreenand(-webkit-min-device-pixel-ratio:2){
.css{
background-image:url(img_2x.png);
}
}
/*高清显示屏(设备像素比例大于等于3)使用3倍图*/
@mediaonlyscreenand(-webkit-min-device-pixel-ratio:3){
.css{
background-image:url(img_3x.png);
}
}
进一步,可以通过工具生成相应的3x,2x,1x的图片及css,在使用时直接引用即可。谁搞一个?
关于移动设备的-webkit-min-device-pixel-ratio值,可以查看该网页的整理:http://bjango.com/articles/min-device-pixel-ratio/
image-set实现高清化
image-set,它是Webkit的私有属性,也是Css4的一个属性,它是为了解决Retina屏幕下的图像显示而生。
使用方式也很简单。伪代码如下:
.css{
background-image:url(1x.png);/*不支持image-set的情况下显示*/
background:-webkit-image-set(
url(1x.png)1x,/*支持image-set的浏览器的[普通屏幕]下*/
url(2x.png)2x,/*支持image-set的浏览器的[2倍Retina屏幕]*/
url(3x.png)3x/*支持image-set的浏览器的[3倍Retina屏幕]*/
);
}
目前移动端的支持程度来看,ios7+,android4.4+下已经支持了。如果仅仅是做ip6+的高清适配方案。image-set也是一种实现方案。
使用image-set与mediaquery实现有什么区别及好处?
这篇文章里面做了很详细的阐述,大家可以看看:http://blog.cloudfour.com/safari-6-and-chrome-21-add-image-set-to-support-retina-images/
大体的意思是:image-set不需要告诉浏览器使用什么图像,而是直接提供了图像让浏览器选择。这就意味着,如果在低网速下,浏览器可以选择加载低分辨率的图片。(PS:好智能的样子)
但是相比如mediaquery的实现,image-set仅支持单个图片的高清化,不适合在csssprite下使用。并且兼容性也是一大硬伤。
但是一般来说,用在LOGO区域,单个图片图标的区域下,也是个不错的选择。
7、图片列表的自适应
关于适配,也就是要让布局更灵活,在电商网站里面,商品列表是一个非常常见的结构。
一种比较智能的列表方式是:两端对齐,间距自适应。
那么可以使用FLEXBOX布局来实现两端对齐的效果,也可以使用text-align:justify的方式实现。
先看个flex实现的例子,主要通过justify-content:space-between,来实现:
flexbox的布局方式,在PC端就不合适了,ie9以下都不支持,那么更友好的方式可以使用text-align:justify来实现,兼容各大主流浏览器,包括IE6。
但是这2种布局方式都有一定的局限性。就是列表个数必须凑整。目前还没找到一种能够兼容不限个数的实现方案,如果各位看官有更好的实现方式,也欢迎提出,一起交流。
移动端ip6的适配方案有很多,没有固定的套路及方法,请根据自身业务的特点,选择其中的一些方法组合使用。
跨无忧(www.kuawuyou.com)来自“跨屏无忧”的想法,我们首个推出永久的、不依赖第三方的跨屏幕适配方案,希望以我们专业的力量帮助每个企业都能实现在移动互联网的转变,让企业网站轻松无忧完成到移动设备的跨屏幕适配,快速抓住移动互联网机遇。
学目标:
1. 理解前端开发的基本概念和原理。
- 前端开发的定义和作用
- 前端开发的基本工具和环境
- 前端开发的职责和要求
2. 掌握HTML5标记语言的基本语法、元素和属性。
- HTML5的发展历程和版本
- HTML5文档结构和基本语法规范
- HTML5常用的文本标记、图像标记、表格标记等
- HTML5的表单元素和相关属性
3. 掌握CSS3的基本语法、选择器和常用样式属性。
- CSS3的发展历程和版本
- CSS3的基本语法和选择器
- CSS3的盒模型、布局和浮动
- CSS3的文本样式、背景样式和过渡动画
it学习
4. 理解JavaScript的基本语法、数据类型、条件语句和循环结构。
- JavaScript的基本语法和变量定义
- JavaScript的数据类型和类型转换
- JavaScript的条件语句和逻辑运算
- JavaScript的循环结构和数组操作
5. 掌握DOM操作,能够使用JavaScript操作HTML文档中的元素。
- DOM的概念和基本原理
- 使用JavaScript获取和操作HTML元素
- 使用JavaScript创建、修改和删除HTML元素
- DOM事件的处理和绑定
6. 理解响应式设计的概念和基本原理。
- 响应式设计的定义和作用
- 使用媒体查询实现页面布局的适应性
- 使用流式布局和弹性盒子布局实现页面适配
- 使用响应式图片等技术提升页面响应性
软件开发
大纲精细化教学设计:
第一部分:前端开发基础
1. 前端开发概述
1.1 什么是前端开发
1.2 前端开发的历史和发展趋势
1.3 前端开发的基本工具和环境
2. HTML5基础
2.1 HTML5的简介和发展历程
2.2 HTML5的文档结构和基本语法规范
2.3 HTML5常用的文本标记、图像标记、链接标记等
2.4 HTML5的表单元素和相关属性
3. CSS3基础
3.1 CSS3的简介和发展历程
3.2 CSS3的基本语法和选择器
3.3 CSS3的盒模型、布局和浮动
3.4 CSS3的文本样式、背景样式和过渡动画
4. JavaScript基础
4.1 JavaScript的简介和发展历程
4.2 JavaScript的基本语法和变量定义
4.3 JavaScript的数据类型和类型转换
4.4 JavaScript的条件语句和逻辑运算
4.5 JavaScript的循环结构和数组操作
小程序开发
第二部分:网页交互与动态效果
1. DOM操作
1.1 DOM的概念和基本原理
1.2 使用JavaScript获取和操作HTML元素
1.3 使用JavaScript创建、修改和删除HTML元素
1.4 DOM事件的处理和绑定
2. 事件处理与表单验证
2.1 常见的DOM事件类型和触发条件
2.2 使用JavaScript处理交互事件
2.3 表单验证的基本原理和实现方法
3. Ajax与数据交互
3.1 Ajax的简介和发展历程
3.2 使用JavaScript发送异步请求
3.3 处理服务器返回的数据
第三部分:响应式设计与跨平台开发
1. 响应式设计概述
1.1 响应式设计的定义和作用
1.2 媒体查询的基本语法和常用属性
1.3 使用响应式设计实现网页适配
2. 移动端开发概述
2.1 移动端开发的特点和挑战
2.2 使用CSS3实现移动端样式效果
2.3 使用JavaScript处理移动端交互
3. 跨平台开发基础
3.1 常见的跨平台开发技术和框架
3.2 使用跨平台开发工具搭建应用
3.3 测试和发布跨平台应用
通过以上的教学目标和大纲精细化教学设计,学习者将能够全面掌握前端开发所需的HTML5、CSS3和JavaScript的基础知识,并能够应用所学知识实现网页交互和动态效果,以及具备响应式设计和跨平台开发的能力。
辑导语:如何为一款产品制定合适的界面规则?随着产品的迭代更新,作为设计师,则更需要在了解产品特性的情况下、设计出合理且有效的界面布局。本篇文章里,作者就对web产品设计适配选型做出介绍,并提出了他的看法。
现如今,几乎所有的网页设计都要进行响应式和自适应设计,才能让产品能够覆盖到更多终端。接手一个产品设计的初期,制定界面适配规则时,你是否也有过如下疑问:
在早期,硬件设备落后,网页使用的是绝对静态布局为主,绝对固定宽度的布局被称为是静态布局(Static Layout),也有叫固定布局(Fixed Layout)。
后随时代变迁,技术发展。因浏览器的增多,开发者们忙于兼容各种浏览器。在这个期间,实际已经有了针对各设备适配的解决方案,只是未成为主流,这种新布局方式叫自适应布局(Adaptive Web Design,简称AWD)。
在当时,大多指的就是宽度自适应布局。
在这种新思想下,又出现了两派的具体解决方案:百分比宽度布局和流体式布局(Fluid Layout)。
在当时,大家都还没有响应式布局的概念,但此时出现了一个新的词——渐进增强。渐进增强出现后,另一个词优雅降级也随之出现了。这里只是举个典型的例子:Gmail和QQmail。这两个都是百分比宽度布局,都属于自适应布局,但有区别。
QQmail就是CSS hack的完美体现。你用任何一个浏览器,几乎可以看到同一个样子的邮箱,为的是用户体验统一。
Gmail则使用了渐进增强,你的浏览器越新越强,你看到的效果就越好,为的是用户体验增强。再后来,Google发布了Android,移动互联网爆发,html5标准发布。
互联网大战从PC打到了手机。手机虽然屏幕变小了,但是却提供了更丰富的功能。用户要求不断提高,网站更加看重的是用户体验了。
所以,谷歌式的渐进增强被广泛认可。结合自适应的思想,出现了响应式布局(Responsive Web Design)的概念——2010年由Ethan Marcotte提出。
描述响应式界面最著名的一句话就是“Content is like water”——无论用户正在使用笔记本还是iPad,我们的页面都应该能够自动切换分辨率、图片尺寸及相关脚本功能等,以适应不同设备。
现如今,为何需要考虑多设备的兼顾呢?依然是因为时代发展与生活方式的变迁:
因此我们需要在了解基本布局方式的特征下,选择适合自身产品的布局实现方式。
静态式、自适应、流体式、响应式布局,A+R混合布局的特点对比如下。
窗口缩小后内容被遮挡时,拖动滚动条显示布局。不管在哪种设备,哪种浏览器上浏览都是一个样。移动设备上则显示太小或不全。
用自适应技术(Adaptive),我们可以开发和提供不同的布局,来为类似纯触屏或者混合触屏设备这样的一类具体场景提供最好的体验。
分别为不同的屏幕分辨率设备设计不同的样式布局,相当于多个静态布局组成的一个系列合集。
每个静态布局对应一个屏幕分辨率范围,页面通过百分比自动适配设备屏幕分辨率和可视窗口大小。
当可视窗口改变时,不会出现横向滚动条,UI、图片、文字会自动缩放,元素内容、布局、交互方式基本不变。
以百分比作为页面的基本单位,可以适应一定范围内所有尺寸的设备屏幕及浏览器宽度,并能完美利用有效空间展现最佳效果。
属于自适应的一个子集,也是通过百分比自动适配设备屏幕分辨率和可视窗口大小。不同于百分比自适应的是,随着窗口大小的改变,页面的布局会发生小的变化,可以进行适配调整,这个正好与自适应相补。
如果从广义上讲,响应式布局实际上就是更好、更机智、更灵活地去实现自适应,他们都算是一种弹性布局。再通俗点讲响应式重在于「响应」它会随着设备属性(如宽高)的变化。
页面的设计和开发应当根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)进行相应的响应和调整。具体的实践方式由多方面组成,包括弹性网格和删格、布局、图片、CSS media query的使用等。
狭义上讲,响应式网页设计指的是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。
1)R和A上的区别
当响应式设计在基于预定义断点之上用CSS或者JS调整布局和内容。调整方法提供基于用户代理和设备类型的预结构化模版。
他们之间主要的区别是DOM结构,当采用响应式思维开发时,HTML代码在各种情况下都会一样(除非你用JS移除某些DOM节点),而在自适应开发中我们可能会有不一样的代码结构和体验。
R采用流体+断点,在断点之间,页面依然会随窗口大小自动缩放(通过fluid grid),直到遇到断点改变界面样式布局甚至内容。R一般来说需要在网页设计初期就开始(通常采用mobile first策略),所以旧的网站要做RWD很可能要完全重建。
A只在针对几种分辨率(如320、480、760、960、1200、1600px)进行优化,在断点之间的自动过渡比较少。而A则采用保留现有桌面网站(desktop version)而对于更小的分辨率做针对性的优化(适应),减小重构的成本。
两种设计思维都是有效的,需衡量在项目中有多少组件、复杂性如何以及是否存在一种体验是适合所有用户的。开发web应用时经常会用到响应式设计,例如通过自适应开发来构建定制化体验。
两种方法各有利弊,但是如果同时使用它们到底会得到什么呢?A+R模型结合了基于单个主要临界点的自适应和响应式方法。
混合式布局就是为不同终端设备的屏幕分辨率定义布局(适配各种尺寸的PC、手机、穿戴设备等等),在每个布局中,页面元素随着窗口调整而自动适配,混合了百分比、像素为基本单位的组合方式。可以把混合式布局看作是弹性布局、自适应布局的融合。
自适应布局、弹性布局、混合布局都是响应式布局方式的一种。其中自适应布局的实现成本最低,但拓展性比较差;而弹性布局与混合布局效果都是比较理想的响应式布局实现方式。
很多时候,单一方式的布局响应无法满足理想效果,需要结合多种组合方式,但原则上尽可能是保持简单轻巧,而且同一断点内(发生布局改变的临界点称之为断点,后面内容会讲到)保持统一逻辑。否则页面实现太过复杂也会影响整体体验和页面性能。
一般通栏、等分结构的布局适合采用弹性布局方式,非等分的多栏结构布局则需要采用混合布局的实现方式。
2)选型
如何考虑实践过程中的判断呢?
一是看应用场景,二是看如何设计“响应式”方案。简单、轻量的页面直接用media query实现响应性就很好。比如blog、小型企业站之类。现在的CSS框架基本都具备响应性。
但请注意响应式不仅仅是响应式布局。对于大型站简单用media query是远远不够的。
于是在同一个controller层上,识别UA,渲染不同版本的模板,组合相应的静态资源,这也算是响应式。开发及维护成本明显提高。
当各个版本间的差异很大时,维护成本很可能会大到无法接受。即便分开做,架构上也要调整,后端服务化,应用层App化。
根据不同公司的技术特点,调整的成本也难讲是否可行。对于大型站,分开做更清晰,同时用响应式组件解决复用、功能同步的问题。总之,根据场景响应式可以从各种层面、各种粒度上做。这是现代web开发的特点。
建议开发一套响应式电脑网站(过渡到平板端,不过渡到手机端)和开发一套响应式手机端网站(过渡到平板端以下的尺寸,不过渡到平板端)。
响应式布局有可能造成冗余的代码较多,对研发的要求也更高,比如如何更好地让图片、适配、UI动画自适应各种布局。
大站还是要考虑数据计算和承载的问题,会对桌面和移动端输出不同数据,减轻压力。
首先,我们需要了解几种分辨率的差别。
PS:原生应用可查询横纵两个方向的像素密度,通常浏览器可查询1个系统像素对应多少物理像素。而设计角度通常需要参考的是所获取的系统分辨率。
以一个SaaS类后台产品为例。
对于基本流量来自Web端网页的产品而言,需要了解当下的浏览器分辨率现状 Web端不同屏幕分辨率占比情况,数据来源百度统计,如图所示:
如上所述,选择适配方式时,设计目标为:区分web与pad端可共享的设计布局大于手机端,且产品规划上web端为主流量来源,pad端属于短期兼顾。考虑技术维护成本与开发成本的平衡,于是判断需要选择A+R模式来完成产品的跨端设计。
自适应(A)方法能让我们在不同的设备上有不同的体验、内容甚至是功能。如将960px作为主要的自适应临界点,根据全局统计信息定义,我们会得到一些相似处:
在使用响应式(R)技术时,我们可以利用主要临界点创建两个互不相同的体验情景。每种体验里,我们都可以在可用空间内定义二级临界点去调整布局。
通过结合自适应和响应的方法,我们得到A+R模型。利用自适应技术,我们将致力于体验和功能,作出两种不同的情景设计。使用响应式组件,我们可以处理上下文内的UI组件和布局。
这种设计方法要求设计师真正了解他们想要提供的体验,以便于定义要遵循的模型。此模型非常适合那些在较少功能或结构完全不同的小型移动设备上运行的大型APP。就像你看到的,你的产品将具有很强的灵活性,但同时也很复杂。
因为你要处理不同的代码库和环境(非强制性),Twitter、Facebook和Github将此模式应用在他们的移动网站上。如果你在移动设备上浏览这些网站,则可以根据移动用户的期望来检验它们是如何改变的用户体验的。
栅格系统可以帮助我们设计,但却不能保证我们的设计。它有多种可能的用途,并且每个设计师都可以寻找适合其个人风格的解决方案。对于简化复杂的响应式布局规则而言,这是一项十分有效的辅助手段。
列(Column)用于对齐内容。
其中的槽(Gutter)是指相邻列之间的空间,把控页面留白,有助于分隔内容。
页边距是指内容和屏幕边缘之间的空间。将边距宽度定义为固定值,这些值决定了每个屏幕尺寸的最小呼吸空间。
用于组成栅格的列数称为列结构。
8、12、16和20是响应式布局中最常见的几种列结构。而这取决于我们对产品的设计要求。
12列结构是相对灵活的。它可以进一步细分,将内容排列在4-4-4或3-3-3-3大小的文本框中,也有部分设计系统采用来24列的形式,如Ant-D。
是指屏幕尺寸的特定范围,列结构、列宽、槽宽和边距都取决于断点。
在这个范围内,布局会根据可用的屏幕尺寸重新调整,以获得最佳的布局视图。
如果较小的屏幕有足够的可用空间容纳内容,则列将按比例缩小。如果一列的内容无法在较小屏幕上显示,该列将垂直放置图文内容。
列跟槽的宽度是以网格作为基本单位来做增减,所以应该先定义好栅格的原子单位。“网红款”8点网格指的是设计页面时,也应该遵循8点规律。值得注意的是,列跟槽的值尽量取8的倍数,但不是非得是8的倍数。
产品中各类元素应该遵循这个倍数原则(图标、组件大小等),不同的设计系统根据自身需求,设定这个规则。例如在Material Design中使用的是2X网格。
流体栅格有不同宽度的列,固定的槽和固定的边距。流体栅格有灵活的内容宽度,根据屏幕大小变化在流体栅格中,列可以增长或收缩以适应可用空间。
混合栅格既有不同的宽度,也有固定宽度。在现代布局中,一些元素超出了网格边缘,与屏幕边缘对齐。页眉、页脚、出血都是一些常见的例子。
如果内容宽度大于可用的屏幕尺寸,那么一个固定栅格就会转变成一个适应屏幕可用空间的流动栅格,以充分适应内容。
设计需在技术方案前介入,根据你的产品特点,进行设计方案评估。可借助的手段有删格、网格规则等。设计断点规则时,需关注设备的常见系统分辨率。
移动和桌面设计的差别远不止是布局问题。只要有足够的编程量,这些差别是可以通过响应式设计来解决的。事实上,你可以认为如果一种设计不能兼顾两种平台的主要差别,就不能算是合格的响应式设计。
但是,如果确实想要处理好平台间的所有差异,我们就回到了原点:进行两种不同的设计或者使用A+R的模型,在寻求合适的过程中,关注技术的革新。
A与B不是硬币的正反面,它们为了解决同一个问题而生,是同一种思想的延伸。
作者:神乐、沙拉;公众号:酷家乐用户体验设计
本文由 @酷家乐用户体验设计 原创发布于人人都是产品经理,未经许可,禁止转载
题图来自 Unsplash,基于 CC0 协议
*请认真填写需求信息,我们会在24小时内与您取得联系。