孩纸你需要治疗

孩纸你需要治疗 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

业余前端爱好者,闲来无事会写点代码,大多数时间在发呆...

个人动态

孩纸你需要治疗 关注了专栏 · 2020-05-21

手摸手系列

手摸手带你学习前端系列

关注 1771

孩纸你需要治疗 关注了问题 · 2019-08-02

解决js数据匹配,类似中奖数字,例如开头是1,3,4这种号码

比如用户id,有很多位数,然后要找出比如:个位数是不是在[1,3,5,7]里面,十位数是不是在[2,4,6,8]里,百位数是不是在[1,3,6,9],千位...的用户;这种要怎么去操作合适呢?
想的是先把表洗一遍,把个,十,百,千...位数分别塞成一个新的数组,然后在对应去匹配!

请教更合理点的方式。。

关注 3 回答 2

孩纸你需要治疗 提出了问题 · 2019-08-02

解决js数据匹配,类似中奖数字,例如开头是1,3,4这种号码

比如用户id,有很多位数,然后要找出比如:个位数是不是在[1,3,5,7]里面,十位数是不是在[2,4,6,8]里,百位数是不是在[1,3,6,9],千位...的用户;这种要怎么去操作合适呢?
想的是先把表洗一遍,把个,十,百,千...位数分别塞成一个新的数组,然后在对应去匹配!

请教更合理点的方式。。

关注 3 回答 2

孩纸你需要治疗 收藏了文章 · 2019-04-24

可能这些是你想要的H5软键盘兼容方案

image

前言

最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上。需求很明确,看似很简单,其实不然。从实验过一些机型上看,发现主要存在以下问题:

  • AndroidIOS 上,获知软键盘弹起和收起状态存在差异,且页面 webview 表现不同。
  • IOS12 上,微信版本 v6.7.4 及以上,输入框获取焦点,键盘弹起,页面(webview)整体往上滚动,当键盘收起后,不回到原位,导致键盘原来所在位置是空白的。
  • IOS 上,使用第三方输入法,高度计算存在偏差,导致在有些输入法弹起,将输入框挡住一部分。
  • 在有些浏览器上使用一些操作技巧,还是存在输入框被输入法遮挡。

下面就上述发现的问题,逐个探索一下解决方案。

获知软键盘弹起和收起状态

获知软键盘的弹起还是收起状态很重要,后面的兼容处理都要以此为前提。然而,H5 并没有直接监听软键盘的原生事件,只能通过软键盘弹起或收起,引发页面其他方面的表现间接监听,曲线救国。并且,在 IOSAndroid 上的表现不尽相同。

IOS 软键盘弹起表现

IOS 上,输入框(inputtextarea 或 富文本)获取焦点,键盘弹起,页面(webview)并没有被压缩,或者说高度(height)没有改变,只是页面(webview)整体往上滚了,且最大滚动高度(scrollTop)为软键盘高度。

Android 软键盘弹起表现

同样,在 Android 上,输入框获取焦点,键盘弹起,但是页面(webview)高度会发生改变,一般来说,高度为可视区高度(原高度减去软键盘高度),除了因为页面内容被撑开可以产生滚动,webview 本身不能滚动。

IOS 软键盘收起表现

触发软键盘上的“收起”按钮键盘或者输入框以外的页面区域时,输入框失去焦点,软键盘收起。

Android 软键盘收起表现

触发输入框以外的区域时,输入框失去焦点,软键盘收起。但是,触发键盘上的收起按钮键盘时,输入框并不会失去焦点,同样软键盘收起。

软键盘弹起,IOS 和 Android 的 webview 不同表现

监听软键盘弹起和收起

综合上面键盘弹起和收起在 IOSAndroid 上的不同表现,我们可以分开进行如下处理来监听软键盘的弹起和收起:

  • IOS 上,监听输入框的 focus 事件来获知软键盘弹起,监听输入框的 blur 事件获知软键盘收起。
  • Android 上,监听 webview 高度会变化,高度变小获知软键盘弹起,否则软键盘收起。
// 判断设备类型
var judgeDeviceType = function () {
  var ua = window.navigator.userAgent.toLocaleLowerCase();
  var isIOS = /iphone|ipad|ipod/.test(ua);
  var isAndroid = /android/.test(ua);

  return {
    isIOS: isIOS,
    isAndroid: isAndroid
  }
}()

