My sweet comic book application written entirely in Dart is starting to come together:
At this point, I can delete stuff from my front-end, but I am forced to navigate to a separate page to add new comics to the collection. Bah!
Instead, I would like to convert that last line to a link to a smooth animation of an add-form. Since I am building this in Dartium, a webkit based browser, I should be able to do something along the lines of CSS3 animations. Let's see...
First up, I define a "faded" CSS class that describes the start state for my add-form. In this case, I want the thing hidden:
.faded {
opacity: 0;
-webkit-transition: opacity 1s ease-in-out;
}To get my fade animation, I make the opacity as a "-webkit-transition" property with a duration of 1 second. The ease-in-out transformation function starts things off slow, gets going at a pretty good pace, and then stops slowly. Next, I define two other CSS classes describing the end state of my transitions:.fade-in {
opacity: 1;
}
.fade-out {
opacity: 0;
}With that, I am ready for some Dart. In addition to loading my comic book collection via Ajax, I now want to attach the necessary handlers to the add-form:main() {
load_comics();
attach_add_handler();
}The appropriate action when clicking the add text is to enable the add-form. So I add enable_add_form as a click handler:attach_add_handler() {
document.
query('#add-comic').
on.
click.
add(enable_add_form);
}(yes, I hate horizontal code that much)To enable the form, I merely need to add the
fade-in class to my form:enable_add_form(event) {
final form_div = document.query('#add-comic-form');
form_div.classes.remove('fade-out');
form_div.classes.add('fade-in');
form_div.queryAll('a').forEach((el) {
el.on.click.add(disable_add_form);
event.preventDefault();
});
}For good measure, I also remove the fade-out class (if present). I also add the disable_add_form handler as a click handler to all child <a> tags (e.g. Cancel links).The
disable_add_form handler is, of course, the inverse of enable_add_form:disable_add_form(event) {
final form_div = document.query('#add-comic-form');
form_div.classes.remove('fade-in');
form_div.classes.add('fade-out');
form_div.queryAll('a').forEach((el) {
el.on.click.remove(disable_add_form);
event.preventDefault();
});
}And it works. When the page first loads, there is no form (as before). Clicking on the add comic text causes the form to fade into view:The problem with this approach is that I need to build those CSS classes in addition to Dart. One way to get around this is to replace the add/remove class names and, instead, use webkit's animation frames:
enable_add_form(event) {
final form_div = document.query('#add-comic-form');
var start = new Date.now();
step(timestamp) {
var progress = timestamp - start.value
, opacity = "${progress/1000}";
form_div.style.opacity = opacity;
if (progress < 1000) window.webkitRequestAnimationFrame(step, form_div);
true;
}
window.webkitRequestAnimationFrame(step, form_div);
}Hooking in to this animation stuff is cool, but it is overkill for simple animations. Happily, while rooting through documentation, I found that CSSStyleDeclaration supports setting animation properties rather easily:
enable_add_form(event) {
final form_div = document.query('#add-comic-form');
form_div.style.transition = 'opacity 1s ease-in-out';
form_div.style.opacity = "1";
form_div.queryAll('a').forEach((el) {
el.on.click.add(disable_add_form);
event.preventDefault();
});
}That is pretty darn nice.Day #271


Access CSS and classes is definitely awesome that way. Attributes are also an easy access, form_div.attributes['someattribute]='somevalue';
ReplyDelete