A quick demo of how to use CSS to achieve a somewhat scroll-jacking experience.
Never do this.
A Pen by Jake Albaugh on CodePen.
A quick demo of how to use CSS to achieve a somewhat scroll-jacking experience.
Never do this.
A Pen by Jake Albaugh on CodePen.
<section id=s1> | |
<div> | |
<article> | |
<h1>Scroll Jacking with CSS</h1> | |
<p>Right now you are reading content inside of a fixed-position child of a relatively-positioned transparent area.</p> | |
<p>You are hovering over the transparent area (the white tint background) which is displaying this content. This fixed child content has a colored background image with a blend mode which appears to modify the original background image you saw before hover.</p> | |
<p>If you keep scrolling down you will see a line. If you hover beneath that line you will be hovering over the next section and it will make this content disappear.</p> | |
</article> | |
</div> | |
</section> | |
<section id=s2> | |
<div> | |
<article> | |
<h1>Changing Hover Areas</h1> | |
<p>You are now reading the second section's fixed content with a green background. This is because you are hovering over the second section (the white tint background).</p> | |
<p>If you didn't move your mouse and scrolled to get here, you may have noticed that the hover event doesn't fire until scrolling has completely stopped. This is default browser behavior.</p> | |
<p>This means you can quickly scroll to the bottom of the page and it will skip the sections along the way.</p> | |
</article> | |
</div> | |
</section> | |
<section id=s3> | |
<div> | |
<article> | |
<h1>Why This is Awesome</h1> | |
<p>As you can see, the result is pretty amazing for not using any Javascript. This goes to show you that CSS can do some pretty crazy things.</p> | |
</article> | |
</div> | |
</section> | |
<section id=s4> | |
<div> | |
<article> | |
<h1>Why This Sucks</h1> | |
<p>First off, you cant select this text because the "hover" section areas are sitting on top of it. This is because we need to hover event to make this work.</p> | |
<p>Secondly, this pen is useless if you aren't hovering over it, so you cant use this on a tablet or phone. Relying on hover is a terrible idea.</p> | |
</article> | |
</div> | |
</section> | |
<div class=default> | |
<h1>Hover if you know what's good for ya</h1> | |
</div> | |
<div class=bg></div> |
jakealbaughSignature("light"); |
<script src="http://codepen.io/jakealbaugh/pen/WvNjZB.js"></script> |
// section count | |
$sections: 4; | |
// width of svgs | |
$svg-w: 200px; | |
// kind of like a throttle, increase to add more scrolling | |
$section-height: 100vh; | |
// easing | |
$cubic-enter: cubic-bezier(1, 1.6, 0.3, 1); | |
$cubic-leave: cubic-bezier(0.32,-0.24, 0.24, 0.98); | |
// colors | |
$c-light: #D7D7CE; | |
$c-dark: #2A2B26; | |
// body height | |
body { | |
position: relative; // needed to stretch body to bottom | |
} | |
section { | |
// sizing our sections | |
height: $section-height; | |
width: 100%; | |
box-sizing: border-box; | |
position: relative; | |
// subtle white on hover | |
&::after { | |
content: ""; | |
position: absolute; | |
top: 0; | |
right: 0; | |
bottom: 0; | |
left: 0; | |
transition: background 250ms $cubic-leave; | |
z-index: 2; | |
} | |
&:hover { | |
// hide default message | |
~ .default { | |
opacity: 0; | |
visibility: hidden; | |
} | |
// show subtle white bg on section | |
&::after { | |
transition-timing-function: $cubic-enter; | |
background: rgba(#FFF,0.05); | |
} | |
} | |
// border reference between sections | |
+ section::before { | |
content: ""; | |
position: absolute; | |
top: 0; | |
left: 0; | |
width: 100%; | |
z-index: 99; | |
border-top: 1px solid rgba(#FFF,0.2); | |
} | |
// different backgorund color tints for each | |
@for $i from 1 through $sections { | |
&:nth-of-type(#{$i}) { | |
div { background-color: hsl((($i - 1) / $sections * 360), 50%, 50%); } | |
} | |
} | |
// section content | |
// this is displayed fixed all the time, | |
// but only visible when hovering over static section | |
div { | |
position: fixed; | |
opacity: 0; | |
top: 0; left: 0; right: 0; | |
height: 100vh; | |
transition: opacity 250ms linear; | |
background-blend-mode: multiply; | |
} | |
article { | |
width: 95%; | |
max-width: 600px; | |
position: absolute; | |
left: 50%; | |
top: 50%; | |
padding: 1rem 2rem; | |
box-sizing: border-box; | |
background: rgba(#000,0.9); | |
box-shadow: 0px 1px 0px 2px rgba(#FFF,0.05); | |
border-radius: 2px; | |
transform: translateX(-50%) translateY(0%); | |
transition: transform 500ms $cubic-leave; | |
} | |
h1 { | |
margin-top: 1rem; | |
} | |
// show content on hover (when scrolling over it) | |
// scroll to a switchpoint | |
// move your mouse to top and then bottom of window | |
// it should change the content because you are hovering | |
// over a different section | |
&:hover > div { | |
opacity: 1; | |
article { | |
transform: translateX(-50%) translateY(-50%); | |
} | |
} | |
} | |
section > div, | |
div.bg { | |
// .bg is the default background behind everything | |
// section > div is for each section because they all need to mix with bg color for blend mode | |
background-image: url(http://wallpaperspal.com/wp-content/uploads/Black-And-White-Chicago-Night-Wallpaper.jpg); | |
background-position: center; | |
background-size: cover; | |
} | |
div.default { | |
position: fixed; | |
width: 100%; | |
top: 50%; | |
transition: opacity 250ms; | |
} | |
div.bg { | |
position: fixed; | |
pointer-events: none; | |
top: 0; left: 0; right: 0; | |
height: 100vh; | |
background-blend-mode: multiply; | |
background-color: $c-dark; | |
z-index: -1; | |
} | |
// non essential style | |
body { | |
background-color: $c-dark; | |
color: $c-light; | |
} | |
h1 { | |
font-weight: 100; | |
width: 100%; text-align: center; | |
margin-top: 0; | |
} | |
p { | |
line-height: 1.6; | |
font-weight: 100; | |
} |