// 监听输入框的软键盘弹起和收起事件
function listenKeybord($input) {
  if (judgeDeviceType.isIOS) {
    // IOS 键盘弹起:IOS 和 Android 输入框获取焦点键盘弹起
    $input.addEventListener('focus', function () {
      console.log('IOS 键盘弹起啦!');
      // IOS 键盘弹起后操作
    }, false)

    // IOS 键盘收起:IOS 点击输入框以外区域或点击收起按钮,输入框都会失去焦点,键盘会收起,
    $input.addEventListener('blur', () => {
      console.log('IOS 键盘收起啦!');
      // IOS 键盘收起后操作
    })
  }

  // Andriod 键盘收起:Andriod 键盘弹起或收起页面高度会发生变化,以此为依据获知键盘收起
  if (judgeDeviceType.isAndroid) {
    var originHeight = document.documentElement.clientHeight || document.body.clientHeight;

    window.addEventListener('resize', function () {
      var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;
      if (originHeight < resizeHeight) {
        console.log('Android 键盘收起啦!');
        // Android 键盘收起后操作
      } else {
        console.log('Android 键盘弹起啦!');
        // Android 键盘弹起后操作
      }

      originHeight = resizeHeight;
    }, false)
  }
}

var $inputs = document.querySelectorAll('.input');

for (var i = 0; i < $inputs.length; i++) {
  listenKeybord($inputs[i]);
}

弹起软键盘始终让输入框滚动到可视区

有时我们会做一个输入表单,有很多输入项,输入框获取焦点,弹起软键盘。当输入框位于页面下部位置时,在 IOS 上,会将 webview 整体往上滚一段距离,使得该获取焦点的输入框自动处于可视区,而在 Android 则不会这样,它只会改变页面高度,而不会去滚动到当前焦点元素到可视区。
由于上面已经实现监听 IOSAndroid 键盘弹起和收起,在这里,只需在 Android 键盘弹起后,将焦点元素滚动(scrollIntoView())到可视区。查看效果,可以戳这里

// 获取到焦点元素滚动到可视区
function activeElementScrollIntoView(activeElement, delay) {
  var editable = activeElement.getAttribute('contenteditable')

  // 输入框、textarea或富文本获取焦点后没有将该元素滚动到可视区
  if (activeElement.tagName == 'INPUT' || activeElement.tagName == 'TEXTAREA' || editable === '' || editable) {
    setTimeout(function () {
      activeElement.scrollIntoView();
    }, delay)
  }
}

// ...
// Android 键盘弹起后操作
activeElementScrollIntoView($input, 1000);
// ...

唤起纯数字软键盘

上面的表单输入框有要求输入电话号码,类似这样就要弹出一个数字软键盘了,既然说到了软键盘兼容,在这里就安插一下。比较好的解决方案如下:

<p>请输入手机号</p>
<input type="tel" novalidate="novalidate" pattern="[0-9]*" class="input">
  • type="tel", 是 HTML5 的一个属性,表示输入框类型为电话号码,在 AndroidIOS 上表现差不多,都会有数字键盘,但是也会有字母,略显多余。
  • pattern="[0-9]"pattern 用于验证表单输入的内容,通常 HTML5type 属性,比如 emailtelnumberdata 类、url 等,已经自带了简单的数据格式验证功能了,加上 pattern 后,前端部分的验证更加简单高效了。IOS 中,只有 [0-9]\* 才可以调起九宫格数字键盘,\d 无效,Android 4.4 以下(包括X5内核),两者都调起数字键盘。
  • novalidate="novalidate"novalidate 属性规定当提交表单时不对其进行验证,由于 pattern 校验兼容性不好,可以不让其校验,只让其唤起纯数字键盘,校验工作由 js 去做。

软键盘弹起,IOS 和 Android 的 webview 不同表现

兼容 IOS12 + V6.7.4+

如果你在用 IOS12V6.7.4+版本的微信浏览器打开上面表单输入的 demo ,就会惊奇的发现键盘收起后,原本被滚动顶起的页面并没有回到底部位置,导致原来键盘弹起的位置“空”了。

兼容 codeIOS12/code + codeV6.7.4+/code

其实这是 AppleIOSbug,会出现在所有的 Xcode10 打包的 IOS12 的设备上。微信官方已给出解决方案,只需在软键盘收起后,将页面(webview)滚回到窗口最底部位置(clientHeight位置)。修复后的上面表单输入 demo 可以戳这里

