Skip to content

Commit

Permalink
fix(drag-drop): dragged elements blurry in some browsers (#14299)
Browse files Browse the repository at this point in the history
Rounds the `transform` value before they're assigned, in order to avoid blurriness in some browsers.

Fixes #14283.
  • Loading branch information
crisbeto authored and jelbourn committed Dec 3, 2018
1 parent 700f20f commit 63174d2
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 4 deletions.
13 changes: 12 additions & 1 deletion src/cdk/drag-drop/drag.spec.ts
Expand Up @@ -504,6 +504,7 @@ describe('CdkDrag', () => {
expect(dragElement.style.touchAction)
.not.toEqual('none', 'should not disable touchAction on when there is a drag handle');
});

it('should be able to reset a freely-dragged item to its initial position', fakeAsync(() => {
const fixture = createComponent(StandaloneDraggable);
fixture.detectChanges();
Expand Down Expand Up @@ -556,7 +557,17 @@ describe('CdkDrag', () => {
expect(fixture.componentInstance.endedSpy).toHaveBeenCalledTimes(1);
}));

});
it('should round the transform value', fakeAsync(() => {
const fixture = createComponent(StandaloneDraggable);
fixture.detectChanges();
const dragElement = fixture.componentInstance.dragElement.nativeElement;

expect(dragElement.style.transform).toBeFalsy();
dragElementViaMouse(fixture, dragElement, 13.37, 37);
expect(dragElement.style.transform).toBe('translate3d(13px, 37px, 0px)');
}));

});

describe('draggable with a handle', () => {
it('should not be able to drag the entire element if it has a handle', fakeAsync(() => {
Expand Down
4 changes: 3 additions & 1 deletion src/cdk/drag-drop/drag.ts
Expand Up @@ -866,7 +866,9 @@ interface Point {
* @param y Desired position of the element along the Y axis.
*/
function getTransform(x: number, y: number): string {
return `translate3d(${x}px, ${y}px, 0)`;
// Round the transforms since some browsers will
// blur the elements, for sub-pixel transforms.
return `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;
}

/** Creates a deep clone of an element. */
Expand Down
6 changes: 4 additions & 2 deletions src/cdk/drag-drop/drop-list.ts
Expand Up @@ -362,10 +362,12 @@ export class CdkDropList<T = any> implements OnInit, OnDestroy {
// Note that we shouldn't use `getBoundingClientRect` here to update the cache, because the
// elements may be mid-animation which will give us a wrong result.
if (isHorizontal) {
elementToOffset.style.transform = `translate3d(${sibling.offset}px, 0, 0)`;
// Round the transforms since some browsers will
// blur the elements, for sub-pixel transforms.
elementToOffset.style.transform = `translate3d(${Math.round(sibling.offset)}px, 0, 0)`;
this._adjustClientRect(sibling.clientRect, 0, offset);
} else {
elementToOffset.style.transform = `translate3d(0, ${sibling.offset}px, 0)`;
elementToOffset.style.transform = `translate3d(0, ${Math.round(sibling.offset)}px, 0)`;
this._adjustClientRect(sibling.clientRect, offset, 0);
}
});
Expand Down

0 comments on commit 63174d2

Please sign in to comment.