之前写过两篇开发中遇到的问题和解决方案。当时是CSS 和 JavaScript 分开写的。现在写这篇文章的时候感觉很多内容都是有内在联系的,所以不好分开。

给大家分享一下这半年来的感受吧:

知道和理解之间是有很大距离的。别人谈到一个知识点,能接上嘴并且能发表一下自己的意见,这叫知道。遇到问题能够想到用什么知识点解决问题,这叫理解。

所以有很多知识点自己确实在书上都看到过但是在平时遇到问题的时候却不知道怎么去用或者说想到去用,有时候会有同事给一下指导说用什么解决问题。关键时候还是多看(看书,看别人的代码)和多用。

1.display:none; 和 visibility:hidden;的区别

display:none 关闭一个元素的显示(对布局没有影响);其所有后代元素都也被会被关闭显示。文档渲染时,该元素如同不存在。(不会显示在文档流中的位置,但是 DOM 节点仍会出现在文档流中) 
visibility:hidden visibility属性让你能够控制一个图形元素的可见性,但是仍会占用显示时候在文档流中的位置。

使用 display:none 的时候虽然元素不会显示,但是DOM 节点仍会出现,所以我们就可以使用选择器对该元素进行操作。如下图中的示例:

2.事件冒泡引发的问题

这个问题是发生在自己上篇文章《h5端呼起摄像头扫描二维码并解析》中的。详细的代码可以看那篇文章。

问题发生的场景

先看一段html 代码:

  1. <div class="qr-btn" node-type="qr-btn">扫描二维码1
  2. <input node-type="jsbridge" type="file" name="myPhoto" value="扫描二维码1" />
  3. </div>

之前我的想法是这个样子的: 
1.我先触发qr-btn的 click 事件,在回调中触发 input 的click 事件click 事件 
2.然后触发input 的 change 事件,获取上传图片的信息。

按照我的思路代码应该是下面的这个样子的

  1. //点击父级元素的事件
  2. $('.qr-btn').bind('click',function(){
  3. //触发子元素的事件
  4. $('[node-type=jsbridge]').trigger("click");
  5. });
  6. $('[node-type=jsbridge]').bind('change',function(){
  7. //做一些事情
  8. });

上面的代码,按照正常的思路应该是没有问题的,但是,在实际的运行过程中却发生了问题。浏览器的报错信息如下:


这是因为堆栈溢出的问题。那么为什么会出现这样的问题呢?我把断点打在了以下的位置,然后点击子元素 

发生的情况是:代码无限次的触发$('.qr-btn').bind(...) ,就出现了上面的报错信息。那么是什么原因导致的呢? 
思考一下发现:是因为事件冒泡的问题。我单击父元素触发子元素的click 事件,子元素的 click 事件又冒泡到父元素上,触发父元素的 click 事件,然后父元素再次触发了子元素的 click 事件,这就造成了事件的循环

问题解决办法:

尝试阻止事件的冒泡,看能够解决问题? 
那我们尝试在触发子元素的click的时候,尝试组织子元素的冒泡,看能否解决我的问题?添加如下的代码:

  1. $('[node-type=jsbridge]').bind('click',function(e){
  2. // console.log(e.type);
  3. e.stopPropagation();
  4. });

经过我的测试,代码是能够正常的运行的。

那么我们有没有更好的方法来解决上面的问题呢?请看接下来的内容

3.lable标签的 for 属性

先来看 lable 标签的定义:

<label> 标签为input元素定义标注(标记)。 
label元素不会向用户呈现任何特殊效果。不过,它为鼠标用户改进了可用性。如果您在 label 元素内点击文本,就会触发此控件。就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。 
<label> 标签的for属性应当与相关元素的 id 属性相同。

看想一下 w3school 的示例代码和效果:

  1. <form> <label for="male">Male</label>
  2. <input type="radio" name="sex" id="male" />
  3. <br /> <label for="female">Female</label>
  4. <input type="radio" name="sex" id="female" />
  5. </form>

效果如下图:

到这里应该之道我们该怎么改进我们的代码了,

  1. <lable class="qr-btn" node-type="qr-btn" for="qr-input">扫描二维码1
  2. <input node-type="jsbridge" id="qr-input" type="file" name="myPhoto" value="扫描二维码1" />
  3. </lable>

除了 lable 标签的样式我们自己需要自己定义外,还有两个优点:

  • 减少了 JavaScript 的书写;
  • lable 标签和 input 标签没有必要是包含关系

4.“弹层盒”布局和普通盒模型布局的优缺点对比

最近做了一个抽奖的活动,其中就有一个轮盘的旋转的动画效果(注意啦,中间的那个卡顿是 gif 图片又重新开始播放了)。,效果如下图:

关于动画实现在下一篇文章中会继续介绍,这里主要来关注下布局的问题。因为我们页面会在 pc 和移动移动各出一套。所以在 pc 和移动我分别用了两种方案,pc 传统布局实现,h5 “弹性盒”实现。

1.弹性盒实现九宫格

外围的那些灯是使用绝对定位来做的,就不过过多的介绍,主要的是看中间的奖品九宫格的部分。html 代码如下:

  1. <div class="re-middle">
  2. <div class="row-a" node-type="row-a">
  3. <div>mac pro</div>
  4. <div>扫地机器人</div>
  5. <div>iphone6s</div>
  6. </div>
  7. <div class="row-b" node-type="row-b">
  8. <div>20积分</div>
  9. <div></div>
  10. <div>优惠券</div>
  11. </div>
  12. <div class="row-c" node-type="row-c">
  13. <div>ps4</div>
  14. <div>
  15. <p>猴年限定</p>公仔</div>
  16. <div>祝福红包</div>
  17. </div>
  18. <div node-type="reward-layer"></div>
  19. </div>

css代码如下:

  1. .re-middle {
  2. position: absolute;
  3. width: 28.3rem;
  4. height: 16rem;
  5. ;
  6. ;
  7. ;
  8. ;
  9. margin: auto;
  10. background-color: #f69f75;
  11. color: #ffdece;
  12. font-size: 1.8rem;
  13. }
  14. .row-a,
  15. .row-b,
  16. .row-c {
  17. height: 5.3rem;
  18. display: -webkit-box;
  19. display: -webkit-flex;
  20. display: -ms-flexbox;
  21. display: flex;
  22. -webkit-flex-flow: row nowrap;
  23. -ms-flex-flow: row nowrap;
  24. flex-flow: row nowrap;
  25. }
  26. .row-a div,
  27. .row-b div,
  28. .row-c div {
  29. ;
  30. ;
  31. ;
  32. ;
  33. text-align: center;
  34. line-height: 5.3rem;
  35. background-color: #f69f75;
  36. }

由上面的 css 代码可以看出来我仅仅是在水平方向上使用了“弹性盒”,而在竖直的方向上,还是使用了固定高度(因为我是用的 rem 单位,这里的固定也是不准确的,高度会根据 fontsize 值进行计算。)

那么可不可以在竖直和水平都是用“弹性盒”呢? 
来看一下下面的css代码:

  1. .re-middle {
  2. position: absolute;
  3. width: 28.3rem;
  4. height: 16rem;
  5. ;
  6. ;
  7. ;
  8. ;
  9. margin: auto;
  10. background-color: #f69f75;
  11. display: -webkit-box;
  12. display: -webkit-flex;
  13. display: -ms-flexbox;
  14. display: flex;
  15. -webkit-box-orient: vertical;
  16. -webkit-box-direction: normal;
  17. -webkit-flex-direction: column;
  18. -ms-flex-direction: column;
  19. flex-direction: column;
  20. color: #ffdece;
  21. font-size: 1.8rem;
  22. }
  23. .row-a,
  24. .row-b,
  25. .row-c {
  26. /*height: 5.3rem;*/
  27. ;
  28. ;
  29. ;
  30. ;
  31. display: -webkit-box;
  32. display: -webkit-flex;
  33. display: -ms-flexbox;
  34. display: flex;
  35. -webkit-flex-flow: row nowrap;
  36. -ms-flex-flow: row nowrap;
  37. flex-flow: row nowrap;
  38. }
  39. .row-a div,
  40. .row-b div,
  41. .row-c div {
  42. ;
  43. ;
  44. ;
  45. ;
  46. text-align: center;
  47. line-height: 5.3rem;
  48. background-color: #f69f75;
  49. /*position: relative;*/
  50. -webkit-box-align:center;
  51. -webkit-align-items:center;
  52. -ms-flex-align:center;
  53. align-items:center;
  54. }

周末的时候关于这个布局自己又翻书看了下“弹性盒”的文档,终于实现了在竖直和垂直方向上都实现内容的水平垂直居中内部元素。其实上面的代码只需要把内容的父级元素再次定义为display:flex再添加两个属性justify-contentalign-items就可以了。前者是控制弹性盒的内容垂直方向居中,后者控制内容水平方向居中。

详细代码如下:

  1. .row-a div,
  2. .row-b div,
  3. .row-c div {
  4. ;
  5. ;
  6. ;
  7. ;
  8. border: 1px solid #000;
  9. -webkit-box-align: center;
  10. -webkit-align-items: center;
  11. -ms-flex-align: center;
  12. align-items: center;
  13. -webkit-box-pack: center;
  14. -webkit-justify-content: center;
  15. -ms-flex-pack: center;
  16. justify-content: center;
  17. display: -webkit-box;
  18. display: -webkit-flex;
  19. display: -ms-flexbox;
  20. display: flex;
  21. }

