MDN: Compat table: first and compact

Moves compatibility and specs tables to the top and makes them compact in articles at developer.mozilla.org.

当前为 2024-11-27 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

/* ==UserStyle==
@name        MDN: Compat table: first and compact
@description Moves compatibility and specs tables to the top and makes them compact in articles at developer.mozilla.org.
@namespace   myfonj
@version     1.6.0
@license     CC0 - Public Domain
==/UserStyle== */

@-moz-document domain("developer.mozilla.org") {
/*
Changelog
1.6.0 (2024-10-16) - "Resources" like "See also" on the top
1.5.0 (2024-04-17) - sticky header attepmt
1.4.3 (2024-03-21) - "see also" also in right order in sidebar nav
1.4.2 (2024-03-21) - reordered sidebar nav to match new order
1.4.1 (2024-03-20) - pulling up even the "no compat/spec data found" warning boxes
*/


 /** no fancy yet distracting underlines */
 .main-page-content h1::after {
  content: none;
 }
 
 /*

https://userstyles.org/styles/177139/edit
https://greasyfork.org/en/scripts/408039/versions/new

MDN: Compat table: first and compact

*/

/*
 Pull Browser Compatibility table to the top
*/
.main-page-content {
 display: flex;
 flex-direction: column;
}
section[aria-labelledby="browser_compatibility" i],
[id="Browser_compatibility" i],
[id="Browser_compatibility" i] + a,
[id="Browser_compatibility" i] + a + .table-scroll ,
[id="Browser_compatibility" i] + a + .table-container ,
[id="Browser_compatibility" i] + div[class="notecard warning"] {
 order: -2;
}
.document-toc-list {
 display: flex;
 flex-direction: column;
 & .document-toc-item:has([href="#browser_compatibility" i]) {
  order: -3;
 }
 & .document-toc-item:has([href="#specifications" i]) {
  order: -2;
 }
 & .document-toc-item:has([href="#resources" i]) {
  order: -1;
 }
 & .document-toc-item:has([href="#see_also" i]) {
  order: -1;
 }
}
/*
for pages wit multiple compat tables scattered
e.g.: https://developer.mozilla.org/en-US/docs/Web/CSS/hue-interpolation-method
keeping separate from above to keep compat with older UAs
*/
[id]:has(+ a.bc-github-link + .table-container .bc-table) {
 & {
  font-size: 1.1rem;
  position: relative;
  z-index: 1;
  margin: 0 3em 0 0;
  align-self: flex-start;

 }
 & + a.bc-github-link {
  margin-top: -1.5rem;
  margin-left: 3em;
 }
 &,
 & + a.bc-github-link,
 & + a.bc-github-link + .table-container {
  order: -2;
 }
}

.table-container:has(.bc-table) ~ .table-container:has(.bc-table) thead {

 & *:not(.bc-head-icon-symbol){
  height: 0px !important;
  overflow: hidden;
  padding: 0;
  margin: 0;
  line-height: 0;
 }
 & .bc-head-icon-symbol,
 & .bc-head-icon-symbol::before {
  --_w: 2ch;
  height: var(--_w) !important;
  background-size: var(--_w) var(--_w) !important;
  background-repeat: no-repeat;
 }
}


/*
 Pull Specifications Table below Compatibility table
*/
[aria-labelledby="specifications"],
/* this is probably obsolete */
:is([id="Specifications" i], [id="Specification" i]),
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table, div[class="notecard warning"]) {
 order: -1;
 border-left: none;
 margin-top: 0 !important;
}

 /*
  Pull "See also" and "Resources" up (below specifications)
  // Yay, we can now target sections by aria attributes!
  // We don't even need upcoming :has() anymore!
 */
 section[aria-labelledby="resources"],
 section[aria-labelledby="see_also"] {
  order: -1;
 }

 
/*
  main heading: above all, after all, and slightly dimmer;
 */
 .main-page-content > h1 {
  order: -2;
  margin: 0 !important;
  opacity: .6;
 }
 main#content {
  padding-top: 0;
 }
 
 section[aria-labelledby="resources"] h2[id="resources"],
 section[aria-labelledby="see_also"] h2[id="see_also"] {
   font-size: 1.2rem;
   margin: .8em 0 0
 }

/*
 * remake Specifications Table into condensed and reversed "list"
 * • 3 columns without status badge (Specification | Comment | Feedback)
 *   e.g. https://developer.mozilla.org/en-US/docs/Web/CSS/@media#Specifications
 *   ->  (counter) Specification Comment Feedback
 * • 3 columns with status badge (Specification | Status | Comment)
 * e.g. https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Specifications
 *  -> Status (badge) Specification (link) Comment
 * • 2 columns (Specification | Title)
 * e.g. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires#Specifications
 * 	-> Title Specification (link)
 * // the only page using `#Specification` instead of `#Specifications` was https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML
*/

