diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index 7bf5543e9a1..447f4fe3b2c 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -162,6 +162,29 @@ export const isChromev56 = ( && userAgent.indexOf('Edge/') === -1 ); +export const supportsTranslate3d = !isFirefox; + +export function canUseTranslate3d(): boolean { + if (!supportsTranslate3d) { + return false; + } + + if (getZoomLevel() !== 0) { + return false; + } + + // see https://github.com/Microsoft/vscode/issues/24483 + if (isChromev56) { + const pixelRatio = getPixelRatio(); + if (Math.floor(pixelRatio) !== pixelRatio) { + // Not an integer + return false; + } + } + + return true; +} + export function supportsExecCommand(command: string): boolean { return ( (isIE || Platform.isNative) diff --git a/src/vs/base/browser/ui/list/list.css b/src/vs/base/browser/ui/list/list.css index b8fdfc875cb..5d83a84c557 100644 --- a/src/vs/base/browser/ui/list/list.css +++ b/src/vs/base/browser/ui/list/list.css @@ -21,7 +21,6 @@ .monaco-list-rows { position: relative; - will-change: top; width: 100%; height: 100%; } diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 06fe9665ff5..497bf624a0c 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -13,6 +13,8 @@ import { ScrollEvent, ScrollbarVisibility } from 'vs/base/common/scrollable'; import { RangeMap, IRange, relativeComplement, each } from './rangeMap'; import { IDelegate, IRenderer } from './list'; import { RowCache, IRow } from './rowCache'; +import { isWindows } from 'vs/base/common/platform'; +import { canUseTranslate3d } from 'vs/base/browser/browser'; interface IItem { id: string; @@ -178,7 +180,14 @@ export class ListView implements IDisposable { rangesToInsert.forEach(range => each(range, i => this.insertItemInDOM(this.items[i], i))); rangesToRemove.forEach(range => each(range, i => this.removeItemFromDOM(this.items[i]))); - this.rowsContainer.style.top = `-${renderTop}px`; + if (canUseTranslate3d() && !isWindows /* Windows: translate3d breaks subpixel-antialias (ClearType) unless a background is defined */) { + const transform = `translate3d(0px, -${renderTop}px, 0px)`; + this.rowsContainer.style.transform = transform; + this.rowsContainer.style.webkitTransform = transform; + } else { + this.rowsContainer.style.top = `-${renderTop}px`; + } + this.lastRenderTop = renderTop; this.lastRenderHeight = renderHeight; }