2.传统方式实现

与 h5 端相比,我在 pc 端的实现是传统的浮动方式.我的 HTML 代码如下:

  1. <div class="re-middle">
  2. <div class="row-a">
  3. <div>mac pro</div>
  4. <div class="row-a-sec">祝福红包</div>
  5. <div class="row-a-last"> iphone 6s</div>
  6. </div>
  7. <div class="row-b clearfix">
  8. <div>优惠券</div>
  9. <div class="row-b-sec"></div>
  10. <div class="row-b-last">20积分</div>
  11. </div>
  12. <div class="row-c">
  13. <div>扫地机器人</div>
  14. <div class="row-c-sec">猴年限定
  15. <p>公仔</p>
  16. </div>
  17. <div class="row-c-last">ps4</div>
  18. </div>
  19. <div class="reward-btn"></div>
  20. </div>

css 代码如下:

  1. .re-middle {
  2. background-color: #f89f71;
  3. width: 530px;
  4. height: 320px;
  5. position: absolute;
  6. ;
  7. ;
  8. ;
  9. ;
  10. margin: auto;
  11. }
  12. .row-a,
  13. .row-b,
  14. .row-c {
  15. /*height: 106px;*/
  16. ;
  17. overflow: hidden;
  18. }
  19. .row-a > div,
  20. .row-c > div {
  21. float: left;
  22. width: 176px;
  23. height: 106px;
  24. text-align: center;
  25. }
  26. .row-b div {
  27. float: left;
  28. width: 176px;
  29. height: 106px;
  30. text-align: center;
  31. line-height: 106px;
  32. background-color: #f69f75;
  33. }

由上面的 css 代码对比看我们可以显然看出传统的浮动方式的布局和“弹性盒”布局的一些优缺点:

  • float布局代码简洁,但是必须确定的指定盒子的宽度和高度,多屏幕的适配上会差一些(rem动态计算除外)。
  • “弹性盒”布局代码使用新的 css3属性,需要添加额外的厂商前缀,增加了代码的复杂度(添加厂商前缀可以使用 sublime 插件,一键完成,推荐我的文章 前端开发工程师的 sublime 配置)
  • “弹性盒”为多屏幕的适配提供了便利性。我不用去关心子元素的宽度和高度是多少,或者是屏幕的宽度是多少,都会根据实际请款flex自身会去适配。

遇到的一个小问题,多行文本的处置居中: 
这个九宫格内的文本元素,如果只是单行的话,只要使用 line-height 就可以解决问题,但是如果多行呢?会出什么情况呢,看下图: 

所以这里只能考虑不使用line-height,使用padding 来解决问题 ,尝试padding后的效果。如下图: 

可以看到容器的下面多出了一部分。那也是我们使用的padding的问题,那么怎么解决这个问题呢?这就要用到之前提到过的box-sizing来解决问题。

  1. .row-c-sec {
  2. color: #ffdece;
  3. font-size: 30px;
  4. padding-top: 17px;
  5. background-color: #f69f75;
  6. /*使容器的高=内容高度+padding +border*/
  7. box-sizing: border-box;
  8. }

5.按钮多次提交的解决方案

在做“跑马灯”插件的时候遇到了一个问题,就是用户点击开始抽奖按钮以后在还没有返回结果的时候用户又第二次点击抽奖按钮,那个时候机会出现“奇葩”的问题。比如说:第一次请求和第二次请求重合返回的结果显示哪一个,就算允许用户进行二次抽奖,交互也不友好。而且如果前端页面不做限制的话,显示也会出现奇葩的问题。比如下面这样:

这样是不是很糟糕啊。。。

那么我是怎么解决这个问题呢? 
答案很简单,我就是在点击按钮之后,使用绝对定位弹起了一个透明的弹层,将按钮给覆盖,等结果返回并显示以后,我在同时去掉弹层。这样就避免了用户的重复提交。详细看一下代码:

  1. <div node-type="cover_layer"></div>
  1. .cover-layer{
  2. %;
  3. %;
  4. ;
  5. position:absolute;
  6. ;
  7. }

这里保证我的这个透明的弹层能够覆盖在抽奖按钮的上面。当然这个class 是我通过JavaScript动态的添加和删除的。

  1. $(node).on('clcik','.reward-btn',function(){
  2. //呼起弹层
  3. $('[node-type=cover_layer]',node).addClass('cover-layer');
  4. .....
  5. //返回结果以后去掉弹层
  6. $('[node-type=cover_layer]',node).removeClass('cover-layer');
  7. .....
  8. });

