📚一站式解决:H5开发全攻略,看这篇让你省时又省力-3

简介: ⭐️⭐️border-radius 画出的圆在移动端有毛边解决方案给元素添加 overflow: hidden 属性。

⭐️⭐️border-radius 画出的圆在移动端有毛边

解决方案

给元素添加 overflow: hidden 属性。

.elem {
  overflow: hidden;
}

⭐️⭐️安卓上去掉语音输入按钮

input::-webkit-input-speech-button {
  display: none;
}

⭐️⭐️Vue 单页应用在 iOS 上微信分享失效,图片,标题和描述均未正常显示,安卓上分享正常

原因

我们一般在 APP.vue 的 mounted 生命周期中初始化微信 SDK,此时页面的地址 hash 是#/,而首页的 hash 是#/home,导致初始化微信 SDK 时传入的分享 url 和用户实际触发分享操作时页面的 url 不一致,致使在 iOS 上分享失败。

解决方案

初始化微信分享 SDK 时传入的地址,和实际触发分享时页面的地址保持一致。

⭐️⭐️iOS safari 被点击元素会出现半透明灰色遮罩

解决方案

给 html 或者 body 加入以下 css 代码。

body {
  -webkit-tap-highlight-color: rgba(0,0,0,0);
  -webkit-user-modify: read-write-plaintext-only;
}

⭐️⭐️iOS 禁止保存或拷贝图像

解决方案

长按图片保存场景下,禁止 IOS 默认识别图像行为。

img {
  -webkit-touch-callout: none;
}

⭐️⭐️⭐️iOS 端微信 H5 页面上下滑动时卡顿

解决方案

给滚动元素加上-webkit-overflow-scrolling属性。

body {
  -webkit-overflow-scrolling:touch;
}

⭐️⭐️iOS 默认输入框内阴影重置

解决方案

阻止 iOS 默认的美化页面的策略-webkit-appearance:none;

input {
  border: 0;
  -webkit-appearance:none;
}

⭐️⭐️⭐️对非可点击元素(div,span 等)监听 click 事件,部分 ios 版本不会触发事件

解决方案

  1. 添加 css 属性 cursor: pointer;
  2. 换成 button 元素。
cursor: pointer;
<button></button>

⭐️⭐️⭐️手机底部刘海存在背景,和页面背景色不一致

解决方案

通过指定 body 的背景色来解决。

body {
  background-color: #fff;
  // or 暗色模式
  // background-color: #000;
}

⭐️⭐️对于带有 hash 的 H5 链接,部分手机厂商的 webview 打开 H5 页面会加载两次

解决方案

这是部分 webview 对于特殊 url 有独特的解析和加载逻辑,去掉 hash 即可

https://www.example.com/a/b#/

⭐️⭐️body存在默认背景色

解决方案

body 标签在大部分浏览器中的默认背景色是白色,但在极少数浏览器中的背景颜色是淡绿色或者其他颜色。通过指定 body 背景色为#fff,来兼容更多设备。

body {
  background-color: #fff;
}

⭐️⭐️旋转屏幕的时候,字体大小调整的问题

css
body {
  -webkit-text-size-adjust: 100%;
}

⭐️⭐️IOS解析日期问题

在某些情况下,苹果系统上解析 YYYY-MM-DD HH:mm:ss 格式的日期会报错 Invalid Date,而安卓系统则没有这个问题。解决这个问题的一种方法是将日期字符串中的 - 替换为 /

const dateString = "2023-07-16 00:00:00";
const fixedDateString = dateString.replace(/-/g, "/");
const date = new Date(fixedDateString);

⭐️⭐️⭐️⭐️⭐️滚动穿透

现象

滚动穿透(scrolling through)是指在一个固定区域内滚动时,滚动事件透过该区域继续传递到其下方的元素,导致同时滚动两个区域的现象。滚动穿透可能会对用户体验产生负面影响,因为用户可能意外地滚动到不相关的内容。

