现在移动互联网的发展,现在很多企业做网站开发不仅是电脑端的网站,还包括了移动端网站的开发,移动端网站开发和pc端是有一定的区别,比如移动端的页面更小,移动端的打开和加载速度都远低于电脑端访问网站,其实除过这两点,pc端网站的建设和移动端网站开发都是有很多的区别,今天我们一起来了解下。
移动端网站和pc端的网站在设计风格上是不太一样的,很多人说手机站不就是pc站的缩小版么,为什么还要不一样?这里大家要注意,手机网站和pc网站的像素大小不同,另外一点就是手机屏幕操作和电脑操作是不一样的,所以有些功能电脑网站操作很简单,但是手机站操作很麻烦,所以手机网站开发就不能全部抄pc端网站。
另外一点就是手机网站开发语言和pc端网站是不一样的,以前手机网站的语言是HTML写的,而现在已经采用了HTML5技术,可以自适应所有尺寸的手机屏幕,有着更强大的网页表现能力,也优于其他前端语言的aeo性能,让企业能把握住移动搜索引擎的流量入口。而css3的技术可以让手机网站的布局字体、颜色和背景有更炫丽的效果。
做好手机网站的建设也更方便用户去看,如果一个企业只有一个电脑端网站,没有一个手机端的网站,那么手机访问的话打开网站的页面就是不完整的,因为手机访问电脑网站是在是太大了,所以需要缩放,而如果有手机网站的话,就会自适应成更适合手机网站访问的页面,这样看起来就更加的清楚,也更加的方便,这就是手机网站建设的重要性,如果企业要做移动端营销,那么手机网站建设是很有必要的。
在对主流手机终端进行统计得出,大部分手机的device-width为320px、360px、375px、384px、400px、414px,另外安卓pad的device-width为600px0px。手机屏幕分辨率宽度则在320px-1080px间,有少部分手机已经达到1152px和1440px。PS:ipad访问移动端建议跳转去对应的PC页面。
css的计量单位有三种选择:
px: 固定的相素值
em: 相对父级元素的font-size设置来作为当前元素1em所代表的像素值,如父节点的font-size:10px,当前节点的font-size:1.2em,则当前节点的font-size实为12px;
rem:相对根节点html的font-size设置来作为当前元素1rem所代表的像素值,与em的区别就是rem的基本度量单位与父节点无关,只与根节点font-size的设置有关,如设置html{font-size:10px;}后当前dom所有节点的1rem都表示10px;
移动端开发中我们使用rem作为基本计量单位,同时将根节点默认字号大小设为font-size:62.5%,因移动端浏览器默认字号大小为16px;16*62.5%刚好为10px; 具体设置方法及使用示例
html{font-size:62.5%;/*刚好为10px;*/} #example{font-size:1.2rem}/*设置#example的字体大小为12px;*/ #example div{font-size:1.4rem; width:10rem;height:10rem}/*设置#example子节点div的字体大小为14px;宽度为100px;高度100px*/
安卓下<textarea>标签的内容字体大小不支持rem设置,如有需要使用响应式及px单位设置其字体大小,暂时还未找到具体原因
在对主流手机终端进行统计得出,大部分手机的device-width为320px、360px、375px、384px、400px、414px,另外安卓pad的device-width为600px0px。 手机屏幕分辨率宽度则在320px-1080px间,有少部分手机已经达到1152px和1440px。PS:ipad访问移动端建议跳转去对应的PC页面。
在移动端开发中,我们使用如下viewport设置
<!--viewport的设置--> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
注:device-width实际上并不等于设备宽度,而是css宽度,它是根据设备屏幕宽度和屏幕像素密度换算得出的用于网页显示的css宽度
/*reset.less*/ /* CSS Document */ html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%; font-size:62.5%;} ul,li,div,p,body,h1,h2,h3,h4,h5,h6,dl,dt,dd{margin:0;padding:0;} li{list-style:none;} a{text-decoration:none; color: #2a2a2a; } input{ -webkit-appearance:none;outline:none} *{outline: none; webkit-focus-ring-color: rgba(0, 0, 0, 0);-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;} .hide{display:none;} body, html {width: 100%; font-family: "Microsoft YaHei","Helvetica Neue",Arial, HelveticaNeue, Helvetica, "BBAlpha Sans", sans-serif;font-weight: normal;display: -webkit-box;-webkit-box-orient: vertical; -webkit-box-align: center;} /* *{-webkit-backface-visibility: hidden;-moz-backface-visibility: hidden;-ms-backface-visibility: hidden;backface-visibility: hidden;} 用于解决某些情况下出现闪屏的问题,若无则不加*/ body{opacity: 1;-webkit-transition:opacity 500ms ease-in;transition:opacity 500ms ease-in; } p,a,li{font-size:1.2rem; color:#434343} html{ font-size: 312.5%; } @media screen and (max-width:359px) and (orientation:portrait) { html { font-size: 266.67%; } } @media screen and (min-width:360px) and (max-width:374px) and (orientation:portrait) { html { font-size: 300%; } } @media screen and (min-width:384px) and (max-width:399px) and (orientation:portrait) { html { font-size: 320%; } } @media screen and (min-width:400px) and (max-width:413px) and (orientation:portrait) { html { font-size: 333.33%; } } @media screen and (min-width:414px) and (max-width:431px) and (orientation:portrait){ html { font-size: 345%; } } @media screen and (min-width:432px) and (max-width:479px) and (orientation:portrait){ html { font-size:360%; } } @media screen and (min-width:480px)and (max-width:639px) and (orientation:portrait){ html{ font-size:400%;} } @media screen and (min-width:640px) and (orientation:portrait){ html{ font-size:533.33%;} }
例如750px设计稿上320px*200px字体大小为32px的区域样式为:
html{ font-size: 312.5%; } .div{ width:3.2rem; height:2rem; font-size:0.32rem }
主要处理短屏下缩放,以及初始化时固定页面大小,防止竖屏下弹出键盘或横屏时页面发生缩放的情况
var initScreen=function(callback){//初始化html font-size $("html").css("font-size",document.documentElement.clientHeight/document.documentElement.clientWidth<1.5 ? (document.documentElement.clientHeight/603*312.5+"%") : (document.documentElement.clientWidth/375*312.5+"%")); //单屏全屏布局时使用,短屏下自动缩放 //$("html").css("font-size",document.documentElement.clientWidth/375*312.5+"%");//长页面时使用,不缩放 if(callback)callback(); } function _onorientationchange(e){ if(window.orientation==90||window.orientation==-90){ $("#forhorview").css("display", "-webkit-box"); //显示竖屏浏览提示框 }else{//竖屏下恢复默认显示效果 var st=setTimeout(initScreen,300); $("#forhorview").css("display", "none"); } _resize(e); } $(function(){ initScreen(); window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", function(e){_onorientationchange(e);}, false); })
<!doctype html> <html> <head> <title>标题</title> <meta name="keywords" content="关键字" /> <meta name="description" content="描述" /> <meta name="format-detection" content="telephone=no" /> <meta name="format-detection" content="address=no" /> <!--for baidu 识别移动端页面并禁止百度转码--> <meta name="applicable-device"content="mobile"> <meta http-equiv="Cache-Control" content="no-transform" /> <meta http-equiv="Cache-Control" content="no-siteapp" /> <!--viewport 设置,如果页面实际情况不允许缩放请加上,user-scalable=no--> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <meta name="apple-mobile-web-app-capable" content="yes" /> <link rel="stylesheet" type="text/css" href="css/index.less" /> </head> <body> <div id="forhorview"> <p>推荐使用竖屏浏览哦~</p> </div> <script src="js/zepto.min.js"></script> </body> </html>
在移动端使用新的css3样式代替原来在PC上的开发习惯
新的布局实现方式:使用display:box、box-flex代替float\display:inline-block; 实现更强大、更完美的流体布局,尤其在宽度为100%的布局中,实现横向并排元素宽度的自动伸缩以及水平垂直居中平均分布、首尾分布排列等。
垂直居中的实现方式:使用display:-webkit-box;-webkit-box-align: center;实现垂直居中。
尽量使用border-radius,box-shadow,text-shadow等css3样式实现诸如圆角、渐变色、盒子投影、字体投影,减少使用图片。
对于单色的icon图标,我们将会整理出一套常用图标,并制作成字体,利用css3的@font-face使用自定义字体导入,这样的话,可以像修改字体一样随意地修改图标的颜色、大小、背景色、特殊效果(如投影)等,而不再需要每一种颜色就需要切一份图片。
利用-webkit-transform:rotate(90deg)来获取旋转了不同角度的icon,避免每个角度需要切一张图片
在动画中,利用css3动画属性如-webkit-transform:translate(10px,12px)来改变元素的偏移位置,减少使用left和top来做位移动画
pp开发是一个非常有趣的事情,如果你试着开发一个自己的app的话,你一定会爱上这项活动。
编者按:React Native愈发火爆,如果你尚未接触过,不如看看本文作者的入门指南,他会带你体验基于RN平台开发一款电子商务搜索类App的奇妙旅程!本文编译自Hackernoon,原文标题为:Building an e-commerce search app with react native,推荐有一定编程基础的读者阅读。
今天我们来聊一聊是如何在RN平台开发一款用于查找图书数据库的电子商务移动app。如果你之前没有使用过RN,那么现在就跟我一起开启你的移动端Javascript开发之旅吧。
2018年Javascript迎来了前所未有的发展,各种库、框架、开发工具都已经发展的相当的成熟了,整个社区也都在致力于使网上冲浪变得更加方便快捷。当然,开发过程中还是会存在一些bug,但是,如果你会用Javascript,那么这些小问题就都不是事。你可以利用JS来制作web app、后台服务器、移动端app。
React Native不仅可以像Cordova/Ionic/Phonegap等利用WebView架构和Javascript进行移动端APP开发,而且支持native编译,因此如果有需要也可以编写native代码。
你需要提前知道的事情
现在React Native非常的火,网上有很多的资源,所以你可以很容易从互联网上获取学习资源,因此,在你进行RN程序开发之前最好有一定的学习基础。如果你是刚接触这个项目,你可以先尝试学习下官方教程,如果,你更愿意跟着视频课程进行学习,那么我会强烈推荐你去看Kent C. Dodds在egghead上的免费课程“The Beginner’s Guide to ReactJS”
如果你对ES6+同样了解的话,那就再好不过了。这有一本ES6的入门指南,有了它,你就能很快上手了。
作为一个初学者,虽然我建议你去认真学习一下React,并开发一些网络版的APP,但是,如果你想抓紧时间上手开发自己的程序的话,好好的了解React的基本架构也是很有必要的,因为React和React Native具有相通的架构,只是他们最后的目标不同,一个是服务于Web APP的,另一个是服务于native APP
如果,你使用React或React Native 进行产品开发,你将节省大部分的时间和精力,因为,无论是IOS还是Andriod平台,社区上都有很多其他人共享的代码。这也是为什么RN开发平台被像爱彼迎,脸书,照片墙,沃尔玛和特斯拉等公司接受并利用它开发移动端app的原因。
基本概念
简单的介绍一下React Native是如何进行工作的以及JavaScript的代码是如何装换成到一个强大的移动端app。我们需要知道的是任何的一个React Native 应用都是双线程的:
1. 主线程
主线程管理着程序的用户界面,处理包括手势和触摸在内的所有本地交互。因为RN允许在源代码中添加android java,Objective C或swift代码,所以这些代码块也可以在此线程中执行。是不是感觉这样开发变得很舒服。
2. JavaScript 线程
这个线程执行在JavaScript编译器写的JavaScript代码(默认状态下是在iOS平台中,并且通过构件可以发送到Android设备上。)
为了使应用程序正常工作,两个线程之间就需要搭一座桥接器来实现交流,就像下面的示意图展示的那样。
React Native core architecture
正如名字所表示的,中间件可以帮助实现JavaScriprt线程和主线程之间的数据(信息)处理。这些信息可以被异步和批量处理。中间件可以保证JS代码与本机模块进行对话并且与设备API交互。
现在我们对RN的结构有了基本的了解,接下来我们来介绍实现的过程。
搭建开发环境
如果你已经安装了RN并且对开发系统比较了解,你就可以跳过去看下一部分内容了。如果你是刚入门的新手,那么你可以按照官方的安装指南(会有更加详细的介绍)去操作,或者按照我下面说的去做。首先确认你的电脑上已经成功安装了node和yarn模块。我们将利用CRNA(create-react-native-app )工具来创建模版,运行下面的指令实现程序“HelloNative”
create-react-native-app HelloNative
cd HelloNative
npm start
这将为你启动一个可扩展的服务器,并在终端输出一段QR代码。使用CRNA工具出现的警告只有:
it may not use the latest version of react-native
如果出现这个警告,你可以使用Expo CLI 或者 Expo XDE去解决。
然后安装Expo 在你的iOS系统或者Android系统上,并将手机和你的电脑一样联接到网络中。使用Expo app你就可以在你的手机上进行操作啦,想想就很令人激动把。就像下面图显示的一样:
React Native app
你可以运用yarn ios 和yarn android指令分别在iOS和Android模拟器上测试,这样你就可以运行你的React-Native app啦。
如果你知道如何打开app中的扩展菜单,你将会看到有支持热加载和实时重载选项。这些可以使你可以迅速在Andriod环境下加载你的app
A closer look at the developer options
扩展操作同时具有了debugging模块,在后面的内容中我们将进行详细的介绍。
调试模块
远程调试JS程序可以让我们查看相关的控制信息和错误信息。这让我们的开发和调试过程变得更加容易,另外,你还需要安装 React Native debugger
React Native Debugger in action
这是一个非常实用的工具,可以帮助我们查看React Native app中的模块声明和类树,你也可以在上面查看和码上你开发的app需要运用的模块。
准备阶段
React Native提供了一些开发app的基本模块,你可以在list of available components here中找到React Native提供的不同平台下对应的功能模块,这些模块可以帮助你进行开发属于你自己的app,这让开发过程变得更加简单。React Native支持fetch 功能,这样使得开发人员在开发过程中就可以像网页一样从服务器上获取数据和处理http请求。
对于我们将要设计的搜索app,我们将使用能够在短时间内遍历大量数据的NoSQL数据架构进行开发。它将对以JSON为对象的所有文档进行全文搜索。
可能你以前没有接触过Elasticsearch,但是你不得不接受使用Elasticsearch是个趋势。你可以从下面的介绍中学习相关的基础。
Elasticsearch的起步并不是那样的简单,设置环境、添加数据、查看数据等等操作对于一个初学者来讲并不是一件简单的事,因此,Elasticsearch的社区里面提供了很多开源的工具来帮助初学者进行开发。
· Importer 添加数据到Elasticsearch中
· Data Browser 以excel表格的形式查看Elasticsearch中的数据。
· Query Builder 组织管理关联的Elasticsearch队列。
在这些工具的帮助下,我们可以直接利用这些工具和React Native 去组建一个强大的移动端图书馆app
你可以按照官网的指导安装设计Elasticsearch服务器,或者你可以申请一个appbase.io 的账号,appbase.io 提供了一个Elasticsearch的服务器,这样就更加方便了,因此,我们就用appbase.io平台开始我们的开发。
我已经简单的创建了一个基本的数据搜索的app,你可以进入下图进行查看。
Dataset of books
你可以利用最下面的 Clone this app选项复制已经存在的模版作为你开发的基础。这些授权信任书可以帮助我们连接到UI上,我们在这篇教程中要使开发的app的授权信任模块如下
{
app: "good-books-ds",
credentials: "nY6NNTZZ6:27b76b9f-18ea-456c-bc5e-3a5263ebc63d",
type: "good-books-ds"
}
开启 Reactive search之旅
我们将使用ReactiveSearch来进行开发,因为ReactiveSearch是一个Elasticsearch上的UI模块的React和React Native通用的开源库,它提供了一个丰富的资源库、完善的配置环境以及架构,这样你就可以连接到任何一个Elasticsearch的服务器上,
为什么我们需要ReacttiveSearch呢?
ReactiveSearch提供了一整套连接到Elasticsearch服务器上的模块,可以创建队列、具有灵活直观的特点。并且可以让你的模块可以与其他的模块实现通信,比如说你创建了一个A模块,A模块实现了升级更新,这样需要B模块可以获取信息并且可以实现不依靠任何关联额自主的实现更新。
Reactivesearch-native上有很多的nativeUI模块,这些可以使你开发app的UI 模块的时候有所借鉴,让你的app变得更加的美观和智能。
开发搜索app
我们需要在我们的React Native项目下利用下面的代码安装reactivesearch-native
yarn add @appbaseio/reactivesearch-native
全部的ReactiveSearch的模块都被包装在ReactiveBase 的容器中,
我们将使用这些在App.js中Adding ReactiveBase component React Native 中的Styling和网页类似,我们这里采用的是Flex中的基本Styling,如果你之前没有接触过这个Flex的话呢,个人建议你可以尝试从FlexBox Froggy开始起步。
除了Stylesheet以外,我们的代码中还使用了React Native中的两个其他的模块。
· View 在React Native中和html中的div元素差不多是一个容器,可以支持多种操作。
· Text 这个是React Native中可以查阅相关内容的的模块。
在我们设计的BookSearch app中,我们将需要尝试Reactivesearch-native中的另外的两个模块:
1. Search box for searching the books:
我们这里将使用reactivesearch-native中的DataSearch模块去实现多区域的搜索功能,其核心如下所示
<DataSearch
componentId="searchbox"
dataField={[
'original_title',
'original_title.search',
'authors',
'authors.search',
]}
placeholder="Search for books"
autosuggest={false}
/>
DataSearch使用起来相当的方便,由于其本身就是在dataFied(s)的队列中,因此这个模块就可以轻松的帮助我们实现转入到ReactiveBase模块中,并且可以传递和接收一切索引的信息,这样就不需要我们自己去编写相关的队列算法了。
2. Result List View for displaying the search results:
结果展示模块
我们在结果的输出上主要采用的是reactivesearch-native 中的ReactiveList模块:
<ReactiveList
componentId="results"
dataField="original_title"
size={7}
showResultStats={false}
pagination={true}
react={{
and: "searchbox"
}}
onData={(res) => (
<View style={styles.result}>
<Image source={{ uri: res.image }} style={styles.image} />
<View style={styles.item}>
<Text style={styles.title}>{res.original_title}</Text>
<Text>{res.authors}</Text>
</View>
</View>
)}
/>
上面的代码是如何工作的呢?
· dataField: 通过name field去调整结果
· onData: 接收返回值为JSX相关结果的函数,这是我们常用来查看部分结果的方式。
如果你想让你的app变得美观,想要调整一些字体的话,可以在你的程序里面输入下面的代码
async componentWillMount() {
await Expo.Font.loadAsync({
Roboto: require('native-base/Fonts/Roboto.ttf'),
Roboto_medium: require('native-base/Fonts/Roboto_medium.ttf'),
Ionicons: require('@expo/vector-icons/fonts/Ionicons.ttf'),
});
}
编后语:如果你很有兴趣,还想了解更多,不妨去看看这两个论坛,和更多朋友交流下你的想法:
1. ReactiveSearch GitHub repo
2. ReactiveSearch docs
原文链接:
https://hackernoon.com/building-an-e-commerce-search-app-with-react-native-2c87760a2315
*请认真填写需求信息,我们会在24小时内与您取得联系。