移动端H5开发遇到的问题

2023-11-20

移动端开发必会出现的问题和解决方案


H5开发过程中难免会遇到一些兼容性等爬过坑的问题

移动端 H5 相关问题汇总:
1px 问题

响应式布局

iOS 滑动不流畅

iOS 上拉边界下拉出现白色空白

页面件放大或缩小不确定性行为

click 点击穿透与延迟

软键盘弹出将页面顶起来、收起未回落问题

iPhone X 底部栏适配问题

保存页面为图片和二维码问题和解决方案

微信公众号 H5 分享问题

H5 调用 SDK 相关问题及解决方案

H5 调试相关方案与策略
ub.io/flowchart.js/

iOS 滑动不流畅

上下滑动页面会产生卡顿,手指离开页面,页面立即停止运动。整体表现就是滑动不流畅,没有滑动惯性。

产生原因
为什么 iOS 的 webview 中 滑动不流畅,它是如何定义的?

最终我在 safari 文档里面寻找到了答案(文档链接在参考资料项)。
原来在 iOS 5.0 以及之后的版本,滑动有定义有两个值 auto 和 touch,默认值为 auto。

 -webkit-overflow-scrolling: touch; /* 当手指从触摸屏上移开,会保持一段时间的滚动 */
 ​
 -webkit-overflow-scrolling: auto; /* 当手指从触摸屏上移开,滚动会立即停止 */

解决方案
1.在滚动容器上增加滚动 touch 方法
将-webkit-overflow-scrolling 值设置为 touch

 .wrapper {
     -webkit-overflow-scrolling: touch;
 }

设置滚动条隐藏: .container ::-webkit-scrollbar {display: none;}

可能会导致使用position:fixed; 固定定位的元素,随着页面一起滚动

2.设置 overflow
设置外部 overflow 为 hidden,设置内容元素 overflow 为 auto。内部元素超出 body 即产生滚动,超出的部分 body 隐藏。

body {
     overflow-y: hidden;
 }
 .wrapper {
     overflow-y: auto;
 }

两者结合使用更佳!

iOS 上拉边界下拉出现白色空白

表现
手指按住屏幕下拉,屏幕顶部会多出一块白色区域。手指按住屏幕上拉,底部多出一块白色区域。

产生原因
在 iOS 中,手指按住屏幕上下拖动,会触发 touchmove 事件。这个事件触发的对象是整个 webview 容器,容器自然会被拖动,剩下的部分会成空白。

解决方案

1. 监听事件禁止滑动
移动端触摸事件有三个,分别定义为

  1. touchstart :手指放在一个DOM元素上。
  2. touchmove :手指拖曳一个DOM元素。
  3. touchend :手指从一个DOM元素上移开。

touchmove 事件的速度是可以实现定义的,取决于硬件性能和其他实现细节
preventDefault 方法,阻止同一触点上所有默认行为,比如滚动。

由此我们找到解决方案,通过监听 touchmove,让需要滑动的地方滑动,不需要滑动的地方禁止滑动。

值得注意的是我们要过滤掉具有滚动容器的元素。

实现如下:

document.body.addEventListener('touchmove', function(e) {
     if(e._isScroller) return;
     // 阻止默认事件
     e.preventDefault();
 }, {
     passive: false
 });

2. 滚动妥协填充空白,装饰成其他功能
在很多时候,我们可以不去解决这个问题,换一直思路。根据场景,我们可以将下拉作为一个功能性的操作。

比如:下拉后刷新页面
在这里插入图片描述
页面放大或缩小不确定性行为
表现
双击或者双指张开手指页面元素,页面会放大或缩小。

产生原因
HTML 本身会产生放大或缩小的行为,比如在 PC 浏览器上,可以自由控制页面的放大缩小。但是在移动端,我们是不需要这个行为的。所以,我们需要禁止该不确定性行为,来提升用户体验。

原理与解决方案

移动端常规写法

<meta name="viewport" content="width=device-width, initial-scale=1.0">

因此我们可以设置 maximum-scale、minimum-scale 与 user-scalable=no 用来避免这个问题

<meta name=viewport content="width=device-width, initial-scale=1.0, minimum-scale=1.0 maximum-scale=1.0, user-scalable=no">