这次的分享就到这里,下一次会分享“轮盘”抽奖效果的 JavaScript 开发过程。

 

移动端 h5开发相关内容总结(三)的更多相关文章

  1. 移动端h5开发相关内容总结css篇--笔记

    原文参考http://mp.weixin.qq.com/s/Nho2DHj-Y59j2F62vpN9jQ 1.开发移动端,头部必要的配置<meta name="viewport&quo ...

  2. 转---移动端 h5开发相关内容总结——CSS篇

    作者:伯乐在线专栏作者 - zhiqiang21 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 1.移动端开发视窗口的添加 h5端开发下面这段话是必须配置的 meta ...

  3. 移动端 h5开发相关内容总结——CSS篇

    1.移动端开发视窗体的加入 h5端开发以下这段话是必须配置的 <meta name="viewport" content="width=device-width, ...

  4. 移动端 h5 开发相关内容总结——JavaScript 篇

    1.改变页面标题的内容 有时候我们开发 h5页面的时候须要动态的去更新title 的名字,这个时候使用 document.title='改动后的名字'; 就行解决我们的问题. 或者使用 //当前fir ...

  5. 移动端H5开发自适应技巧

    移动端H5开发,必要要做到自适应各种分辨率的手机,下面由我为大家大致说一下,需要3步走 第一:head标签中添加: <meta name="viewport" content ...

  6. 移动端H5开发遇到的问题及解决方法

    本篇文章给大家带来的内容是关于移动端H5开发遇到的问题及解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 微信分享签名错误invalid signature vue单页应用hi ...

  7. 移动端H5开发中的常见问题处理

    1.问题之合成海报: 功能技术:http://html2canvas.hertzen.com 问题描述:合成模糊.合成区域内容错位,合成不完整,合成边缘白条等. 解决方案:如有页面布局正常合成错位的, ...

  8. 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)

    一.在开发移动端webapp时,我们经常会遇到这样的问题,当我们需要在页面底部固定一个logo或者说明时,往往会采用position:fixed进行固定定位或者absolute定位到最底部 这是一个很 ...

  9. 移动端H5开发 (滑动事件)

    最近一直在做手机App H5的开发,在开发过程中,经常会遇到很多滑动事件,写个demo,分享自己的一些写法.(如写的不好,轻喷!) 直接贴代码 html css代码 <!DOCTYPE html ...

随机推荐

  1. 153. Find Minimum in Rotated Sorted Array找其中的最小值

    [抄题]: [暴力解法]: 时间分析: 空间分析: [优化后]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: [思维问题]: 总算自己写出一道题来了. [英文数据结构 ...

  2. eclipse-查看继承层次图/继承实现层次图

    阅读代码时,如果想要看某个类继承了哪些类.实现了哪些接口.哪些类继承了这个类,恰巧这个类的继承实现结构又比较复杂,那么如果对开发工具不是很熟练,这个需求是比较难以实现的.eclipse中的type h ...

  3. springboot 使用JPA自动生成Entity实体类的方法

    1. 2. 3.添加数据库 4. 5. 6. 7.点击OK完成. 8.去掉红色波浪线方法. 9.配置数据源 完成!

  4. 20. pt-show-grants

    pt-show-grants -h 192.168.100.101 -P 3306 -u admin -p admin 也可以delete,revoke,flush privileges , 用的不多 ...

  5. python 05集合

    1.集合 特性:可变的,不同元素组成,无序,集合中元素类型必须是不可变(数字,元组,字符串) 形式:s={1,"good",(2,3)} 方法:add(), clear()清空, ...

  6. Apache Beam是什么?

    Apache Beam 的前世今生 1月10日,Apache软件基金会宣布,Apache Beam成功孵化,成为该基金会的一个新的顶级项目,基于Apache V2许可证开源. 2003年,谷歌发布了著 ...

  7. Samba简介与配置(匿名&本地用户验证)

    Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. 在此之前我们已经了解了NFS,NFS与samba一样,也是在网络中实现文件共享的一种实 ...

  8. DedeCMS文章页去img图片width和height属性

    方法一:正则匹配去除 打开include/ arc.archives.class.php,查找代码: //设置全局环境变量 $this->Fields['typename'] = $this-& ...

  9. Html5与Css3知识点拾遗(四)

    web图像 JPEG:适用于大多数照片,颜色较多,可接受质量损失的图像 PNG-8:适用标识.重复的图案以及其他颜色较少的图像或具有连续颜色的图像 PNG-24:不支持颜色更多的图像,适用与颜色丰富且 ...

  10. Pycharm 开发 Django 项目

    1. 安装Pycharm, 自行百度安装教程 2. 安装python3 自行百度安装教程 3. 安装Django框架 使用命令: Window的终端控制台输入:安装Django框架. pip inst ...