Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)

上文回顾 :Hybird框架UI重构之路:四、分而治之

这里讲述在开发的过程中,一些HTML、CSS的关键点。

单页模式的页面结构

在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中显示的主体内容才是页面,一个HTML容器中可以存放1个或者多个页面,每个页面放置于section中。而一个页面(section)中必有主体内容(content),也有可能包含头部内容、底部内容,甚至一些侧滑菜单等。

所以,以我们通常看到的一个移动应用的界面中包含了顶部Title和主体内容的页面代码如下:

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="viewport" content="width=480,user-scalable=no" /><link rel="stylesheet" href="css/bingotouch.css" />
<link rel="stylesheet" href="css/app.css" /><!-- 函数库 -->
<script src="js/cordova.js"></script>
<script src="js/zepto.js"></script>
<script src="js/iscroll.js"></script>
<script src="js/baiduTemplate.js"></script>
<script src="js/bingotouch.js"></script>
<script src="js/app/app.js"></script><title>BingoTouch</title>
</head>
<body><div id="section_container"><section id="index_section" class="active"><div class="header" data-fixed="top"><div class="title row-box"><div class="box-left"></div><div class="span1"><h1>首页</h1></div><div class="box-right"></div></div></div><div class="content"><h1>欢迎使用BingoTouch</h1></div><div class="footer" data-fixed="bottom"></div></section></div>
</body>
</html>

这里可以看到单页的基本结构是以Section为单个页面的容器,页面中显示的标题导航header和主体内容content都位于Section之下,并且各自可以显示需要的内容。

也就是如下图的一个结构:

片段页面相对就简单很多,如下代码:

<section id="demo_section"><div class="header" data-fixed="top"><div class="title row-box"><div class="box-left"></div><div class="span1"><h1>Demo</h1></div><div class="box-right"></div></div></div><div class="content"><h1>欢迎使用BingoTouch</h1></div><div class="footer" data-fixed="bottom"></div>
</section>

页面片段也即是主页面里面的section块,从这里看其他页面是很简洁的。

viewport

viewport这东西不详细描述,我只是被整得快疯了,几个属性width、height、initial-scale、minimum-scale、maximum-scale、user-scalable。

ios : 在ios上很正常,设啥就是啥。

android : 在android上千奇百怪,简直是“茅坑里的石头”。尽管网上很多的文章对viewport都有阐述,但所写的描述、公式、示例没有一个能说对(我有用不同手机测试过),都没能完全说明白,都是对一点错一点,似对似错。而公司也没有人能好好说明它,之后我测试过,当测试到第5个机型就测不下去了,都不同各异,没有共同的特点,只能暂停下来(做其他事,测试事情先延后)。

现在使用的设置viewport的脚本在已测试过的机型都没有问题,所以暂不深究了,代码如下。

var viewport = "";
var userAgent = navigator.userAgent.toLowerCase();if (/android (\d+\.\d+)/.test(userAgent)) {viewport ="width=device-width,initial-scale=1,user-scalable=no,target-densitydpi =240";
} else {if(userAgent.match(/ipad/i)){viewport = "width=640,user-scalable=no";}else if(userAgent.match(/iphone os/i) == "iphone os"){viewport = "width=480,user-scalable=no";}
}
//add view
if ($("meta[name='viewport']").length > 0) {$("meta[name='viewport']").attr("content", viewport);
} else {var element = document.createElement('meta');element.name = "viewport";element.content = viewport;var head = document.getElementsByTagName('head')[0];head.appendChild(element);
}

PS:对于不理解东西,我不喜欢只一对一解决,例如某个机型的viewport设置有问题,设置某些属性就可以了,但可能不知为什么。我是希望能明白本质原因,以后可以做到举一反三,才是我想的。另外,如果有人明白viewport且做过测试(这点很重要),能否告诉我你的理解,求交流。

扁平化

扁平化不是新的东西,目前很多公司的项目都是渐变的风格,主要是体现是在header、footer、button等一些控件。而扁平化也仅仅是将渐变的效果去掉,并没有什么特别。

 

图标

图标有两种,一种是图片图标,一种是字体图标。

我有一篇文章有详细介绍:http://www.cnblogs.com/lovesong/p/4115991.html

总结
我并没有写开发的具体内容(太多东西,没办法几篇文章讲完,也没必要,毕竟思路才是正途),也就不多讲,旨在介绍我开发的方式、方法、步奏,以及一点关键的前端问题。
本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。
本文地址 :http://www.cnblogs.com/lovesong/p/4297182.html

转载于:https://www.cnblogs.com/lovesong/p/4297182.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1367):什么是中间件

