写点什么

简单聊聊配合 dialog 使用 popover 的问题

作者:Adrian Roselli

  • 2023-06-14
    北京
  • 本文字数:1441 字

    阅读完需:约 5 分钟

简单聊聊配合dialog使用popover的问题

首先澄清一点,这里要讨论的不是 popover 和 dialog 谁好谁错,也不是要站队支持哪一方。我想聊的是如何通过模式混合和模式匹配帮助用户解决潜在问题。

 

00:00 / 00:00
    1.0x
    • 3.0x
    • 2.5x
    • 2.0x
    • 1.5x
    • 1.25x
    • 1.0x
    • 0.75x
    • 0.5x
    网页全屏
    全屏
    00:00

     

    台本:视频演示的是弹窗跳出来,挡住了带 ARIA dialog 角色的<div>模态对话框。焦点切换和手动关闭都没法解决这个遮挡问题。但是,原生 HTML <dialog>元素能够正常位于弹窗更前方。演示中的对话框是一段超时警告,提示用户按下按钮,否则会在一份复杂表单的第 14 步(共 72 步)中被注销。

     

    这个演示页面,模拟的是我们怎么争分夺秒地填写一份复杂的多步骤表单。当用户点击切换提示来获取关于当前字段的更多信息时,系统会弹出一个对话框,提示用户除非点击按钮、否则将会被注销。但这个延时按钮被切换提示给挡住了。用户按下 Esc 想关闭切换提示,但关掉的却是对话框。也就是说,用户没法正常延长注销时间,只能眼睁睁看着自己已经填完的内容全部作废,然后气得骂娘。

     

    但使用〈dialog〉元素实现的对话框就不会遇到这个问题。

     

    所以我强烈建议大家,除非确认所有模态对话框都已经被转换成了原生 HTML <dialog>、或者经过了严格的布局位置测试,否则别轻易在项目中引入 popover。有些朋友可能轻蔑地笑了——别嚣张,您只是目前还没用上,再过一、两年可就说不准了。

     

    这个示例来自 Chrome Canary 115,并不属于最终版本,所以情况仍有改善的可能。

     

    来点技术

     

    我曾在之前的文章中讨论过用<div role="dialog">实现对话框的好处,这种方式通过了可访问性测试而且效果良好。其中还用到了 inert polyfill,我不确定 inert 会不会影响这次的演示,感兴趣的朋友可以亲自试试。

     

    Scott O’Hara 也在今年 1 月的帖子(https://www.scottohara.me/blog/2023/01/26/use-the-dialog-element.html)中,整理了一份关于在对话框中合理使用原生 HTML <dialog>元素的指导。

     

    5 月 23 日,Google Chrome 开发者博客发布了 popover API 的介绍帖子。其中解释了手动关闭弹窗和自动关闭弹窗的区别,二者在演示视频里都有体现。后者是在弹窗容器失去焦点时关闭,而前者则要求用户手动触发。

     

    在视频中,popover 关闭方法并不会影响它与<div role="dialog">的交互。但是将<dialog> 与手动关闭的 popover 一同使用时,弹窗容器会被放置在模态后面且不会遮挡我们正确查看模态内容。当弹窗被设置为自动(浅色,默认)关闭时,则<dialog> 一出现弹窗就会消失。

     

    下图所示为实际效果。我没有费力气修改切换提示,实在太麻烦了。总之截至本文撰稿时,这些情况仅适用于 Chrome Canary。欢迎大家自己上手体验,但我可以保证,切换提示就是不愿出现在我们希望它们出现的位置上。



    回顾

     

    说点题外话,如果大家只打算用 popover 实现视觉或者行为效果,而无需考虑语义、结构、DOM 顺序、内容乃至附加的元素流,那要不要 popover 其实影响不大。

     

    考虑到目前 <dialog>的支持效果仍然比 popover 更好,所以在新项目中继续用 <dialog>应该也没啥问题。但如果您的新项目需要用到稳健性较差的框架/库,那么根据 Scott 的指导意见,最好别选 <dialog>。

     

    对于现有项目,其中或多或少可能存在与非-<dialog>代码相关的技术债务。那么在用<dialog>替换现有对话框之前,建议大家先别急着把任何 popover 功能列进开发日程,否则情况就是视频演示那个样子。

     

    原文链接:


    https://adrianroselli.com/2023/05/brief-note-on-popovers-with-dialogs.html


    相关阅读:


    Vue3 使用 Teleport 封装 一个 Dialog

    Dialog 对应的 Context 必须是 Activity 吗?

    面向函数编程:关于函数式组件、dialog 的 api 化

    Flutter 让你的 Dialog 脱胎换骨吧!

    2023-06-14 14:34104289

    评论

    发布
    暂无评论
    发现更多内容

    揭秘:如何化身BAT面试offer收割机?

    android 程序员 移动开发

    我怎么感觉全世界都在劝退学Android的程序员?

    android 程序员 移动开发

    换个姿势,带着问题看Handler

    android 程序员 移动开发

    探索Android开源框架之OkHttp源码解析

    android 程序员 移动开发

    插件化框架解读之so-文件加载机制(四)

    android 程序员 移动开发

    史上最全Java程序员必备辅助开发神器(2022年版),建议收藏!

    Java高级开发

    程序员 架构 开发工具 java;

    挑战全网!最全Android面试知识点梳理。收藏这一篇就够了!

    android 程序员 移动开发

    成为伟大程序员的-10-个要点

    android 程序员 移动开发

    成熟项目的Flutter快速引入以及Flutter、Native混合开发探究

    android 程序员 移动开发

    我是双非-三本-专科学校的Android开发,我有机会进入大厂吗?

    android 程序员 移动开发

    我的十年:2020金九银十必刷——小米

    android 程序员 移动开发

    95后阿里P7晒出工资单:狠补了这个,真香...

    Java高级开发

    Java 程序员 面试 编程语言 阿里

    探索 Flutter 异步消息的实现

    android 程序员 移动开发

    教师节:程序员的献礼方式

    android 程序员 移动开发

    数组结构七:集合和映射(Set And Map)

    android 程序员 移动开发

    成功获得字节跳动月薪20+的Android岗offer,看看面试都问了些什么?

    android 程序员 移动开发

    我们始终不能靠旧的技术来生活!

    android 程序员 移动开发

    我曾经用了 3 天面试 7 家公司,拿到了4个offer!记录一段搞Android开发黄金五年

    android 程序员 移动开发

    数据的强一致性与弱一致性

    android 程序员 移动开发

    我懵了,面试大厂被熟悉的App启动流程和RecycleView连环三问坑了

    android 程序员 移动开发

    效率提升百分之四十,AS模板也太好用了吧

    android 程序员 移动开发

    数据的强一致性与弱一致性(1)

    android 程序员 移动开发

    数据结构和算法学习指南

    android 程序员 移动开发

    感觉中国程序员前景一片灰暗,是这样吗?

    android 程序员 移动开发

    抽象工厂模式

    android 程序员 移动开发

    数据结构(二), AVL平衡二叉树

    android 程序员 移动开发

    新鲜出炉的Android面试题,确定不来看看吗?还有超详细的答案解析哦~

    android 程序员 移动开发

    初识Lua

    Changing Lin

    11月日更

    我的Android 求职简历,二本渣校,靠这份简历拿下BATJ等15家大厂Offer!

    android 程序员 移动开发

    我真的要做一辈子的程序员吗?

    android 程序员 移动开发

    新风向!成就了Android,热门框架排第一,你还是不够了解它

    android 程序员 移动开发

    简单聊聊配合dialog使用popover的问题_大前端_InfoQ精选文章