console.log('IOS 键盘收起啦!');
// IOS 键盘收起后操作
// 微信浏览器版本6.7.4+IOS12会出现键盘收起后,视图被顶上去了没有下来
var wechatInfo = window.navigator.userAgent.match(/MicroMessenger\/([\d\.]+)/i);
if (!wechatInfo) return;

var wechatVersion = wechatInfo[1];
var version = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);

if (+wechatVersion.replace(/\./g, '') >= 674 && +version[1] >= 12) {
  setTimeout(function () {
    window.scrollTo(0, Math.max(document.body.clientHeight, document.documentElement.clientHeight));
  })
}

兼容第三方输入法

上面说了那么多,其实已经把 H5 聊天输入框的坑填了一大半了,接下来就先看下聊天输入框的基本HTML结构

<div class="chat__content">
  <div>
    <p>一些聊天内容1</p>
  </div>
  <!-- 省略几千行聊天内容 -->
</div>
<div class="input__content">
  <div class="input" contenteditable="true"></div>
  <button>发送</button>
</div>

样式

/* 省略一些样式 */
.chat__content {
  height: calc(100% - 40px);
  margin-bottom: 40px;
  overflow-y: auto;
  overflow-x: hidden;
}

.input__content {
  display: flex;
  height: 40px;
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  align-items: center;
}
/* 省略一些样式 */

很简单,就是划分内容区和输入区,输入区是绝对定位,按照上面表单输入 demo 的做法,确实大部分 Android 浏览器是没问题的,但是测试在 IOS 上,UC 浏览器配合原生输入法和第三方输入法(比如搜狗输入法),输入框都会被完全挡住;QQ 浏览器或微信浏览器,配合第三方输入法,输入框会被遮住一半;百度浏览器配合第三方输入法输入框也会被完全遮住。查看效果可以用相应浏览器中访问这里

keyboard-chat-input.png

UC 浏览器上,软键盘弹起后,浏览器上面的标题栏高度就有个高度变小延时动态效果,这样导致 webview 往下滚了一点,底部输入框滚到了非可视区。
而对于第三方输入法,猜测本身是由于输入法面板弹起后高度计算有误,导致 webview 初始滚动定位有误。其实这两点都是 webview 滚动不到位造成的。可以让软键盘弹起后,让焦点元素再次滚到可视区,强迫 webview 滚到位。

console.log('Android 键盘弹起啦!');
// Android 键盘弹起后操作
activeElementScrollIntoView($input, 1000);

兼容 Android 小米浏览器的 Hack 方案

Android 的小米浏览器上,应用上面的方案,发现聊天输入框还是被遮挡得严严实实,scrollIntoView() 仍然纹丝不动。所以猜测,其实是滚到底了,软键盘弹起,页面实现高度大于可视区高度,这样只能在软键盘弹起后,强行增加页面高度,使输入框可以显示出来。综合上面兼容第三方输入法,查看效果可以戳这里

// Andriod 键盘收起:Andriod 键盘弹起或收起页面高度会发生变化,以此为依据获知键盘收起
if (judgeDeviceType.isAndroid) {
  var originHeight = document.documentElement.clientHeight || document.body.clientHeight;

  window.addEventListener('resize', function () {
    var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;
    if (originHeight < resizeHeight) {
      console.log('Android 键盘收起啦!');
      // Android 键盘收起后操作
      // 修复小米浏览器下,输入框依旧被输入法遮挡问题
      if (judgeDeviceType.isMiuiBrowser) {
        document.body.style.marginBottom = '0px';
      }
    } else {
      console.log('Android 键盘弹起啦!');
      // Android 键盘弹起后操作
      // 修复小米浏览器下,输入框依旧被输入法遮挡问题
      if (judgeDeviceType.isMiuiBrowser) {
        document.body.style.marginBottom = '40px';
      }
      activeElementScrollIntoView($input, 1000);
    }

    originHeight = resizeHeight;
  }, false)
}

总结

H5 端前路漫漫,坑很多,需要不断尝试。了解软键盘弹起页面在 IOSAndroid 上的表现差异是前提,其次是将焦点元素滚动到可视区,同时要考虑到第三方输入法和某些浏览器上的差别。总结肯定不全面,欢迎大家指正哈,完~

查看原文

