Details(细节)

概观

详细信息是创建可隐藏内容的可折叠元素的扩展,它使用HTML5<details> <summary>标签来实现这一点。 它支持嵌套,你也可以强制默认状态打开。如果你想要设计一些不同于其他的样式,你可以选择自定义的类。

句法

在开始之前,细节必须包含一个空行。 如果要启动默认状态为“打开”的详细信息块,请使用???启动详细信息块或???+。 用可选的一个或多个类(以空格分隔)和包含在引号中的摘要跟随块的开头。 内容放在标题下方,并且必须缩进。

??? optional-class "Summary"
    Here's some content.
??? multiple optional-class "Summary"
    Here's some content.

示例详细信息

???+ note "开放式的细节"

    ??? danger "嵌套的细节!"
        还有更多的内容。
开放式的细节
嵌套的细节!

还有更多的内容。

也可以只提供一个类。如果这样做,标题将从first类派生。

标题的示例类

??? success
   内容。
Success

内容。

??? warning classes
   内容。
Warning

内容。

详细信息将以下面的格式输出。 内容将始终封装在某种标签中。

<details class="optional-class"><summary>文本</summary><p>内容</p></details>

浏览器支持

不幸, 由于<details> <summary>标签有多新,并不是所有的浏览器都支持它们. 为了让他们在所有新的浏览器支持, 您将不得不提供一些备用样式和JavaScript,直到所有浏览器赶上.

这个扩展的目标不是为你提供完美的polyfill, 但这是提供基本支持的基本范例. 还有更多精心制作的支持jQuery的polyfills, 添加键盘事件,甚至支持回到IE8. 随意修改这里或找到适合您的需求的解决方案。

Basic Polyfill Setup

这是可以使用的基本CSS。 这意味着在两个支持<details><summary>标签的浏览器中提供一致的CSS,而不支持`。

details {
  display: block;
}

details[open] > summary::before {
  content: "\25BC";
}

details summary {
  display: block;
  cursor: pointer;
}

details summary:focus {
  outline: none;
}

details summary::before {
  content: "\25B6";
  padding-right: 0.5em;
}

details summary::-webkit-details-marker {
  display: none;
}

/* Attach the "no-details" class to details tags
   in browsers that do not support them to get
   open/show functionality. */
details.no-details:not([open]) > * {
  display: none;
}

details.no-details:not([open]) summary {
  display: block;
}

下面是JavaScript将检测不支持 <details> <summary> 标签的浏览器,并将“no-details”类应用于这些浏览器中的所有细节。 它还将附加一个点击事件,将切换打开状态。 上面的CSS将定位 no-details 类和 open 属性来隐藏/显示 <details> 标签的内容。 加载HTML内容后,只需运行代码。

有很多东西没有在这里覆盖,比如跳到一个封闭的polyfilled细节元素中的脚注或ID,但这是留给用户去弄清楚的,或者是一个完整的第三方polyfill。

(function () {
'use strict';
/**
 * Converts details/summary tags into working elements in browsers that don't yet support them.
 * @return {void}
 */
var details = (function () {

  var isDetailsSupported = function () {
    // https://mathiasbynens.be/notes/html5-details-jquery#comment-35
    // Detect if details is supported in the browser
    var el = document.createElement("details");
    var fake = false;

    if (!("open" in el)) {
      return false;
    }

    var root = document.body || function () {
      var de = document.documentElement;
      fake = true;
      return de.insertBefore(document.createElement("body"), de.firstElementChild || de.firstChild);
    }();

    el.innerHTML = "<summary>a</summary>b";
    el.style.display = "block";
    root.appendChild(el);
    var diff = el.offsetHeight;
    el.open = true;
    diff = diff !== el.offsetHeight;
    root.removeChild(el);

    if (fake) {
      root.parentNode.removeChild(root);
    }

    return diff;
  }();

  if (!isDetailsSupported) {
    var blocks = document.querySelectorAll("details>summary");
    for (var i = 0; i < blocks.length; i++) {
      var summary = blocks[i];
      var details = summary.parentNode;

      // Apply "no-details" to for unsupported details tags
      if (!details.className.match(new RegExp("(\\s|^)no-details(\\s|$)"))) {
        details.className += " no-details";
      }

      summary.addEventListener("click", function (e) {
        var node = e.target.parentNode;
        if (node.hasAttribute("open")) {
          node.removeAttribute("open");
        } else {
          node.setAttribute("open", "open");
        }
      });
    }
  }
});

(function () {
  var onReady = function onReady(fn) {
    if (document.addEventListener) {
      document.addEventListener("DOMContentLoaded", fn);
    } else {
      document.attachEvent("onreadystatechange", function () {
        if (document.readyState === "interactive") {
          fn();
        }
      });
    }
  };

  onReady(function () {
    details();
  });
})();

}());