Wszystkie wpisy, których autorem jest admin
Power Fox
Smarty
Post pobrano z: Smarty

Cartoon Network – 25 Years
Post pobrano z: Cartoon Network – 25 Years

How to Draw a Nose
Post pobrano z: How to Draw a Nose

Drawing something from a reference is one thing, but if you want to draw from memory/imagination, you must really understand the topic beforehand. In this tutorial I will tell you everything you need to know about a human nose: how its anatomy can be simplified to forms and lines, and how to draw it in every view and style without a reference.
1. The Anatomy of a Human Nose
The nose consists of three parts: bone, cartilage, and connective tissue. Its upper half is all made of bone, an integral part of the skull:

The lower half is more complex and consists of:
- Alar cartilage (the ball of the nose)
- Lateral and septal cartilage
- The ala (the wings of the nose made of connective tissue)
- The nostrils (notice they’re made of two parts: the hole in the ball and in the wings)
- The philtrum (the groove connecting the nose with the lips)

All these elements can be turned into a 3D form:


Once you understand what this form looks like, you can rotate it and reshape it to create a nose from imagination.


But it’s still not easy to remember! Let’s simplify it to something easier to draw:
- The ball of the nose can be drawn as a sphere.
- The wings can be drawn as two smaller spheres.
- The septum can be drawn as a small sphere below the ball, behind it, and between the nostrils.
- The bridge can be drawn in two parts, to symbolically separate the bone from the cartilage.
- The tip of the nose is the upper part of the ball. You don’t always need to draw it, but it should be accentuated with shading. A great place to put some shine on!
- The sides of the nose should blend with the rest of the face, but the shading should gently reveal their shape.
- The root can be drawn as a „bent fan”.

2. Nose Shapes
This was a general „recipe” for a nose. But noses vary a lot among people! For example, we can talk about a „masculine” and a „feminine” nose. Traditionally, males are drawn with big, wide, roughly chiseled noses, and females with small, smooth, gentle ones.

However, this difference is mostly an artistic exaggeration (based on beauty standards and used to differentiate the „beautiful, feminine” characters from the „rough, masculine” ones) —both males and females can have various nose shapes that have nothing to do with their sex. It’s not unusual for a woman to have her father’s nose!
If you look at a nose in profile, there are lots of ways you can arrange the elements to create a nose. It can be pointing up or down, round or pointed, straight or humpy. There is not one perfect shape, „default” to all humans!

Noses can also differ in front view. Both the ball and the nostrils can have various sizes and proportions. Also, the nostrils can appear wide or tiny. Because the shape of a nose is mainly genetic, various ethnicities can have their own characteristic shape. Experimenting with the nose shape will therefore help you create unique characters, with a story hidden in their faces (you can make certain characters look related, or show their affiliation to a clan or tribe).

3. How to Draw a Nose in the Side View
Step 1
First, sketch the general shape of the nose as you imagine it. This will help you get an idea about the proportions of the elements you’ll need to draw later.

Step 2
Draw the ball in the front according to the shape you want to achieve.

Step 3
Draw the circle for the wing. Adjust its size to your vision.

Step 4
Draw the tiny circle for the septum. It should be placed slightly below the ball, at the back.

Step 5
Draw the nostril. Remember the two parts of it!

Step 6
Outline the bottom of the nose all the way down to the philtrum. „Cut” the upper part of the nose to create the root, and divide the rest roughly into halves.

Step 7
Outline the bridge and the tip.


Step 8
Draw the sides of the nose.


Step 9
Add the details.

Step 10
Draw the final lines and shade it, if you want to.


4. How to Draw a Nose in the Front View
Step 1
Sketch the general shape, adjusting the length and width of your imagined nose.

Step 2
Add the ball at the bottom.

Step 3
Sketch the circular wings.

Step 4
Add the small circle for the septum.

Step 5
Outline the nostrils. Remember that they’re 3D—they bend towards the front.