click 点击事件延时与穿透
表现
监听元素 click 事件,点击元素触发时间延迟约 300ms。

点击蒙层,蒙层消失后,下层元素点击触发。

产生原因

为什么会产生 click 延时?
iOS 中的 safari,为了实现双击缩放操作,在单击 300ms 之后,如果未进行第二次点击,则执行 click 单击操作。也就是说来判断用户行为是否为双击产生的。但是,在 App 中,无论是否需要双击缩放这种行为,click 单击都会产生 300ms 延迟。

为什么会产生 click 点击穿透?
双层元素叠加时,在上层元素上绑定 touch 事件,下层元素绑定 click 事件。由于 click 发生在 touch 之后,点击上层元素,元素消失,下层元素会触发 click 事件,由此产生了点击穿透的效果。

原理与解决方案

解决方案一:使用 touchstart 替换 click
前面已经介绍了,移动设备不仅支持点击,还支持几个触摸事件。那么我们现在基本思路就是用 touch 事件代替click 事件。

将 click 替换成 touchstart 不仅解决了 click 事件都延时问题,还解决了穿透问题。因为穿透问题是在 touch 和 click 混用时产生。

在原生中使用

el.addEventListener(“touchstart”, () => { console.log(“ok”); }, false);

在 vue 中使用

 <button @touchstart="handleTouchstart()">点击</button>

那么,是否可以将 click 事件全部替换成 touchstart 呢?为什么开源框架还会给出 click 事件呢?

我们想象一种情景,同时需要点击和滑动的场景下。如果将 click 替换成 touchstart 会怎样?

事件触发顺序: touchstart, touchmove, touchend, click。

很容易想象,在我需要touchmove滑动时候,优先触发了touchstart的点击事件,是不是已经产生了冲突呢?

所以呢,在具有滚动的情况下,还是建议使用 click 处理。
解决方案二:使用 fastclick 库
使用 npm/yarn 安装后使用

 import FastClick from 'fastclick';
 ​
 FastClick.attach(document.body, options);

同样,使用fastclick库后,click 延时和穿透问题都没了

按照我的惯例,只要涉及开源库,那么我们一定要去了解它实现的原理。主要是将现有的原生事件集合封装合成一个兼容性较强的事件集合。

fastclick源码 核心代码不长, 1000 行不到。有兴趣可以了解一下!

软键盘将页面顶起来、收起未回落问题
表现
Android 手机中,点击 input 框时,键盘弹出,将页面顶起来,导致页面样式错乱。

移开焦点时,键盘收起,键盘区域空白,未回落。

产生原因
我们在app 布局中会有个固定的底部。安卓一些版本中,输入弹窗出来,会将解压 absolute 和 fixed 定位的元素。导致可视区域变小,布局错乱。

原理与解决方案
软键盘将页面顶起来的解决方案,主要是通过监听页面高度变化,强制恢复成弹出前的高度。

// 记录原有的视口高度
 const originalHeight = document.body.clientHeight || document.documentElement.clientHeight;
 ​
 window.onresize = function(){
   var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;
   if(resizeHeight < originalHeight ){
     // 恢复内容区域高度
     // const container = document.getElementById("container")
     // 例如 container.style.height = originalHeight;
   }
 }

键盘不能回落问题出现在 iOS 12+ 和 wechat 6.7.4+ 中,而在微信 H5 开发中是比较常见的 Bug。

兼容原理,1.判断版本类型 2.更改滚动的可视区域

const isWechat = window.navigator.userAgent.match(/MicroMessenger\/([\d\.]+)/i);
 if (!isWechat) return;
 const wechatVersion = wechatInfo[1];
 const version = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
  
  // 如果设备类型为iOS 12+ 和wechat 6.7.4+,恢复成原来的视口
 if (+wechatVersion.replace(/\./g, '') >= 674 && +version[1] >= 12) {
   window.scrollTo(0, Math.max(document.body.clientHeight, document.documentElement.clientHeight));
 }

window.scrollTo(x-coord, y-coord),其中window.scrollTo(0,> clientHeight)恢复成原来的视口

iPhone X系列安全区域适配问题
表现
头部刘海两侧区域或者底部区域,出现刘海遮挡文字,或者呈现黑底或白底空白区域。