孩纸你需要治疗 收藏了文章 · 2019-02-14

Javascript 冒泡、捕获、事件代理

2019开工荒了两天,赶紧开始!

为什么写事件代理、冒泡、捕获,首先冒泡和捕获是js事件的核心基础,事件代理原理来自冒泡和捕获。

此文章略过标准浏览器和非标准浏览器的事件流讲解,原因很简单我们现在已经幸福了,已经不考虑IE6、7、8了

直接说现代浏览器事件流,用两张图看看什么是冒泡 什么是捕获,其实从字面意思大概能看出 一个是向外一个是向内。

事件冒泡

事件捕获

标准事件流

1、捕获阶段 (先从最外层向内查找)
2、目标阶段(找到事件元(当前点击的dom))
3、冒泡阶段(向上冒泡传递事件)

事件冒泡

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>冒泡</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }
    
    div {
        padding: 30px;
    }
    
    .div1 {
        background: red
    }
    
    .div2 {
        background: blueviolet
    }
    
    .div3 {
        background: yellowgreen
    }
</style>

<body>
    <div class="div1">
        父
        <div class="div2">
            子
            <div class="div3">
                孙
            </div>
        </div>
    </div>
    <script>
       // javascript事件绑定addEventListener接收三个参数,
       //  1、事件名称字符串且不带on
       //  2、回调函数
       //  3、事件流方式(默认为冒泡(false),捕获为true)
        window.onload = function() {
            document.querySelector('.div1').addEventListener('click', function() {
                console.log('点击div1')
            }, false)
            document.querySelector('.div2').addEventListener('click', function() {
                console.log('点击div2')
            }, false)
            document.querySelector('.div3').addEventListener('click', function() {
                console.log('点击div3')
            }, false)
        }
    </script>
</body>

</html>

先演示下冒泡
事件冒泡

事件捕获

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>冒泡</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }
    
    div {
        padding: 30px;
    }
    
    .div1 {
        background: red
    }
    
    .div2 {
        background: blueviolet
    }
    
    .div3 {
        background: yellowgreen
    }
</style>

<body>
    <div class="div1">
        父
        <div class="div2">
            子
            <div class="div3">
                孙
            </div>
        </div>
    </div>
    <script>
        window.onload = function() {
            document.querySelector('.div1').addEventListener('click', function(e) {
                console.log('点击父元素')
            }, true)
            document.querySelector('.div2').addEventListener('click', function(e) {
                console.log('点击子元素')
            }, true)
            document.querySelector('.div3').addEventListener('click', function(e) {
                console.log('点击孙子元素')
            }, true)
        }
    </script>
</body>

</html>

看看效果
事件捕获

事件委托

我理解的事件委托的好处有两点
1、减少事件绑定次数
2、可以给未知元素绑定事件(例如动态渲染的List)

其原理就是利用事件冒泡向外传递的特性,下面代码解析一下:
同样忽略低版本浏览器获取当前target兼容性问题

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>冒泡</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }
    
    div {
        padding: 30px;
        border: 1px solid red
    }
    
    div span {
        display: inline-block;
        padding: 10px;
        border: 1px solid blueviolet
    }
</style>

<body>
    <div class="div1">
        <span>1</span>
        <span>2</span>
        <span>3</span>
        <span>4</span>
    </div>
    <script>
        window.onload = function() {
            document.querySelector('.div1').addEventListener('click', function(e) {
                //回调函数e为事件对象,同伙事件对象可以获取当前点击dom
                console.log(e.target)
                //获取到当前事件源(dom)后再去搞一些你想搞的事情就ok了

                //搞事情代码
            }, false)

        }
    </script>
</body>

</html>

老规矩,看看效果
事件委托

最后顺便说一下事件对象功能很全的,看下图能获取到很多当前dom的周边,可以搞好多其它的事情。
事件对象

感谢阅读,欢迎吐槽!谢谢!

查看原文

孩纸你需要治疗 评论了文章 · 2019-02-14

html5--移动端视频video的android兼容,去除播放控件、全屏等

android下html5的视频播放一直是前端兼容的重灾区,各种体验差,被诟病已久。但之前的故宫穿越H5,和吴亦凡入伍H5,利用的视频技术,貌似又给人一种新面貌。

前段时间做某项目,恰好也是一个类似视频全屏的,下面跟大家分享下经历的坑和填坑的办法。

