之前写过两篇开发中遇到的问题和解决方案。当时是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. top: 0;
  6. left: 0;
  7. right: 0;
  8. bottom: 0;
  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. -webkit-box-flex: 1;
  30. -webkit-flex: 1;
  31. -ms-flex: 1;
  32. flex: 1;
  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. top: 0;
  6. left: 0;
  7. right: 0;
  8. bottom: 0;
  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. -webkit-box-flex: 1;
  28. -webkit-flex: 1;
  29. -ms-flex: 1;
  30. flex: 1;
  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. -webkit-box-flex: 1;
  43. -webkit-flex: 1;
  44. -ms-flex: 1;
  45. flex: 1;
  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. -webkit-box-flex: 1;
  5. -webkit-flex: 1;
  6. -ms-flex: 1;
  7. flex: 1;
  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. top: 0;
  7. right: 0;
  8. bottom: 0;
  9. left: 0;
  10. margin: auto;
  11. }
  12. .row-a,
  13. .row-b,
  14. .row-c {
  15. /*height: 106px;*/
  16. font-size: 0;
  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. width:100%;
  3. height:100%;
  4. top:0;
  5. position:absolute;
  6. z-index:9999;
  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篇

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

  2. html5 拖拽滚动条,js 简易版滚动条实例(适用于移动端H5开发)

    废话不多说,直接上代码 滑动条 *{ margin: 0; padding: 0; } #content{ margin-top: 50px; width:100%; height: 200px; b ...

  3. 微信端H5的相关问题总结

    微信端H5的相关问题总结 微信端H5的相关问题总结 微信端路由(带[#])跳转问题 微信二次分享问题 微信二次分享配置详情 工具类总结 微信端路由(带[#])跳转问题 问题描述:在微信端页面路由跳转成 ...

  4. android Wifi开发相关内容

    今天,简单讲讲android里如何使用WifiManager. 之前,我看代码时,看到了wifi相关的代码,发现自己对于这个内容的使用还很不熟悉,所以在网上查找资料,最终解决了问题.这里记录一下. 移 ...

  5. pandas pandas具体用法相关内容(三)

    pandas pandas具体用法相关内容(三) #%%import pandas as pd import numpy as np titanic_survival = pd.read_csv(&q ...

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

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

  7. Promise相关内容(三)——异步获取服务器数据:promise方式解决回调地狱的问题。通过多个.then使代码可读性更高 实现异步任务的串行执行,保证按顺序发送请求获取数据

    Promise相关内容(三)--异步获取服务器数据:promise方式解决回调地狱的问题.通过多个.then使代码可读性更高 & 实现异步任务的串行执行,保证按顺序发送请求获取数据 第一种形式 ...

  8. 记一次移动端H5开发所遇到的问题与细节,以及ios兼容

    第一次弄移动端H5项目开发,虽然是简单的页面展示,但也遇到了很多细节问题与兼容问题,尤其是h5视频标签video, 一.移动端禁止缩放 兼容 <meta name="viewport& ...

  9. 移动端H5开发遇到的问题

    移动端开发必会出现的问题和解决方案 H5开发过程中难免会遇到一些兼容性等爬过坑的问题 移动端 H5 相关问题汇总: 1px 问题 响应式布局 iOS 滑动不流畅 iOS 上拉边界下拉出现白色空白 页面 ...

最新文章

  1. mongodb 从一台服务器拷贝到另一台服务器_拥有一台HECS云服务器,是怎样一种体验...
  2. ML与Information:机器学习与Information信息论之间那些七七八八、乱七八糟、剪不断理还乱的关系攻略
  3. isnan isinf
  4. LINQ之路系列博客后记
  5. 分布式系统:一致性模型
  6. rsync和inotify实时同步配置 exclude排除多个文件夹
  7. Android 性能优化---(8)APP启动时间优化指南
  8. lucene3.0中使用MultiFieldQueryParser多字段查找
  9. 亲身经历:如何判断一个字符在a/z之前?
  10. DL_C2_week1_1(Initialization)神经网络模型的初始化
  11. 现在出纳记账手写还是用计算机,请问:出纳现金日记账和银行日记账是否一定要用手写归档能否用电脑打印归档?...
  12. dell服务器显示器fre,戴尔全新 Freesync 显示器,专门针对游戏玩家
  13. hosts.ics或hosts权限修改、GitHub无法访问Windows下载问题
  14. python打包成pyc文件发布_Python 使用pyinstaller将py文件发布成exe程序
  15. Burpsuite配置抓apk流量代理设置脚本
  16. ios 打包 验证应用失败原因汇总
  17. Android万能遥控菜单选择添加,将小米米家万能遥控器添加到Home Assistant
  18. android 实现发送彩信方法 (MMS),非调用系统彩信界面
  19. 15 ActionProvider代码例子
  20. SpringMVC(一·)

热门文章

  1. Java四种引用类型
  2. python密码学从这里开始!
  3. 【进阶指南】数据结构 - 楼兰图腾【BIT】
  4. 矫情一下我的水印相机
  5. 资产管理系统 CMDB 详解
  6. 利用FFMPEG进行视频分割
  7. Wechaty :成功申报中国科协开源评选
  8. 人工智能数学基础---定积分8:无穷限反常积分审敛法
  9. android 请求sd卡权限,androidQ sd卡权限使用详解
  10. java钝角三角形怎么判断,java-第十三章-类的无参方法(一)-根据三角形的三条边长,判断是直角,锐角还是钝角三角形...