解决方案

这个问题一直很无解,只能hack去兼容

overflow: hidden

1.先锁住body

.modal-open {
  &,
  body {
    overflow: hidden;
    height: 100%;
  }
}

2.还原body滚动区域

// 获取滚动区域的容器元素
const container = document.querySelector('.container');
// 获取滚动区域的内容元素
const content = document.querySelector('.content');
// 记录滚动位置
let scrollTop = 0;
// 禁止滚动穿透
function disableScroll() {
  // 记录当前滚动位置
  scrollTop = window.pageYOffset || document.documentElement.scrollTop;
  // 设置滚动区域容器的样式,将其高度设置为固定值,并设置滚动条样式
  container.style.height = '100%';
  container.style.overflow = 'hidden';
  // 阻止窗口滚动
  document.body.classList.add('no-scroll');
  document.body.style.top = `-${scrollTop}px`;
}
// 启用滚动穿透
function enableScroll() {
  // 恢复滚动区域容器的样式
  container.style.height = '';
  container.style.overflow = '';
  // 允许窗口滚动
  document.body.classList.remove('no-scroll');
  document.body.style.top = '';
  // 恢复滚动位置
  window.scrollTo(0, scrollTop);
}
// 示例使用,当某个事件触发时禁止滚动穿透
function disableScrollEvent() {
  disableScroll();
}
// 示例使用,当某个事件触发时启用滚动穿透
function enableScrollEvent() {
  enableScroll();
}

ant-mobile组件库解决方式

思想思路:

  • 针对触摸滑动事件 touchmove,通过监听滑动方向和滚动元素的状态,决定是否阻止默认的滑动行为,从而防止滚动穿透。
  • 在需要锁定滚动的情况下,给 document 添加 touchstarttouchmove 事件的监听器,通过捕获触摸滑动事件,并根据情况阻止默认行为,从而避免滚动穿透。
  • 在解锁滚动时,从 document 移除对触摸事件的监听器,恢复默认的滑动行为。

// 移植自vant:https://github.com/youzan/vant/blob/HEAD/src/composables/use-lock-scroll.ts
export function useLockScroll(
  rootRef: RefObject<HTMLElement>,
  shouldLock: boolean | 'strict'
) {
  const touch = useTouch()
  const onTouchMove = (event: TouchEvent) => {
    touch.move(event)
    const direction = touch.deltaY.current > 0 ? '10' : '01'
    const el = getScrollParent(
      event.target as Element,
      rootRef.current
    ) as HTMLElement
    if (!el) return
    // This has perf cost but we have to compatible with iOS 12
    if (shouldLock === 'strict') {
      const scrollableParent = getScrollableElement(event.target as HTMLElement)
      if (
        scrollableParent === document.body ||
        scrollableParent === document.documentElement
      ) {
        event.preventDefault()
        return
      }
    }
    const { scrollHeight, offsetHeight, scrollTop } = el
    let status = '11'
    if (scrollTop === 0) {
      status = offsetHeight >= scrollHeight ? '00' : '01'
    } else if (scrollTop + offsetHeight >= scrollHeight) {
      status = '10'
    }
    if (
      status !== '11' &&
      touch.isVertical() &&
      !(parseInt(status, 2) & parseInt(direction, 2))
    ) {
      if (event.cancelable) {
        event.preventDefault()
      }
    }
  }
  const lock = () => {
    document.addEventListener('touchstart', touch.start)
    document.addEventListener(
      'touchmove',
      onTouchMove,
      supportsPassive ? { passive: false } : false
    )
    if (!totalLockCount) {
      document.body.classList.add(BODY_LOCK_CLASS)
    }
    totalLockCount++
  }
  const unlock = () => {
    if (totalLockCount) {
      document.removeEventListener('touchstart', touch.start)
      document.removeEventListener('touchmove', onTouchMove)
      totalLockCount--
      if (!totalLockCount) {
        document.body.classList.remove(BODY_LOCK_CLASS)
      }
    }
  }
  useEffect(() => {
    if (shouldLock) {
      lock()
      return () => {
        unlock()
      }
    }
  }, [shouldLock])
}

