HTML preprocessors can make writing HTML more powerful or convenient. For instance, Markdown is designed to be easier to write and read for text documents and you could write a loop in Pug.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. So you don't have access to higher-up elements like the <html>
tag. If you want to add classes there that can affect the whole document, this is the place to do it.
In CodePen, whatever you write in the HTML editor is what goes within the <body>
tags in a basic HTML5 template. If you need things in the <head>
of the document, put that code here.
The resource you are linking to is using the 'http' protocol, which may not work when the browser is using https.
CSS preprocessors help make authoring CSS easier. All of them offer things like variables and mixins to provide convenient abstractions.
It's a common practice to apply CSS to a page that styles elements such that they are consistent across all browsers. We offer two of the most popular choices: normalize.css and a reset. Or, choose Neither and nothing will be applied.
To get the best cross-browser support, it is a common practice to apply vendor prefixes to CSS properties and values that require them to work. For instance -webkit-
or -moz-
.
We offer two popular choices: Autoprefixer (which processes your CSS server-side) and -prefix-free (which applies prefixes via a script, client-side).
Any URLs added here will be added as <link>
s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.
You can apply CSS to your Pen from any stylesheet on the web. Just put a URL to it here and we'll apply it, in the order you have them, before the CSS in the Pen itself.
You can also link to another Pen here (use the .css
URL Extension) and we'll pull the CSS from that Pen and include it. If it's using a matching preprocessor, use the appropriate URL Extension and we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
JavaScript preprocessors can help make authoring JavaScript easier and more convenient.
Babel includes JSX processing.
Any URL's added here will be added as <script>
s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.
You can apply a script from anywhere on the web to your Pen. Just put a URL to it here and we'll add it, in the order you have them, before the JavaScript in the Pen itself.
If the script you link to has the file extension of a preprocessor, we'll attempt to process it before applying.
You can also link to another Pen here, and we'll pull the JavaScript from that Pen and include it. If it's using a matching preprocessor, we'll combine the code before preprocessing, so you can use the linked Pen as a true dependency.
Search for and use JavaScript packages from npm here. By selecting a package, an import
statement will be added to the top of the JavaScript editor for this package.
Using packages here is powered by esm.sh, which makes packages from npm not only available on a CDN, but prepares them for native JavaScript ESM usage.
All packages are different, so refer to their docs for how they work.
If you're using React / ReactDOM, make sure to turn on Babel for the JSX processing.
If active, Pens will autosave every 30 seconds after being saved once.
If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.
If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.
Visit your global Editor Settings.
mixin claw(index)
.snorlax__foot-claw(class=`snorlax__foot-claw--${index}`)
div
.snorlax
.snorlax__head
.snorlax__head-outline
.snorlax__ear.snorlax__ear--left
.snorlax__ear.snorlax__ear--right
.snorlax__brow.snorlax__brow--left
.snorlax__brow.snorlax__brow--right
.snorlax__eye.snorlax__eye--left
.snorlax__eye.snorlax__eye--right
.snorlax__mouth
.snorlax__tooth.snorlax__tooth--left
.snorlax__tooth.snorlax__tooth--right
.snorlax__arm-left
.snorlax__arm-wrapper
.snorlax__claws--left
.snorlax__arm-left-arm
.snorlax__arm-right
.snorlax__claws--right
.snorlax__arm-right-arm
.snorlax__claw
.snorlax__body
.snorlax__body-shade
.snorlax__belly
.snorlax__belly-segment.snorlax__belly-segment--one
.snorlax__belly-segment.snorlax__belly-segment--two
.snorlax__left-foot
.snorlax__left-foot-foot
+claw('one')
+claw('two')
+claw('three')
.snorlax__right-foot
.snorlax__right-foot-foot
+claw('four')
+claw('five')
+claw('six')
*
*:after
*:before
box-sizing border-box
:root
// We know our img is 300x237
--size 60
--unit calc((var(--size) / 300) * 1vmin)
// colors
--belly hsl(39, 66%, 84%)
--dark-belly hsl(35, 29%, 59%)
--body hsl(164, 26%, 28%)
--dark-body hsl(199, 43%, 15%)
--foot hsl(21, 43%, 41%)
--claws hsl(0, 0%, 98%)
body
min-height 100vh
display flex
align-items center
background hsl(190, 70%, 30%)
justify-content center
.snorlax
*
*:after
*:before
position absolute
height calc(237 * var(--unit))
width calc(300 * var(--unit))
position relative
&:before
content ''
position absolute
bottom 0
width 100%
height 20%
border-radius 50%
filter blur(10px)
opacity 0.5
background #111
transform translate(-50%, 25%)
left 50%
&__body
border-radius 50% 45% 50% 50% / 68% 50% 28% 30%
height 74%
width 79%
border calc(2 * var(--unit)) solid black
background var(--body)
overflow hidden
top 60%
left 47%
transform translate(-50%, -50%)
&-shade
background var(--dark-body)
height 30%
width 80%
bottom 0
border-radius 50%
left 50%
transform translate(-50%, 50%)
&:after
content ''
position absolute
width 25%
height 150%
border-radius 50%
background var(--dark-body)
left 9%
bottom 24%
transform rotate(-22deg)
&__brow
background var(--belly)
&--left
width 50%
height 100%
left 5%
top 11%
border-radius 65% 47% 0 50%/70% 39% 0 44%
&--right
width 54%
height 100%
right 4%
top 10%
overflow hidden
border-radius 45% 80% 0 50%/72% 77% 0 44%
&:before
content ''
right 0
height 100%
width 32%
bottom 0
background var(--dark-belly)
z-index 2
&:after
content ''
right 16%
height 100%
width 32%
bottom 36%
background var(--belly)
z-index 3
border-radius 0 0 75% 0 / 0 0 36% 0
&__eye
height calc(2 * var(--unit))
width 15%
background black
top 33%
z-index 5
&--left
left 21%
&--right
right 25%
&__mouth
height calc(2 * var(--unit))
width 30%
background black
top 52%
left 48%
transform translate(-50%, 0)
&__tooth
background black
height 235%
width 20%
bottom 100%
$clip = polygon(0 100%, 50% 0, 100% 100%)
-webkit-clip-path $clip
clip-path $clip
&:after
content ''
background var(--claws)
height 100%
width 100%
$clip = polygon(0 100%, 50% 0, 100% 100%)
-webkit-clip-path $clip
clip-path $clip
transform-origin bottom center
transform scale(0.65)
&--left
left 0
&--right
right 0
&__head
height 30%
width 45%
left 50%
top 5%
transform translate(-50%, 0)
&__head-outline
background var(--body)
height 100%
width 100%
border calc(2 * var(--unit)) solid black
border-radius 75% 75% 25% 25% / 110% 110% 0% 0%
overflow hidden
&:after
content ''
right -5%
height 110%
width 15%
border-radius 50% / 50%
top -5%
background var(--dark-body)
&__ear
height 64%
border calc(2 * var(--unit)) solid black
background var(--body)
top -14%
width 35%
position absolute
overflow hidden
border-radius 15% 85% 0 10% / 20% 100% 0 80%
$clip = polygon(0 0, 100% 0, 100% 18%, 0 90%)
-webkit-clip-path $clip
clip-path $clip
&:before
content ''
top 0
left 0
background var(--body)
position absolute
z-index 2
height 100%
width 15%
border-radius 28%
transform-origin top center
transform rotate(-67deg) translate(11%, 23%)
&--left
left 4%
&--right
right 4%
top -15%
transform rotateY(180deg)
&:after
content ''
left -10%
width 25%
background var(--dark-body)
height 100%
top -10%
border-radius 50% / 50%
&__belly
position absolute
height 50%
width 82%
left 50%
top 0
transform translate(-49%, 0%)
&:after
content ''
position absolute
width 58%
height 50%
border-top calc(10 * var(--unit)) solid var(--belly)
top 90%
left 50%
clip-path polygon(5% 0, 79% 0, 90% 100%, 5% 100%)
transform translate(-50%, -26%)
z-index 3
border-radius 50% 50% 0 0/50% 50% 50% 50%
&__belly-segment
&--one
height 83%
width 100%
bottom 0%
left 0%
// border calc(2 * var(--unit)) solid black
background var(--belly)
transform-origin 0 100%
transform translate(6.5%, 13%) rotate(-20deg)
border-radius 40% 55% 0 17% / 60% 100% 0% 40%
$clip = polygon(0 0, 75% 0, 75% 100%, 0 100%)
-webkit-clip-path $clip
clip-path $clip
z-index 2
&:before
content ''
position absolute
top 100%
background var(--belly)
left 50%
height 80%
width 80%
border-radius 10%
transform translate(-50%, -81%) rotate(10deg)
&--two
height 90%
width 100%
bottom 0%
right 0%
transform-origin 100% 100%
background var(--dark-belly)
transform translate(-7%, 14%) rotate(20deg)
border-radius 0% 34% 34% 0 / 0% 60% 40% 0%
$clip = polygon(30% 0, 100% 0, 100% 150%, 30% 150%)
-webkit-clip-path $clip
clip-path $clip
&:after
content ''
position absolute
right 10%
top -4%
width 100%
height 102%
transform-origin right bottom
transform rotate(-2deg)
background var(--belly)
z-index 3
border-radius 0 14% 19% 0/0 50% 50% 0
&:before
content ''
background var(--belly)
position absolute
z-index 2
height 50%
width 50%
bottom 0
left 50%
transform translate(-50%, 31%) rotate(-20deg)
&__arm-left
height 85%
width 24%
left 12%
top 14%
transform rotate(-21deg)
&__claws--left
background black
top -4%
width 60%
height 10%
left 48%
$clip = polygon(7% 100%, 7% 39%, 25% 73%, 22% 11%, 39% 42%, 49% 0, 61% 46%, 74% 11%, 79% 58%, 95% 44%, 90% 100%)
-webkit-clip-path $clip
clip-path $clip
transform translate(-50%, 0)
&:after
content ''
width 100%
height 100%
$clip = polygon(7% 100%, 7% 39%, 25% 73%, 22% 11%, 39% 42%, 49% 0, 61% 46%, 74% 11%, 79% 58%, 95% 44%, 90% 100%)
-webkit-clip-path $clip
clip-path $clip
transform-origin bottom center
background white
transform scaleY(0.8) scaleX(0.95)
&__arm-left-arm
background var(--body)
height 68%
width 100%
top 0
left 0
border-radius 44% 54% 50% 50%/50% 60% 40% 50%
transform-origin 50% 60%
transform rotate(0deg)
overflow hidden
border calc(2 * var(--unit)) solid black
// animation wave 5s infinite ease
&:after
content ''
right 0
width 50%
background var(--dark-body)
height 120%
top 50%
transform translate(56%, -50%) rotate(-15deg)
border-radius 50%
$clip = inset(0 50% 0 0)
-webkit-clip-path $clip
clip-path $clip
animation fade 6s infinite linear
@keyframes fade
0%, 100%
opacity 1
50%
opacity 0
&__arm-wrapper
animation wave 6s infinite ease
height 100%
width 100%
transform-origin 56% 41%
@keyframes wave
0, 100%
transform rotate(0deg)
50%
transform rotate(-100deg)
&__arm-right
height 50%
width 17%
right 7%
top 28%
transform rotate(-39deg)
&__claw
bottom 0
width 15%
height 9%
background black
transform translate(109%, 19%) rotate(45deg)
$clip = polygon(0 0, 100% 0, 50% 100%)
-webkit-clip-path $clip
clip-path $clip
&:after
content ''
$clip = polygon(0 0, 100% 0, 50% 100%)
-webkit-clip-path $clip
clip-path $clip
height 100%
width 100%
background white
transform scale(0.5)
&__arm-right-arm
height 100%
width 100%
border-radius 25% 75% 65% 35%/56% 60% 40% 30%
background var(--dark-body)
overflow hidden
border calc(2 * var(--unit)) solid #000
&:after
content ''
height 100%
width 130%
border-radius 50%
background var(--body)
bottom 8%
left -9%
&__claws--right
bottom -6%
left 25%
height 22%
width 57%
background black
$clip = polygon(20% 0, 16% 100%, 35% 78%, 55% 97%, 63% 69%, 85% 78%, 85% 56%, 100% 66%, 100% 0)
-webkit-clip-path $clip
clip-path $clip
&:after
height 100%
width 100%
content ''
background white
$clip = polygon(20% 0, 16% 100%, 35% 78%, 55% 97%, 63% 69%, 85% 78%, 85% 56%, 100% 66%, 100% 0)
-webkit-clip-path $clip
clip-path $clip
transform-origin top center
transform scaleY(0.85) scaleX(0.85)
&__left-foot
height 34%
width 29%
bottom 0
left 2.5%
&__left-foot-foot
height 100%
width 100%
top 0
left 0
background var(--belly)
border-radius 60% 40% 55% 40%/60% 45% 55% 40%
border calc(2 * (var(--unit))) solid black
overflow hidden
&:after
&:before
content ''
&:after
border calc(2 * var(--unit)) solid black
height 38%
width 49%
border-radius 50%
background var(--foot)
left 38%
bottom 11%
transform rotate(-36deg)
&:before
background var(--dark-belly)
height 73%
width 100%
left 32%
bottom 0
transform-origin left center
border-radius 61% 20% 20% 37%/73% 50% 50% 50%
transform rotate(10deg)
&__foot-claw
top 50%
left 50%
width 20%
height 30%
&:after
content ''
background var(--claws)
bottom 12%
height 35%
width 67%
left 15%
border-radius 50%
&:before
content ''
bottom 2%
left 0
width 100%
height 56%
border-radius 50%
background var(--claws)
border calc(3 * var(--unit)) solid black
& > div
width 100%
height 66%
top 0
left 0
background black
$clip = 'polygon(0 100%, %s 0, 100% 100%)' % calc(var(--clip-point) * 1%)
-webkit-clip-path $clip
clip-path $clip
&:after
content ''
height 100%
width 100%
background var(--claws)
bottom 0
left 0
transform-origin bottom center
transform scale(0.7)
$clip = 'polygon(0 100%, %s 0, 100% 100%)' % calc(var(--clip-point) * 1%)
-webkit-clip-path $clip
clip-path $clip
&--one
--clip-point 65
left -5%
top 52%
transform rotate(-90deg)
width 15%
height 23%
&--two
--clip-point 50
top 9%
left 3%
height 26%
transform rotate(-45deg)
&--three
--clip-point 20
top -10%
left 34%
width 21%
height 25%
&--four
--clip-point 20
top -18%
left 49%
width 21%
height 34%
transform rotate(45deg)
&--five
--clip-point 50
top 0%
left 78%
width 21%
height 31%
transform rotate(40deg)
&--six
--clip-point 50
top 37%
left 95%
width 19%
height 27%
transform rotate(90deg)
&__right-foot
bottom 0
right 6.5%
width 28%
height 35%
&__right-foot-foot
height 100%
width 100%
border calc(2 * var(--unit)) solid black
background var(--belly)
overflow hidden
border-radius 50% 50% 50% 50% / 50% 45% 55% 50%
&:before
&:after
content ''
bottom 0
&:before
left 5%
border-radius 50%
height 62%
width 77%
background var(--dark-belly)
&:after
left 10%
border-radius 50%
border calc(2 * var(--unit)) solid #000
bottom 14%
height 42%
background var(--foot)
width 55%
// 404
Also see: Tab Triggers