const express require(express);const app express(); app.get(/request, (req, res, next) > {//send 响应内容的累心//http 状态码req.name 张三;next(); }) app.get(/request, (req, res) > {//send 响应内容的累心//http 状态码res.send(req.name); }) app.liste…

python choose语句作用_理解闭包是如何与变量作用域相互影响的

原文标题&#xff1a;KNOW HOW CLOSURES INTERACT WITH VARIABLE SCOPE比如说你现在想要对一组数字进行排序&#xff0c;同时希望提高一组数字的优先级使这组数字优先显示。这种模式在展示用户接口时非常有用&#xff0c;在展示用户接口时经常需要优先展示一些重要信息以及异常…

前端学习(1368):app.use使用

const express require(express);const app express(); app.use((req, res, next) > {console.log(请求走了use中间件);next(); }) app.use(/request, (req, res, next) > {console.log(请求走了use中间件/hh)next() }) app.get(/list, (req, res) > {//send 响应内…

JDE Client开发端 左侧边栏设置

转载于:https://www.cnblogs.com/GYoungBean/p/4299317.html

cmd oracle 连接实例_C#连接Oracle数据库的实例方法

1.建立连接字符串&#xff0c;里面包含数据库名称、用户名和密码2.建立操作字符串&#xff0c;里面是对数据操作的SQL语句3.建立Connection&#xff0c;用连接字符串作为参数建立4.建立Command&#xff0c;用操作字符串和Connection作为参数5.建立DataAdapter&#xff0c;用Com…

59-混沌操作法感悟2.(2015.2.25)

混沌操作法感悟2羊年到了&#xff0c;今年要好好努力&#xff0c;争取赚到满意的收入。今天刚来到上海&#xff0c;明天开始上班&#xff0c;今天更新下春节期间在家的思考。随机性被视为噪音是因为时间因素&#xff0c;时间框架的长短性。如果以小时为时间框架&#xff0c;这种…

insert事务隔离mysql_MySQL数据库详解(三)MySQL的事务隔离剖析

提到事务&#xff0c;你肯定不陌生&#xff0c;和数据库打交道的时候&#xff0c;我们总是会用到事务。最经典的例子就是转账&#xff0c;你要给朋友小王转 100 块钱&#xff0c;而此时你的银行卡只有 100 块钱。转账过程具体到程序里会有一系列的操作&#xff0c;比如查询余额…

前端学习(1369):中间件应用

const express require(express);const app express(); app.use((req, res, next) {res.send(网站维护中); }) app.use(/admin, (req, res, next) > {let isLogin false;if (isLogin) {next()} else {res.send(你还没有登录);} }) app.get(/admin, (req, res) > {res.…

宽容与忍耐 忍乃济——这是《尚书》这部中国令世人刮目的奇书告诉我们的真理 保身第一法:谦逊;处事第一法:安详;待人第一法:涵容(宽容);养心第一法:洒脱...

宽容与忍耐 不让古人&#xff0c;是谓有志&#xff1b;不让今人&#xff0c;是谓无量。 忍耐若与敏感、魄力、思维、迅速行动结合&#xff0c;将所向无敌。 脾气服从理性的判断才会成功&#xff0c;否则只是动物式愤怒欲的满足&#xff0e;或从心理学的角度讲是怒需求。 大智者…

mysql数据表交叉引用_数据定义语句

数据定义语句MySQL 8.0支持原子数据定义语言(DDL)语句。此功能称为原子DDL。原子DDL语句将数据字典更新&#xff0c;存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子事务中。即使事务在操作期间停止&#xff0c;事务也可以提交&#xff0c;并在数据字典&…

前端学习(1370):错误处理中间件

const express require(express);const app express(); app.get(/index, (req, res) > {throw new Error(程序发生了错误);/* res.send(); */ }) app.use((err, req, res, next) > {res.status(500).send(err.message); }) app.listen(3000); console.log(服务器启动成…

MySQL官方备份_Mysqlbackup 备份详解(mysql官方备份工具)

A.1全库备份.命令:mysqlbackup--defaults-file/home/mysql-server/mysql3/my.cnf --userroot --passwordroot --databases"mysql total2" --with-timestamp --backup-dir/home/mysql-server/backup backup参数说明&#xff1a;--defaults-filemy.cnf文件的路径…

Linux下的库文件搜索路径

对于以压缩包发布的软件&#xff0c;在它的目录下通常都有一个配置脚本configure&#xff0c;它的作用确定编译参数(比如头文件位置、连接库位置等)&#xff0c;然后生成Makefile以编译程序。可以进入该软件的目录&#xff0c;执行"./configure --help"命令查看使用帮…

慕课笔记 mysql读写分离_mysql读写分离笔记

主数据库执行命令&#xff1a;show master status;得到结果mysql-bin.0000092123从数据库执行命令stop slave;change master tomaster_host47.95.247.135,master_port3306,master_userroot,master_passwordroot,master_log_filemysql-bin.000009,master_log_pos4353;start slav…

ruby记录

ruby记录 --posted on 2015-02-28 20:52 zlingh 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/zlingh/p/4306195.html

前端学习(1372):构建模块化路由

const express require(express);const app express(); //创建路由对象 const home express.Router(); app.use(/home, home); home.get(/index, (req, res) > {res.send(欢迎来到我的页面) }) app.listen(3000); console.log(服务器启动成功); 运行结果

做移动端视频通话软件,大致看了下现有的开源软件(转)

转自&#xff1a;链接 要做一个移动端视频通话软件&#xff0c;大致看了下现有的开源软件一) sipdroid1&#xff09;架构sip协议栈使用JAVA实现&#xff0c;音频Codec使用skype的silk&#xff08;Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音…

wamp环境搭建到mysql就不成功_Wamp环境搭建常见错误问题解决

第一点、对于apache php mysql 的版本的正确选择问题&#xff1a;网上有些教学视频已经很早了&#xff0c;然后很多人照着来&#xff0c;完全和视频里讲的一样&#xff0c;但是结果就是搭建不成功。出现问题原因&#xff1a;三件套的版本选择不正确&#xff0c;比如有的php版…

前端学习(1373):构建模块化路由2

demo37.js const express require(express);const app express(); const home require(./home); const admin require(./admin);app.use(/home, home); app.use(/admin, admin);app.listen(3000); console.log(服务器启动成功); home.js const express require(express…

WebApi权限验证流程的设计和实现

前言&#xff1a;Web 用户的身份验证&#xff0c;及页面操作权限验证是B/S系统的基础功能&#xff0c;一个功能复杂的业务应用系统&#xff0c;通过角色授权来控制用户访问&#xff0c;本文通过Form认证&#xff0c;Mvc的Controller基类及Action的权限验证来实现Web系统登录&am…