pdf.js/web/pdf_viewer.css
Nicolò Ribaudo 253621fc5d
Workaround WebKit canvas rendering bug when zooming PDFs
WebKit has a bug when rendering canvases that have their width defined as
relative to their container, and their parent is resized. This causes a
"tearing" effect when zooming in PDFs past a certain threshold, which
is device-dependent but tends to be between 120% and 200%.

The DOM structure around the canvas is as follows:
  div.pdfViewer [ --scale-factor: ...; ]
    > div.page [ width: round(var(--scale-factor) * ..., 1px); ]
      > div.canvasWrapper
        > canvas

Setting `width: inherit` on the div.canvasWrapper and on the canvas is
equivalent to explicitly specifying the same `width` property in pixels
as in div.page, thus making Safari properly redraw the canvas on resize.

See https://bugs.webkit.org/show_bug.cgi?id=267986 for more details
on the WebKit bug.

Fixes #16155, fixes #16329, fixes #17459
2024-01-24 11:35:49 +01:00

231 lines
5.4 KiB
CSS

/* Copyright 2014 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@import url(text_layer_builder.css);
@import url(annotation_layer_builder.css);
@import url(xfa_layer_builder.css);
/* Ignored in GECKOVIEW builds: */
@import url(annotation_editor_layer_builder.css);
:root {
--viewer-container-height: 0;
--pdfViewer-padding-bottom: 0;
--page-margin: 1px auto -8px;
--page-border: 9px solid transparent;
--spreadHorizontalWrapped-margin-LR: -3.5px;
--loading-icon-delay: 400ms;
}
@media screen and (forced-colors: active) {
:root {
--pdfViewer-padding-bottom: 9px;
--page-margin: 8px auto -1px;
--page-border: 1px solid CanvasText;
--spreadHorizontalWrapped-margin-LR: 3.5px;
}
}
[data-main-rotation="90"] {
transform: rotate(90deg) translateY(-100%);
}
[data-main-rotation="180"] {
transform: rotate(180deg) translate(-100%, -100%);
}
[data-main-rotation="270"] {
transform: rotate(270deg) translateX(-100%);
}
#hiddenCopyElement,
.hiddenCanvasElement {
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
display: none;
}
.pdfViewer {
/* Define this variable here and not in :root to avoid to reflow all the UI
when scaling (see #15929). */
--scale-factor: 1;
padding-bottom: var(--pdfViewer-padding-bottom);
--hcm-highlight-filter: none;
@media screen and (forced-colors: active) {
--hcm-highlight-filter: invert(100%);
}
}
.pdfViewer .canvasWrapper {
overflow: hidden;
/* See `width: inherit` comment in `.pdfViewer .page canvas[zooming]` for the reason
* we use `inherit` and not `100%`. */
width: inherit;
height: 100%;
z-index: 1;
}
.pdfViewer .page {
direction: ltr;
width: 816px;
height: 1056px;
margin: var(--page-margin);
position: relative;
overflow: visible;
border: var(--page-border);
background-clip: content-box;
background-color: rgb(255 255 255);
}
.pdfViewer .dummyPage {
position: relative;
width: 0;
height: var(--viewer-container-height);
}
.pdfViewer.noUserSelect {
user-select: none;
}
/*#if GENERIC*/
.pdfViewer.removePageBorders .page {
margin: 0 auto 10px;
border: none;
}
/*#endif*/
/*#if COMPONENTS*/
.pdfViewer.singlePageView {
display: inline-block;
}
.pdfViewer.singlePageView .page {
margin: 0;
border: none;
}
/*#endif*/
.pdfViewer:is(.scrollHorizontal, .scrollWrapped),
.spread {
margin-inline: 3.5px;
text-align: center;
}
.pdfViewer.scrollHorizontal,
.spread {
white-space: nowrap;
}
/*#if GENERIC*/
.pdfViewer.removePageBorders,
/*#endif*/
.pdfViewer:is(.scrollHorizontal, .scrollWrapped) .spread {
margin-inline: 0;
}
.spread :is(.page, .dummyPage),
.pdfViewer:is(.scrollHorizontal, .scrollWrapped) :is(.page, .spread) {
display: inline-block;
vertical-align: middle;
}
.spread .page,
.pdfViewer:is(.scrollHorizontal, .scrollWrapped) .page {
margin-inline: var(--spreadHorizontalWrapped-margin-LR);
}
/*#if GENERIC*/
.pdfViewer.removePageBorders .spread .page,
.pdfViewer.removePageBorders:is(.scrollHorizontal, .scrollWrapped) .page {
margin-inline: 5px;
}
/*#endif*/
.pdfViewer .page canvas {
margin: 0;
display: block;
}
.pdfViewer .page canvas .structTree {
contain: strict;
}
.pdfViewer .page canvas[hidden] {
display: none;
}
.pdfViewer .page canvas[zooming] {
/* WebKit has a bug when rendering canvases that have their width defined as
* relative to their container, and their parent is resized. This causes a
* "tearing" effect when zooming in PDFs past a certain threshold, which
* is devide-dependent but tends to be between 120% and 200%.
*
* The DOM structure around the canvas is as follows:
* div.pdfViewer [ --scale-factor: ...; ]
* > div.page [ width: round(var(--scale-factor) * ..., 1px); ]
* > div.canvasWrapper
* > canvas
*
* Setting `width: inherit` on the div.canvasWrapper and on the canvas is
* equivalent to explicitly specifying the same `width` property in pixels
* as in div.page, thus making Safari properly redraw the canvas on resize.
*
* See https://bugs.webkit.org/show_bug.cgi?id=267986 for more details
* on the WebKit bug.
*/
width: inherit;
height: 100%;
}
.pdfViewer .page.loadingIcon::after {
position: absolute;
top: 0;
left: 0;
content: "";
width: 100%;
height: 100%;
background: url("images/loading-icon.gif") center no-repeat;
display: none;
/* Using a delay with background-image doesn't work,
consequently we use the display. */
transition-property: display;
transition-delay: var(--loading-icon-delay);
z-index: 5;
contain: strict;
}
.pdfViewer .page.loading::after {
display: block;
}
.pdfViewer .page:not(.loading)::after {
transition-property: none;
display: none;
}
.pdfPresentationMode .pdfViewer {
padding-bottom: 0;
}
.pdfPresentationMode .spread {
margin: 0;
}
.pdfPresentationMode .pdfViewer .page {
margin: 0 auto;
border: 2px solid transparent;
}