ios端问题其实没什么,基本都在android端,基本每一个带有视频的项目都会遇到的,当然有特殊需求的产生的情况另说了就,问题主要有几个方面:

  1. 全屏处理;

  2. 自动播放;

  3. 播放控制;

  4. 隐藏播放控件;


video全屏的处理

这个其实不难,只需在video标签加个webkit-playsinline属性即可,这个属性基本上在基于webkit内核的移动端都是没问题的,此全屏非彼全屏,它是在浏览器视窗内的全屏,并不是占居整个手机的全屏,当然我们做web端需要的就是在document的body内的视窗范围的全屏。

<video id="myvideo" data-original="test.mp4" webkit-playsinline="true"></video>

在ios下,视频被嵌入后,媒体的元数据加载完成后,会以全屏的形式显示出来,或者加个poster,可以看到画面。但在android下,多数机子是不显示视频画面的,要不就是显示一个黑色的还不是全屏的播放控件,即使及加个poster封面也不济于是。因为poster在android兼容的并不好,不如在视频上层加个div铺张图片,这个比较好的处理方式应该是:视频上加一层div做封面,由于android不允许视频上层有东西,所以首先将视频设为的width:1px,当播放后,上层的封面remove掉,同时width:100%或者你想要的宽度。

video的自动播放

这个的话就不多说了,相信大家跟我一样,试图寻找android下,页面加载完毕就可以自动播放,但现实是残酷的,android下是不允许自动播放的,即使你用了video.play(),也是不行的。必须有用户的主动触发,比如触摸了屏幕,有click或touch事件产生。不知以后android会不会改进,但至少目前来看是不行的。比较的好的办法是,引导用户触发,滑屏或touch的行为,然后调用video.play()播放,给用户一个自动播放的错觉。

video播放的控制

对于video或者audio等媒体元素,有一些方法,常用的有play(),pause();也有一些事件,如'loadstart','canplay','canplaythrough','ended','timeupdate'.....等等。

在移动端有一些坑需要注意,不要轻易使用媒体元素的除'ended','timeupdate'以外event事件,在不同的机子上可能有不同的情况产生,例如:
ios下监听'canplay'和'canplaythrough'(是否已缓冲了足够的数据可以流畅播放),当加载时是不会触发的,即使preload="auto"也没用,但在pc的chrome调试器下和android下,是会在加载阶段就触发。ios需要播放后才会触发。
总之就是现在的视频标准还不尽完善,有很多坑要注意,要使用前最好自己亲测一遍。

关于控制的问题还想说一点就是android在播放视频时会有个控件初始化的过程,在全屏视频想伪装成非视频时,是我们很不想看到的,我的解决思路是这样:
在我们需要播放时提前初始化它,即需要播放的时间前先设width:1px;然后play()一下,使视频已经播放初始化。然后再需要播放的时候再次play()时就不会产生,控件拉伸的情况了。

“去除”android下的播放控件条

重头戏来了,相信这个这个问题已困扰无数的前端开发人员,再搜寻这个问题的解决方法时,几乎所有的文章都是告诉你android下,播放器的控件是去不了的。其实似乎确实是这样的,但你看了故宫穿越H5,和吴一凡那个H5后,会发现,在android下,也是没有控制条的。最初看到那些H5视频我首先并没有去看他们的内容多么新颖,传播量多么广,我是第一时间测试了android下的兼容问题,发现并没有出现控制条。在我研究半天未果时,在一篇技术帖中看到说:因是腾讯自己的项目,微信是腾讯自己的,他们在浏览器里做了一些配置,对旗下出品的H5有所“优待”,才能确保视频的顺利“乔装”。

上面的说法我并没有真正核实过,但好像是这么回事,非常有幸我做的那个视频项目也是腾讯的,其实是有机会可以向他们证实一下以上说法的,但即使是这样的,也只有腾讯的项目有这样的解决办法,对于广大的开发者来说似乎并太不公平,我试图找到一种解决去除播放控件的解决方案,下面是我花了很多心思找到的一种解决办法,看似很简单也不那么高大尚,但确实解决了问题,跟大家分享:

我这里只看android的情况,ios基本没什么问题,就忽略啦。
测试机android版本:5.1
首先我们将那个H5视频地址嵌入自己的页面,你会发现确实播放器出现了。如下

图片描述