:is([id="Specifications" i], [id="Specification" i]) + :is(table.standard-table, div > table.standard-table) tbody {
display: flex;
flex-direction: column-reverse;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) th,
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td br {
 display: none !important;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td {
 background-color: transparent !important;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td,
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td * {
 display: inline !important;
 padding: 0;
 border: none !important;
 box-shadow: none !important;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(1) small {
 padding-left: 1ch;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr {
 border-bottom: 1px solid #ccc;
 text-indent: 4rem;
 position: relative;
 counter-increment: specount -1;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr * {
 text-indent: 0 !important; /* whoa, text indent is inherited? */
}
/*
 this is just "fallback"
*/
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody td:first-child::before {
 content: counter(specount, lower-roman) '.';
 width: 4rem;
 text-align: center;
 position: absolute;
 left: 0;
 top: 0;
 opacity: .4;
}
/*
 We don't have nice things, sadly: it's impossible to count "backwards" to 1 starting from items count
 https://github.com/w3c/csswg-drafts/issues/4559#issuecomment-562058086
*/
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(1) { counter-reset: specount 2; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(2) { counter-reset: specount 3; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(3) { counter-reset: specount 4; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(4) { counter-reset: specount 5; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(5) { counter-reset: specount 6; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(6) { counter-reset: specount 7; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(7) { counter-reset: specount 8; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(8) { counter-reset: specount 9; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(9) { counter-reset: specount 10; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(10) { counter-reset: specount 11; }
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(11) td:first-child::before, 
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) tbody tr:first-child:nth-last-child(11) ~ tr td:first-child::before {
 content: '•';
}
/* futile attempt */

/*
Status badge is in three columns table [class^="spec-"]
Sadly, there are three columns tables WITHOUT status badges in the middle col :sad face:
 (e.g. https://developer.mozilla.org/en-US/docs/Web/CSS/@media#Browser_compatibility
 contains
 )
 So resorting to little yanky posabs swap.
 Because displayed badge is ::before and text is 'real', I cannot make static placeholder for overflowing tooltip pade from text
*/
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class^="spec-"] {
 white-space: nowrap;
 background-color: #eeeeee !important;
 font-size: 0;
 position: absolute;
 left: 0; top: 0;
 z-index: 1;
 padding-right: 1ch;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class^="spec-"]::after {
 content: '';
 font-size: 1rem;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class^="spec-"]:hover {
 font-size: 1rem;
 box-shadow: 0 0 1ch #fff;
 padding-right: 1ch;
}
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class^="spec-"]::before {
 content: attr(class);
 pointer-events: all;
 margin: 0;
 padding: 0;
 padding-left: 1ch;
 padding-right: 1ch;
 font-size: 1rem;
}
/*
 ::before contents removed in 
 https://github.com/mdn/mdn-minimalist/commit/c702743a06df0bda9318f4e60b54157cece8df6a
 restoring something resembling state from
 https://github.com/mdn/mdn-minimalist/blob/978e0b075d6fb12432a99307ca22c9263d41d406/sass/atoms/_meta.scss
*/
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-living"]::before { content: "LS"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-standard"]::before { content: "ST"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-rec"]::before { content: "REC"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-cr"]::before { content: "CR"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-pr"]::before { content: "PR"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-rfc"]::before { content: "RFC"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-wd"]::before { content: "WD"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-draft"]::before { content: "D"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-lc"]::before { content: "LC"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-ed"]::before { content: "ED"; }
[id="Specifications" i] + :is(div > table.standard-table, table.standard-table) td:nth-child(2):nth-last-child(2) [class~="spec-obsolete"]::before { content: "O"; }
/*  */

 
/*
 Hide "The definition of '%feature%' in that specification."
 Redundant.
*/
:is([id="Specifications" i], [id="Specification" i]) + :is(div > table.standard-table, table.standard-table) td:nth-child(1) > a[href*="#"] > br + small {
 display: none !important;
}
 
/*
 Hiding unnecessary headings
 (display: none; breaks anchors)
*/
[id="Specification" i],
[id="Specifications" i],
[id="Browser_compatibility" i] {
 height: 0 !important;
 overflow: hidden;
 padding: 0 !important;
 margin: 0 !important;
}

.bc-table {
 margin-top: 0 !important;  
 margin-bottom: 0 !important;
}
.bc-table td:empty {
 background-color: inherit !important;
}
/* compact table headers - icons only */
.bc-table .bc-platforms > th {
 padding: 0;
 border-top: 1px solid;
 height: 1em !important;
 overflow: visible;
}
.bc-table .bc-platforms > th::before {
 position: absolute;
 top: -1.4em;
}
.bc-table thead,
.bc-table .bc-platforms, 
.bc-table .bc-platforms > th,
.bc-table .bc-platforms > th::before {
 background-color: inherit;
}
/*
§ attempt to have BDC browsers header sticky
 will probably cause horizontal scroll of entire page
 sadly necessary
*/
.table-container:has(.bc-table) {
 overflow: visible;
}
.table-container-inner {
 padding-right: 0;
}
.bc-table thead .bc-browsers{
 background-color: var(--background-primary);
 position: sticky;
 top: 0;
 z-index: 1
}

.bc-table .bc-browsers th {
 padding: 0;
 height: 2rem;
 overflow: hidden;
}

/* browser headers: hide text until hover */

 th.bc-browser {
  position: relative !important;
  overflow: visible !important;
 }
 th.bc-browser:not(:hover) .bc-head-txt-label {
  opacity: 0;
 }
 .bc-head-icon-symbol {
  opacity: .7; /* too glaring */
 }
 th.bc-browser .bc-head-txt-label {
  display: block !important; /* reverting other tweaks */
  background-color: var(--background-primary) !important;
  writing-mode: horizontal-tb;
  transform: translate(50%);
  position: absolute;
  top: auto;
  right: 50%;
  left: auto;
  bottom: 100%;
  padding: .5em 1em;
  border: 1px solid var(--border-secondary);
 }
 th.bc-browser:last-child .bc-head-txt-label {
  transform: none;
  right: 0;
 }
 

/* history dropdown toggle smaller */
.bc-history-link.only-icon {
 border: none;
 text-align: right;
}
.ic-history {border-right: 0.35rem solid transparent
}
.text-content .bc-has-history.active .bc-history-link {
 max-width: 2em
}
.bc-history-link {
 height: 8px;
}
td[aria-expanded="false"]:not(:hover) .bc-history-link {
 opacity: .5 !important;
}

/*
"⚠" badges in theads
* OFF 2022-04-04 - messed in cells /
.bc-table-row-header {

}
.bc-table-row-header * {
}
.bc-table-row-header .bc-icons {
 position: absolute;
 right: 0; line-height: 2.1;
}
.bc-table-row-header:not(:hover) .bc-icons {
 opacity: 0.7

}

/*
text underflow fix in label cells
e.g. https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
*/
.bc-table-row-header code {
 white-space: normal;
}

/*
 Legend is redundant for us
*/ 
.bc-legend {
 display: none;
} 

/*
footnote "*" (stars) are quite redundant as well
make them small and not let them wrap 
*/
.bc-table td[class^="bc-browser"] .bc-icons {
 position: absolute;
}
.bc-table td[class^="bc-browser"] .bc-icons *,
.bc-table td[class^="bc-browser"] .bc-icons *::before{
 background-size: .4rem !important;
 background-repeat: no-repeat !important;
}


/*
 wild formatting paragraphs appears
*/
p:empty {
 display: none;
}
.text-content dd:last-child {
 margin-bottom: 0;
}
 


/*
"Report problems…"
*/
.bc-github-link {
 text-align: right;
 align-self: flex-end;
 display: block;
 position: relative;
 z-index: 0;
}
.bc-github-link:not(:hover) {
 color: transparent !important;
}
/* collision with compacted headings in multiple bc tables */
.bc-github-link:hover {
 z-index: 2;
 background-color: var(--background-primary);
 
}

/*
visually accessible markers of support levels for when background images are not rendered
WHCM or user style
*/
.bc-level-yes::before {
 content: '✓';
 color: transparent;
}
.bc-level-no::before {
 content: '✗';
 color: transparent;
}

/*
<span class="bc-version-label" title="Released 2018-10-02">18</span>
*/
/*
 Release dates in cell tooltips visible

*/
.bc-version-label[title^="Released "] {
 position: relative;
 margin: 0 -.5em;
 z-index: 0;
}
.bc-version-label[title^="Released "]::after {
 content: attr(title);
 display: block;
 font-family: monospace;
 opacity: .5;
 font-size: 12px;
 line-height: 1em;
 margin: -1em 0em 0 0;
 clip-path: inset(50% 0 0 0);
}
/* for now pull out only in detail */
/* * OFF, not exitent anymore? /
.bc-notes-wrapper .bcd-cell-text-copy {
 text-align: center;
}
.bc-notes-wrapper .bc-version-label::after {
 content: attr(title);
 display: block;
}
/* */
/*
END of MDN: Compat table: first and compact
*/
h4:is([id^="html_"],[id^="css_"],[id^="javascript_"]):has(+.code-example) {
 display: none;
 outline: #0FF6 solid; outline-offset: -2px;
}
.code-example ,
.code-example pre {
 margin: 0 !important;
}

}