Step 6
„Cut off” the upper part of the nose to define the root. Mark the border between the two halves of the nose, too.

Step 7
Outline the bridge.


Step 8
Outline the sides.


Step 9
Add the details.

Step 10
Finish the drawing.


5. How to Draw a Nose in Perspective
Although drawing in perspective is considered difficult, there’s actually one rule you need to remember here: rotation from side to front creates an intermediate state between them. So you need to draw all the elements as a transition between one state and the other.
Step 1
Sketch the general shape of the nose. It should be an intermediate shape between the side and the front, depending on the angle of rotation.

Step 2
Draw the ball. Notice it’s almost on the side, but not really.

Step 3
Draw the circular wings. In the side view, they would cover each other. In the front view, there would be a distance between them. Here we have a compromise between these two states.

Step 4
Add the septum. It still needs to be under the ball, behind it, and between the wings.

Step 5
Sketch the outline of the nostrils. Remember the 3D shape!

Step 6
Draw a line along the nose, accentuating its 3D form. „Cut off” the top to create the root, and mark the middle of the bridge.

Step 7
Draw the bridge.


Step 8
Draw the sides.


Step 9
Add the details.

Step 10
Finish the nose.


6. Nose Styles
Drawing the nose in styles different than realism is pretty straightforward—you simply need to replace shading with lines. You can also ignore almost everything besides the ball, the wings, and the outline of the bridge. The simpler your style, the more elements you can safely ignore.

In cartoon styles, you can exaggerate visible elements of the nose. If the nose is pointed, you can make it almost sharp, if it’s small, you can make it tiny, and so on. This will let you accentuate the difference between the characters and will make drawing them easier.

In manga style, noses are almost non-existent, symbolic, which directly follows the simplification of other facial features (a detailed nose would bring attention to them being unrealistic). The simpler the variation of manga, the simpler the nose, with chibi being the extreme—no need to draw a nose at all!

Conclusion
Now you know how to draw a nose in any view and style you need! Do you want to learn more about drawing human characters? You may be interested in these tutorials, then:
DrawingHuman Anatomy Fundamentals: Basics of the FaceJoumana Medlej
IllustrationHuman Anatomy Fundamentals: Advanced Facial FeaturesJoumana Medlej
DrawingHuman Anatomy Fundamentals: Mastering Facial ExpressionsJoumana Medlej
Human AnatomyHuman Anatomy Fundamentals: Drawing Characters ConsistentlyJoumana Medlej
Or maybe you want to become better at drawing in general, but you don’t know exactly how? Check out these!
DrawingHow to DrawMonika Zagrobelna
Drawing100 Easy Drawing Tutorials for Beginners and Beyond!Monika Zagrobelna

Burning Animals / Une idée visuelle un peu cramée?
Post pobrano z: Burning Animals / Une idée visuelle un peu cramée?
![]() |
![]() |
| THE ORIGINAL? Robin Wood “stop forest fires” – 2016 “Destroying nature is destroying life”. Source : Cannes Lions SHORTLIST Agency : Grabarz & Partner (Germany) |
LESS ORIGINAL Polish National Fire Service – 2018 “Stop grass fire” Source : OSP.PL Agency : Unknown (Poland) |
Talk in Bern, Switzerland: What are your Career Options as a Freelancer?
Post pobrano z: Talk in Bern, Switzerland: What are your Career Options as a Freelancer?

