diff --git a/lighthouse-core/report/html/renderer/report-renderer.js b/lighthouse-core/report/html/renderer/report-renderer.js
index 86559958f4b6..0b3392c026b4 100644
--- a/lighthouse-core/report/html/renderer/report-renderer.js
+++ b/lighthouse-core/report/html/renderer/report-renderer.js
@@ -184,22 +184,6 @@ class ReportRenderer {
* @return {DocumentFragment}
*/
_renderReport(report) {
- const headerContainer = this._dom.createElement('div');
- headerContainer.appendChild(this._renderReportHeader());
-
- const container = this._dom.createElement('div', 'lh-container');
- const reportSection = container.appendChild(this._dom.createElement('div', 'lh-report'));
-
- reportSection.appendChild(this._renderReportWarnings(report));
-
- let scoreHeader;
- const isSoloCategory = Object.keys(report.categories).length === 1;
- if (!isSoloCategory) {
- scoreHeader = this._dom.createElement('div', 'lh-scores-header');
- } else {
- headerContainer.classList.add('lh-header--solo-category');
- }
-
const detailsRenderer = new DetailsRenderer(this._dom);
const categoryRenderer = new CategoryRenderer(this._dom, detailsRenderer);
categoryRenderer.setTemplateContext(this._templateContext);
@@ -213,19 +197,20 @@ class ReportRenderer {
renderer.setTemplateContext(this._templateContext);
});
- const categories = reportSection.appendChild(this._dom.createElement('div', 'lh-categories'));
+ const headerContainer = this._dom.createElement('div');
+ headerContainer.appendChild(this._renderReportHeader());
- for (const category of Object.values(report.categories)) {
- const renderer = specificCategoryRenderers[category.id] || categoryRenderer;
- // .lh-category-wrapper is full-width and provides horizontal rules between categories.
- // .lh-category within has the max-width: var(--report-width);
- const wrapper = renderer.dom.createChildOf(categories, 'div', 'lh-category-wrapper');
- wrapper.appendChild(renderer.render(category, report.categoryGroups));
- }
+ const reportContainer = this._dom.createElement('div', 'lh-container');
+ const reportSection = this._dom.createElement('div', 'lh-report');
+ reportSection.appendChild(this._renderReportWarnings(report));
- const reportFragment = this._dom.createFragment();
- const topbarDocumentFragment = this._renderReportTopbar(report);
- reportFragment.appendChild(topbarDocumentFragment);
+ let scoreHeader;
+ const isSoloCategory = Object.keys(report.categories).length === 1;
+ if (!isSoloCategory) {
+ scoreHeader = this._dom.createElement('div', 'lh-scores-header');
+ } else {
+ headerContainer.classList.add('lh-header--solo-category');
+ }
if (scoreHeader) {
const scoreScale = this._dom.cloneTemplate('#tmpl-lh-scorescale', this._templateContext);
@@ -238,11 +223,25 @@ class ReportRenderer {
const stickyHeader = this._dom.createElement('div', 'lh-sticky-header');
stickyHeader.append(
...this._renderScoreGauges(report, categoryRenderer, specificCategoryRenderers));
- reportFragment.appendChild(stickyHeader);
+ reportContainer.appendChild(stickyHeader);
+ }
+
+ const categories = reportSection.appendChild(this._dom.createElement('div', 'lh-categories'));
+ for (const category of Object.values(report.categories)) {
+ const renderer = specificCategoryRenderers[category.id] || categoryRenderer;
+ // .lh-category-wrapper is full-width and provides horizontal rules between categories.
+ // .lh-category within has the max-width: var(--report-width);
+ const wrapper = renderer.dom.createChildOf(categories, 'div', 'lh-category-wrapper');
+ wrapper.appendChild(renderer.render(category, report.categoryGroups));
}
- reportFragment.appendChild(headerContainer);
- reportFragment.appendChild(container);
+ const reportFragment = this._dom.createFragment();
+ const topbarDocumentFragment = this._renderReportTopbar(report);
+
+ reportFragment.appendChild(topbarDocumentFragment);
+ reportFragment.appendChild(reportContainer);
+ reportContainer.appendChild(headerContainer);
+ reportContainer.appendChild(reportSection);
reportSection.appendChild(this._renderReportFooter(report));
return reportFragment;
diff --git a/lighthouse-core/report/html/report-styles.css b/lighthouse-core/report/html/report-styles.css
index c4c4faaeeed5..1821d721d9f2 100644
--- a/lighthouse-core/report/html/report-styles.css
+++ b/lighthouse-core/report/html/report-styles.css
@@ -269,7 +269,7 @@
--header-padding: 16px 0 16px 0;
--plugin-icon-size: 75%;
--pwa-icon-margin: 0 7px 0 -3px;
- --score-container-width: 92px;
+ --score-container-width: 97px;
--score-number-font-size-big: 34px;
--score-number-font-size: 26px;
--score-shape-margin-left: 2px;
@@ -285,6 +285,18 @@
--lh-section-vpadding: 8px;
}
+.lh-devtools.lh-root {
+ height: 100%;
+}
+.lh-devtools .lh-container {
+ overflow-y: scroll;
+ height: calc(100% - var(--topbar-height));
+}
+.lh-devtools .lh-sticky-header {
+ /* This is normally the height of the topbar, but we want it to stick to the top of our scroll container .lh-container` */
+ top: 0;
+}
+
@keyframes fadeIn {
0% { opacity: 0;}
100% { opacity: 0.6;}