blob: e543a59b090717fd93f103c7aeb1b44ac451e60a [file] [log] [blame]
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// @dart = 2.9
part of touch;
/**
* Common effects related helpers.
*/
class FxUtil {
/** On transition end event. */
static const TRANSITION_END_EVENT = 'webkitTransitionEnd';
/** The translate3d transform function. */
static const TRANSLATE_3D = 'translate3d';
/** The rotate transform function. */
static const ROTATE = 'rotate';
/** The scale transform function. */
static const SCALE = 'scale';
/** Stops and clears the transition on an element. */
static void clearWebkitTransition(Element el) {
el.style.transition = '';
}
static void setPosition(Element el, Coordinate point) {
num x = point.x;
num y = point.y;
el.style.transform = '${TRANSLATE_3D}(${x}px,${y}px,0px)';
}
/** Apply a transform using translate3d to an HTML element. */
static void setTranslate(Element el, num x, num y, num z) {
el.style.transform = '${TRANSLATE_3D}(${x}px,${y}px,${z}px)';
}
/** Apply a -webkit-transform using translate3d to an HTML element. */
static void setWebkitTransform(Element el, num x, num y,
[num z = 0,
num rotation = null,
num scale = null,
num originX = null,
num originY = null]) {
final style = el.style;
// TODO(jacobr): create a helper class that simplifies building
// transformation matricies that will be set as CSS styles. We should
// consider using CSSMatrix although that may be overkill.
String transform = '${TRANSLATE_3D}(${x}px,${y}px,${z}px)';
if (rotation != null) {
transform += ' ${ROTATE}(${rotation}deg)';
}
if (scale != null) {
transform += ' ${SCALE}(${scale})';
}
style.transform = transform;
if (originX != null || originY != null) {
assert(originX != null && originY != null);
style.transformOrigin = '${originX}px ${originY}px';
}
}
/**
* Determine the position of an [element] relative to a [target] element.
* Moving the [element] to be a child of [target] and setting the
* [element]'s top and left values to the returned coordinate should result
* in the [element]'s position remaining unchanged while its parent is
* changed.
*/
static Coordinate computeRelativePosition(Element element, Element target) {
final testPoint = new Point(0, 0);
/*
final pagePoint =
window.convertPointFromNodeToPage(element, testPoint);
final pointRelativeToTarget =
window.convertPointFromPageToNode(target, pagePoint);
return new Coordinate(pointRelativeToTarget.x, pointRelativeToTarget.y);
*/
// TODO(sra): Test this version that avoids the nonstandard
// `convertPointFromPageToNode`.
var eRect = element.getBoundingClientRect();
var tRect = target.getBoundingClientRect();
return new Coordinate(eRect.left - tRect.left, eRect.top - tRect.top);
}
/** Clear a -webkit-transform from an element. */
static void clearWebkitTransform(Element el) {
el.style.transform = '';
}
/**
* Checks whether an element has a translate3d webkit transform applied.
*/
static bool hasWebkitTransform(Element el) {
return el.style.transform.indexOf(TRANSLATE_3D, 0) != -1;
}
/**
* Translates [el], an HTML element that has a relative CSS
* position, by setting its left and top CSS styles.
*/
static void setLeftAndTop(Element el, num x, num y) {
final style = el.style;
style.left = '${x}px';
style.top = '${y}px';
}
}
class TransitionTimingFunction {
static const EASE_IN = 'ease-in';
static const EASE_OUT = 'ease-out';
static const EASE_IN_OUT = 'ease-in-out';
}