产生原因
iPhone X 以及它以上的系列,都采用刘海屏设计和全面屏手势。头部、底部、侧边都需要做特殊处理。才能适配 iPhone X 的特殊情况。

解决方案
设置安全区域,填充危险区域,危险区域不做操作和内容展示。

危险区域指头部不规则区域,底部横条区域,左右触发区域。

具体操作为:viewport-fit meta 标签设置为 cover,获取所有区域填充。判断设备是否属于 iPhone X,给头部底部增加适配层

viewport-fit 有 3 个值分别为:

auto:此值不影响初始布局视图端口,并且整个web页面都是可查看的。

contain:视图端口按比例缩放,以适合显示内嵌的最大矩形。

cover:视图端口被缩放以填充设备显示。强烈建议使用 safe area inset 变量,以确保重要内容不会出现在显示之外。

设置 viewport-fit 为 cover

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes, viewport-fit=cover">

增加适配层
使用 safe area inset 变量

/* 适配 iPhone X 顶部填充*/
 @supports (top: env(safe-area-inset-top)){
   body,
   .header{
       padding-top: constant(safe-area-inset-top, 40px);
       padding-top: env(safe-area-inset-top, 40px);
       padding-top: var(safe-area-inset-top, 40px);
   }
 }
 /* 判断iPhoneX 将 footer 的 padding-bottom 填充到最底部 */
 @supports (bottom: env(safe-area-inset-bottom)){
     body,
     .footer{
         padding-bottom: constant(safe-area-inset-bottom, 20px);
         padding-bottom: env(safe-area-inset-bottom, 20px);
         padding-top: var(safe-area-inset-bottom, 20px);
     }
 }

safe-area-inset-top, safe-area-inset-right, safe-area-inset-bottom,
safe-area-inset-left safe-area-inset-*由四个定义了视口边缘内矩形的 top, right,
bottom 和 left
的环境变量组成,这样可以安全地放入内容,而不会有被非矩形的显示切断的风险。对于矩形视口,例如普通的笔记本电脑显示器,其值等于零。对于非矩形显示器(如圆形表盘,iPhoneX
屏幕),在用户代理设置的四个值形成的矩形内,所有内容均可见。

其中 env() 用法为 env( , ? ),第一个参数为自定义的区域,第二个为备用值。

其中 var() 用法为 var( , ? ),作用是在 env() 不生效的情况下,给出一个备用值。

constant() 被 css 2017-2018 年为草稿阶段,是否已被标准化未知。而其他iOS 浏览器版本中是否有此函数未知,作为兼容处理而添加进去。

详情请查看文章末尾的参考资料。

页面生成为图片和二维码问题
表现
在工作中有需要将页面生成图片或者二维码的需求。可能我们第一想到的,交给后端来生成更简单。但是这样我们需要把页面代码全部传给后端,网络性能消耗太大。

解决方案
生成二维码
使用 QRCode 生成二维码

import QRCode from 'qrcode';
 // 使用 async 生成图片
 const options = {};
 const url = window.location.href;
 async url => {
   try {
     console.log(await QRCode.toDataURL(url, options))
   } catch (err) {
     console.error(err);
   }
 }

将 await QRCode.toDataURL(url, options) 赋值给 图片 url 即可

生成图片
主要是使用 htmlToCanvas 生成 canvas 画布

import html2canvas from 'html2canvas';
 ​
 html2canvas(document.body).then(function(canvas) {
     document.body.appendChild(canvas);
 });

但是不单单在此处就完了,由于是 canvas 的原因。移动端生成出来的图片比较模糊。

我们使用一个新的 canvas 方法多倍生成,放入一倍容器里面,达到更加清晰的效果,通过超链接下载图片 下载文件简单实现,更完整的实现方式之后更新