目录
相关文章
|
8月前
|
人工智能 自然语言处理 安全
新年愿望清单:搭建官网选哪家?
而今立足「SaaS系统」面向中小企业的各种低成本建站产品让人眼花缭乱,小云对比了几大厂牌,梳理出一些【阿里云精选建站】的功能亮点,篇幅有限,各位看官可酌情参考——
185 0
|
数据采集 前端开发 JavaScript
从零开始搭建群众权益平台(七)
从零开始搭建群众权益平台(七)
58 0
|
2月前
|
安全 前端开发 API
反向海淘客户案例:hoobuy淘宝代购集运系统搭建攻略介绍
这份攻略详细介绍了如何搭建 Hoobuy 淘宝代购集运系统。首先,通过市场调研与定位,明确目标客户和竞争态势,确定市场定位。接着,选择合适的技术栈,包括后端、前端和数据库,构建稳定高效的系统架构。核心功能涵盖 API 集成、商品展示、购物车管理、物流追踪等,确保用户体验。此外,注重安全与合规,保障用户数据和支付安全,遵守相关法律法规。最后,通过 SEO 优化、社交媒体营销和建立合作伙伴关系,推动系统的推广与运营。
|
6月前
|
前端开发 安全 测试技术
逆向海淘代购集运系统客户案例:superbuy淘宝代购集运系统丨1688代采系统搭建攻略
搭建Superbuy淘宝代购及1688代采系统涉及定位分析、技术选型、API集成、支付物流、用户体验及安全部署。采用PHP、MVC架构,集成多平台商品、支付方式,确保数据同步与安全。1688代采系统着重商品代采、订单管理与物流跟踪,通过自动化流程提升效率。全面测试确保系统稳定可靠。
|
7月前
|
供应链 API UED
逆向海淘代购案例解读:类似Pandabuy淘宝代购集运系统搭建攻略
逆向海淘模式下,Pandabuy式代购集运系统搭建涉及市场定位、供应链管理、平台开发与优化、支付物流及用户体验。系统提供丰富商品选择,集成多平台API,确保数据同步。关键点包括确定目标用户,建立稳定供应链,优化网站与支付流程,合作可靠物流,并提供客服支持以提升用户满意度。通过这样的攻略,可构建一站式跨境购物解决方案。
|
移动开发 前端开发 JavaScript
从零开始搭建群众权益平台(六)
从零开始搭建群众权益平台(六)
58 0
|
监控 JavaScript 应用服务中间件
从零开始搭建群众权益平台(八)
从零开始搭建群众权益平台(八)
80 0
|
JavaScript 前端开发 数据挖掘
从零开始搭建群众权益平台(九)
从零开始搭建群众权益平台(九)
63 0
|
BI 图形学 数据库管理
天下苦广告久矣!分享五款免费且无广告的开源软件
在日常的使用中,我们需要使用各种软件来提高我们的工作效率或者进行创意的表达。然而,商业软件价格昂贵,某些国产软件又充斥着广告。因此,开源软件成为了一个不错的选择,以下是我推荐的五款优秀的开源软件。
185 1
天下苦广告久矣!分享五款免费且无广告的开源软件
|
Web App开发 移动开发 缓存
📚一站式解决:H5开发全攻略,看这篇让你省时又省力-1
响应式布局 在 H5 中,我们通常会使用 REM 和 VW 这两种单位来实现页面的响应式布局。这两种单位可以让页面元素的大小随着根元素(对于 REM)或视口宽度(对于 VW)的大小变化而变化,从而适应不同尺寸的屏幕。
140 0