If you live in Switzerland and read this blog, it’s about time we meet. On the 25th of April, there will be a good opportunity to meet at a talk I’ll be giving in Bern, at the Urbanfish coworking space.
For 45 minutes, I will give you an overview of the career paths that you can consider when working as a freelancer, followed by a short Q&A session. After that, drinks will be served and fun can start.
The talk
This is a talk you should attend if you are working as a freelancer or if you consider freelancing. I’ve been freelancing for 15 years now and I have experimented most ways to earn an income doing gigs, so I’ll be comparing freelancing careers and explain who should consider what path. For example, people who hate taking risks should not go full-time freelancer, but consider working part-time as an employee while freelancing on the side.
For each career path, I’ll be giving marketing advice. After all, the ultimate goal of freelancing is to make enough money to keep on going. Marketing yourself as a freelancer isn’t like marketing as a design studio, I will get into the differences to help you better focus on what works.
So if you are in Switzerland, don’t hesitate and attend the talk, I’ll be very happy to meet you there. You can register on the Swiss Tech Talks website.
Design deals for the week
Post pobrano z: Design deals for the week
Every week, we’ll give you an overview of the best deals for designers, make sure you don’t miss any by subscribing to our deals feed. You can also follow the recently launched website Type Deals if you are looking for free fonts or font deals.
EXCLUSIVE: 123 Best-Selling Fonts & 552 Premium Graphics and Logos
A Mighty Deals Exclusive!!! You won’t find this designer’s dream of a deal anywhere else on the Web. Packed with pure professional pop, this Mighty Bundle is overflowing with more than 120 fabulous fonts and over 550 graphics and logo templates. From badges to ornaments to illustrations, and everything from modern script to watercolor brush style fonts, this collection is all you’ll need to whip up your latest projects.
$15 instead of $1850 – Get it now!

250+ Royalty Free Stock Animation Video Assets
Create professional video animations in minutes with the VideoPlasty Stock Animation Bundle. With little to no experience required, with drag and drop simplicity! A huge library of more 250 premium quality stock animation video assets, basically our entire collection since launch!
$17 instead of $1730 – Get it now!

Love to craft bundle
The Love to Craft Bundle has arrived! It’s jam packed with popular Fonts, Monogram Frames, SVG’s cut files, Silhouettes, templates, digital papers and more.
$24 instead of $305 – Get it now!

Akwe Pro Font Family of 150+ Modern Typefaces
Professional. Versatile. Those are just two words to describe Akwe Pro. This professional, ultra versatile sans serif typeface sports a modern design with perfect legibility. Created for use in both short and long blocks of text, as well as headlines and user interfaces, this font family features more than 150 unique fonts that are just perfect for your latest branding challenge.
$24 instead of $299 – Get it now!

S&S Nickson Font Bundle of 15 Display, Script, Illustrations and More Typefaces
How would you like a collection of fonts that are strong enough to stand on their own, but creative enough to pair beautifully with one another? That’s exactly what you’ll get with the S&S Nickson Font Bundle Collection! Take home 15 different typefaces in a variety of creatively elegant styles including display fonts, script, illustrations, badges and more!
$12 instead of $25 – Get it now!

1 HTML Element + 5 CSS Properties = Magic!
Post pobrano z: 1 HTML Element + 5 CSS Properties = Magic!
Let’s say I told you we can get the results below with just one HTML element and five CSS properties for each. No SVG, no images (save for the background on the root that’s there just to make clear that our one HTML element has some transparent parts), no JavaScript. What would you think that involves?

