迹忆客 专注技术分享

当前位置:主页 > 学无止境 > WEB前端 > HTML >

Bulletproof HTML5 <details> 使用 jQuery 回退

作者:迹忆客 最近更新:2023/01/11 浏览次数:

HTML5 <details> 元素目前不受 Chrome 12 及更高版本原生支持的任何浏览器的原生支持。 这使得猜测这个新元素的确切行为有点困难,但阅读规范给了我们一个很好的主意。 清楚的是:

details 元素表示一个公开小部件,用户可以从中获取其他信息或控件。

默认情况下隐藏此信息。 可以通过将布尔 open 属性添加到 <details> 元素来使其可见。 之后,用户可以通过单击 <summary> 来切换可见性。

summary 元素表示 summary 元素的父 details 元素(如果有)的其余内容的摘要、标题或图例。 如果没有子摘要元素,用户代理应该提供自己的图例(例如“详细信息”)。

请注意 ,虽然规范描述了在 <summary> 元素被省略的情况下应该发生什么,但这样做仍然无效。

在我看来,summary元素也应该可以通过键盘访问。 我们应该能够浏览所有不同的交互元素(例如链接、按钮、表单元素),然后猜猜是什么—— summary 就是其中之一。 用键盘聚焦后,只需按 Enter 或 Space 即可切换 <details> 元素内容的可见性。 不过,HTML 规范没有说明任何关于此事的内容。

请注意 ,细节已包含在 HTML5 中,因为它是网站和应用程序的常见行为——如此常见,应该可以做到这一点,而无需额外的脚本来使整个事情正常进行。 然而,HTML5 仍在进行中。 <details> 元素甚至还没有实现。 与此同时,在使用不(完全)支持跨浏览器的新功能时,提供回退/polyfill 很重要。


CSS、JavaScript 和 jQuery 助你一臂之力

幸运的是,使用 CSS、(纯)JavaScript 和 jQuery 的组合,很容易使 <details> 跨浏览器工作。

使用 JavaScript 检测本机

支持

首先,如果启用了 JavaScript 并且浏览器本身不支持 <details>,让我们将 class="no-details" 添加到 html 元素。 这将允许我们专门为实际执行脚本的场合编写 CSS。 添加类可以通过多种方式完成,但我更喜欢的一种是将以下代码片段放在 <head> 中:

<script>
    // Don’t use this! See note below.
    if (!('open' in document.createElement('details'))) {
         document.documentElement.className += ' no-details';
    }
</script>

更新 :Chrome 10 可以识别 <details> 元素的 open 属性,尽管它还不支持正确渲染该元素。 这意味着上述特征检测方法已经变得不可靠了。 我现在为 <details>/<summary> 支持创建了一个更强大的功能测试:

var isDetailsSupported = (function(doc) {
    var el = doc.createElement('details');
    var fake;
    var root;
    var diff;
    if (!('open' in el)) {
        return false;
    }
    root = doc.body || (function() {
        var de = doc.documentElement;
        fake = true;
        return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild);
    }());
    el.innerHTML = '<summary>a</summary>b';
    el.style.display = 'block';
    root.appendChild(el);
    diff = el.offsetHeight;
    el.open = true;
    diff = diff != el.offsetHeight;
    root.removeChild(el);
    if (fake) {
        root.parentNode.removeChild(root);
    }
    return diff;
}(document));

所以在那之后,我们可以做类似的事情:

<script>
    if (!isDetailsSupported) {
        document.documentElement.className += ' no-details';
    }
</script>

请注意,Modernizr 目前未检测到 <details> 支持。 我相信它很快就会被包括在内。 更新:我对 <details> 的特性测试现在包含在 Modernizr 存储库中。

添加一些基本样式

现在我们可以为 details 元素及其子元素添加一些基本样式。

/* Default browser styles for <details> and <summary> */
details { display: block; }
summary { display: list-item; }

/* The following styles will only get applied if JavaScript is enabled and <details> is not natively supported */

/* Add focus styles (for keyboard accessibility) */
.no-details summary:hover, .no-details summary:focus { background: #ddd; }

/* The following styles are not really needed, since the jQuery script takes care of hiding/displaying the elements. */
/* However, we’re still gonna use CSS as well to prevent FOUC in browsers that understand these selectors. */
/* Remember: by default (and probably most of the time), the contents of the <details> element are hidden. */

/* Hide all direct descendants of every <details> element */
/* Note that IE6 doesn’t support the child selector; we’ll work around that using jQuery later */
.no-details details > * { display: none; }

/* Make sure summary remains visible */
.no-details details summary { display: list-item; }

/* Apply a pointer cursor upon hover to indicate it’s a clickable element. These styles can be applied regardless of whether the fallback is needed */
summary { cursor: pointer; }

jQuery 魔法

有一个 jQuery 插件,可以很容易地在尚不支持这些元素的浏览器中模拟 <details>/<summary>。 查看 GitHub 上的代码

在包含 jQuery 和插件之后,你可以写这样的东西来模拟 <details>/<summary> 必要的地方:

$('details').details();

功能测试的结果存储在 $.fn.details.support 中,如果浏览器本身支持 <details><summary> 则为真,否则为假:

// Conditionally add a classname to the `<html>` element, based on native support
$('html').addClass($.fn.details.support ? 'details' : 'no-details');

该插件还将添加适当的 ARIA 注释以获得最佳可访问性。 即使在本机支持 <details> 的浏览器中也会这样做,以防万一。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

HTML5 document.head DOM 树访问器

发布时间:2023/01/11 浏览次数:184 分类:HTML

一个鲜为人知的 HTML5 JavaScript 好东西是 document.head DOM 树访问器,它比 document.getElementsByTagName(head)[0] 更有效(也更容易输入)。 文档的 head 元素是作为 html 元素子元素的第一个 head 元素

HTML5 使用的三个层次

发布时间:2023/01/11 浏览次数:65 分类:HTML

级别 1:它只是工作 HTML5 规范是在考虑向后兼容性的情况下编写的(并且仍在编辑中)。 HTML5 中有一些新功能已经可以在每个 A 级浏览器中使用,因此现在可以使用,不需要任何奇怪的

HTML5 的 XML 序列化,又名“XHTML5”

发布时间:2023/01/11 浏览次数:148 分类:HTML

你知道的,我总是更喜欢 HTML 而不是 XHTML ,因为它不那么冗长,而且我喜欢让事情变得简单。 真实的故事。 但这并没有阻止我想知道究竟是如何触发 HTML5 的 XML 模式的让我们从现在起

id 属性在 HTML5 中变得更加优雅

发布时间:2023/01/08 浏览次数:130 分类:HTML

HTML5 带来的更微妙但更棒的变化之一,适用于 id 属性。 HTML 4.01 和 HTML5 中的 id 有何不同 HTML 4.01 规范规定 ID 令牌必须以字母 ([A-Za-z]) 开头,后面可以跟任意数量的字母、数字 ([0-9]) 、

图片上传——html5+PHP实现无刷新上传

发布时间:2015/12/22 浏览次数:2025 分类:PHP

本篇介绍一种全新利用PHP上传图片的方式,利用html5的FileReader,读取图片文件,然后将数据传输到服务器再使用PHP进行处理。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便