作者简介

永利,携程开发经理,专注于Web领域的探索。

一、什么是响应式设计?

可能很多人脑海中已经出现了这样一个动画,当浏览器中页面尺寸不断变化时,内容也在随之变化。简单说,响应式网站设计是一种允许设计和代码响应设备屏幕大小的方法。

二、响应式设计的优势有哪些?

1) 节省人力物力

一套代码两端使用,节省开发、设计、测试、产品、运营资源。

2) 两个端使用同一个url:
  • 利于seo,可以集中精力和资源做一个url的seo,提升搜索引擎的排名。以Google来说,网址不同但内容相同的情况下,虽不会将该网站列为恶意连结,但仍会影响评价。

  • 不需要设置302跳转。如果是非响应式的站点,当移动端浏览器访问桌面站点的url,或者当桌面浏览器访问移动端站点的url时,需要设置正确的302跳转,而这将大大影响用户体验。

三、在携程火车票的应用

响应式设计的概念已经出来蛮长时间,但在国内一直处于不愠不火的状态。当然这与响应式设计并非完美不无关系,在我们的实践当中,也确实遇到了一些问题。

1)业务代码中充斥着大量的媒体查询代码,两个端样式的分开书写不利于阅读和维护。如下:
css
// h5
.box {font-size: 14px;
}
// pc
@media only screen and (min-width: 760px) {.box {font-size: 18px; }
}

假如遇到层级嵌套很深,这种写法可读性更差。

解决方案:

响应式不仅可以根据屏幕尺寸做,一些简单的场合,还可以根据设备代理(UA)做。

由于项目中绝大部分模块的样式代码即使移动端和桌面端有所不同,也只需要书写两种即可,不必特意针对不同尺寸的屏幕分别书写样式代码。据此可以试着来优化代码。

html
<html class="isMobile ? 'h5' : 'pc'"></html>
less
.box {font-size: 14px;.pc & {font-size: 18px;}
}

首先,我们在html中预设了h5或者pc的class,之后在样式中分别根据h5,pc环境书写样式。默认是h5的样式,pc如果有所不同直接覆盖样式即可。这样就把移动端和桌面端的样式写在了一起,样式中减少了大量的媒体查询的代码,并且.pc、.h5的名字不比媒体查询的代码更容易看懂吗?

当然isMobile可以通过屏幕尺寸甚至可以通过UA来实现。使用屏幕尺寸实现的好处就是当用户屏幕在尺寸变化时可以实时响应,不过这个好处不大。用UA实现的好处是服务端也能拿到UA,做ssr时在服务端就能确定渲染哪个平台组件,能够有效的减少size。

这边的less代码用到了一个小技巧,假设没有 & 符号,那么.pc的类会从.box的子元素中去寻找,由于在less中 & 代表的是父元素,也就是.box类,.pc & 就会逃逸出.box的作用范围。.pc会从.box的祖先元素中去寻找,在scss中可以使用@at-root实现相同的效果。

2)size的增加

桌面端和移动端的屏幕大小和操作方式的差异决定了两者的设计一定存在着根本性的区别。为了保证两个端都有较好的用户体验,某些组件(如城市选择器,日期选择器)不得不分别引入。这是导致尺寸增加最重要的因素。要解决这个问题需要根据模块展示的位置做不同处理。

模块在非首屏上展示,这种场景解决比较简单,两个端分别动态引入不同的组件即可。如今的react和vue都已经支持动态引入组件的方式。

棘手的是模块在首屏展示,要如何区分引入呢?如果还是按照动态引入组件的方式,那势必是需要在模块展示区域中有一个加载中的状态,影响体验。两个都导入又会增加包size,假如是ssr的项目,倒是可以在服务端通过UA来区分引入两个端的组件,只不过打包后的js依旧会比较大,降低执行性能。怎么才能两全其美呢?

我们的解决方案是分别定义pc和h5两个page级别的组件,分别引入各自端需要的模块。服务端识别UA去加载正确的page。这个组件要做到尽量的轻量,业务逻辑都交给内部的组件去处理。这样就解决了首屏模块区分引入的问题,只是会多一点代码的维护量。

由于我们用的是携程公司内部的nfes ssr 框架,nfes是这样去定义一个路由的:

javascript
{reg: '/xxx',pageName: 'xxx.html',
}

基于此,我们向框架组提出了pageName能够支持传入一个方法,支持根据ua来区分。如下:

javascript
{reg: '/xxx',pageName(req) {return /mobile/i.test(req.headers['user-agent']) ? 'xxxh5.html' : 'xxxpc.html'},
}

如果你的项目没有用到前端路由,那么事情到这里就结束了。但是我们做的是一个ssr项目,在前端无刷新路由跳转时,前端需要判断UA,去渲染正确的page组件。这种方式并不适合无刷新跳转,前端拿不到req。一开始我们有考虑过是否可以把req这个对象中必要的字段序列化到html中,比如说headers,这样就能保证前端也能完全有这套配置。但是考虑到这种做法太魔法,不太好理解,最终针对性的出了解决方法。

javascript
{reg: '/xxx',h5PageName: 'xxxh5.html',onlinePageName: 'xxxpc.html',
}

具体的实现交由前端或者后端跳转时统一实现即可。如果有些页面确实不适合做响应式,但是又想路径一致,也可以用这种方式解决。

3)图片的引入

对于一些小icon时尽量采用iconfont的形式去替代,幸运的是公司有专业的设计师能做到。其他的情况就用image标签的srcset属性或者用background-image的 image-set方法去引入不同的倍图。记得做好兼容处理即可。

四、适合场景