怎么办呢,不是腾讯自己的项目就没办法了嘛?再我搜了N多资料未果后,发现了一个细节,控制条始终是最下方的,可不可以让视频的尺寸放大些,将控制条顶到浏览窗口外面,就看不到了嘛,于是我将视频宽高放大到120%-----控件条神奇的‘消失’了(其实是顶到视窗外面了),惊喜万分啊。

具体思路和实现如下:
html中将video标签外包一层,

    <div class="videobox">
        <video id="mainvideo" webkit-playsinline="true" data-original="http://7xvl2z.com1.z0.glb.clouddn.com/nigg2.mp4"></video>
    </div>

初始样式表如下:

html,body {
  padding: 0;
  margin: 0;
  width: 100%;
  height: 100%;
  -webkit-user-select: none; 
  user-select: none;
  overflow: hidden;
}

.videobox {
  width: 100%;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
  overflow: hidden;
}

video {width: 1px;display: blcok;}

/*
注:html,body里的overflow:hidden,非常重要,不能省。
因为微信android的播放器是脱离DOM结构的,也不会响应click、touch等事件。
如果视频尺寸大了,会产生滚动条,必须在html和body加overflow:hidden,
在videobox加没用的。
*/

当视频要播放时改变video的宽度(高度会等比缩放,即使自定义高度也是没用的,会被忽略)

  var video = document.querySelector('#mainvideo');
  var videobox = document.querySelector('.videobox');

  //播放时改变外层包裹的宽度,使video宽度增加,
  //相应高度也增加了,播放器控件被挤下去,配合overflow:hidden
  //控件看不见也触摸不到了
  var setVideoStyle = function (){
    videobox.style.width = '120%';
    videobox.style.left = '-10%';
    video.style.width = '100%';
  }

当然上面这样写参杂了一些需求逻辑,也可以直接样式表就width:120%,或者更大;这个根据自己的需要来,但基本思路就是将播放器控件顶出视窗之外,达到一种‘去除’、‘消失’的效果。连‘小窗’字样也被顶出去了,用过android或测试过的同学都知道点了小窗后会怎样....(原版的即使去掉了播放器,但小窗字样还在,不能算完全的隐藏播放控件吧)

相应产生的一些问题的解决办法:

1,视频被放大了,画面会被截掉一部分怎么办?

这个可以在视频输出的时候两边和下边留一些留白,即留白可以没用画面黑色底,但又属于视频尺寸的一部分,放视频放大后,将主体画面置满视窗,被挤到外面都是留白的即可。

2,视频播放完毕后会中间自动出现播放控件按钮

如果确实不想在播放完是出现一个按钮,哪怕只有零点几秒,就把视频remove掉,可以使用timeupdate监听视频播放,用video.duration-video.currentTime的差值判断是否快要结束了,在结束前零点几秒提前remove掉。

3,要是不是全屏视频怎么搞?

可以,思路是一样的,将视频控件顶出外层的包裹层,利用overflow:hidden。只是全屏的外层包裹是body而已。

哦了,终于可以搞一个全屏视频伪装的东西了。





2017-03-21补
随着时间的变迁,设备和技术的更新,本着不坑害同胞的心,负责任更新下还是有必要的
咱们还是从上面的4个要点来说ios和android吧

  1. 全屏处理;

  2. 自动播放;

  3. 播放控制;

  4. 隐藏播放控件;

补充--全屏处理

ios加playsinline属性,之前只带webkit前缀的在ios10以后,会吊起系统自带播放器,两个属性都加上基本ios端都可以保证内敛到浏览器webview里面了。如果仍有个别版本的ios会吊起播放器,还可以引用一个库iphone-inline-video(具体用法很简单看它github,这里不介绍了,只需加js一句话,css加点),
github地址是https://github.com/bfred-it/i...,加上playsinline webkit-playsinline这两个属性和这个库基本可以保证ios端没有问题了(不过亲测,只加这两个属性不引入库好像也是ok的,至今没有在ios端微信没有出现问题,如果你要兼容uc或者qq的浏览器建议带上这个库),
最后介绍个新的x5-video-player-type="h5"属性,腾讯x5内核系的android微信和手Q内置浏览器用的浏览器webview的内核,使用这个属性在微信中视频会有不同的表现,会呈现全屏状态,貌似播放控件剥去了,至少加了这个属性后视频上层可以有其他dom元素出现了(非腾讯白名单机制的一种处理措施),