const scaleSize = 2;
 const newCanvas = document.createElement("canvas");
 const target = document.querySelector('div');
 const width = parseInt(window.getComputedStyle(target).width);
 const height = parseInt(window.getComputedStyle(target).height);
 newCanvas.width = width * scaleSize;
 newCanvas.height = widthh * scaleSize;
 newCanvas.style.width = width + "px";
 newCanvas.style.height =width + "px";
 const context = newCanvas.getContext("2d");
 context.scale(scaleSize, scaleSize);
 html2canvas(document.querySelector('.demo'), { canvas: newCanvas }).then(function(canvas) {
   // 简单的通过超链接设置下载功能
   document.querySelector(".btn").setAttribute('href', canvas.toDataURL());
 }

根据需要设置 scaleSize 大小

微信公众号分享问题
表现
在微信公众号 H5 开发中,页面内部点击分享按钮调用 SDK,方法不生效。

解决方案
解决方法:添加一层蒙层,做分享引导。
因为页面内部点击分享按钮无法直接调用,而分享功能需要点击右上角更多来操作。

然后用户可能不知道通过右上角小标里面的功能分享。又想引导用户分享,这时应该怎么做呢?

技术无法实现的,从产品出发。
在这里插入图片描述
如果技术上实现复杂,或者直接不能实现。不要强行钻牛角尖哦,学会怼产品,也是程序员必备的能力之一。

H5 调用 SDK 相关解决方案
产生原因
在 Hybrid App 中使用 H5 是最常见的不过了,刚接触的,肯定会很生疏模糊。不知道 H5 和 Hybrid 是怎么交互的。怎样同时支持 iOS 和 Android 呢?现在来谈谈 Hybrid 技术要点,原生与 H5 的通信。

解决方案
在这里插入图片描述
使用 DSBridge 同时支持 iOS 与 Android
SDK小组 提供方法

  1. 注册方法 bridge.register
 bridge.register('enterApp', function() {
   broadcast.emit('ENTER_APP')
 })
  1. 回调方法 bridge.call
 export const getSDKVersion = () => bridge.call('BLT.getSDKVersion')

事件监听与触发法

const broadcast = {
   on: function(name, fn, pluralable) {
     this._on(name, fn, pluralable, false)
   },
   once: function(name, fn, pluralable) {
     this._on(name, fn, pluralable, true)
   },
   _on: function(name, fn, pluralable, once) {
     let eventData = broadcast.data
     let fnObj = { fn: fn, once: once }
     if (pluralable && Object.prototype.hasOwnProperty.call(eventData, 'name')) {
       eventData[name].push(fnObj)
     } else {
       eventData[name] = [fnObj]
     }
     return this
   },
   emit: function(name, data, thisArg) {
     let fn, fnList, i, len
     thisArg = thisArg || null
     fnList = broadcast.data[name] || []
     for (i = 0, len = fnList.length; i < len; i++) {
       fn = fnList[i].fn
       fn.apply(thisArg, [data, name])
       if (fnList[i].once) {
         fnList.splice(i, 1)
         i--
         len--
       }
     }
     return this
   },
   data: {}
 }
 export default broadcast

踩坑注意
方法调用前,一定要判断 SDK 是否提供该方法 如果 Android 提供该方法,iOS 上调用就会出现一个方法调用失败等弹窗。怎么解决呢?

提供一个判断是否 Android、iOS。根据设备进行判断

export const hasNativeMethod = (name) =>
   return bridge.hasNativeMethod('BYJ.' + name)
 }
 ​
 export const getSDKVersion = function() {
   if (hasNativeMethod('getSDKVersion')) {
     bridge.call('BYJ.getSDKVersion')
   }
 }

同一功能需要iOS,Android方法名相同,这样更好处理哦

H5 调试相关方案策略
表现
调试代码一般就是为了查看数据和定位 bug。分为两种场景,一种是开发和测试时调试,一种是生产环境上调试。

为什么有生产环境上调试呢?有些时候测试环境上没法复现这个 bug,测试环境和生产环境不一致,此时就需要紧急生产调试。

在 PC 端开发时,我们可以直接掉出控制台,使用浏览器提供的工具操作devtools或者查看日志。但是在 App 内部我们怎么做呢?

原理与解决方案

  1. vconsole 控制台插件
    使用方法也很简单
import Vconsole from 'vconsole'
 ​
 new Vconsole()

上述方法仅用于开发和测试。生产环境中不允许出现,所以,使用时需要对环境进行判断。

 import Vconsole from 'vconsole'
 if (process.env.NODE_ENV !== 'production') {
     new Vconsole()
 }

