Wszystkie wpisy, których autorem jest admin

Getting The House Ready For The Holidays

Post pobrano z: Getting The House Ready For The Holidays

The fall is upon the calendar and the holidays are nearly here. From the home decorators perspective, Halloween is nearly here followed by Thanksgiving in November, with Christmas and New Year’s Eve right around the corner. It’s a time where most homes transcend into holiday spirit before hosting a gathering after gathering with friends and family. The fall can also be a busy time for remodelling and DIY projects as school is back in session and the holiday’s fast approach. Many homeowners put off housework and preparation all year until the fall hits and its time to finish the basement for your cousins to stay in during Christmas. Finding inspiration isn’t hard after all, you can search online for kitchen remodel ideas, check out different home and living blogs for ways to transform your living space into more functional rooms, or see the annual issues of craft magazines for all the holiday decoration trends. Here are some ideas for each holiday as you enter the crazy season at home! 

Halloween

Halloween seems to be a real feast of famine situation when it comes to enthusiasm and decoration. Some homes turn into borderline theme parks with bones, pumpkins, witches, and ghosts where many just light a candle or maybe change nothing at all. If you get a little creative you can join the ranks of the Halloween diehards without much work. If you are going for terrifying, a simple way to show your guts is to take old clothes, rags, and bedding to a pair of scissors and get them all tattered and dirty. Next, you can add some red dye or food coloring all over them in a splatter to give the scary sense of Freddy or Jason running through the neighborhood. Spreading out some of these ragged clothes on Halloween night will surely bring an element of gore to your yard. 

Photo by Drew Hays on Unsplash

Thanksgiving

In early November Thanksgiving is on everybody’s mind, one of the most popular holidays in America and a source of great inspiration. One of the hallmarks of Thanksgiving is the colors of red, yellow, and orange. When the weather is turning towards winter and all the leaves are changing colors outside you only see these colors so this year invite them into your home. Shopping for anything these colors is a great way to bring the season into your home. Just finding online shops with sales and deals on shipping can have new decor at your home weeks before the holiday without forcing you to leave home at all. Finding towels, blankets, and even bedding like https://www.designerliving.com/products/duvet-covers/c106 can be super easy and affordable. Embrace the color because a few weeks after you will look out the window and see nothing but snow! 

Photo by Simon Maage on Unsplash

Christmas

The 25th of December is one of the most celebrated holidays in the world and traditionally the one which gets the largest decorating budget in time and money. A Christmas decor hallmark is the tree, which can be covered in ornaments and lights any way you see fit. A newer trend has actually become planting a tree outside your home, decorating with the family, and letting it live long beyond that one Christmas season. It is a way to celebrate the holiday without cutting down a fresh tree to do so and year after year your family will have that tree as a memory of a past Christmas. 

Photo by Arun Kuchibhotla on Unsplash

New Year’s Eve

The turning over of the calendar is best celebrated by opulence and luxury. If you happen to find yourself throwing a New Year’s Eve party, this is the time to go big! If you are a woman get a sparkly dress and a man can match in a white tuxedo. As for the decorator, think Great Gatsby! Getting your home dressed up in glitz and glamour is the perfect setting for New Year’s Eve. Champagne and loud music are sure to bring a crowd to your home for fun long after the ball drops. 

Photo by Josh Boot on Unsplash

Featured image by Denise Johnson on Unsplash

Fenty Beauty: Fenty Beauty by Rihanna

Post pobrano z: Fenty Beauty: Fenty Beauty by Rihanna

Media
Fenty Beauty

Fenty’s Playground invited Rihanna’s navy of fans and influencers to join her in an electrifying live immersive experience to produce the beauty film together, and in real-time. The launch event has since generated a whopping 1.1 billion impressions on social media.

The film of the experience shows the complete takeover of Madrid’s central Callao Square, orchestrated by experiential design agency Wildbytes. Wildbytes harnessed cutting-edge technology to create the unforgettable multi-sensorial experience and an instantaneous, high-end fashion film.

Advertising Agency:Wildbytes, New York, USA
Production Company:Wildbytes
Set Design:Wildbytes
Project Director:Julio Obelleiro
Creative Director:Casilda Sánchez
Art Director:Guillem Castellvi
Production Director:Laia Zanon
Technical Production:Andrés Yves
Space Designer:María López
Film Director:Ginesta Guindal

Burger King: Zombie Whopper

Post pobrano z: Burger King: Zombie Whopper

Film
Burger King

Advertising Agency:Buzzman, Paris, France
President:Georges Mohammed-Cherif
Executive Creative Director:Georges Mohammed-Cherif
Vicepresident:Thomas Granger
Managing Director:Julien Levilain
Creative Director:Jean-Christophe Royer
Art Directors:Mickael Krikorian, Victor Sidoroff, Steven Daout
Copywriters:Mickael Krikorian, Victor Sidoroff, Steven Daout
Account Director:Pierre Guengant
Account Manager:Loïc Coelho
Account Executive:Clémence Gateau
Account Executive Assistant:Antoine Boizeau
Strategic Planner:Clément Scherrer
Head Of Social Media:Julien Scaglione
Social Media Mangers:Marie Le Scao, Elise Lassimoulie
Head Of Pr:Amélie Juillet
Communication:Amélie Juillet
Pr:Suzanne Langlais, Julie Claeyman
Communication Assistants:Suzanne Langlais, Julie Claeyman
Head Of Tv Production:Vanessa Barbel
Tv Production:Assya Mediouni
Tv Production Assistant:May Pham
Production:HVH Productions
Post Producer:HVH Productions
Post Production:HVH Productions
Sound Production:Claire Paillot, Octopus
Director:Boris Vassallo
Producer:Rodolphe Hesseman

10 Award Winning Industrial Designs

Post pobrano z: 10 Award Winning Industrial Designs
first image of the post

Every year, A’ Design Award reward excellency in design from all over the world. In the 2017 edition, many great designers submitted their work in almost every possible field of design you could imagine. However, it did catch my eye that the entries in the industrial design category seemed to be really outstanding. In this post we share some of the great work we saw, and you can enter the competition for a chance to be featured in 2018.

1. Qoobi One

Wireless Tube Pre Amp by Matvey Evstigneev.

2. Bebe

Images of Bebe by Ajay Choudhary.

3. Less Door Handle

Less Door Handle by Azam Eskandari.

4. Polycom RealPresence Trio

Polycom RealPresence Trio Smart Conference Phone by Pip Tompkin Design.

5. Nest Speakers

Nest Speaker Nesting Speaker by Donita Viktoria Salazar.

6. 3D Printable Prosthetic

Illume 3D Printable Prosthetic by Cliff Shin.

7. BenjiLock

BENJILOCK Fingerprint Padlock by BenjiLock Llc.

8. Shell Homage Hangers

Shell Homage Hangers by Rania Elkalla.

9. Formon Core

Formon Core Desktop 3D Printer by Rron Cena.

10. Ergonomic Salon Hair Dryer

Salon Hair Dryer by Mojtaba Hosseini.

A collection of fake programming covers

Post pobrano z: A collection of fake programming covers
first image of the post

As web designers and developers, we have all been guilty of taking shortcuts when it comes to building websites or apps. For that reason, we usually try to hide a little when looking at these fake programming covers that make fun of our own shortcomings. These are part of a “fake programming books” meme that consists of taking the famous O’Reilly cover style, with a main color, the title in a box of that color, and a line-based black and white drawing of an animal.

I already knew of the “Copying and Pasting from Stack Overflow” cover, which you can find at the end of this post, but googling it opened a whole new world of giggles for me.

Google The Error Message

This is how 99.9% support people work after asking you if your computer is plugged in.

Writing Code that nobody else can read

Why comment when you can just write regular spaghetti code like everyone else?

Changing stuff and seeing what happens

Welcome to a world of learning by doing.

blamin the user

The easy way to get away from responsibility, blaming the user.

Pointless meetings

This one is not only for developers or designers, but for anyone who has an office job.

z-index: 100000000000

Next step is “Z-Index: 100000000000 !important”, we’ve all done this!

Copying and Pasting from Stack Overflow

This is how more than half of the Internet works, copying and pasting code from Stack Overflow.

Make Like it Matters

Post pobrano z: Make Like it Matters

(This is a sponsored post.)

Our sponsor Media temple is holding a contest to give away a bunch of stuff, including a nice big monitor and gift cards. Entering is easy, you just drop them an image or URL to a project you’re proud of. Do it quickly though, as entries end on Tuesday. Then the top 20 will be publicly voted on. US residents only.

Direct Link to ArticlePermalink


Make Like it Matters is a post from CSS-Tricks

Emulating CSS Timing Functions with JavaScript

Post pobrano z: Emulating CSS Timing Functions with JavaScript

CSS animations and transitions are great! However, while recently toying with an idea, I got really frustrated with the fact that gradients are only animatable in Edge (and IE 10+). Yes, we can do all sorts of tricks with background-position, background-size, background-blend-mode or even opacity and transform on a pseudo-element/ child, but sometimes these are just not enough. Not to mention that we run into similar problems when wanting to animate SVG attributes without a CSS correspondent.

Using a lot of examples, this article is going to explain how to smoothly go from one state to another in a similar fashion to that of common CSS timing functions using just a little bit of JavaScript, without having to rely on a library, so without including a lot of complicated and unnecessary code that may become a big burden in the future.

This is not how the CSS timing functions work. This is an approach that I find simpler and more intuitive than working with Bézier curves. I’m going to show how to experiment with different timing functions using JavaScript and dissect use cases. It is not a tutorial on how to do beautiful animation.

A few examples using a linear timing function

Let’s start with a left to right linear-gradient() with a sharp transition where we want to animate the first stop. Here’s a way to express that using CSS custom properties:

background: linear-gradient(90deg, #ff9800 var(--stop, 0%), #3c3c3c 0);

On click, we want the value of this stop to go from 0% to 100% (or the other way around, depending on the state it’s already in) over the course of NF frames. If an animation is already running at the time of the click, we stop it, change its direction, then restart it.

We also need a few variables such as the request ID (this gets returned by requestAnimationFrame), the index of the current frame (an integer in the [0, NF] interval, starting at 0) and the direction our transition is going in (which is 1 when going towards 100% and -1 when going towards 0%).

While nothing is changing, the request ID is null. We also set the current frame index to 0 initially and the direction to -1, as if we’ve just arrived to 0% from 100%.

const NF = 80; // number of frames transition happens over

let rID = null, f = 0, dir = -1;

function stopAni() {
  cancelAnimationFrame(rID);
  rID = null;  
};

function update() {};

addEventListener('click', e => {
  if(rID) stopAni(); // if an animation is already running, stop it
  dir *= -1; // change animation direction
  update();
}, false);

Now all that’s left is to populate the update() function. Within it, we update the current frame index f. Then we compute a progress variable k as the ratio between this current frame index f and the total number of frames NF. Given that f goes from 0 to NF (included), this means that our progress k goes from 0 to 1. Multiply this with 100% and we get the desired stop.

After this, we check whether we’ve reached one of the end states. If we have, we stop the animation and exit the update() function.

function update() {
  f += dir; // update current frame index
  
  let k = f/NF; // compute progress
  
  document.body.style.setProperty('--stop', `${+(k*100).toFixed(2)}%`);
  
  if(!(f%NF)) {
    stopAni();
    return
  }
  
  rID = requestAnimationFrame(update)
};

The result can be seen in the Pen below (note that we go back on a second click):

See the Pen by thebabydino (@thebabydino) on CodePen.

The way the pseudo-element is made to contrast with the background below is explained in an older article.

The above demo may look like something we could easily achieve with an element and translating a pseudo-element that can fully cover it, but things get a lot more interesting if we give the background-size a value that’s smaller than 100% along the x axis, let’s say 5em:

See the Pen by thebabydino (@thebabydino) on CodePen.

This gives us a sort of a „vertical blinds” effect that cannot be replicated in a clean manner with just CSS if we don’t want to use more than one element.

Another option would be not to alternate the direction and always sweep from left to right, except only odd sweeps would be orange. This requires tweaking the CSS a bit:

--c0: #ff9800;
--c1: #3c3c3c;
background: linear-gradient(90deg, 
    var(--gc0, var(--c0)) var(--stop, 0%), 
    var(--gc1, var(--c1)) 0)

In the JavaScript, we ditch the direction variable and add a type one (typ) that switches between 0 and 1 at the end of every transition. That’s when we also update all custom properties:

const S = document.body.style;

let typ = 0;

function update() {
  let k = ++f/NF;
  
  S.setProperty('--stop', `${+(k*100).toFixed(2)}%`);
  
  if(!(f%NF)) {
    f = 0;
    S.setProperty('--gc1', `var(--c${typ})`);
    typ = 1 - typ;
    S.setProperty('--gc0', `var(--c${typ})`);
    S.setProperty('--stop', `0%`);
    stopAni();
    return
  }
  
  rID = requestAnimationFrame(update)
};

This gives us the desired result (click at least twice to see how the effect differs from that in the first demo):

See the Pen by thebabydino (@thebabydino) on CodePen.

We could also change the gradient angle instead of the stop. In this case, the background rule becomes:

background: linear-gradient(var(--angle, 0deg), 
    #ff9800 50%, #3c3c3c 0);

In the JavaScript code, we tweak the update() function:

function update() {
  f += dir;
	
  let k = f/NF;
  
  document.body.style.setProperty(
    '--angle', 
    `${+(k*180).toFixed(2)}deg`
  );
  
  if(!(f%NF)) {
    stopAni();
    return
  }
  
  rID = requestAnimationFrame(update)
};

We now have a gradient angle transition in between the two states (0deg and 180deg):

See the Pen by thebabydino (@thebabydino) on CodePen.

In this case, we might also want to keep going clockwise to get back to the 0deg state instead of changing the direction. So we just ditch the dir variable altogether, discard any clicks happening during the transition, and always increment the frame index f, resetting it to 0 when we’ve completed a full rotation around the circle:

function update() {
  let k = ++f/NF;
  
  document.body.style.setProperty(
    '--angle', 
    `${+(k*180).toFixed(2)}deg`
  );
  
  if(!(f%NF)) {
    f = f%(2*NF);
    stopAni();
    return
  }
  
  rID = requestAnimationFrame(update)
};

addEventListener('click', e => {
  if(!rID) update()
}, false);

The following Pen illustrates the result – our rotation is now always clockwise:

See the Pen by thebabydino (@thebabydino) on CodePen.

Something else we could do is use a radial-gradient() and animate the radial stop:

background: radial-gradient(circle, 
    #ff9800 var(--stop, 0%), #3c3c3c 0);

The JavaScript code is identical to that of the first demo and the result can be seen below:

See the Pen by thebabydino (@thebabydino) on CodePen.

We may also not want to go back when clicking again, but instead make another blob grow and cover the entire viewport. In this case, we add a few more custom properties to the CSS:

--c0: #ff9800;
--c1: #3c3c3c;
background: radial-gradient(circle, 
    var(--gc0, var(--c0)) var(--stop, 0%), 
    var(--gc1, var(--c1)) 0)

The JavaScript is the same as in the case of the third linear-gradient() demo. This gives us the result we want:

See the Pen by thebabydino (@thebabydino) on CodePen.

A fun tweak to this would be to make our circle start growing from the point we clicked. To do so, we introduce two more custom properties, --x and --y:

background: radial-gradient(circle at var(--x, 50%) var(--y, 50%), 
    var(--gc0, var(--c0)) var(--stop, 0%), 
    var(--gc1, var(--c1)) 0)

When clicking, we set these to the coordinates of the point where the click happened:

addEventListener('click', e => {
  if(!rID) {
    S.setProperty('--x', `${e.clientX}px`);
    S.setProperty('--y', `${e.clientY}px`);
    update();
  }
}, false);

This gives us the following result where we have a disc growing from the point where we clicked:

See the Pen by thebabydino (@thebabydino) on CodePen.

Another option would be using a conic-gradient() and animating the angular stop:

background: conic-gradient(#ff9800 var(--stop, 0%), #3c3c3c 0%)

Note that in the case of conic-gradient(), we must use a unit for the zero value (whether that unit is % or an angular one like deg doesn’t matter), otherwise our code won’t work – writing conic-gradient(#ff9800 var(--stop, 0%), #3c3c3c 0) means nothing gets displayed.

The JavaScript is the same as for animating the stop in the linear or radial case, but bear in mind that this currently only works in Chrome with Experimental Web Platform Features enabled in chrome://flags.

The Experimental Web Platform Features flag enabled in Chrome Canary (63.0.3210.0).

Just for the purpose of displaying conic gradients in the browser, there’s a polyfill by Lea Verou and this works cross-browser but doesn’t allow using CSS custom properties.

The recording below illustrates how our code works:

Recording of how our first conic gradient demo works in Chrome with the flag enabled.
Recording of how our first conic-gradient() demo works in Chrome with the flag enabled (live demo).

This is another situation where we might not want to go back on a second click. This means we need to alter the CSS a bit, in the same way we did for the last radial-gradient() demo:

--c0: #ff9800;
--c1: #3c3c3c;
background: conic-gradient( 
    var(--gc0, var(--c0)) var(--stop, 0%), 
    var(--gc1, var(--c1)) 0%)

The JavaScript code is exactly the same as in the corresponding linear-gradient() or radial-gradient() case and the result can be seen below:

Recording of how our second conic gradient demo works in Chrome with the flag enabled.
Recording of how our second conic-gradient() demo works in Chrome with the flag enabled (live demo).

Before we move on to other timing functions, there’s one more thing to cover: the case when we don’t go from 0% to 100%, but in between any two values. We take the example of our first linear-gradient, but with a different default for --stop, let’s say 85% and we also set a --stop-fin value – this is going to be the final value for --stop:

--stop-ini: 85%;
--stop-fin: 26%;
background: linear-gradient(90deg, #ff9800 var(--stop, var(--stop-ini)), #3c3c3c 0)

In the JavaScript, we read these two values – the initial (default) and the final one – and we compute a range as the difference between them:

const S = getComputedStyle(document.body), 
      INI = +S.getPropertyValue('--stop-ini').replace('%', ''), 
      FIN = +S.getPropertyValue('--stop-fin').replace('%', ''), 
      RANGE = FIN - INI;

Finally, in the update() function, we take into account the initial value and the range when setting the current value for --stop:

document.body.style.setProperty(
  '--stop', 
  `${+(INI + k*RANGE).toFixed(2)}%`
);

With these changes we now have a transition in between 85% and 26% (and the other way on even clicks):

See the Pen by thebabydino (@thebabydino) on CodePen.

If we want to mix units for the stop value, things get hairier as we need to compute more things (box dimensions when mixing % and px, font sizes if we throw em or rem in the mix, viewport dimensions if we want to use viewport units, the length of the 0% to 100% segment on the gradient line for gradients that are not horizontal or vertical), but the basic idea remains the same.

Emulating ease-in/ ease-out

An ease-in kind of function means the change in value happens slow at first and then accelerates. ease-out is exactly the opposite – the change happens fast in the beginning, but then slows down towards the end.

Illustration showing the graphs of the ease-in and ease-out timing functions, both defined on the [0,1] interval, taking values within the [0,1] interval. The ease-in function has a slow increase at first, the change in value accelerating as we get closer to 1. The ease-out function has a fast increase at first, the change in value slowing down as we get closer to 1.
The ease-in (left) and ease-out (right) timing functions (live).

The slope of the curves above gives us the rate of change. The steeper it is, the faster the change in value happens.

We can emulate these functions by tweaking the linear method described in the first section. Since k takes values in the [0, 1] interval, raising it to any positive power also gives us a number within the same interval. The interactive demo below shows the graph of a function f(k) = pow(k, p) (k raised to an exponent p) shown in purple and that of a function g(k) = 1 - pow(1 - k, p) shown in red on the [0, 1] interval versus the identity function id(k) = k (which corresponds to a linear timing function).

See the Pen by thebabydino (@thebabydino) on CodePen.

When the exponent p is equal to 1, the graphs of the f and g functions are identical to that of the identity function.

When exponent p is greater than 1, the graph of the f function is below the identity line – the rate of change increases as k increases. This is like an ease-in type of function. The graph of the g function is above the identity line – the rate of change decreases as k increases. This is like an ease-out type of function.

It seems an exponent p of about 2 gives us an f that’s pretty similar to ease-in, while g is pretty similar to ease-out. With a bit more tweaking, it looks like the best approximation is for a p value of about 1.675:

See the Pen by thebabydino (@thebabydino) on CodePen.

In this interactive demo, we want the graphs of the f and g functions to be as close as possible to the dashed lines, which represent the ease-in timing function (below the identity line) and the ease-out timing function (above the identity line).

Emulating ease-in-out

The CSS ease-in-out timing function looks like in the illustration below:

Illustration showing the graph of the ease-in-out timing function, defined on the [0,1] interval, taking values within the [0,1] interval. This function has a slow rate of change in value at first, then accelerates and finally slows down again such that it's symmetric with respect to the (½,½) point.
The ease-in-out timing function (live).

So how can we get something like this?

Well, that’s what harmonic functions are for! More exactly, the ease-in-out out shape is reminiscent the shape of the sin() function on the [-90°,90°] interval.

The sin(k) function on the [-90°,90°] interval. At -90°, this function is at its minimum, which is -1. After that, it increases, at first slow, then accelerates and finally slows down again when k gets close to 90°. At 90°, the sin(k) function is at its maximum, which is 1. Its graph is symmetrical with respect to the (0°,0) point.
The sin(k) function on the [-90°,90°] interval (live).

However, we don’t want a function whose input is in the [-90°,90°] interval and output is in the [-1,1] interval, so let’s fix this!

This means we need to squish the hashed rectangle ([-90°,90°]x[-1,1]) in the illustration above into the unit one ([0,1]x[0,1]).

First, let’s take the domain [-90°,90°]. If we change our function to be sin(k·180°) (or sin(k·π) in radians), then our domain becomes [-.5,.5] (we can check that -.5·180° = 90° and .5·180° = 90°):

The sin(k·π) function on the [-½,½] interval. At -½, the sin(k·π) function is at its minimum, which is -1. After that, it increases, at first slow, then accelerates and finally slows down again when k gets close to ½. At ½, the sin(k·π) function is at its maximum, which is 1. Its graph is symmetrical with respect to the (0,0) point.
The sin(k·π) function on the [-.5,.5] interval (live).

We can shift this domain to the right by .5 and get the desired [0,1] interval if we change our function to be sin((k - .5)·π) (we can check that 0 - .5 = -.5 and 1 - .5 = .5):

The sin((k - .5)·π) function on the [0,1] interval (live).

Now let’s get the desired codomain. If we add 1 to our function making it sin((k - .5)·π) + 1 this shifts out codomain up into the [0, 2] interval:

The sin((k - .5)·π) + 1 function on the [0,1] interval (live).

Dividing everything by 2 gives us the (sin((k - .5)·π) + 1)/2 function and compacts the codomain into our desired [0,1] interval:

The (sin((k - .5)·π) + 1)/2 function on the [0,1] interval (live).

This turns out to be a good approximation of the ease-in-out timing function (represented with an orange dashed line in the illustration above).

Comparison of all these timing functions

Let’s say we want to have a bunch of elements with a linear-gradient() (like in the third demo). On click, their --stop values go from 0% to 100%, but with a different timing function for each.

In the JavaScript, we create a timing functions object with the corresponding function for each type of easing:

tfn = {
  'linear': function(k) {
    return k;
  }, 
  'ease-in': function(k) {
    return Math.pow(k, 1.675);
  }, 
  'ease-out': function(k) {
    return 1 - Math.pow(1 - k, 1.675);
  }, 
  'ease-in-out': function(k) {
    return .5*(Math.sin((k - .5)*Math.PI) + 1);
  }
};

For each of these, we create an article element:

const _ART = [];

let frag = document.createDocumentFragment();

for(let p in tfn) {
  let art = document.createElement('article'), 
      hd = document.createElement('h3');

  hd.textContent = p;
  art.appendChild(hd);
  art.setAttribute('id', p);
  _ART.push(art);
  frag.appendChild(art);
}

n = _ART.length;
document.body.appendChild(frag);

The update function is pretty much the same, except we set the --stop custom property for every element as the value returned by the corresponding timing function when fed the current progress k. Also, when resetting the --stop to 0% at the end of the animation, we also need to do this for every element.

function update() {
  let k = ++f/NF;	
  
  for(let i = 0; i < n; i++) {
    _ART[i].style.setProperty(
      '--stop',
      `${+tfn[_ART[i].id](k).toFixed(5)*100}%`
    );
  }
  
  if(!(f%NF)) {
    f = 0;
		
    S.setProperty('--gc1', `var(--c${typ})`);
    typ = 1 - typ;
    S.setProperty('--gc0', `var(--c${typ})`);
		
    for(let i = 0; i < n; i++)
      _ART[i].style.setProperty('--stop', `0%`);
		
    stopAni();
    return;
  }
  
  rID = requestAnimationFrame(update)
};

This gives us a nice visual comparison of these timing functions:

See the Pen by thebabydino (@thebabydino) on CodePen.

They all start and finish at the same time, but while the progress is constant for the linear one, the ease-in one starts slowly and then accelerates, the ease-out one starts fast and then slows down and, finally, the ease-in-out one starts slowly, accelerates and then slows down again at the end.

Timing functions for bouncing transitions

I first came across the concept years ago, in Lea Verou’s CSS Secrets talk. These happen when the y (even) values in a cubic-bezier() function are outside the [0, 1] range and the effect they create is of the animated value going outside the interval between its initial and final value.

This bounce can happen right after the transition starts, right before it finishes or at both ends.

A bounce at the start means that, at first, we don’t go towards the final state, but in the opposite direction. For example, if want to animate a stop from 43% to 57% and we have a bounce at the start, then, at first, out stop value doesn’t increase towards 57%, but decreases below 43% before going back up to the final state. Similarly, if we go from an initial stop value of 57% to a final stop value of 43% and we have a bounce at the start, then, at first, the stop value increases above 57% before going down to the final value.

A bounce at the end means we overshoot our final state and only then go back to it. If want to animate a stop from 43% to 57% and we have a bounce at the end, then we start going normally from the initial state to the final one, but towards the end, we go above 57% before going back down to it. And if we go from an inital stop value of 57% to a final stop value of 43% and we have a bounce at the end, then, at first, we go down towards the final state, but, towards the end, we pass it and we briefly have stop values below 43% before our transition finishes there.

If what they do is still difficult to grasp, below there’s a comparative example of all three of them in action.

Screen capture of a demo showing the three cases described above.
The three cases.

These kinds of timing functions don’t have their own keywords associated, but they look cool and they are what we want in a lot of situations.

Just like in the case of ease-in-out, the quickest way of getting them is by using harmonic functions. The difference lies in the fact that now we don’t start from the [-90°,90°] domain anymore.

For a bounce at the beginning, we start with the [s, 0°] portion of the sin() function, where s (the start angle) is in the (-180°,-90°) interval. The closer it is to -180°, the bigger the bounce is and the faster it will go to the final state after it. So we don’t want it to be really close to -180° because the result would look too unnatural. We also want it to be far enough from -90° that the bounce is noticeable.

In the interactive demo below, you can drag the slider to change the start angle and then click on the stripe at the bottom to see the effect in action:

See the Pen by thebabydino (@thebabydino) on CodePen.

In the interactive demo above, the hashed area ([s,0]x[sin(s),0]) is the area we need move and scale into the [0,1]x[0,1] area in order to get our timing function. The part of the curve that’s below its lower edge is where the bounce happens. You can adjust the start angle using the slider and then click on the bottom bar to see how the transition looks for different start angles.

Just like in the ease-in-out case, we first squish the domain into the [-1,0] interval by dividing the argument with the range (which is the maximum 0 minus the minimum s). Therefore, our function becomes sin(-k·s) (we can check that -(-1)·s = s and -0·s = 0):

The sin(-k·s) function on the [-1,0] interval. At -1, the sin(-k·s) function is sin(s). After that, it decreases, reaches a minimum, then starts increasing again and keeps increasing until k gets to 0. At 0, the sin(-k·s) function is 0.
The sin(-k·s) function on the [-1,0] interval (live).

Next, we shift this interval to the right (by 1, into [0,1]). This makes our function sin(-(k - 1)·s) = sin((1 - k)·s) (it checks that 0 - 1 = -1 and 1 - 1 = 0):

The sin(-(k - 1)·s) function on the [0,1] interval. At 0, the sin(-(k - 1)·s) function is sin(s). After that, it decreases, reaches a minimum, then starts increasing again and keeps increasing until k gets to 1. At 1, the sin(-(k - 1)·s) function is 0.
The sin(-(k - 1)·s) function on the [0,1] interval (live).

We then shift the codomain up by its value at 0 (sin((1 - 0)*s) = sin(s)). Our function is now sin((1 - k)·s) - sin(s) and our codomain [0,-sin(s)].

The sin(-(k - 1)·s) - sin(s) function on the [0,1] interval. At 0, the sin(-(k - 1)·s) - sin(s) function is 0. After that, it decreases, reaches a minimum, then starts increasing again and keeps increasing until k gets to 1. At 1, the sin(-(k - 1)·s) - sin(s) function is -sin(s).
The sin(-(k - 1)·s) - sin(s) function on the [0,1] interval (live).

The last step is to expand the codomain into the [0,1] range. We do this by dividing by its upper limit (which is -sin(s)). This means our final easing function is 1 - sin((1 - k)·s)/sin(s)

The 1 - sin((1 - k)·s)/sin(s) function on the [0,1] interval. At 0, the 1 - sin((1 - k)·s)/sin(s) function is 0. After that, it decreases, reaches a minimum, then starts increasing again and keeps increasing until k gets to 1. At 1, the 1 - sin((1 - k)·s)/sin(s) function is 1.
The 1 - sin((1 - k)·s)/sin(s) function on the [0,1] interval (live).

For a bounce at the end, we start with the [0°, e] portion of the sin() function, where e (the end angle) is in the (90°,180°) interval. The closer it is to 180°, the bigger the bounce is and the faster it will move from the initial state to the final one before it overshoots it and the bounce happens. So we don’t want it to be really close to 180° as the result would look too unnatural. We also want it to be far enough from 90° so that the bounce is noticeable.

See the Pen by thebabydino (@thebabydino) on CodePen.

In the interactive demo above, the hashed area ([0,e]x[0,sin(e)]) is the area we need to squish and move into the [0,1]x[0,1] square in order to get our timing function. The part of the curve that’s below its upper edge is where the bounce happens.

We start by squishing the domain into the [0,1] interval by dividing the argument with the range (which is the maximum e minus the minimum 0). Therefore, our function becomes sin(k·e) (we can check that 0·e = 0 and 1·e = e):

The sin(k·e) function on the [0,1] interval. At 0, the sin(k·e) function is 0. After that, it increases, overshoots the final value, reaches a maximum of 1, then decreases back to sin(e) for a k equal to 1.
The sin(k·e) function on the [0,1] interval (live).

What’s still left to do is to expand the codomain into the [0,1] range. We do this by dividing by its upper limit (which is sin(e)). This means our final easing function is sin(k·e)/sin(e).

The sin(k·e)/sin(e) function on the [0,1] interval. At 0, the sin(k·e)/sin(e) function is 0. After that, it increases, overshoots the final value, reaches a maximum, then decreases back to 1 for a k equal to 1.
The sin(k·e)/sin(e) function on the [0,1] interval (live).

If we want a bounce at each end, we start with the [s, e] portion of the sin() function, where s is in the (-180°,-90°) interval and e in the (90°,180°) interval. The larger s and e are in absolute values, the bigger the corresponding bounces are and the more of the total transition time is spent on them alone. On the other hand, the closer their absolute values get to 90°, the less noticeable their corresponding bounces are. So, just like in the previous two cases, it’s all about finding the right balance.

See the Pen by thebabydino (@thebabydino) on CodePen.

In the interactive demo above, the hashed area ([s,e]x[sin(s),sin(e)]) is the area we need to move and scale into the [0,1]x[0,1] square in order to get our timing function. The part of the curve that’s beyond its horizontal edges is where the bounces happen.

We start by shifting the domain to the right into the [0,e - s] interval. This means our function becomes sin(k + s) (we can check that 0 + s = s and that e - s + s = e).

The sin(k + s) function on the [0,e - s] interval. At 0, the sin(k + s) function is sin(s). At first, it decreases, reaches a minimum of -1, then starts increasing and keeps increasing until it overshoots the final value, reaches a maximum of 1, then decreases back to sin(e) for a k equal to e - s.
The sin(k + s) function on the [0,e - s] interval (live).

Then we shrink the domain to fit into the [0,1] interval, which gives us the function sin(k·(e - s) + s).

The sin(k·(e - s) + s) function on the [0,1] interval. At 0, the sin(k·(e - s) + s) function is sin(s). At first, it decreases, reaches a minimum of -1, then starts increasing and keeps increasing until it overshoots the final value, reaches a maximum of 1, then decreases back to sin(e) for a k equal to 1.
The sin(k·(e - s) + s) function on the [0,1] interval (live).

Moving on to the codomain, we first shift it up by its value at 0 (sin(0·(e - s) + s)), which means we now have sin(k·(e - s) + s) - sin(s). This gives us the new codomain [0,sin(e) - sin(s)].

The sin(k·(e - s) + s) - sin(s) function on the [0,1] interval. At 0, the sin(k·(e - s) + s) - sin(s) function is 0. At first, it decreases, reaches a minimum, then starts increasing and keeps increasing until it overshoots the final value, reaches a maximum, then decreases back to sin(e) - sin(s) for a k equal to 1.
The sin(k·(e - s) + s) - sin(s) function on the [0,1] interval (live).

Finally, we shrink the codomain to the [0,1] interval by dividing with the range (sin(e) - sin(s)), so our final function is (sin(k·(e - s) + s) - sin(s))/(sin(e - sin(s)).

The (sin(k·(e - s) + s) - sin(s))/(sin(e - sin(s)) function on the [0,1] interval. At 0, the s(sin(k·(e - s) + s) - sin(s))/(sin(e - sin(s)) function is 0. At first it decreases, reaches a minimum, then starts increasing and keeps increasing until it overshoots the final value, reaches a maximum, then decreases back to 1 for a k equal to 1.
The (sin(k·(e - s) + s) - sin(s))/(sin(e - sin(s)) function on the [0,1] interval (live).

So in order to do a similar comparative demo to that for the JS equivalents of the CSS linear, ease-in, ease-out, ease-in-out, our timing functions object becomes:

tfn = {
  'bounce-ini': function(k) {
    return 1 - Math.sin((1 - k)*s)/Math.sin(s);
  }, 
  'bounce-fin': function(k) {
    return Math.sin(k*e)/Math.sin(e);
  }, 
  'bounce-ini-fin': function(k) {
    return (Math.sin(k*(e - s) + s) - Math.sin(s))/(Math.sin(e) - Math.sin(s));
  }
};

The s and e variables are the values we get from the two range inputs that allow us to control the bounce amount.

The interactive demo below shows the visual comparison of these three types of timing functions:

See the Pen by thebabydino (@thebabydino) on CodePen.

Alternating animations

In CSS, setting animation-direction to alternate also reverses the timing function. In order to better understand this, consider a .box element on which we animate its transform property such that we move to the right. This means our @keyframes look as follows:

@keyframes shift {
   0%,  10% { transform: none }
  90%, 100% { transform: translate(50vw) }
}

We use a custom timing function that allows us to have a bounce at the end and we make this animation alternate – that is, go from the final state (translate(50vw)) back to the initial state (no translation) for the even-numbered iterations (second, fourth and so on).

animation: shift 1s cubic-bezier(.5, 1, .75, 1.5) infinite alternate

The result can be seen below:

See the Pen by thebabydino (@thebabydino) on CodePen.

One important thing to notice here is that, for the even-numbered iterations, our bounce doesn’t happen at the end, but at the start – the timing function is reversed. Visually, this means it’s reflected both horizontally and vertically with respect to the .5,.5 point.

Illustration showing, using the previous example, how the reverse timing function (bounce at the start) is symmetrical to the normal one (having a bounce at the end in this case) with respect to the (.5,.5) point.
The normal timing function (f, in red, with a bounce at the end) and the symmetrical reverse one (g, in purple, with a bounce at the start) (live)

In CSS, there is no way of having a different timing function other than the symmetrical one on going back if we are to use this set of keyframes and animation-direction: alternate. We can introduce the going back part into the keyframes and control the timing function for each stage of the animation, but that’s outside the scope of this article.

When changing values with JavaScript in the fashion presented so far in this article, the same thing happens by default. Consider the case when we want to animate the stop of a linear-gradient() between an initial and a final position and we want to have a bounce at the end. This is pretty much the last example presented in the first section with timing function that lets us have a bounce at the end (one in the bounce-fin category described before) instead of a linear one.

The CSS is exactly the same and we only make a few minor changes to the JavaScript code. We set a limit angle E and we use a custom bounce-fin kind of timing function in place of the linear one:

const E = .75*Math.PI;

/* same as before */

function timing(k) {
  return Math.sin(k*E)/Math.sin(E)
};

function update() {
  /* same as before */
	
  document.body.style.setProperty(
    '--stop', 
    `${+(INI + timing(k)*RANGE).toFixed(2)}%`
  );
  
  /* same as before */
};

/* same as before */

The result can be seen below:

See the Pen by thebabydino (@thebabydino) on CodePen.

In the initial state, the stop is at 85%. We animate it to 26% (which is the final state) using a timing function that gives us a bounce at the end. This means we go beyond our final stop position at 26% before going back up and stopping there. This is what happens during the odd iterations.

During the even iterations, this behaves just like in the CSS case, reversing the timing function, so that the bounce happens at the beginning, not at the end.

But what if we don’t want the timing function to be reversed?

In this case, we need to use the symmetrical function. For any timing function f(k) defined on the [0,1] interval (this is the domain), whose values are in the [0,1] (codomain), the symmetrical function we want is 1 - f(1 - k). Note that functions whose shape is actually symmetrical with respect to the .5,.5 point, like linear or ease-in-out are identical to their symmetrical functions.

See the Pen by thebabydino (@thebabydino) on CodePen.

So what we do is use our timing function f(k) for the odd iterations and use 1 - f(1 - k) for the even ones. We can tell whether an iteration is odd or even from the direction (dir) variable. This is 1 for odd iterations and -1 for even ones.

This means we can combine our two timing functions into one: m + dir*f(m + dir*k).

Here, the multiplier m is 0 for the odd iterations (when dir is 1) and 1 for the even ones (when dir is -1), so we can compute it as .5*(1 - dir):

dir = +1 → m = .5*(1 - (+1)) = .5*(1 - 1) = .5*0 = 0
dir = -1 → m = .5*(1 - (-1)) = .5*(1 + 1) = .5*2 = 1

This way, our JavaScript becomes:

let m;

/* same as before */

function update() {
  /* same as before */
  
  document.body.style.setProperty(
    '--stop', 
    `${+(INI + (m + dir*timing(m + dir*k))*RANGE).toFixed(2)}%`
  );
  
  /* same as before */
};

addEventListener('click', e => {
  if(rID) stopAni();
  dir *= -1;
  m = .5*(1 - dir);
  update();
}, false);

The final result can be seen in this Pen:

See the Pen by thebabydino (@thebabydino) on CodePen.

Even more examples

Gradient stops are not the only things that aren’t animatable cross-browser with just CSS.

Gradient end going from orange to violet

For a first example of something different, let’s say we want the orange in our gradient to animate to a kind of violet. We start with a CSS that looks something like this:

--c-ini: #ff9800;
--c-fin: #a048b9;
background: linear-gradient(90deg, 
  var(--c, var(--c-ini)), #3c3c3c)

In order to interpolate between the initial and final values, we need to know the format we get when reading them via JavaScript – is it going to be the same format we set them in? Is it going to be always rgb()/ rgba()?

Here is where things get a bit hairy. Consider the following test, where we have a gradient where we’ve used every format possible:

--c0: hsl(150, 100%, 50%); // springgreen
--c1: orange;
--c2: #8a2be2; // blueviolet
--c3: rgb(220, 20, 60); // crimson
--c4: rgba(255, 245, 238, 1); // seashell with alpha = 1
--c5: hsla(51, 100%, 50%, .5); // gold with alpha = .5
background: linear-gradient(90deg, 
  var(--c0), var(--c1), 
  var(--c2), var(--c3), 
  var(--c4), var(--c5))

We read the computed values of the gradient image and the individual custom properties --c0 through --c5 via JavaScript.

let s = getComputedStyle(document.body);

console.log(s.backgroundImage);
console.log(s.getPropertyValue('--c0'), 'springgreen');
console.log(s.getPropertyValue('--c1'), 'orange');
console.log(s.getPropertyValue('--c2'), 'blueviolet');
console.log(s.getPropertyValue('--c3'), 'crimson');
console.log(s.getPropertyValue('--c4'), 'seashell (alpha = 1)');
console.log(s.getPropertyValue('--c5'), 'gold (alpha = .5)');

The results seem a bit inconsistent.

Screenshots showing what gets logged in Chrome, Edge and Firefox.
Screenshots showing what gets logged in Chrome, Edge and Firefox (live).

Whatever we do, if we have an alpha of strictly less than 1, what we get via JavaScript seems to be always an rgba() value, regardless of whether we’ve set it with rgba() or hsla().

All browsers also agree when reading the custom properties directly, though, this time, what we get doesn’t seem to make much sense: orange, crimson and seashell are returned as keywords regardless of how they were set, but we get hex values for springgreen and blueviolet. Except for orange, which was added in Level 2, all these values were added to CSS in Level 3, so why do we get some as keywords and others as hex values?

For the background-image, Firefox always returns the fully opaque values only as rgb(), while Chrome and Edge return them as either keywords or hex values, just like they do in the case when we read the custom properties directly.

Oh well, at least that lets us know we need to take into account different formats.

So the first thing we need to do is map the keywords to rgb() values. Not going to write all that manually, so a quick search finds this repo – perfect, it’s exactly what we want! We can now set that as the value of a CMAP constant.

The next step here is to create a getRGBA(c) function that would take a string representing a keyword, a hex or an rgb()/ rgba() value and return an array containing the RGBA values ([red, green, blue, alpha]).

We start by building our regular expressions for the hex and rgb()/ rgba() values. These are a bit loose and would catch quite a few false positives if we were to have user input, but since we’re only using them on CSS computed style values, we can afford to take the quick and dirty path here:

let re_hex = /^\#([a-f\d]{1,2})([a-f\d]{1,2})([a-f\d]{1,2})$/i,
    re_rgb = /^rgba?\((\d{1,3},\s){2}\d{1,3}(,\s((0|1)?\.?\d*))?\)/;

Then we handle the three types of values we’ve seen we might get by reading the computed styles:

if(c in CMAP) return CMAP[c]; // keyword lookup, return rgb
	
if([4, 7].indexOf(c.length) !== -1 && re_hex.test(c)) {
  c = c.match(re_hex).slice(1); // remove the '#'
  if(c[0].length === 1) c = c.map(x => x + x);
	// go from 3-digit form to 6-digit one
  c.push(1); // add an alpha of 1

  // return decimal valued RGBA array
  return c.map(x => parseInt(x, 16)) 
}
	
if(re_rgb.test(c)) {
  // extract values
  c = c.replace(/rgba?\(/, '').replace(')', '').split(',').map(x => +x.trim());
  if(c.length === 3) c.push(1); // if no alpha specified, use 1

  return c // return RGBA array
}

Now after adding the keyword to RGBA map (CMAP) and the getRGBA() function, our JavaScript code doesn’t change much from the previous examples:

const INI = getRGBA(S.getPropertyValue('--c-ini').trim()), 
      FIN = getRGBA(S.getPropertyValue('--c-fin').trim()), 
      RANGE = [], 
      ALPHA = 1 - INI[3] || 1 - FIN[3];

/* same as before */

function update() {
  /* same as before */
  
  document.body.style.setProperty(
    '--c', 
    `rgb${ALPHA ? 'a' : ''}(
      ${INI.map((c, i) => Math.round(c + k*RANGE[i])).join(',')})`
  );
  
  /* same as before */
};

(function init() {
  if(!ALPHA) INI.pop(); // get rid of alpha if always 1
  RANGE.splice(0, 0, ...INI.map((c, i) => FIN[i] - c));
})();

/* same as before */

This gives us a linear gradient animation:

See the Pen by thebabydino (@thebabydino) on CodePen.

We can also use a different, non-linear timing function, for example one that allows for a bounce at the end:

const E = .8*Math.PI;

/* same as before */

function timing(k) {
  return Math.sin(k*E)/Math.sin(E)
}

function update() {
  /* same as before */
  
  document.body.style.setProperty(
    '--c', 
    `rgb${ALPHA ? 'a' : ''}(
      ${INI.map((c, i) => Math.round(c + timing(k)*RANGE[i])).join(',')})`
  );
  
  /* same as before */
};

/* same as before */

This means we go all the way to a kind of blue before going back to our final violet:

See the Pen by thebabydino (@thebabydino) on CodePen.

Do note however that, in general, RGBA transitions are not the best place to illustrate bounces. That’s because the RGB channels are strictly limited to the [0,255] range and the alpha channel is strictly limited to the [0,1] range. rgb(255, 0, 0) is as red as red gets, there’s no redder red with a value of over 255 for the first channel. A value of 0 for the alpha channel means completely transparent, there’s no greater transparency with a negative value.

By now, you’re probably already bored with gradients, so let’s switch to something else!

Smooth changing SVG attribute values

At this point, we cannot alter the geometry of SVG elements via CSS. We should be able to as per the SVG2 spec and Chrome does support some of this stuff, but what if we want to animate the geometry of SVG elements now, in a more cross-browser manner?

Well, you’ve probably guessed it, JavaScript to the rescue!

Growing a circle

Our first example is that of a circle whose radius goes from nothing (0) to a quarter of the minimum viewBox dimension. We keep the document structure simple, without any other aditional elements.

<svg viewBox='-100 -50 200 100'>
  <circle/>
</svg>

For the JavaScript part, the only notable difference from the previous demos is that we read the SVG viewBox dimensions in order to get the maximum radius and we now set the r attribute within the update() function, not a CSS variable (it would be immensely useful if CSS variables were allowed as values for such attributes, but, sadly, we don’t live in an ideal world):

const _G = document.querySelector('svg'), 
      _C = document.querySelector('circle'), 
      VB = _G.getAttribute('viewBox').split(' '), 
      RMAX = .25*Math.min(...VB.slice(2)), 
      E = .8*Math.PI;

/* same as before */

function update() {
  /* same as before */
  
  _C.setAttribute('r', (timing(k)*RMAX).toFixed(2));
  
  /* same as before */
};

/* same as before */

Below, you can see the result when using a bounce-fin kind of timing function:

See the Pen by thebabydino (@thebabydino) on CodePen.

Pan and zoom map

Another SVG example is a smooth pan and zoom map demo. In this case, we take a map like those from amCharts, clean up the SVG and then create this effect by triggering a linear viewBox animation when pressing the +/ - keys (zoom) and the arrow keys (pan).

The first thing we do in the JavaScript is create a navigation map, where we take the key codes of interest and attach info about what we do when the corresponding keys are pressed (note that we need different key codes for + and - in Firefox for some reason).

const NAV_MAP = {
  187: { dir:  1, act: 'zoom', name: 'in' } /* + */, 
   61: { dir:  1, act: 'zoom', name: 'in' } /* + Firefox ¯\_(ツ)_/¯ */, 
  189: { dir: -1, act: 'zoom', name: 'out' } /* - */, 
  173: { dir: -1, act: 'zoom', name: 'out' } /* - Firefox ¯\_(ツ)_/¯ */, 
   37: { dir: -1, act: 'move', name: 'left', axis: 0 } /* ⇦ */, 
   38: { dir: -1, act: 'move', name: 'up', axis: 1 } /* ⇧ */, 
   39: { dir:  1, act: 'move', name: 'right', axis: 0 } /* ⇨ */, 
   40: { dir:  1, act: 'move', name: 'down', axis: 1 } /* ⇩ */
}

When pressing the + key, what we want to do is zoom in. The action we perform is 'zoom' in the positive direction – we go 'in'. Similarly, when pressing the - key, the action is also 'zoom', but in the negative (-1) direction – we go 'out'.

When pressing the arrow left key, the action we perform is 'move' along the x axis (which is the first axis, at index 0) in the negative (-1) direction – we go 'left'. When pressing the arrow up key, the action we perform is 'move' along the y axis (which is the second axis, at index 1) in the negative (-1) direction – we go 'up'.

When pressing the arrow right key, the action we perform is 'move' along the x axis (which is the first axis, at index 0) in the positive direction – we go 'right'. When pressing the arrow down key, the action we perform is 'move' along the y axis (which is the second axis, at index 1) in the positive direction – we go 'down'.

We then get the SVG element, its initial viewBox, set the maximum zoom out level to these initial viewBox dimensions and set the smallest possible viewBox width to a much smaller value (let’s say 8).

const _SVG = document.querySelector('svg'), 
      VB = _SVG.getAttribute('viewBox').split(' ').map(c => +c), 
      DMAX = VB.slice(2), WMIN = 8;

We also create an empty current navigation object to hold the current navigation action data and a target viewBox array to contain the final state we animate the viewBox to for the current animation.

let nav = {}, tg = Array(4);

On 'keyup', if we don’t have any animation running already and the key that was pressed is one of interest, we get the current navigation object from the navigation map we created at the beginning. After this, we handle the two action cases ('zoom'/ 'move') and call the update() function:

addEventListener('keyup', e => {	
  if(!rID && e.keyCode in NAV_MAP) {
    nav = NAV_MAP[e.keyCode];
		
    if(nav.act === 'zoom') {
      /* what we do if the action is 'zoom' */
    }
		
    else if(nav.act === 'move') {
      /* what we do if the action is 'move' */
    }
		
    update()
  }
}, false);

Now let’s see what we do if we zoom. First off, and this is a very useful programming tactic in general, not just here in particular, we get the edge cases that make us exit the function out of the way.

So what are our edge cases here?

The first one is when we want to zoom out (a zoom in the negative direction) when our whole map is already in sight (the current viewBox dimensions are bigger or equal to the maximum ones). In our case, this should happen if we want to zoom out at the very beginning because we start with the whole map in sight.

The second edge case is when we hit the other limit – we want to zoom in, but we’re at the maximum detail level (the current viewBox dimensions are smaller or equal to the minimum ones).

Putting the above into JavaScript code, we have:

if(nav.act === 'zoom') {
  if((nav.dir === -1 && VB[2] >= DMAX[0]) || 
     (nav.dir ===  1 && VB[2] <= WMIN)) {
    console.log(`cannot ${nav.act} ${nav.name} more`);
    return
  }

  /* main case */
}

Now that we’ve handled the edge cases, let’s move on to the main case. Here, we set the target viewBox values. We use a 2x zoom on each step, meaning that when we zoom in, the target viewBox dimensions are half the ones at the start of the current zoom action, and when we zoom out they’re double. The target offsets are half the difference between the maximum viewBox dimensions and the target ones.

if(nav.act === 'zoom') {
  /* edge cases */
			
  for(let i = 0; i < 2; i++) {
    tg[i + 2] = VB[i + 2]/Math.pow(2, nav.dir);
    tg[i] = .5*(DMAX[i] - tg[i + 2]);
  }
}

Next, let’s see what we do if we want to move instead of zooming.

In a similar fashion, we get the edge cases that make us exit the function out of the way first. Here, these happen when we’re at an edge of the map and we want to keep going in that direction (whatever the direction might be). Since originally the top left corner of our viewBox is at 0,0, this means we cannot go below 0 or above the maximum viewBox size minus the current one. Note that given we’re initially fully zoomed out, this also means we cannot move in any direction until we zoom in.

else if(nav.act === 'move') {
  if((nav.dir === -1 && VB[nav.axis] <= 0) || 
     (nav.dir ===  1 && VB[nav.axis] >= DMAX[nav.axis] - VB[2 + nav.axis])) {
    console.log(`at the edge, cannot go ${nav.name}`);
    return
  }

  /* main case */

For the main case, we move in the desired direction by half the viewBox size along that axis:

else if(nav.act === 'move') {
  /* edge cases */
			
  tg[nav.axis] = VB[nav.axis] + .5*nav.dir*VB[2 + nav.axis]
}

Now let’s see what we need to do inside the update() function. This is going to be pretty similar to previous demos, except now we need to handle the 'move' and 'zoom' cases separately. We also create an array to store the current viewBox data in (cvb):

function update() {	
  let k = ++f/NF, j = 1 - k, cvb = VB.slice();
	
  if(nav.act === 'zoom') {		
    /* what we do if the action is zoom */
  }
	
  if(nav.act === 'move') {		
    /* what we do if the action is move */
  }
	
  _SVG.setAttribute('viewBox', cvb.join(' '));
	
  if(!(f%NF)) {
    f = 0;
    VB.splice(0, 4, ...cvb);
    nav = {};
    tg = Array(4);
    stopAni();
    return
  }
  
  rID = requestAnimationFrame(update)
};

In the 'zoom' case, we need to recompute all viewBox values. We do this with linear interpolation between the values at the start of the animation and the target values we’ve previously computed:

if(nav.act === 'zoom') {		
  for(let i = 0; i < 4; i++)
    cvb[i] = j*VB[i] + k*tg[i];
}

In the 'move' case, we only need to recompute one viewBox value – the offset for the axis we move along:

if(nav.act === 'move')	
  cvb[nav.axis] = j*VB[nav.axis] + k*tg[nav.axis];

And that’s it! We now have a working pan and zoom demo with smooth linear transitions in between states:

See the Pen by thebabydino (@thebabydino) on CodePen.

From sad square to happy circle

Another example would be morphing a sad square SVG into a happy circle. We create an SVG with a square viewBox whose 0,0 point is right in the middle. Symmetrical with respect to the origin of the SVG system of coordinates we have a square (a rect element) covering 80% of the SVG. This is our face. We create the eyes with an ellipse and a copy of it, symmetrical with respect to the vertical axis. The mouth is a cubic Bézier curve created with a path element.

- var vb_d = 500, vb_o = -.5*vb_d;
- var fd = .8*vb_d, fr = .5*fd;

svg(viewBox=[vb_o, vb_o, vb_d, vb_d].join(' '))
  rect(x=-fr y=-fr width=fd height=fd)
  ellipse#eye(cx=.35*fr cy=-.25*fr
              rx=.1*fr ry=.15*fr)
  use(xlink:href='#eye'
      transform='scale(-1 1)')
  path(d=`M${-.35*fr} ${.35*fr}
          C${-.21*fr} ${.13*fr}
           ${+.21*fr} ${.13*fr}
           ${+.35*fr} ${.35*fr}`)

In the JavaScript, we get the face and the mouth elements. We read the face width, which is equal to the height and we use it to compute the maximum corner rounding. This is the value for which we get a circle and is equal to half the square edge. We also get the mouth path data, from where we extract the initial y coordinate of the control points and compute the final y coordinate of the same control points.

const _FACE = document.querySelector('rect'), 
      _MOUTH = document.querySelector('path'), 
      RMAX = .5*_FACE.getAttribute('width'), 
      DATA = _MOUTH.getAttribute('d').slice(1)
                   .replace('C', '').split(/\s+/)
                   .map(c => +c), 
      CPY_INI = DATA[3], 
      CPY_RANGE = 2*(DATA[1] - DATA[3]);

The rest is very similar to all other transition on click demos so far, with just a few minor differences (note that we use an ease-out kind of timing function):

/* same as before */

function timing(k) { return 1 - Math.pow(1 - k, 2) };

function update() {
  f += dir;
	
  let k = f/NF, cpy = CPY_INI + timing(k)*CPY_RANGE;	
  
  _FACE.setAttribute('rx', (timing(k)*RMAX).toFixed(2));
  _MOUTH.setAttribute(
    'd', 
    `M${DATA.slice(0,2)}
     C${DATA[2]} ${cpy} ${DATA[4]} ${cpy} ${DATA.slice(-2)}`
  );
  
  /* same as before */
};

/* same as before */

And so we have our silly result:

See the Pen by thebabydino (@thebabydino) on CodePen.


Emulating CSS Timing Functions with JavaScript is a post from CSS-Tricks

Variable Fonts from Adobe Originals

Post pobrano z: Variable Fonts from Adobe Originals

It’s one thing to see a variable fonts demo (oooooo one font can change things like weight, width, and slant?) but it feels a lot more real when fonts you see and work with all the time go variable. Adobe made six of them available: Source Sans, Source Serif, Source Code, Myriad, Acumin, and Minion. You can’t serve them on the web directly through TypeKit yet, but you can download them from GitHub to start playing.

Print designers have just as much reason to be excited, or perhaps more, as so long as you have software that supports variable fonts, you can use them right now:

Direct Link to ArticlePermalink


Variable Fonts from Adobe Originals is a post from CSS-Tricks

99 Best Advanced Photoshop Tutorials

Post pobrano z: 99 Best Advanced Photoshop Tutorials

Take your expertise to the next level with these advanced Photoshop tutorials.

99 of the Best Advanced Photoshop Tutorials

Photoshop is the tool of choice for many artists. Whether you’re a photographer, a designer, or any kind of creative, there is so much you can do with one program.

So in order to show you how endless the possibilities are, we present you with 99 of the best advanced Photoshop tutorials from around the web. Learn more about photo effects and manipulations, or try out a fun digital painting like those of your favorite artists.

Need a quick challenge? Try our Photoshop in 60 Seconds series to learn quick tips in under a minute!

Enjoy this collection of tutorials curated from Envato Tuts+ and friends.

Photo Effects

Live your life with beautiful filters better than Instagram. Adjust
the brightness and color scheme or just explore more fun tricks for
easier control.

Put your best face forward with these advanced photo effects to transform your images.

  • How to Make Your Photos Look Better Fast Photoshop Tutorial

    How to Make Your Photos Look Better Fast! Photoshop Tutorial

    Enhance your photos with these quick tips! YouTuber Peter McKinnon walks you through his process for editing photos. Learn about Adjustment Layers and more in this helpful video.

    Visit Tutorial

  • How To Create an Infrared Photo Effect in Adobe Photoshop

    How To Create an Infrared Photo Effect in Adobe Photoshop

    Master your photography skills with this Photoshop tutorial. Learn how
    to enhance your eye for breathtaking photos while tackling extraordinary
    infrared effects. Enjoy this breakdown from Chris Spooner.

    Visit Tutorial

  • How to Create a Smoke Effect in Photoshop

    How to Create a Smoke Effect in Photoshop

    Learn how to make a beautiful wispy smoke effect with this video. YouTuber LetsGettoIt uses Gradient Maps and more to achieve a fantastic result.

    Visit Tutorial

  • How to Make Optical Illusion Art in Adobe Photoshop

    How to Make Optical Illusion Art in Adobe Photoshop

    Grabbed from Adobe Creative Cloud’s
    YouTube Channel, this video shows you how to make a dope optical
    illusion using Photoshop. Twist your photos with mind-blowing patterns.

    Visit Tutorial

  • How to Create a Colored Pencil Sketch Effect Action in Adobe Photoshop

    How to Create a Colored Pencil Sketch Effect Action in Adobe Photoshop

    Create a handmade pencil sketch effect using Photoshop actions. Check out this deconstruction process from , involving amazing brushes and more.

    Visit Tutorial

  • How to Create a Rubber Stamp Effect in Adobe Photoshop

    How to Create a Rubber Stamp Effect in Adobe Photoshop

    Create a realistic rubber stamp effect using Photoshop brushes and textures. shows you how, using shape tools and more.

    Visit Tutorial

  • How to Create a 90s Graphical Photo Effect in Adobe Photoshop

    How to Create a 90s Graphical Photo Effect in Adobe Photoshop

    Follow along with as she shows you how to create this colorful and graphic photo effect. Use bold colors and abstract shapes to make your photos stand out.

    Visit Tutorial

  • How to Create a Color Dust Action in Adobe Photoshop

    How to Create a Color Dust Action in Adobe Photoshop

    Learn how to build a Color Dust Action with this Photoshop tutorial. gives you his process for creating an epic photo effect. Great for posters too!

    Visit Tutorial

  • How to Create an Awesome Dispersion Action in Adobe Photoshop

    How to Create an Awesome Dispersion Action in Adobe Photoshop

    You can create photo effects that are simply out of this world in Photoshop. In this tutorial, uses simple shapes and patterns to create a dispersion effect.

    Visit Tutorial

  • How to Create a Graffiti Effect in Adobe Photoshop

    How to Create a Graffiti Effect in Adobe Photoshop

    Test out a cool graffiti look with this Photoshop tutorial. In this tutorial, shows you how to use filters and adjustments to blend your portraits with graffiti art.

    Visit Tutorial

  • Make a Trendy Double Exposure Effect in Adobe Photoshop

    Make a Trendy Double Exposure Effect in Adobe Photoshop

    Recreate one of the biggest trends around with this fun double exposure tutorial. Instructor walks you through the process from start to finish. 

    Visit Tutorial

  • How to Create a Tous-Les-Memes-Inspired Isometric Scene Effect in Photoshop

    How to Create a Tous-Les-Memes-Inspired, Isometric Scene Effect in Photoshop

    Remake this wicked 3D kaleidoscope effect. Challenge yourself using tips for building the isometric scene.

    Visit Tutorial

  • Manipulate a Portrait Photo to Create a Splatter Paint Effect

    Manipulate a Portrait Photo to Create a Splatter Paint Effect

    Put your manipulation skills to the test with this paint splatter tutorial. Instructor shows you how to recreate traditional paint textures you can apply to any photo.

    Visit Tutorial

  • How to Shade Black and White Realistically in Digital Painting

    How to Shade Black and White Realistically in Digital Painting

    Follow along with to learn how to paint black and white the realistic way. Learn the tips and tricks to shading with value.

    Visit Tutorial

  • How to Create a Charcoal Drawing from a Photo With a Photoshop Action

    How to Create a Charcoal Drawing from a Photo (With a Photoshop Action)

    Photoshop Actions help you do more in less time. Create an incredible charcoal effect using this tutorial from .

    Visit Tutorial

  • How to Create a Dark Futuristic City in Adobe Photoshop

    How to Create a Dark Futuristic City in Adobe Photoshop

    Step into the future and build a remarkably lit city. This Photoshop tutorial from shows you how to create a Blade Runner effect we’re sure you’ll love.

    Visit Tutorial

  • How to Create a Rock Blast Effect Action in Adobe Photoshop

    How to Create a Rock Blast Effect Action in Adobe Photoshop

    Transform any ordinary photo with this rock blast effect. breaks down the process using filters and more.

    Visit Tutorial

Photo Manipulations

Think of a photo manipulation like a jigsaw puzzle. Once you find the right images, all you have to do is put the pieces together.

And we have jigsaw puzzles of all types for you to enjoy! Build any fantasy scene or magical composition using these helpful tutorials.

  • How to Create an Intense Composite of a Stone Tiger With Blue Flames

    How to Create an Intense Composite of a Stone Tiger With Blue Flames

    Master a stunning fiery scene with this photo manipulation tutorial.
    Create the initial composite with fire and nature stocks before adding
    amazing effects.

    Visit Tutorial

  • How to Create a Night Jungle Scenery in Photoshop

    How to Create a Night Jungle Scenery in Photoshop

    Create an enchanting composition with fairies and jungle elements. This
    tutorial shows you how to build the landscape from scratch before painting it with earthy colors.

    Visit Tutorial

  • How to Create a Big Bear Photo Manipulation

    How to Create a Big Bear Photo Manipulation

    Watch this video by YouTuber Rafy A
    to learn how to create this beautiful bear manipulation. Start with the
    sky and cloud shapes before adding the main subjects. Enjoy this
    incredible treat!

    Visit Tutorial

  • How to Make Your Photos Look Better Fast Photoshop Tutorial

    How to Create a Rainy Photo Manipulation

    Build a dark rainy scene in under 15 minutes! In this video, YouTuber Arunz Creation shows you how to make a rainy photo manipulation using Layer Masks.

    Visit Tutorial

  • Advanced Photo Manipulation Techniques Filters and Adjustments

    Advanced Photo Manipulation Techniques: Filters and Adjustments

    In this free course, learn how to use advanced photo manipulation techniques to create a fiery landscape. Lewis Moorhead shows you how to build the 3D object and landscape first before adding smoke and fire.

    Visit Tutorial

  • How to Create a Frankensteins Monster Photo Manipulation in Adobe Photoshop

    How to Create a Frankenstein’s Monster Photo Manipulation in Adobe Photoshop

    Master this spooky Frankenstein Monster manipulation from . Learn how to create the menacing expression along with extra tips for working with color.

    Visit Tutorial

  • How to Create a Cute Baby Dragon Photo Manipulation in Adobe Photoshop

    How to Create a Cute Baby Dragon Photo Manipulation in Adobe Photoshop

    Love dragons? Then try out this cute baby dragon manipulation from . Learn how to create a dragon using lizard stocks and filters.

    Visit Tutorial

  • How to Create a Pumpkin Coach Photo Manipulation in Adobe Photoshop

    How to Create a Pumpkin Coach Photo Manipulation in Adobe Photoshop

    Create an enchanting scene with this Cinderella-inspired tutorial from . Recreate this manipulation using 3D objects and layer blend modes.

    Visit Tutorial

  • How to Create a Dreamy Emotional Photo Manipulation Scene With Photoshop

    How to Create a Dreamy, Emotional Photo Manipulation Scene With Photoshop

    Or dive into this dreamy photo manipulation from . Learn how to create beautiful floating flower petals and so much more.

    Visit Tutorial

  • How to Create a Dragon Landscape Photo Manipulation With Adobe Photoshop

    How to Create a Dragon Landscape Photo Manipulation With Adobe Photoshop

    will guide you into a beautiful dragon landscape with this Photoshop tutorial. Learn how to create the mountainous landscape and adjust it with dark colors.

    Visit Tutorial

  • How to Create a Magical Butterfly Photo Manipulation With Adobe Photoshop

    How to Create a Magical Butterfly Photo Manipulation With Adobe Photoshop

    You can illustrate many beautiful scenes in Photoshop. Take this magical butterfly manipulation, for example. Learn how to master adjustment layers and more with this tutorial from .

    Visit Tutorial

  • How to Create a Glamorous Calavera Portrait in Adobe Photoshop

    How to Create a Glamorous Calavera Portrait in Adobe Photoshop

    Celebrate the Day of the Dead with this glamorous Calavera portrait tutorial. walks you through the steps to applying Calavera makeup to a photo.

    Visit Tutorial

  • How to Create a Mermaid in Adobe Photoshop

    How to Create a Mermaid in Adobe Photoshop

    Create a fantasy mermaid effect with this Photoshop tutorial. Follow along with as she shows you how to create the scales and fin.

    Visit Tutorial

  • How to Create an Emotional Molten Shattered Statue in Photoshop

    How to Create an Emotional, Molten, Shattered Statue in Photoshop

    Or tackle this legendary molten statue manipulation from . Great for advanced users, this tutorial is sure to be a fun challenge.

    Visit Tutorial

Design

Need a new website? Design it first in Photoshop! This next selection of tutorials features great designs for marketing, stationery, and promotional work.

Design a professional resume or your first blockbuster movie poster. Enjoy this next collection of design tutorials.

  • How to Create a Photoshop Website Design

    How to Create a Photoshop Website Design

    Every creative should have a website. Get started with this amazing design. Created by YouTuber Mir Rom, this design features a modern look with sleek office accents.

    Visit Tutorial

  • How to Create a Resume in Photoshop

    How to Create a Resume in Photoshop

    Design a winning resume in Photoshop. In this video, YouTuber Digital Roni shows you how to build a nice modern design under an hour. Follow along for great design tips.

    Visit Tutorial

  • How to Make a Movie Poster With Texture Background In Photoshop

    How to Make a Movie Poster With Texture Background In Photoshop

    You
    can rock any design you want, like this legendary movie poster.
    YouTuber Mir Rom shows you how with his step-by-step process using
    simple textures. Enjoy!

    Visit Tutorial

  • How to Design a Logo in Photoshop

    How to Design a Logo in Photoshop

    Sometimes designers like to work out their logos in Photoshop before
    transferring to Illustrator. Learn how to build a logo yourself using
    this video tutorial.

    Visit Tutorial

  • How to Design a Vintage Travel Poster in Adobe Illustrator and Photoshop

    How to Design a Vintage Travel Poster in Adobe Illustrator and Photoshop

    Show off your love of travel with a fun poster project. This tutorial from shows you how to create a vintage-inspired design using Illustrator and Photoshop.

    Visit Tutorial

  • How to Create a Hand-Lettered Housewarming Poster in Adobe Photoshop

    How to Create a Hand-Lettered Housewarming Poster in Adobe Photoshop

    Spread the love with this heartwarming poster tutorial. Instructor shows you how to create a delightful hand-lettered design with beautiful colors.

    Visit Tutorial

  • How to Create a Leather Stamp Logo Mockup in Adobe Photoshop

    How to Create a Leather Stamp Logo Mockup in Adobe Photoshop

    Logo mockups help you present your work in a clean, professional way. Learn how to create your own with help from .

    Visit Tutorial

  • How to Make Your Photos Look Better Fast Photoshop Tutorial

    How to Create an Isometric Map Mockup Action in Adobe Photoshop

    delivers an awesome Photoshop action to create easier isometric maps. Learn the benefits of using actions to create amazing infographics.

    Visit Tutorial

  • Design a Floral Pattern for Fabric in Adobe Photoshop

    Design a Floral Pattern for Fabric in Adobe Photoshop

    Bring out your passion for pattern design with this tutorial. walks you through the steps of creating a handmade floral pattern.

    Visit Tutorial

  • How to Create and Apply a Tropical Seamless Pattern in Adobe Photoshop

    How to Create and Apply a Tropical Seamless Pattern in Adobe Photoshop

    Get tropical with this lovely seamless pattern tutorial by . Learn how to use custom shapes to create colorful flowers and fruit.

    Visit Tutorial

  • Design a Shopify Theme for Handcrafted Goods in Photoshop

    Design a Shopify Theme for Handcrafted Goods in Photoshop

    Launch an online store today! Design a Shopify theme using Adobe Photoshop. Learn more about color theory and proportion with this thorough lesson.

    Visit Tutorial

  • How to Create a Retro Vintage Badge in Adobe Photoshop

    How to Create a Retro Vintage Badge in Adobe Photoshop

    Or practice your skills with this retro badge design. Add that old vintage touch to your design using tips and tricks from .

    Visit Tutorial

  • How to Design a Bollywood-Inspired Poster to Celebrate Hindu New Year

    How to Design a Bollywood-Inspired Poster to Celebrate Hindu New Year

    Try out this poster design featuring an energetic Bollywood theme from . Use it for any major celebration or event. Enjoy!

    Visit Tutorial

  • How to Create Flat Pirate Icons in Adobe Photoshop

    How to Create Flat Pirate Icons in Adobe Photoshop

    This last design tutorial shows you how to make trendy flat icons in Adobe Photoshop. helps you design the pirate theme complete with a treasure-chest icon.

    Visit Tutorial

Text Effects

Text effect tutorials are one of the best ways to get started in Photoshop. But they’re even better for helping you master it. So clear out the cobwebs in your inspiration department and try a realistic text effect!

Step up your game with Layer Styles and design epic typography.

  • How to Create a Splashing Water Text Effect

    How to Create a Splashing Water Text Effect

    Photoshop’s 3D tools are still new to many designers. Try out this splashing water text effect from fellow instructor Rose. Spend the afternoon tinkering away at this lovely design.

    Visit Tutorial

  • How to Create 80s Text Effect in Adobe Photoshop

    How to Create 80s Text Effect in Adobe Photoshop

    Everyone’s lovin’ the 80s again and so are we! Join along with this text
    effect tutorial. A thoroughly broken down lesson, this tutorial will
    introduce you to incredible 3D typography and metallic effects.

    Visit Tutorial

  • How to Make 3D Text in Photoshop

    How to Make 3D Text in Photoshop

    Video tutorials are a great way to watch the design process unfold right
    before you. Check out this great video from Arunz Creation. Featuring
    3D tools and more, this Photoshop tutorial is one you’ll want to see.

    Visit Tutorial

  • How to Create a 3D Rock Text Effect

    How to Create a 3D Rock Text Effect

    Create awesome rock typography with this quick process video. Ismail El haddad shows you how to build the initial rock letters before finalizing it with vibrant plants. Enjoy!

    Visit Tutorial

  •  How to Create a Double Exposure Inspired Text Effect in Adobe Photoshop

    How to Create a Double Exposure Inspired Text Effect in Adobe Photoshop

    Try out this cool double exposure effect to improve your typography skills. delivers a stunning and modern aesthetic we’re sure you’ll love.

    Visit Tutorial

  • Dramatic Text on Fire Effect in Photoshop

    Dramatic Text on Fire Effect in Photoshop

    Challenge yourself with this text effect tutorial. brings you a brilliant effect using fire stocks and filters.

    Visit Tutorial

  • How to Create Stylized Hay Bale Typography in Adobe Photoshop

    How to Create Stylized Hay Bale Typography in Adobe Photoshop

    Step out of the box with this stylized hay bale tutorial. helps you create clever typography using Photoshop’s 3D features.

    Visit Tutorial

  • How to Create a 3D Chipped Painted Wood Text Effect in Adobe Photoshop

    How to Create a 3D Chipped, Painted Wood Text Effect in Adobe Photoshop

    breaks down her method for this 3D chipped wood effect in this tutorial. Get better acquainted with Photoshop’s 3D features in this detailed lesson.

    Visit Tutorial

  • Create a Marvelously British Scone Text Effect in Adobe Photoshop

    Create a Marvelously British Scone Text Effect in Adobe Photoshop

    Studying food is a great way to practice realism. Create a tasty British scone using this amazing tutorial by .

    Visit Tutorial

  •  How to Create a Fluffy Feathery Ugly Duckling Text Effect in Adobe Photoshop

    How to Create a Fluffy, Feathery Ugly Duckling Text Effect in Adobe Photoshop

    Achieve amazing realism with this feather-inspired tutorial. guides you through the process using simple textures, modified tips, and more.

    Visit Tutorial

  • How to Create a Tasty 3D Typographic Illustration in Photoshop

    How to Create a Tasty 3D Typographic Illustration in Photoshop

    We’ve got a mouth-watering treat for you with this typographic illustration. shows you how to complete this tasty, sweet typography using stocks and filters in Photoshop.

    Visit Tutorial

  • How to Create a Metallic 3D Spiky Text Effect in Adobe Photoshop

    How to Create a Metallic 3D Spiky Text Effect in Adobe Photoshop

    Channel your inner rocker with this metallic 3D text effect tutorial. Design the spiky effect from scratch using tips from instructor

    Visit Tutorial

  • Create Light Painted Typography From Scratch in Photoshop

    Create Light Painted Typography From Scratch in Photoshop

    Paint beautifully lit typography by hand. With a little patience and a lot of time, you can master this extraordinary effect by .

    Visit Tutorial

  • How to Create a 3D Shiny Inflated Text Effect in Adobe Photoshop

    How to Create a 3D, Shiny, Inflated Text Effect in Adobe Photoshop

    Celebrate 10 years of tutorials at Envato Tuts+ with this shiny 3D text effect. creates this stunning design using quality fonts and gradients.

    Visit Tutorial

  • How to Create a Colorful Explosion Text Effect in Adobe Photoshop

    How to Create a Colorful Explosion Text Effect in Adobe Photoshop

    This text effect packs a punch. Create a beautiful colorful explosion using smoke and texture overlays.

    Visit Tutorial

  • How to Create a Retro 3D Displaced Text Effect in Adobe Photoshop

    How to Create a Retro 3D Displaced Text Effect in Adobe Photoshop

    Mix 2D and 3D elements to imitate your favorite retro effects. This tutorial shows you how to create vibrant gradients and more.

    Visit Tutorial

  • How to Create a Galaxy Text Effect in Adobe Photoshop

    How to Create a Galaxy Text Effect in Adobe Photoshop

    Create an elegant galaxy text effect in this lesson. Learn how to use beautiful stocks to achieve a realistic effect.

    Visit Tutorial

  • How to Create a Trendy Marble and Rose Gold Text Effect in Adobe Photoshop

    How to Create a Trendy Marble and Rose Gold Text Effect in Adobe Photoshop

    Make an impact with a marble and rose gold text effect. This trendy style features a popular minimalist design that takes time to perfect. Try it out today!

    Visit Tutorial

Painting and Illustration

Digital art doesn’t have to be so hard. Just search around for tutorials that fit your learning style. These digital painting tutorials offer simple breakdowns for essential techniques.

Even great artists need more practice. Test out your knowledge with these awesome lessons.

  • How to Create a Fantasy Sword in Photoshop

    How to Create a Fantasy Sword in Photoshop

    Explore
    amazing game design techniques with instructor Javier Salas. Follow
    along as he breaks down the process of designing medieval-style swords
    based on animal references. Then give this lesson a try!

    Visit Tutorial

  • How to Digitally Paint a Beautiful Animal-headed Portrait

    How to Digitally Paint a Beautiful Animal-Headed Portrait

    Many find animals easier to paint, particularly cats. Do
    you? Their furry faces challenge artists to push themselves and better
    their hone drawing skills. And you can learn how with this painting
    tutorial. 

    Visit Tutorial

  • How to Create an 80s-Inspired Portrait in Photoshop

    How to Create an 80’s-Inspired Portrait in Photoshop

    Paint
    a gorgeous portrait inspired by 80s design with this fun lesson.
    KittoZutto walks you through her personal steps to delivering a stunning
    digital painting.

    Visit Tutorial

  • How to Create a Beautiful Bird Illustration

    How to Create a Beautiful Bird Illustration

    Illustrate a gorgeous swan using shadow and texture. This tutorial shows
    you how, along with several extra tips for developing more depth. Enjoy
    this lesson from instructor Andrew Lyons.

    Visit Tutorial

  • Create Stunning Iron Man Fan Art From Scratch in Photosho

    Create Stunning „Iron Man” Fan Art From Scratch in Photoshop

    In order to make digital paintings more realistic, you can incorporate photographic elements. Learn how with this Iron Man painting tutorial.

    Visit Tutorial

  • How to Create a Sign Language Digital Painting in Adobe Photoshop

    How to Create a Sign Language Digital Painting in Adobe Photoshop

    Spread love with a sign language painting and celebrate others. Learn how to use premium Photoshop brushes to achieve mood and realism with this tutorial by .

    Visit Tutorial

  • How to Paint Water Waves and the Ocean in Adobe Photoshop

    How to Paint Water, Waves, and the Ocean in Adobe Photoshop

    Painting water is a painstaking process for many artists. Learn the secret to achieving realistic ripples and shine in this tutorial.

    Visit Tutorial

  • How to Use Color to Set the Mood in Adobe Photoshop

    How to Use Color to Set the Mood in Adobe Photoshop

    Conquer your fear of color with this digital painting challenge. Use adjustment layers and more to create amazing color effects.

    Visit Tutorial

  • How to Use Color to Set the Mood in Adobe Photoshop

    How to Use Color to Set the Mood in Adobe Photoshop

    There are a few simple ways to change the mood of your digital paintings. Learn how to use Photoshop’s essential tools to add beautiful filters to your work.

    Visit Tutorial

  • How to Paint Realistic Skin in Adobe Photoshop

    How to Paint Realistic Skin in Adobe Photoshop

    How do you paint skin in Photoshop? It’s simpler than you think. Follow these thorough steps to paint natural hues and realistic skin tones.

    Visit Tutorial

  • How to Digitally Paint Faces With Incredible Likeness

    How to Digitally Paint Faces With Incredible Likeness

    Likeness is how much you’re able to capture the person you’re painting. Are the features the same? Do they line up? And how can you improve? Find out in this lesson by .

    Visit Tutorial

  • Sculpt Your Idea How to Quickly Paint a Snow Griffin in Adobe Photoshop

    Sculpt Your Idea: How to Quickly Paint a Snow Griffin in Adobe Photoshop

    Follow along with to paint a beautiful snow griffin in Photoshop. Learn how to sculpt a character using a simple texture brush and a few steps.

    Visit Tutorial

  • An Introduction to Painting Realistic Hair in Adobe Photoshop

    An Introduction to Painting Realistic Hair in Adobe Photoshop

    Paint beautiful, springy hair with this Photoshop tutorial. breaks down what it’s like to paint four different hair styles and textures. Enjoy!

    Visit Tutorial

  • 7 Exercises to Improve Your Digital Painting Skills

    7 Exercises to Improve Your Digital Painting Skills

    Learn seven essential tips to bring the best out of your work. breaks down a few common things we all go through while trying to master our technique.

    Visit Tutorial

  • How to Digitally Paint a Superhero Portrait in Adobe Photoshop

    How to Digitally Paint a Superhero Portrait in Adobe Photoshop

    Get inspired by this wicked X-men fan art. Learn how to develop a sketch and background using simple brushes and filters.

    Visit Tutorial

  • How to Create Dramatic Lighting in Your Digital Painting Portraits

    How to Create Dramatic Lighting in Your Digital Painting Portraits

    Stop stressing yourself out about lighting! You know more than you realize. Learn how to use Photoshop’s awesome tools to create dramatic lighting now.

    Visit Tutorial

  • How to Shade Black and White Realistically in Digital Painting

    How to Shade Black and White Realistically in Digital Painting

    Enhance your photos with these quick tips! YouTuber Peter McKinnon walks you through his process for editing photos. Learn about Adjustment Layers and more in this helpful video.

    Visit Tutorial

Animation

Love animation? Get started on your first cartoon in Photoshop. Take on these new challenges to bring your animations to life.

  • How to Illustrate Animals With 13 Circles

    How to Illustrate Animals With 13 Circles

    In this drawing challenge by Dorota Pankowska, she set out to draw several
    familiar animal designs using just 13 circles. Learn how to create one
    of these amazing animals yourself.

    Visit Tutorial

  • How to Make Your Pictures Come to Life using a Cinemagraph

    How to Make Your Pictures Come to Life using a Cinemagraph

    Nike said it best, Just do it. And in this awesome video,
    you’ll see Peter McKinnon create a cool cinemagraph effect in Adobe
    Photoshop. If you love photos and animation, you’ll definitely like this
    tutorial.

    Visit Tutorial

  • How to Create an Animated GIF in Photoshop

    How to Create an Animated GIF in Photoshop

    Jump-start your love for animation with this video from Adobe Creative Cloud. Learn how to create simple animations layer by layer in under a minute!

    Visit Tutorial

  • How to Draw an Animation in Photoshop

    How to Draw an Animation in Photoshop

    Learn how to draw dynamic movement frame by frame. Now is the time to make your animations come alive! Join YouTuber Finchwing for this Photoshop animation lesson.

    Visit Tutorial

  • Make an Animated Pumpkin Icon Using Pixel Art in Adobe Photoshop

    Make an Animated Pumpkin Icon Using Pixel Art in Adobe Photoshop

    This cute pumpkin will inspire you to get into animation. Join as you learn about pixel art animation techniques.

    Visit Tutorial

  • How to Create a Selective Animated Glitch Photo Effect in Adobe Photoshop

    How to Create a Selective Animated Glitch Photo Effect in Adobe Photoshop

    Create an incredible animation glitch effect with this tutorial by . Learn how to use the automated Content Aware Fill feature and more great tools.

    Visit Tutorial

  • How to Create an Animated Pixel Art Sprite in Adobe Photoshop

    How to Create an Animated Pixel Art Sprite in Adobe Photoshop

    Dive into this animated pixel art tutorial by . Follow closely as you learn how to build and animate your pixel art. Try something new today.

    Visit Tutorial

  • How to Create a Glitch Animated Gif Action in Adobe Photoshop

    How to Create a Glitch Animated Gif Action in Adobe Photoshop

    Glitch effects can be used on all types of photos for a unique-looking post. Try this tutorial by to learn how to animate this amazing effect from start to finish.

    Visit Tutorial

  • How to Create a Walking Kitten Animation In Adobe Photoshop

    How to Create a Walking Kitten Animation In Adobe Photoshop

    For cat lovers and friends, animate your favorite furry pals with this tutorial. breaks down the steps for a wonderful introduction to animation.

    Visit Tutorial

  • Create an Animated Interface GIF in Adobe Photoshop

    Create an Animated Interface GIF in Adobe Photoshop

    Learn how to design for better business. Create this animated GIF interface using the Timeline panel.

    Visit Tutorial

  • How to Create an Animated Pixel Art Video Game Sprite in Adobe Photoshop

    How to Create an Animated Pixel Art Video Game Sprite in Adobe Photoshop

    Run this happy bunny on a loop for a cute animation. shows you his methods for animating in Photoshop.

    Visit Tutorial

  • How to Create Animated Vector Icons in Adobe Illustrator and Photoshop

    How to Create Animated Vector Icons in Adobe Illustrator and Photoshop

    Tackle this super awesome vector icon animation created by . Watch as you take simple icons and turn them into magical animations in Photoshop.

    Visit Tutorial

  • How to Create Animation Assets in Adobe Photoshop

    How to Create Animation Assets in Adobe Photoshop

    Design your own animation assets using this Photoshop tutorial. Instructor guides you step by step through the storyboard and illustration process.

    Visit Tutorial

  • Create a Flight Animation From Scratch in Adobe Photoshop

    Create a Flight Animation From Scratch in Adobe Photoshop

    Take flight with this fascinating animation tutorial from . Draw a realistic bird flapping its wings for a lovely effect.

    Visit Tutorial

Advanced Photoshop Courses

Want to learn more? Get quality, step-by-step videos from our experts. Envato Tuts+ courses offer creatives access to thorough video lessons on your favorite subjects. Conquer Photoshop on your time.

Mastering the Filter Forge Plugin for Adobe Photoshop

Filter Forge is an impressive Photoshop plugin made with quality custom-made textures. In this course, instructor explores the incredible preset and shows you how to master its settings.

 

Digital Portrait Painting in Adobe Photoshop

Some believe that mastering realism takes a lifetime, but you can get pretty close with a few Photoshop tricks. Follow along with my Photoshop course to achieve better likeness and realism in your digital portraits. 

 

Advanced Photo Manipulation Techniques

Learn the best techniques around for fiery photo manipulations! Build a volcanic scene with instructor Lewis Moorhead. In this course, you’ll use patterns and custom textures to create a powerful manipulation.

 

Advanced Photo Manipulation for Advertisements

Follow up with this advanced photo manipulation course for aspiring advertisers. Get the industry information you need to know to design amazing ads. Try out the refreshing design yourself, using pro techniques from .