<video id="mainvideo" data-original="test.mp4" playsinline webkit-playsinline></video>

补充--自动播放

android始终不能自动播放,不多说。值得一提的是经测现在ios10后版本的safari和微信都不让视频自动播放了(顺带音频也不能自动播放了),但微信提供了一个事件WeixinJSBridgeReady,在微信嵌入webview全局的这个事件触发后,视频仍可以自动播放,这个应该是现在在ios端微信的视频自动播放的比较靠谱的方式,其他如手q或者其他浏览器,建议就引导用户出发触屏的行为操作出发比较好。

//也可以在这个事件触发后播放一次然后暂停(这样以后视频会处于加载状态,为后面的流畅播放做准备)
document.addEventListener("WeixinJSBridgeReady", function (){ 
    video.play();
    video.pause();
}, false)

补充--播放控制

关于控制,这里仅补充一点吧,就是当第一次播放视频的时候ios端,如果网络慢,视频从开始播到能展现画面会有短暂的黑屏(处理视频源数据的时间),为了避免这个黑屏,可以在视频上加个div浮层(可以一个假的视频第一帧),然后用timeupdate方法监听,视屏播放及有画面的时候再移除浮层

video.addEventListener('timeupdate',function (){
    //当视频的currentTime大于0.1时表示黑屏时间已过,已有视频画面,可以移除浮层(.pagestart的div元素)
    if ( !video.isPlayed && this.currentTime>0.1 ){
        $('.pagestart').fadeOut(500);
        video.isPlayed = !0;
    }
})

补充--隐藏播放控件

据说腾讯的android团队的x5内核团队放开了视频播放的限制,视频不一定调用它们那个备受诟病的视频播放器了,x5-video-player-type="h5"属性这个属性好像就有点那个意思,虽然体验还是有点...(导航栏也会清理)但至少播放器控件没有了,上层可以浮div或者其他元素了,这个还是值得一提。
还有一点值得说的是,带播放器控件的隐藏,

<div class="videobox" ontouchmove="return false;">
    <video id="mainvideo" data-original="test.mp4" x5-video-player-type="h5" playsinline webkit-playsinline></video>
</div>

比如这个videobox在android下隐藏,只用display:none貌似还是不行的,但加个z-index:-1,设置成-1就可以达到隐藏播放器控件的目的了。这个经测可用且好用,可以一试。

好了就先补充能想到要说的这么多吧,希望对大家有帮助

查看原文

孩纸你需要治疗 关注了问题 · 2018-08-30

webpack有没有什么类似gulp-font的插件,将多个.svg文件打包生成woff2|eot|ttf|otf字体包文件?

比如:
我有
a.svg,
b.svg,
c.svg...多个svg图标,最后打包成:
myFontIcon.woff2,
myFontIcon.eot,
myFontIcon.ttf,
myFontIcon.otf,
并且生成一个fonticon.css的文件?

关注 4 回答 1

孩纸你需要治疗 提出了问题 · 2018-08-30

webpack有没有什么类似gulp-font的插件,将多个.svg文件打包生成woff2|eot|ttf|otf字体包文件?

比如:
我有
a.svg,
b.svg,
c.svg...多个svg图标,最后打包成:
myFontIcon.woff2,
myFontIcon.eot,
myFontIcon.ttf,
myFontIcon.otf,
并且生成一个fonticon.css的文件?

关注 4 回答 1

孩纸你需要治疗 赞了回答 · 2018-04-23

解决正则表达式怎么把字符串分成任意组数?

可以利用match 方法

假如是334 组合
var str="1234HAGSFC";
var regex = /(.{3})(.{3})(.{4})/

str.match(regex); //["1234HAGSFC", "123", "4HA", "GSFC", index: 0, input: "1234HAGSFC", groups: undefined]

返回的是一个数组,中间那一部分就是你需要的

关注 3 回答 2

孩纸你需要治疗 提出了问题 · 2018-04-19

解决正则表达式怎么把字符串分成任意组数?

例如:

var str="1234HAGSFC"
想要类似足球队型:334组合
123 4HA GSFC
或者:4321组合
1234 HAG SF C
或者...

关注 3 回答 2

认证与成就

  • 获得 2 次点赞
  • 获得 28 枚徽章 获得 0 枚金徽章, 获得 6 枚银徽章, 获得 22 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-05-18
个人主页被 425 人浏览