如何针对触摸设备优化网站

2024-03-26

在 iPhone/iPad/Android 等触摸设备上,用手指敲击小按钮可能很困难。据我所知,没有跨浏览器的方法可以通过 CSS 媒体查询来检测触摸设备。所以我检查浏览器是否支持 Javascript 触摸事件。 到目前为止,其他浏览器尚不支持它们,但开发频道上最新的 Google Chrome启用触摸事件 http://code.google.com/p/chromium/issues/detail?id=36415(即使对于非触摸设备)。我怀疑其他浏览器制造商也会效仿,因为带有触摸屏的笔记本电脑即将到来更新:这是 Chrome 中的一个错误,所以现在 JavaScript 检测再次起作用.

这是我使用的测试:

function isTouchDevice() {
    return "ontouchstart" in window;
}

问题是,这仅测试浏览器是否支持触摸事件,而不是设备。

有谁知道为触摸设备提供更好的用户体验的正确方法?除了嗅探用户代理之外。

Mozilla 有针对触摸设备的媒体查询。但我在其他浏览器中没有看到类似的东西:https://developer.mozilla.org/En/CSS/Media_queries#-moz-touch-enabled https://developer.mozilla.org/En/CSS/Media_queries#-moz-touch-enabled

更新:我想避免为移动/触摸设备使用单独的页面/网站。该解决方案必须通过 JavaScript 中的对象检测或类似功能来检测触摸设备,或者包含自定义触摸 CSS,而无需用户代理嗅探!我问的主要原因是在联系 css3 工作组之前确保今天不可能。因此,如果您不能遵循问题中的要求,请不要回答;)


在我看来,您希望有一个适合触摸屏的选项,以涵盖以下场景:

  1. 类似 iPhone 的设备:小屏幕,仅限触摸
  2. 小屏幕,无触摸(你没有提到这一点)
  3. 大屏幕,无触摸(即传统计算机)
  4. 支持触摸屏的大屏幕,例如iPad、带触摸屏的笔记本/电脑。

对于情况 1 和 2,您可能需要一个单独的站点或 CSS 文件来消除大量不必要的内容并使内容更大且更易于阅读/导航。如果您关心情况 #2,那么只要页面上的链接/按钮可通过键盘导航,则情况 1 和情况 2 是等效的。

对于情况 3,您有正常的网站。对于情况 4,听起来您希望可点击的东西更大或更容易触摸。如果不可能简单地将所有内容放大以供所有用户使用,则替代样式表可以为您提供触摸友好的布局更改。

最简单的方法是在页面上的某个位置提供指向该网站触摸屏版本的链接。对于众所周知的触摸设备(例如 iPad),您可以嗅探用户代理并将触摸样式表设置为默认值。不过我会考虑将其设为每个人的默认值;如果您的设计在 iPad 上看起来不错,那么它在任何笔记本电脑上也应该看起来不错。点击技能不太出色的鼠标用户会很高兴找到更大的点击目标,特别是如果您添加了适当的:hover or mouseover让用户知道事物是可点击的效果。

我知道你说过你不想嗅探用户代理。但我认为,目前浏览器对此的支持状态变化太大,无需担心“正确”的实现方式。浏览器最终会提供您需要的信息,但您可能会发现这些信息要过很多年才能普及。

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