只要两个端想做的事情相似,偏浏览并且交互不是特别复杂的绝大部分web应用,都非常适合用响应式的方案。有些人可能会担心尺寸增加,会导致加载和执行性能的降低,其实完全没必要,毕竟现在的移动网络和浏览器的执行效率跟五六年前相比已经好太多了。

目前在trip中铁项目中的订单详情页和订单完成页,用了响应式设计来开发,其他页面也在陆续跟进中。这种方式对开发人员最直观的感受就是除了样式上需要根据情况适配一下桌面和移动端,js代码是几乎完全一致的,开发效率得到了明显提升,再也不想回去之前的开发方式了。

【推荐阅读】

  • Trip.com 机票RN整洁架构2.0实践

  • 携程桌面应用的前端内存优化与监控

  • 从0到1,搭建一个体系完善的前端React组件库

  • 携程度假无线前端架构演进之路

 “携程技术”公众号

  分享,交流,成长

干货 | 响应式设计在携程火车票的应用相关推荐

  1. 干货,分享!AdminEx - 响应式设计后台管理模版!!!

    今天把一套压箱底的精品拿出来分享,值得大伙收藏. AdminEx - 响应式设计后台管理模版!!! 本资源整理自互联网,仅供学习交流使用,请勿商用,坚持每日分享一套Java学习资源干货,一起提高,一起 ...

  2. 干货 | 数据为王,携程国际火车票的Sharding-Sphere之路

    作者简介 瑞华,携程高级后端开发工程师,关注系统架构.分库分表.微服务.高可用等. 一.前言 随着国际火车票业务的高速发展,订单量快速增长,单数据库瓶颈层面的问题逐渐显露,常规的数据库优化已无法达到期 ...

  3. 干货 | 携程火车票基于因果推断的业务实践

    作者简介 Seven,数据分析师,专注用户增长.数据科学等领域. 一.背景 携程作为旅游平台,跟用户需求息息相关,理解和识别各个策略/系统对转化/收益的因果关系尤为重要,在这个过程中需要将影响因变量的 ...

  4. 平面设计中的网格系统_干货 | 手把手教你做#响应式设计# 还有标准栅格系统库分享!...

    不管是做平面设计还是UI设计的同学,「网格系统」(又称栅格系统)都是经常听到的专有名词,但是一遇到栅格系统如何指导我们做响应式设计的问题,很多同学都会一脸懵*.本期推荐Ivan.Zheng的深度好文, ...

  5. 复杂产品的响应式设计【流程篇】

    都说2013年将是响应式设计爆发的一年.一淘设计团队在去年一淘首页改版时初步尝试了响应式,最近在一淘"玩客"项目中有了更加深入地应用,第一次在复杂产品中实现了全站响应式.中间积累了 ...

  6. 一款由css3和jquery实现的响应式设计导航

    2014年响应式设计成为设计主流.今天要给大家带来一款由css3和jquery实现的响应式设计导航.当显示器为pc时,导航为横条.当客户端为移动端时,呈现坚形导航.我们一起看下效果图: 在线预览    ...

  7. 基于物理尺寸的响应式设计(转)

    两种Queries之间的细微区别 比较如下两个media-query声明:   @media (min-resolution: 341dpi) and (min-width: 767px) > ...

  8. 为什么要学习响应式设计

    编者按:以下是图灵即将出版的新书<响应式Web设计:HTML5和CSS3实战>的封底文字.相信它能解答一些读者的疑问. 随着iPad mini的发布,又一个新的屏幕尺寸诞生了.用不着全面统 ...

  9. 设计师不应该错过的响应式设计框架(含优缺点分析)

    Ethan Marcotte称响应式设计是基于网格建立一个网站.Marcotte定义这项技术后,响应式设计框架开始出现,主要是css和JavaScript的结合.许多框架都是开源的,可以免费下载和快速 ...

最新文章

  1. 在Hibernate中处理批量更新和批量删除
  2. Redis初学:14(Redis中的事务)
  3. python编程入门与案例详解pdf-Python爬虫天气预报实例详解(小白入门)
  4. 题目1192:回文字符串
  5. ECUG 早鸟票热卖中 | 大咖聚首 探索云计算下一个十年
  6. 数字时钟设计verilog_数字IC设计基本概念之创建时钟
  7. 剑指offer:31-32记录(4道)
  8. 【华为云技术分享】Linux内核源码结构(1)
  9. 【ElasticSearch】Es 源码之 GatewayModule GatewayService 源码解读
  10. 判断点在直线的哪一侧_【倒车入库】车身是否“正直”该怎么判断?
  11. Spring 初始化2次的问题
  12. Android内核开发:系统启动速度优化
  13. artset下载_artset4免费版下载-artset4中文版下载v1.4.2-IT168下载站
  14. Centos7.6安装Bugzilla5.0.4
  15. win7加入网络计算机,win7怎么加入局域网工作组_win7加入局域网工作组的步骤
  16. 2020形式化方法复习笔记
  17. HE3342E单节 2A 开关型锂离子电池充电芯片
  18. 【木头Cocos2d-x 005】穷鬼之mac cocos2d-x环境搭建-成功!(VMWare + mac lion+xcode)
  19. 软考信息系统监理师:2016年4月8日作业
  20. 山月大佬做了个极客时间返现平台及技术栈介绍

热门文章

  1. 消息称电信将于10月引入两款CDMA版iPhone
  2. 在win10上安装git
  3. Linux中误删/ etc/profile文件
  4. 流量主开通以及添加广告步骤
  5. 猫和老鼠手游怎么才能快速上分?目前胜率已经超过90%
  6. SQL 分组/不分组求众数
  7. 配置Nginx虚拟主机
  8. android+水滴粘性动画,Android水滴,小球粘性控件生成.
  9. 【动态规划】游艇租用问题(c++)
  10. Webpack打包之坑 _ webpackChunkName【魔法注释】