仅供自己学习使用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移动端H5开发遇到的问题 的相关文章

  • 移动开发之我见--“Android开发生涯”

    纵观这几年的发展 移动手机的发展真是翻天覆地 前两年诺基亚一统天下 苹果颠覆了整个手机市场 安卓也分得了一杯羹 WindowPhone手机也纯纯欲动 Bada也抓紧推出自己的系统 360也要推出自己的手机系统 百度 腾讯纷拥而至 未来世界是
  • Android Rom修改制作工具软件集合

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 SIN2IMG 用于固件ftf中system sin的解包 下载地址 SIN2IMG rar 使用方法 将固件ftf文件用rar打开 解压出system sin文件 将
  • kafka + zookeeper下载/安装/使用(超详细)

    kafka是需要zk来支持 所以先下载zk 1 下载安装zookeeper 下载地址 选择不带source的 下载下来解压2次 进入到 D zookeeper apache zookeeper 3 6 1 bin conf 目录下 把zoo
  • Lottie动画概述,文末有彩蛋

    原生的动画效果有时候写起来会非常的复杂 要考虑到很多兼容和效果 Lottie动画专门为了解决这种烦恼而产生的 注 不仅是Lottie可以做到 另外一种库也可以做到将动画分成一帧一帧展示 它就是 android gif drawable 库
  • Flutter状态管理Provider,简单上手

    学习Flutter一段时间了 偶然看到大家都说状态管理 多数人都是用redux 对于一个Android开发人员来说之前根本没接触过 于是开始了解redux 之后又了解闲鱼推出的fish redux 然后又看到Vadaski发表的一系列关于F
  • 作为技术岗位面试官的一些分享

    我在过去的四年里参与了很多公司技术岗位的面试 说实话要看出一个人的综合素质 我还真的做不到 至于其他面试官是否可以 我也不得而知 但我个人感悟是 在面试过程中 面试官更加多的是去匹配和比较 在招聘过程中 企业会根据人力需求先制定出一套招聘需
  • SSHDroid(SSH Server for Android)通过PC或命令连接android

    1 下载berserker android apps sshdroid apk 如果你懒的下载 给我留言 我会发给你 2 安装到手机 显示如图 简单解释一下 一般android系统没有root权限 Wifi Connection 是你连接的
  • Nginx日志常见时间变量解析

    request time 官方解释 request processing time in seconds with a milliseconds resolution time elapsed between the first bytes
  • Flutter websocket 实现消息推送

    没什么可说的 直接上代码吧 Flutter 中的消息管理工具 class MessageUtils static WebSocket webSocket static num id 0 static void connect Future
  • Docker-swarm 介绍,集群,多服务部署实战

    一 什么是Docker Swarm Swarm是Docker公司推出的用来管理docker集群的平台 几乎全部用GO语言来完成的开发的 代码开源在https github com docker swarm 它是将一群Docker宿主机变成一
  • iOS逆向工程之App脱壳

    本篇博客以微信为例 给微信脱壳 砸壳 在iOS逆向工程中是经常做的一件事情 因为从AppStore直接下载安装的App是加壳的 其实就是经过加密的 这个 砸壳 的过程就是一个解密的过程 未砸壳的App是无法在Class dump Hoppe
  • xposed开发之清除应用数据(研究历程)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近在研究xposed 有个需求要做到清除其他应用数据 xposed功能足够强大 应该可以实现这个功能 下面是基于android4 4 4研究的思路 google只能开放了
  • web移动端布局的那些事儿

    原文地址 github com HuJiaoHJ bl web移动端布局范畴很广 其中比较基础的几个话题 移动端适配 1px border 基础布局 本文主要分享这三个话题 一 移动端适配 提起移动端适配 大家想到的肯定是rem flexi
  • 零基础入门 HTML 的 8 分钟极简教程

    在今天 前端工程师已经成为研发体系中的重要岗位之一 可是与此相对的是 极少大学的计算机专业愿意开设前端课 大部分前端工程师的知识 也都是在实践和工作中不断学习的 最近收到很多同学的后台留言 说希望多推出一些前端方向的教程 今天我们就带来一个
  • Compile Options--编译选项

    目的 其主要作用是用于调试跟踪和测试 主要包含 MT TASK MT ZDO FUNC and other MT compile options LCD SUPPORTED LCD SUPPORTED DEBUG BLINK LEDS 且看
  • 非常详尽的 Linux 中 WEB服务器配置与管理 (通过例子来讲解)

    Apache服务器的安装与启动 检查是否已经安装了APACHE并启动它 这是已安装好的状态 root root rpm qa grep httpd httpd tools 2 2 15 53 el6 x86 64 httpd 2 2 15
  • 【有奖调研】HarmonyOS新物种,鸿蒙流量新阵地——元服务邀你来答题!

    聊技术无话不谈 一起来吹吹元服务 畅聊你对元服务的想法 说不定 你就能撬动元服务的爆发增长 元服务 即原子化服务 是华为 轻量化 服务的新物种 可提供全新的服务和交互方式 让应用化繁为简 让服务触手可及 基于鸿蒙万能卡片 元服务可实现应用功
  • linux中mysql启动服务命令(合集)

    linux的mysql启动服务命令 linux的mysql启动服务命令1 使用mysqld启动 关闭MySQL服务 mysqld是MySQL的守护进程 我们可以用mysqld来启动 关闭MySQL服务 关于mysqld MySQL 5 6官
  • 一致性哈希算法,hash(key)是负值时,会出现异常吗?

    一致性哈希算法 hash key 是负值时 会出现异常吗 一致性哈希算法中 哈希函数hash key 的返回值通常是一个非负整数 如果hash key 返回负值 则可能会出现一些问题 例如无法正确地映射对象到哈希环上的位置 或者无法正确地找
  • 对技术行业的深度思考

    技术行业是当今世界最为热门和发展迅猛的领域之一 无论是互联网 人工智能还是区块链 技术的快速发展正在改变着我们的生活和社会 然而 我们是否真正思考过技术在我们生活中的影响和意义 本文将对技术行业展开深度思考 探讨其带来的优势与挑战 以及如何