如何针对触摸设备优化网站 的相关文章

  • 将图像作为框架放置在 iframe 周围?

    我有一个网站尝试以移动格式显示 但在宽屏幕上 我确信 iframe 是正确的选择 我正在尝试将 iframe 加载到 iPhone 的图像中 你可以看一个例子here http webfro gs south tour iframe tes
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 有角度的动态背景图片

    在 html 模板中 我有这种带有动态图像的样式 div style background none width 200px height 150px div 它适用于网络浏览器和 Android 浏览器 但是 使用 style 的动态背景
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 为 Angular2 中的组件加载多个样式表

    我正在构建一个 angular2 应用程序 当我尝试为同一组件加载多个样式表时 我面临多个问题 这是我正在做的代码 import Component from angular core Component selector my tag t
  • CSS 类命名约定

    在网页上 有两个控件块 主要和次要 大多数人会使用什么类名 选择一 div class primary controls div
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 在 HTML 下拉列表中有一个滚动条

    我正在寻找一种在 HTML 的下拉列表中添加滚动条的方法 这样如果下拉列表包含的内容超过例如 5 项 将出现滚动条以查看其余项 这是因为我将被迫列出一些大清单 过去几个小时我一直在谷歌上搜索它 但没有运气 它需要适用于 IE8 FF 和 C
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐

  • Getopt 移位 optarg

    我需要这样调用我的程序 program hello r foo bar 我从 argv 1 中打招呼 但我在值栏上遇到问题 我还应该将 r 更改为其他内容吗 while c getopt argc argv r 1 switch i cas
  • 使用 mplot3d 绘制二维数组

    我有一个 2D numpy 数组 我想以 3D 形式绘制它 我听说过 mplot3d 但我无法正常工作 这是我想做的一个例子 我有一个尺寸为 256 1024 的数组 它应该绘制一个 3D 图表 其中 x 轴从 0 到 256 y 轴从 0
  • 将 jquery datepicker 创建的日期转换为标准 mysql 日期格式

    我在日记页面上使用以下 jquery 日期和时间选择器 http trentrichardson com examples timepicker rest examples http trentrichardson com examples
  • 如何以编程方式访问数据网格行详细信息控件

    我有一个数据网格 其中包含一些定义的列 然后是行详细信息模板 如何在隐藏代码中访问行详细信息模板中的控件 我有一个按钮 我想以编程方式启用 禁用 但我不知道如何在后面的代码中访问它 我在MSDN上看到过这个 http msdn micros
  • Roo - 添加自定义查找器

    我使用 Roo 创建了一个使用现有数据库的项目 我能够创建动态查找器 但我想实现自定义查找器 它将接收 4 个参数并使用其中一些参数创建 Like 条件 其他参数创建 equals 条件 对 Roo 来说 最好的方法是什么 推荐的模式是编辑
  • 仅当验证成功时如何提交表单

    我尝试在提交请求之前验证表单 我正在使用 jquery 验证 我期望当页面完成加载时 表单将自动提交 并且我将在 div 中看到 正在加载 但什么也没发生 这是我的代码 但似乎不起作用
  • Android应用程序数据存储不断增加

    我正在开发一个 Android 应用程序 它基本上加载新闻文章列表 并在用户单击时在网络视图中打开它们 我想知道的是 当我在 设置 gt 应用程序 gt 管理应用程序 中查看应用程序详细信息时 总存储大小不断增加 特别是 数据存储规模不断增
  • jquery dataTable 过滤器/搜索不起作用

    我是 jquery 新手 我使用了 jqueryData 表 我在搜索过程中遇到问题 搜索适用于前两列 例如 如果我使用 QE5855 或 3453457 进行搜索 则工作正常 但它不搜索第三列 例如 如果我输入 美国 或 美国 表未排序
  • Flutter Firebase 错误(任务“:app:mergeExtDexDebug”执行失败)

    我是编程新手 对 flutter 和 firebase 也很陌生 我正在尝试这段代码 https github com tattwei46 flutter login demo https github com tattwei46 flut
  • Google Places API 为什么每次都会在不同的变量下返回纬度和经度?

    这让我抓狂 出于某种原因 API 用于返回纬度和经度 如下所示 我认为是这样的 place geometry location y作为纬度 place geometry location z作为经度 然后它开始像这样返回 place geo
  • 抛硬币问题的Python代码

    我一直在用 python 编写一个程序 模拟 100 次抛硬币并给出抛硬币的总数 问题是我还想打印正面和反面的总数 这是我的代码 import random tries 0 while tries lt 100 tries 1 coin r
  • 如何在 gradle 脚本中获取正在运行的 Android 风格名称

    这次我遇到了这个问题 我试图在 gradle 脚本中获取当前的风格 我已经尝试过这里给出的答案如何在 gradle 中获取当前的风味 https stackoverflow com questions 30621183 how to get
  • CSS a href 样式

    我有一个 hrefclass button 我正在尝试这样设计 button a link text decoration none button a visited text decoration none button a active
  • UITableViewAutomaticDimension 在 Xcode 6.3 中不起作用

    我将 Xcode 与 Swift 1 2 一起更新到 6 3 并完成了转换 除了表视图的动态行高之外 一切正常 我在 3 个完全不同的表视图上有这些 所以它可能不是影响该错误的其他因素 我将所有表视图设置为 tableView rowHei
  • asp.net mvc 中具有相同输入 id 的两个表单

    我在一个页面上有多个表单 它们通过隐藏输入将 id 传递给控制器 由于我对这些视图使用强类型视图 因此我认为我需要保持每个视图的 Id 相同 它目前有效 但我认为这是不好的做法 我应该如何处理这个问题 在 Django 中有表单前缀值 是否
  • React Native 对 fetch 的缓存行为是什么

    目前 React Native 的默认缓存行为是什么fetch打电话 官方 FB 指南只是说 看看 Mozilla 但我们使用的不是网络浏览器 我假设缓存行为是由于中间件而自定义的 假设我这样做 fetch https exampleser
  • 使用 postmessage 发回消息

    我目前正在制作一个应用程序 需要在两个域之间发送信息 将在页面加载时 网站1 创建 iFrame gt 向网站 2 发送 Postmessage window onload function iframe document createEl
  • 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

    我正在尝试使用 GStreamer 进行 UDP 多播屏幕流传输 我的投屏服务器应该在 Windows 上运行 and my 客户端应在 Linux 上运行 如果我在服务器之前启动客户端 一切都很好 问题是当我启动客户端并且服务器已经启动时
  • asp.net 成员资格表中 Lowered* 列的意义是什么?

    ASP Net 成员资格和朋友的 SQL 架构中列名称以 Lowered 为前缀的架构原因是什么 下面是相关列的一些示例 aspnet Applications LoweredApplicationName aspnet users Low
  • 如何针对触摸设备优化网站

    在 iPhone iPad Android 等触摸设备上 用手指敲击小按钮可能很困难 据我所知 没有跨浏览器的方法可以通过 CSS 媒体查询来检测触摸设备 所以我检查浏览器是否支持 Javascript 触摸事件 到目前为止 其他浏览器尚不