作者: admin

  • html5 录音

    js 上传 blob 上传

    用三星s8和苹果6测试均成功,在h5页面可以实现,如果app嵌套h5则不行。听说可以调用app录音的原生方法实现。这需要向app开发人员提供

    下载地址:voice

    测试地址(SSL过期就用不了):https://www.easynode.cn/voice/technical-describe.html

    注意测试录音功能,必须是在本地起服务器localhost或者是在SSL有证书协议下进行。

     

    ————-上传—————

    录音成功后获取到的是blob二进制数据。

    var formData = new FormData();
    formData.append("type","2");
    formData.append("file",blob,"recorder.mp3");   //blob就是录音的文件,模拟表单上传
    
    // console.log(formData.values());
    for (var value of formData.values()) {
       console.log(value);
    }
    
    
    $.ajax({
      headers: {
       "userToken": "11211556173647768number2"//此处放置请求到的用户token
      },
      url:"https://test.bugegaming.com/cos/file/upload" //上传接口地址
      ,type:"POST"
      ,contentType:false //让xhr自动处理Content-Type header,multipart/form-data需要生成随机的boundary
      ,processData:false //不要处理data,让xhr自动处理
      ,data:formData
      ,success:function(v){
         console.log("上传成功",v);
         alert(v.data)
      }
      ,error:function(s){
         console.error("上传失败",s);
      }
    });

     

    测试地址:https://jiebian.life/web/h5/github/recordapp.aspx

    兼容安卓和iOS:https://github.com/xiangyuecn/Recorder

    下载(其中app-support-sample目录兼容安卓和ios):Recorder-master

     

    链接: https://pan.baidu.com/s/1yocf8snwmmXN6HLpomnQ9w 提取码: dgua 复制这段内容后打开百度网盘手机App,操作更方便哦

  • 破解版抖音

    安装后,先点击运行“抖音高级设置”选择要看的区域,之后在点击“tiktok”即可运行。

    下载

     

    不会报杀毒的

    链接: https://pan.baidu.com/s/1EvwTespZjqGKjMnvVYn4IA 提取码: 8e6f 复制这段内容后打开百度网盘手机App,操作更方便哦

    https://app.aneeo.com/show?id=124

     


    或者在虚拟机上运行,https://www.zhihu.com/question/274883550

     

     

     

  • html5 audio音频 语音

    <audio src="b.mp3" controls="controls" preload ></audio>
    
    $('audio')[0].paused  //如果正在播放则返回false
    $('audio')[0].play()  //播放
    $('audio')[0].pause()  //暂停

     

    语音波浪 声波效果,推荐使用waveview.js。

    https://github.com/HaloMartin/MCVoiceWave

    waveview.js,4kb大小源码,录音时动态显示波形,具体样子参考演示地址页面。此扩展参考MCVoiceWave库编写的,具体代码在https://github.com/HaloMartin/MCVoiceWave/blob/f6dc28975fbe0f7fc6cc4dbc2e61b0aa5574e9bc/MCVoiceWave/MCVoiceWaveView.m中。

    此扩展是在录音时onProcess回调中使用;bufferSize会影响绘制帧率,越小越流畅(但越消耗cpu),默认配置的大概12帧/s。基础使用方法:

    var wave;
    var rec=Recorder({
        onProcess:function(buffers,powerLevel,bufferDuration,bufferSampleRate){
            wave.input(buffers[buffers.length-1],powerLevel,bufferSampleRate);//输入音频数据,更新显示波形
        }
    });
    rec.open(function(){
        wave=Recorder.WaveView({elem:".elem"}); //创建wave对象,写这里面浏览器妥妥的
        
        rec.start();
    });

     

    【构造】wave=Recorder.WaveView(set)
    构造函数,set参数为配置对象,默认配置值如下:

    set={
        elem:"css selector" //自动显示到dom,并以此dom大小为显示大小
            //或者配置显示大小,手动把waveviewObj.elem显示到别的地方
        ,width:0 //显示宽度
        ,height:0 //显示高度
        
        //以上配置二选一
        
        scale:2 //缩放系数,因为正整数,使用2(3? no!)倍宽高进行绘制,避免移动端绘制模糊
        ,speed:8 //移动速度系数,越大越快
        
        ,lineWidth:2 //线条基础粗细
                
        //渐变色配置:[位置,css颜色,...] 位置: 取值0.0-1.0之间
        ,linear1:[0,"rgba(150,97,236,1)",1,"rgba(54,197,252,1)"] //线条渐变色1,从左到右
        ,linear2:[0,"rgba(209,130,253,0.6)",1,"rgba(54,197,252,0.6)"] //线条渐变色2,从左到右
        ,linearBg:[0,"rgba(255,255,255,0.2)",1,"rgba(54,197,252,0.2)"] //背景渐变色,从上到下
    }

     

     

  • 为移动端rem单位解决方案——flexible.js

    方案一:

    在所有的css和js最先引入

    flexible_css.js,flexible  有样式版本

    flexible   无样式版本

    http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js

    假如设计师给来的设计稿是宽375px那么,100px/37.5=2.6666666667rem

    如果设计稿是750px,那么100px/75单位rem

    甚至连viewport和初始化样式都不用设置了,引入的链接已经帮我们设置好了初始化样式和动态设置viewport

     

    深入理解rem原理,rem单位是相对单位,是相对于html的font-size

    把屏幕分成10等分,屏幕宽以375px为基准,每一份是37.5px,1份就是1rem

    <html lang=”en” style=”font-size: 37.5px”>

    画图就很好理解了,在去了解这句话:假如设计师给来的设计稿是宽375px那么,100px/37.5=2.6666666667rem,

    只要把元素的rem值计算好之后,html的font-size值都会随着屏幕宽度变化,元素大小也会成比例放大缩小

     

     

    实例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8" />
    <!-- 去掉meta,交给flexible.js自动处理 -->
    <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0" /> -->
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <script src="./js/flexible.js"></script> 
    <link rel="stylesheet" href="./css/index.css" rel="external nofollow" />  <!--如果引入有样式的flexible.js,连初始化css都可以不用写-->
    </head>
    <body>
     <div class="wrap">
     <div class="title">首页</div>
    </div>
    </body>
    </html>

     

    //index.css,样式简单暴力的初始化

    html,
    body {
     margin: 0;
     padding: 0;
    }

     

     

    vue-cli4部署

    1,

    npm install lib-flexible --save 
    npm install postcss-px2rem --save

     

     

    2,在main.js中引入lib-flexible

    import 'lib-flexible'

     

     

    3,编辑vue.config.js

    module.exports = {
     .
     .
     css: {
      loaderOptions: {
        css: {},
        postcss: {
          plugins: [
            require('postcss-px2rem')({
              remUnit: 37.5 //设计图给的375px的图,100px的话,那么100/37.5rem
            })
          ]
        }
      }
     }
    
    }

     

    这里有一个问题如果样式是写在js中如何适配?,解决方法如下:

    这里以1920为案例,如果浏览器窗口是全屏那么值就是1,缩小会按比例显示

    setHtmlSize() {
          let defaultWidth = 1920;
          let defaultFontSize = 100;
          let minWidth = 1200;
          let wd = document.body.clientWidth;
          let fontSize;
          let globalScale = wd / defaultWidth;
    
          if (wd > defaultWidth) {
            fontSize = defaultFontSize;
          } else if (wd < minWidth) {
            globalScale = minWidth / defaultWidth;
            fontSize = (minWidth / defaultWidth) * defaultFontSize;
          } else {
            fontSize = (wd / defaultWidth) * defaultFontSize;
          }
          
          console.logg(globalScale) //这里就是获取缩放屏幕比例的值
          // document.querySelector('html').style.fontSize = fontSize + 'px';
    },
    
    
    this.setHtmlSize()
    
    window.addEventListener('resize', ()=>{
       this.setHtmlSize()
    });

     

     

     

    也可参考:《vuelic脚手架适配移动端解决方法rem》

     

    方案二:

    <style>
        *{margin: 0;padding: 0;}
    </style>
    <script>
        ;(function(win) {
            var docEl = win.document.documentElement,
                tid;
    
            function refreshRem() {
                var width = docEl.getBoundingClientRect().width;
                var rem = width / 750*100;//以750px为原稿,除以100可得各元素的rem
                docEl.style.fontSize = rem + "px";
                var actualSize = parseFloat(window.getComputedStyle(docEl)["font-size"]);
                if (actualSize !== rem) {
                    var remScaled = rem / ( actualSize / rem );
                    docEl.style.fontSize = remScaled + "px"
                }
            }
    
            function dbcRefresh() {
                clearTimeout(tid);
                tid = setTimeout(refreshRem, 100)
            }
    
            win.addEventListener("resize", function() { dbcRefresh() }, false);
            win.addEventListener("pageshow", function(e) {
                if (e.persisted) { dbcRefresh() }
            }, false);
            refreshRem();
        })(window);
    </script>

    如果设计给平面图宽度是750px  一个图片宽是200px,那么样式就是200/100=2rem

    如果设计给375px  一个图片宽是100px,那么样式就是100/100*2=2rem

     

     


    先了解rem单位作用:

    1,rem 可以控制字体大小、宽、高。栅格布局推荐使用百分比来控制
    2,rem大小都是相对于html font-size的值来确定的

    例如,
    html如果不设置font-size那么默认是16px
    1rem=16px
    
    如果设置font-size:17px
    1rem=17px
    
    如果以html font-size:17px为准,某一个元素宽高都是100px的话,那么计算成rem就要100除以17

     

    为了避免这样麻烦的计算,即使使用css的媒体查询也要针对很多不同手机屏幕设置还要做出很多添加修改,所以考虑使用js来完成。

    页面前面添加:

    //designWidth:设计稿的实际宽度值,需要根据实际设置
    //maxWidth:制作稿的最大宽度值,需要根据实际设置
    //这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作稿最大宽度,例如设计稿为750,最大宽度为750,则为(750,750)
    ;(function(designWidth, maxWidth) {
      var doc = document,
          win = window,
          docEl = doc.documentElement,
          remStyle = document.createElement("style"),
          tid;
    
      function refreshRem() {
         var width = docEl.getBoundingClientRect().width;
         maxWidth = maxWidth || 540;
         width>maxWidth && (width=maxWidth);
         var rem = width * 100 / designWidth;
         remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';
      }
    
      if (docEl.firstElementChild) {
         docEl.firstElementChild.appendChild(remStyle);
      } else {
         var wrap = doc.createElement("div");
         wrap.appendChild(remStyle);
         doc.write(wrap.innerHTML);
         wrap = null;
      }
      //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
      refreshRem();
    
      win.addEventListener("resize", function() {
        clearTimeout(tid); //防止执行两次
        tid = setTimeout(refreshRem, 300);
      }, false);
    
       win.addEventListener("pageshow", function(e) {
         if (e.persisted) { // 浏览器后退的时候重新计算
           clearTimeout(tid);
           tid = setTimeout(refreshRem, 300);
         }
      }, false);
    
      if (doc.readyState === "complete") {
         doc.body.style.fontSize = "16px";
      } else {
         doc.addEventListener("DOMContentLoaded", function(e) {
             doc.body.style.fontSize = "16px";
         }, false);
      }
    })(750, 750);   //第一个参数是设计宽度一般宽度有375,640,750根据设计而定,第二个参数是最大宽度推荐设置750或者640都行

     

    模板及初始化代码:

    html:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="description" content="不超过150个字符"/>
    <meta name="keywords" content=""/>
    <meta content="caibaojian" name="author"/>
    <title>前端开发博客</title>
    <link rel="stylesheet" href="base.css">
    <script type="text/javascript">
    //引入该flexible.min.js
    !function(e,t){function n(){var n=l.getBoundingClientRect().width;t=t||540,n>t&&(n=t);var i=100*n/e;r.innerHTML="html{font-size:"+i+"px;}"}var i,d=document,o=window,l=d.documentElement,r=document.createElement("style");if(l.firstElementChild)l.firstElementChild.appendChild(r);else{var a=d.createElement("div");a.appendChild(r),d.write(a.innerHTML),a=null}n(),o.addEventListener("resize",function(){clearTimeout(i),i=setTimeout(n,300)},!1),o.addEventListener("pageshow",function(e){e.persisted&&(clearTimeout(i),i=setTimeout(n,300))},!1),"complete"===d.readyState?d.body.style.fontSize="16px":d.addEventListener("DOMContentLoaded",function(e){d.body.style.fontSize="16px"},!1)}(750,750);
    </script>
    </head>
    
    <body>
    <!-- 正文 -->
    </body>
    </html>

     

     

    初始化样式:

    base.css

    body,dl,dd,ul,ol,h1,h2,h3,h4,h5,h6,pre,form,input,textarea,p,hr,thead,tbody,tfoot,th,td{margin:0;padding:0;}
    ul,ol{list-style:none;}
    a{text-decoration:none;}
    html{-ms-text-size-adjust:none;-webkit-text-size-adjust:none;text-size-adjust:none;}
    body{line-height:1.5; font-size:14px;}
    body,button,input,select,textarea{font-family:'helvetica neue',tahoma,'hiragino sans gb',stheiti,'wenquanyi micro hei',\5FAE\8F6F\96C5\9ED1,\5B8B\4F53,sans-serif;}
    b,strong{font-weight:bold;}
    i,em{font-style:normal;}
    table{border-collapse:collapse;border-spacing:0;}
    table th,table td{border:1px solid #ddd;padding:5px;}
    table th{font-weight:inherit;border-bottom-width:2px;border-bottom-color:#ccc;}
    img{border:0 none;width:auto\9;max-width:100%;vertical-align:top; height:auto;}
    button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;vertical-align:baseline;}
    button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
    button[disabled],input[disabled]{cursor:default;}
    input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}
    input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}
    input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}
    input:focus{outline:none;}
    select[size],select[multiple],select[size][multiple]{border:1px solid #AAA;padding:0;}
    article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}
    audio,canvas,video,progress{display:inline-block;}
    body{background:#fff;}
    input::-webkit-input-speech-button {display: none}
    button,input,textarea{
    -webkit-tap-highlight-color: rgba(0,0,0,0);
    }

     

    提醒:每个人的解决方案都不一样,根据项目而定。

     

    caibaojian.com/simple-flexible.html

     

  • script标签中defer和async属性的区别

    1,默认情况什么都不加时

    html按顺序上到下加载,遇到加载js文件时,html停止渲染,开始加载js文件并执行,直到结束时才重新接着渲染html。

     

    2,加async

    html渲染和加载js文件并行,直到加载完js文件后立马执行js,在执行js的过程中,这时html停止渲染,直到js执行完成后才继续渲染html。

     

    3,加defer

    html渲染和加载js文件并行,等到所有的html和js都执行完毕后,js最后才执行。