Well, this article is going to explain just how to do this and then also show how to make things fun by adding in some animation.
CSS-ing the Gradient Rays
The HTML is just one <div>.
<div class='rays'></div>
In the CSS, we need to set the dimensions of this element and we need to give it a background so that we can see it. We also make it circular using border-radius:
.rays {
width: 80vmin; height: 80vmin;
border-radius: 50%;
background: linear-gradient(#b53, #f90);
}
And… we’ve already used up four out of five properties to get the result below:
See the Pen by thebabydino (@thebabydino) on CodePen.
So what’s the fifth? mask with a repeating-conic-gradient() value!
Let’s say we want to have 20 rays. This means we need to allocate $p: 100%/20 of the full circle for a ray and the gap after it.
Here we keep the gaps in between rays equal to the rays (so that’s .5*$p for either a ray or a space), but we can make either of them wider or narrower. We want an abrupt change after the ending stop position of the opaque part (the ray), so the starting stop position for the transparent part (the gap) should be equal to or smaller than it. So if the ending stop position for the ray is .5*$p, then the starting stop position for the gap can’t be bigger. However, it can be smaller and that helps us keep things simple because it means we can simply zero it.
repeating-conic-gradient() works (live).$nr: 20; // number of rays
$p: 100%/$nr; // percent of circle allocated to a ray and gap after
.rays {
/* same as before */
mask: repeating-conic-gradient(#000 0% .5*$p, transparent 0% $p);
}
Note that, unlike for linear and radial gradients, stop positions for conic gradients cannot be unitless. They need to be either percentages or angular values. This means using something like transparent 0 $p doesn’t work, we need transparent 0% $p (or 0deg instead of 0%, it doesn’t matter which we pick, it just can’t be unitless).

There are a few things to note here when it comes to support:
- Edge doesn’t support masking on HTML elements at this point, though this is listed as In Development and a flag for it (that doesn’t do anything for now) has already shown up in
about:flags.

The Enable CSS Masking flag in Edge. conic-gradient()is only supported natively by Blink browsers behind the Experimental Web Platform features flag (which can be enabled fromchrome://flagsoropera://flags). Support is coming to Safari as well, but, until that happens, Safari still relies on the polyfill, just like Firefox.

The Experimental Web Platform features flag enabled in Chrome. - WebKit browsers still need the
-webkit-prefix formaskproperties on HTML elements. You’d think that’s no problem since we’re using the polyfill which relies on -prefix-free anyway, so, if we use the polyfill, we need to include -prefix-free before that anyway. Sadly, it’s a bit more complicated than that. That’s because -prefix-free works via feature detection, which fails in this case because all browsers do supportmaskunprefixed… on SVG elements! But we’re usingmaskon an HTML element here, so we’re in the situation where WebKit browsers need the-webkit-prefix, but -prefix-free won’t add it. So I guess that means we need to add it manually:$nr: 20; // number of rays $p: 100%/$nr; // percent of circle allocated to a ray and gap after $m: repeating-conic-gradient(#000 0% .5*$p, transparent 0% $p); // mask .rays { /* same as before */ -webkit-mask: $m; mask: $m; }I guess we could also use Autoprefixer, even if we need to include -prefix-free anyway, but using both just for this feels a bit like using a shotgun to kill a fly.
Adding in Animation
One cool thing about conic-gradient() being supported natively in Blink browsers is that we can use CSS variables inside them (we cannot do that when using the polyfill). And CSS variables can now also be animated in Blink browsers with a bit of Houdini magic (we need the Experimental Web Platform features flag to be enabled for that, but we also need it enabled for native conic-gradient() support, so that shouldn’t be a problem).
In order to prepare our code for the animation, we change our masking gradient so that it uses variable alpha values:
$m: repeating-conic-gradient(
rgba(#000, var(--a)) 0% .5*$p,
rgba(#000, calc(1 - var(--a))) 0% $p);
We then register the alpha --a custom property:
CSS.registerProperty({
name: '--a',
syntax: '<number>',
initialValue: 1;
})
And finally, we add in an animation in the CSS:
.rays {
/* same as before */
animation: a 2s linear infinite alternate;
}
@keyframes a { to { --a: 0 } }
This gives us the following result:

Meh. Doesn’t look that great. We could however make things more interesting by using multiple alpha values:
$m: repeating-conic-gradient(
rgba(#000, var(--a0)) 0%, rgba(#000, var(--a1)) .5*$p,
rgba(#000, var(--a2)) 0%, rgba(#000, var(--a3)) $p);
The next step is to register each of these custom properties:
for(let i = 0; i < 4; i++) {
CSS.registerProperty({
name: `--a${i}`,
syntax: '<number>',
initialValue: 1 - ~~(i/2)
})
}
And finally, add the animations in the CSS:
.rays {
/* same as before */
animation: a 2s infinite alternate;
animation-name: a0, a1, a2, a3;
animation-timing-function:
/* easings from easings.net */
cubic-bezier(.57, .05, .67, .19) /* easeInCubic */,
cubic-bezier(.21, .61, .35, 1); /* easeOutCubic */
}
@for $i from 0 to 4 {
@keyframes a#{$i} { to { --a#{$i}: #{floor($i/2)} } }
}
Note that since we’re setting values to custom properties, we need to interpolate the floor() function.

It now looks a bit more interesting, but surely we can do better?
Let’s try using a CSS variable for the stop position between the ray and the gap:
$m: repeating-conic-gradient(#000 0% var(--p), transparent 0% $p);
We then register this variable:
CSS.registerProperty({
name: '--p',
syntax: '<percentage>',
initialValue: '0%'
})
And we animate it from the CSS using a keyframe animation:
.rays {
/* same as before */
animation: p .5s linear infinite alternate
}
@keyframes p { to { --p: #{$p} } }
The result is more interesting in this case:

But we can still spice it up a bit more by flipping the whole thing horizontally in between every iteration, so that it’s always flipped for the reverse ones. This means not flipped when --p goes from 0% to $p and flipped when --p goes back from $p to 0%.
The way we flip an element horizontally is by applying a transform: scalex(-1) to it. Since we want this flip to be applied at the end of the first iteration and then removed at the end of the second (reverse) one, we apply it in a keyframe animation as well—in one with a steps() timing function and double the animation-duration.
$t: .5s;
.rays {
/* same as before */
animation: p $t linear infinite alternate,
s 2*$t steps(1) infinite;
}
@keyframes p { to { --p: #{$p} } }
@keyframes s { 50% { transform: scalex(-1); } }
Now we finally have a result that actually looks pretty cool:

CSS-ing Gradient Rays and Ripples
To get the rays and ripples result, we need to add a second gradient to the mask, this time a repeating-radial-gradient().
repeating-radial-gradient() works (live).$nr: 20;
$p: 100%/$nr;
$stop-list: #000 0% .5*$p, transparent 0% $p;
$m: repeating-conic-gradient($stop-list),
repeating-radial-gradient(closest-side, $stop-list);
.rays-ripples {
/* same as before */
mask: $m;
}
Sadly, using multiple stop positions only works in Blink browsers with the same Experimental Web Platform features flag enabled. And while the conic-gradient() polyfill covers this for the repeating-conic-gradient() part in browsers supporting CSS masking on HTML elements, but not supporting conic gradients natively (Firefox, Safari, Blink browsers without the flag enabled), nothing fixes the problem for the repeating-radial-gradient() part in these browsers.
This means we’re forced to have some repetition in our code:
$nr: 20;
$p: 100%/$nr;
$stop-list: #000, #000 .5*$p, transparent 0%, transparent $p;
$m: repeating-conic-gradient($stop-list),
repeating-radial-gradient(closest-side, $stop-list);
.rays-ripples {
/* same as before */
mask: $m;
}
We’re obviously getting closer, but we’re not quite there yet:

To get the result we want, we need to use the mask-composite property and set it to exclude:
$m: repeating-conic-gradient($stop-list) exclude,
repeating-radial-gradient(closest-side, $stop-list);
Note that mask-composite is only supported in Firefox 53+ for now, though Edge should join in when it finally supports CSS masking on HTML elements.

If you think it looks like the rays and the gaps between the rays are not equal, you’re right. This is due to a polyfill issue.
Adding in Animation
Since mask-composite only works in Firefox for now and Firefox doesn’t yet support conic-gradient() natively, we cannot put CSS variables inside the repeating-conic-gradient() (because Firefox still falls back on the polyfill for it and the polyfill doesn’t support CSS variable usage). But we can put them inside the repeating-radial-gradient() and even if we cannot animate them with CSS keyframe animations, we can do so with JavaScript!
Because we’re now putting CSS variables inside the repeating-radial-gradient(), but not inside the repeating-conic-gradient() (as the XOR effect only works via mask-composite, which is only supported in Firefox for now and Firefox doesn’t support conic gradients natively, so it falls back on the polyfill, which doesn’t support CSS variable usage), we cannot use the same $stop-list for both gradient layers of our mask anymore.
But if we have to rewrite our mask without a common $stop-list anyway, we can take this opportunity to use different stop positions for the two gradients:
// for conic gradient
$nc: 20;
$pc: 100%/$nc;
// for radial gradient
$nr: 10;
$pr: 100%/$nr;
The CSS variable we animate is an alpha --a one, just like for the first animation in the rays case. We also introduce the --c0 and --c1 variables because here we cannot have multiple positions per stop and we want to avoid repetition as much as possible:
$m: repeating-conic-gradient(#000 .5*$pc, transparent 0% $pc) exclude,
repeating-radial-gradient(closest-side,
var(--c0), var(--c0) .5*$pr,
var(--c1) 0, var(--c1) $pr);
body {
--a: 0;
/* layout, backgrounds and other irrelevant stuff */
}
.xor {
/* same as before */
--c0: #{rgba(#000, var(--a))};
--c1: #{rgba(#000, calc(1 - var(--a)))};
mask: $m;
}
The alpha variable --a is the one we animate back and forth (from 0 to 1 and then back to 0 again) with a little bit of vanilla JavaScript. We start by setting a total number of frames NF the animation happens over, a current frame index f and a current animation direction dir:
const NF = 50;
let f = 0, dir = 1;
Within an update() function, we update the current frame index f and then we set the current progress value (f/NF) to the current alpha --a. If f has reached either 0 of NF, we change the direction. Then the update() function gets called again on the next refresh.
(function update() {
f += dir;
document.body.style.setProperty('--a', (f/NF).toFixed(2));
if(!(f%NF)) dir *= -1;
requestAnimationFrame(update)
})();
And that’s all for the JavaScript! We now have an animated result:

linear (live demo, only works in Firefox 53+).This is a linear animation, the alpha value --a being set to the progress f/NF. But we can change the timing function to something else, as explained in an earlier article I wrote on emulating CSS timing functions with JavaScript.
For example, if we want an ease-in kind of timing function, we set the alpha value to easeIn(f/NF) instead of just f/NF, where we have that easeIn() is:
function easeIn(k, e = 1.675) {
return Math.pow(k, e)
}
The result when using an ease-in timing function can be seen in this Pen (working only in Firefox 53+). If you’re interested in how we got this function, it’s all explained in the previously linked article on timing functions.
The exact same approach works for easeOut() or easeInOut():
function easeOut(k, e = 1.675) {
return 1 - Math.pow(1 - k, e)
};
function easeInOut(k) {
return .5*(Math.sin((k - .5)*Math.PI) + 1)
}
Since we’re using JavaScript anyway, we can make the whole thing interactive, so that the animation only happens on click/tap, for example.
In order to do so, we add a request ID variable (rID), which is initially null, but then takes the value returned by requestAnimationFrame() in the update() function. This enables us to stop the animation with a stopAni() function whenever we want to:
/* same as before */
let rID = null;
function stopAni() {
cancelAnimationFrame(rID);
rID = null
};
function update() {
/* same as before */
if(!(f%NF)) {
stopAni();
return
}
rID = requestAnimationFrame(update)
};
On click, we stop any animation that may be running, reverse the animation direction dir and call the update() function:
addEventListener('click', e => {
if(rID) stopAni();
dir *= -1;
update()
}, false);
Since we start with the current frame index f being 0, we want to go in the positive direction, towards NF on the first click. And since we’re reversing the direction on every click, it results that the initial value for the direction must be -1 now so that it gets reversed to +1 on the first click.
The result of all the above can be seen in this interactive Pen (working only in Firefox 53+).
We could also use a different alpha variable for each stop, just like we did in the case of the rays:
$m: repeating-conic-gradient(#000 .5*$pc, transparent 0% $pc) exclude,
repeating-radial-gradient(closest-side,
rgba(#000, var(--a0)), rgba(#000, var(--a1)) .5*$pr,
rgba(#000, var(--a2)) 0, rgba(#000, var(--a3)) $pr);
In the JavaScript, we have the ease-in and ease-out timing functions:
const TFN = {
'ease-in': function(k, e = 1.675) {
return Math.pow(k, e)
},
'ease-out': function(k, e = 1.675) {
return 1 - Math.pow(1 - k, e)
}
};
In the update() function, the only difference from the first animated demo is that we don’t change the value of just one CSS variable—we now have four to take care of: --a0, --a1, --a2, --a3. We do this within a loop, using the ease-in function for the ones at even indices and the ease-out function for the others. For the first two, the progress is given by f/NF, while for the last two, the progress is given by 1 - f/NF. Putting all of this into one formula, we have:
(function update() {
f += dir;
for(var i = 0; i < 4; i++) {
let j = ~~(i/2);
document.body.style.setProperty(
`--a${i}`,
TFN[i%2 ? 'ease-out' : 'ease-in'](j + Math.pow(-1, j)*f/NF).toFixed(2)
)
}
if(!(f%NF)) dir *= -1;
requestAnimationFrame(update)
})();
The result can be seen below:

Just like for conic gradients, we can also animate the stop position between the opaque and the transparent part of the masking radial gradient. To do so, we use a CSS variable --p for the progress of this stop position:
$m: repeating-conic-gradient(#000 .5*$pc, transparent 0% $pc) exclude,
repeating-radial-gradient(closest-side,
#000, #000 calc(var(--p)*#{$pr}),
transparent 0, transparent $pr);
The JavaScript is almost identical to that for the first alpha animation, except we don’t update an alpha --a variable, but a stop progress --p variable and we use an ease-in-out kind of function:
/* same as before */
function easeInOut(k) {
return .5*(Math.sin((k - .5)*Math.PI) + 1)
};
(function update() {
f += dir;
document.body.style.setProperty('--p', easeInOut(f/NF).toFixed(2));
/* same as before */
})();

We can make the effect more interesting if we add a transparent strip before the opaque one and we also animate the progress of the stop position --p0 where we go from this transparent strip to the opaque one:
$m: repeating-conic-gradient(#000 .5*$pc, transparent 0% $pc) exclude,
repeating-radial-gradient(closest-side,
transparent, transparent calc(var(--p0)*#{$pr}),
#000, #000 calc(var(--p1)*#{$pr}),
transparent 0, transparent $pr);
In the JavaScript, we now need to animate two CSS variables: --p0 and --p1. We use an ease-in timing function for the first and an ease-out for the second one. We also don’t reverse the animation direction anymore:
const NF = 120,
TFN = {
'ease-in': function(k, e = 1.675) {
return Math.pow(k, e)
},
'ease-out': function(k, e = 1.675) {
return 1 - Math.pow(1 - k, e)
}
};
let f = 0;
(function update() {
f = (f + 1)%NF;
for(var i = 0; i < 2; i++)
document.body.style.setProperty(`--p${i}`, TFN[i ? 'ease-out' : 'ease-in'](f/NF);
requestAnimationFrame(update)
})();
This gives us a pretty interesting result:

The post 1 HTML Element + 5 CSS Properties = Magic! appeared first on CSS-Tricks.
Museum of Websites
Post pobrano z: Museum of Websites
The team at Kapwing has collected a lot of images from the Internet Archive’s Wayback Machine and presented a history of how the homepage of popular websites like Google and the New York Times have changed over time. It’s super interesting.
I particularly love how Amazon has evolved from a super high information dense webpage that sort of looks like a blog to basically a giant carousel that takes over the whole screen.

Direct Link to Article — Permalink
The post Museum of Websites appeared first on CSS-Tricks.