随机推荐

  • 图解如何在PLSQL中调试PACKAGE包中的FUNCTION函数

    Oracle中的packages包是一组包含procedures存储过程 functions函数和游标等元素的组合 相比Sybase数据库的SQL Advantage工具 Oracle数据库的管理工具 PLSQL在调试存储过程还是方便 1
  • (十)老照片修复、图像超分、图片提高分辨率、图片高清化、图片清晰化、黑白图片上色、人脸祛斑、美颜、人体瘦身、图像去噪、人像抠图、批量处理、视频提高分辨率、视频逐帧修复

    十 老照片修复 图像超分 图片提高分辨率 图片高清化 图片清晰化 黑白图片上色 人脸祛斑 美颜 人体瘦身 图像去噪 人像抠图 批量处理 视频提高分辨率 视频逐帧修复 本文的代码的功能是 可以对图片文件 视频批量增强清晰度 对老照片进行修复
  • NO.6——Unity3D中两种绘制小地图的方法

    在玩游戏时 你经常会发现 在游戏窗口的右上角或者左下角通常会有一个小地图 里边实时反馈角色的移动信息甚至是世界地图 那么这个小地图是如何绘制的呢 我目前掌握了两种方法 一种是以GUI方法重新绘制一个小窗口 另一种是新建一个正交投影的摄像机机
  • 2023华为OD机试真题 C++ 实现【寻找最大价值的矿堆/深度优先搜索】

    题目 我们规定 0表示空地 1表示银矿 2表示金矿 矿堆表示由相邻的金矿或银矿连接形成的地图 银矿价值是1 金矿价值是2 你的目标是找出地图中最大价值的矿堆 并且输出该矿堆的价值 示例1 输入 22220 00000 00000 01111
  • Java-Springboot整合支付宝接口

    文章目录 一 创建支付宝沙箱 二 使用内网穿透 nat app 三 编写java程序 四 访问 一 创建支付宝沙箱 跳转 支付宝沙箱平台 1 进入控制台 2 创建小程序 编写名称和绑定商家即可 3 返回第一个页面 往下滑进入沙箱 4 进行相
  • Matlab两种求相位的方法

    在matlab中有两种求相位方法 1 使用phase函数 比如a 1 j 2 phase a 则可以就a的相位 这个函数取实部为x轴 虚部为y轴 2 使用函数atan2 atan2 y x 注意y轴的数是放在前面的 atan2 2 1 和刚
  • C++入门教程(一)

    目录 一 初识C 2 程序结构 二 顺序结构程序设计 1 头文件 1 1 iostream 1 2 cstdio 1 3 cmath 2 名称空间 3 输入和输出 3 1输入 3 2输出 3 3各种输入输出优点缺点比较 4 变量 4 1赋值
  • 【人工智能】—_贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

    文章目录 频率学派 vs 贝叶斯学派 贝叶斯学派 Probability 概率 独立性 条件独立性 Probability Theory 概率论 Graphical models 概率图模型 什么是图模型 Graphical Models
  • pytorch1.4+tensorboard不显示graph计算图的问题

    电脑安装的pytoch版本为1 4 tensorboard无法显示计算图graph 但可以显示scalar 经过多方查证为pytorch版本问题 目前graph显示仅支持到pytorch1 3 处理如下 1 卸载当前的pytorch并安装低
  • springboot中用undertow踩坑记

    场景 准备基于springboot的静态资源实现mp4资源的播放 不同版本的springboot下效果不一样 可能导致正常的资源不可用 本文测试了几个版本 也针对这种情况提出了解决建议 希望对你的工作有所帮助 众所周知 springboot
  • 简单的方法解决ORA-07104:字符串文字太长

    工作中 保存数据的时候出现该问题 说字符串问题过长 过长的字段是一个用来保存xml格式的字符串 字段类型已经设置成CLOB 但是还是出现字符串过长问题 在SQLServer应该不会出现该问题 该问题中字符串文字太长 并不是字段的字符串过长
  • React配置@src根路径

    第一种 直接修改node modules包中的webpack config js文件 找到node modules react scripts config webpack config js文件 修改其中alias中的配置 添加 src
  • zotero和obsidian图片无法显示问题(可能的解决思路之一)(bibnotes formatter配置)

    我的zotero图片笔记无法导入obsidian 看了目前的大部分博主的内容 都是教你将bibnotes formatter中 image import下的zotero local folder路径改为storage前的路径 例如 我的位置
  • SSL踩坑ERR_SSL_VERSION_OR_CIPHER_MISMATCH

    最近公司项目开发了一个微信小程序 并且部署测试OK 由于微信小程序调用的后端接口必须是HTTPS 所以给接口安装了SSL 第一天测试都正常 第二天早上再使用时页面无响应 抓包发现是后端接口抛出 net ERR SSL VERSION OR
  • 背包九讲-01背包

    动态规划核心思维能力 动态规划是求最优解问题的重要解法 也是信息学奥赛中每年必考的内容之一 学习动态规划更应该注重此类问题思维能力的锻炼 多多做题 一般 gt 50题后方可入门 注意理解以下概念 1 状态 2 状态属性 3 状态的计算 也就
  • Microsoft Office Excel 不能访问文件 的解决办法

    Microsoft Office Excel 不能访问文件 a xls 可能的原因有 文件名称或路径不存在 文件正被其他程序使用 您正要保存的工作簿与当前打开的工作簿同名 This solution is Windows 2008 Serv
  • 三维实时重建BundleFusion

    转自 计算机视觉方向简介 深度相机室内实时稠密三维重建 知乎 室内场景的稠密三维重建目前是一个非常热的研究领域 其目的是使用消费级相机 本文特指深度相机 对室内场景进行扫描 自动生成一个精确完整的三维模型 这里所说的室内可以是一个区域 一个
  • 前端基础(三)- ES7~ES12

    为了方便记忆和称呼 ES2015之后的新知识点我们都统称ES6语法 就没必要去划分得那么细 ES7 2016 Array prototype includes includes方法可以判断一个数组是否包含某个指定的值 如果存在返回true
  • 多分类学习、多标签学习、多任务学习的区别

    Multi class Multi label Multi task 三者之间的区别与相同之处 1 直观解释 多分类学习 Multi class 一个分类器 但分的类别是包含多个的 例如 分类器判断苹果的颜色是 红色 黄色 青色 白色 这是
  • 移动端H5开发遇到的问题

    移动端开发必会出现的问题和解决方案 H5开发过程中难免会遇到一些兼容性等爬过坑的问题 移动端 H5 相关问题汇总 1px 问题 响应式布局 iOS 滑动不流畅 iOS 上拉边界下拉出现白色空白 页面件放大或缩小不确定性行为 click 点击