Created
July 9, 2022 10:28
-
-
Save hakxcore/90eb38c65ed1fbd449b6ac670ec2a5da to your computer and use it in GitHub Desktop.
Pure CSS Product Card
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #wrap | |
| %input.initial{:type => "checkbox"}/ | |
| %input.wheel1{:name => "wheel", :type => "radio"}/ | |
| %input.wheel2{:name => "wheel", :type => "radio"}/ | |
| %input.wheel3{:name => "wheel", :type => "radio"}/ | |
| %input.wheel4{:name => "wheel", :type => "radio"}/ | |
| %input.buy{:type => "checkbox"}/ | |
| %h1 Configure the Bike | |
| %h2 Added to Cart | |
| %h3 Wheels | |
| -4.times do | |
| .wheeltoggle | |
| .buy | |
| .toggle.expand | |
| %i.fas.fa-bicycle | |
| .toggle | |
| %i.fas.fa-bicycle | |
| .background | |
| .frame | |
| .rear | |
| .stem | |
| .shaft | |
| .seat | |
| .wheel.one.front | |
| .inner | |
| .wheel.one.back | |
| .inner |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| $ease1: cubic-bezier(0.75, 0.885, 0.32, 1); | |
| $p: #4e567d; | |
| $r: #ff6a5e; | |
| body { | |
| display: grid; | |
| place-items: center; | |
| height: 100vh; | |
| font-family: "Roboto"; | |
| background: lighten($p, 50%); | |
| #wrap { | |
| width: 800px; | |
| height: 550px; | |
| background: #efefef; | |
| box-shadow: 0 20px 40px -15px rgba(0, 0, 0, 0.25); | |
| position: relative; | |
| border-radius: 5px; | |
| overflow: hidden; | |
| display: grid; | |
| grid-template-columns: repeat(15, 1fr); | |
| grid-template-rows: repeat(15, 1fr); | |
| grid-column-gap: 0px; | |
| grid-row-gap: 0px; | |
| h1, | |
| h2 { | |
| grid-area: 4 / 10 / 5 / 15; | |
| color: #000; | |
| position: relative; | |
| z-index: 9; | |
| font-size: 28px; | |
| transition: 0.4s $ease1; | |
| text-align: right; | |
| opacity:0.25; | |
| } | |
| h2 { | |
| grid-area: 4 / 2 / 5 / 7; | |
| text-align: left; | |
| transform: translateY(100px); | |
| opacity: 0; | |
| } | |
| h3 { | |
| position: relative; | |
| z-index: 9; | |
| grid-area: 10 / 11 / 11 / 12; | |
| opacity: 0.25; | |
| transition: 0.4s $ease1; | |
| } | |
| .toggle { | |
| width: 30px; | |
| height: 30px; | |
| box-shadow: -5px 0 0 rgba(255, 255, 255, 0.15); | |
| z-index: 9; | |
| background: rgba(255, 255, 255, 0.05); | |
| position: relative; | |
| grid-area: 4 / 2 / 5 / 3; | |
| transition: 0.2s ease-in-out; | |
| &.expand { | |
| &:before { | |
| content: "IF Mode"; | |
| position: absolute; | |
| color: #fff; | |
| top: -40px; | |
| width: 100px; | |
| font-weight: 900; | |
| } | |
| } | |
| i { | |
| color: #fff; | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| } | |
| &:not(.expand) { | |
| margin-top: 40px; | |
| box-shadow: -5px 0 0 $r; | |
| i { | |
| transform: translate(-50%, -50%) rotate(-90deg); | |
| } | |
| } | |
| } | |
| input { | |
| cursor: pointer; | |
| opacity: 0; | |
| } | |
| .buy { | |
| grid-area: 14 / 3 / 15 / 5; | |
| background: $r; | |
| position: relative; | |
| height: 50px; | |
| left: 40px; | |
| border-radius: 3px; | |
| z-index: 9; | |
| transition: 0.2s ease-in-out; | |
| transform: translateY(200px); | |
| &:not(input) { | |
| pointer-events: none; | |
| animation: fadein 0.2s ease-in-out 1 forwards; | |
| @keyframes fadein { | |
| from { | |
| opacity: 0; | |
| } | |
| to { | |
| opacity: 1; | |
| } | |
| } | |
| &:after { | |
| content: "Buy Now"; | |
| position: absolute; | |
| width: 100%; | |
| height: 100%; | |
| box-shadow: 0 0 0 1px $r; | |
| border-radius: inherit; | |
| right: calc(100% + 10px); | |
| top: 0; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| color: $r; | |
| cursor: pointer; | |
| transition: 0.6s ease-in-out; | |
| transform: translateY(200px); | |
| } | |
| } | |
| &:before { | |
| content: "Check Out"; | |
| width: 100%; | |
| height: 100%; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| color: #fff; | |
| animation: buynow 1s ease-in-out 1 forwards; | |
| @keyframes buynow { | |
| 0% { | |
| opacity: 0; | |
| } | |
| 100% { | |
| opacity: 1; | |
| content: "Check Out"; | |
| } | |
| } | |
| } | |
| } | |
| input.initial { | |
| position: relative; | |
| grid-area: 4 / 2 / 5 / 3; | |
| z-index: 999; | |
| width: 30px; | |
| height: 70px; | |
| opacity: 0; | |
| &:first-of-type { | |
| &:hover { | |
| & ~ .toggle.expand { | |
| background: $r; | |
| } | |
| } | |
| } | |
| &:checked { | |
| pointer-events: none; | |
| & ~ .toggle:not(.expand) { | |
| transform: translateX(-100px); | |
| } | |
| & ~ input[type="radio"] { | |
| pointer-events: all; | |
| } | |
| & ~ .wheeltoggle, | |
| & ~ h3, & ~ h1 { | |
| filter: saturate(1); | |
| opacity: 1; | |
| } | |
| & ~ .buy { | |
| transform: translateY(0); | |
| min-width: 110px; | |
| transition-delay: 1s; | |
| &:after { | |
| transform: translateY(200px); | |
| } | |
| &:checked { | |
| transform: translateY(-250px); | |
| & ~ .toggle { | |
| opacity: 0; | |
| } | |
| & ~ .frame { | |
| .wheel { | |
| .inner { | |
| animation: wheelroll6 1.25s ease-in-out 1 forwards; | |
| } | |
| } | |
| } | |
| & ~ h2 { | |
| transform: translateY(0px); | |
| transition-delay: 0.4s; | |
| opacity: 1; | |
| } | |
| & ~ .wheeltoggle, | |
| & ~ h1, | |
| & ~ h3 { | |
| transform: translateY(100px); | |
| opacity: 0; | |
| } | |
| & ~ .wheeltoggle { | |
| @for $i from 1 through 4 { | |
| &:nth-of-type(#{$i}) { | |
| transition-delay: #{$i/20}s; | |
| } | |
| } | |
| } | |
| & ~ h3 { | |
| transition-delay: 0.1s; | |
| } | |
| & ~ .buy { | |
| animation: bounceback 1s ease-in-out 1 forwards; | |
| &:after { | |
| transition-delay: 0.3s; | |
| transform: translateY(0); | |
| opacity: 1; | |
| } | |
| &:before { | |
| animation: buynow2 1s ease-in-out 1 forwards; | |
| @keyframes buynow2 { | |
| 100% { | |
| content: "Back"; | |
| } | |
| } | |
| } | |
| @keyframes bounceback { | |
| 0% { | |
| transform: translateY(0px); | |
| } | |
| 50% { | |
| transform: translateY(200px); | |
| } | |
| 50.5% { | |
| transform: translateY(200px); | |
| opacity: 0; | |
| } | |
| 51% { | |
| transform: translateY(-200px); | |
| opacity: 0; | |
| } | |
| 100% { | |
| transform: translateY(-250px); | |
| } | |
| } | |
| } | |
| & ~ .frame:not(.two):not(i):not(.buy) { | |
| transform: scale(0.7) translateX(350px) translateY(50px); | |
| transition: 0.75s $ease1; | |
| transition-delay: 0.25s; | |
| } | |
| ~ .background { | |
| &:before { | |
| transition:transform 0.4s $ease1, left 0.4s $ease1 !important; | |
| transition-delay:0.4s, 0.8s !important; | |
| transform-origin:right; | |
| transform:scaleX(2) !important; | |
| left:-5%; | |
| } | |
| &:after { | |
| transform: scaleY(1.25) translateX(-40px) !important; | |
| transition-delay: 0.3s; | |
| } | |
| } | |
| } | |
| &:not(div) { | |
| pointer-events: all; | |
| z-index: 999; | |
| &:hover ~ .buy { | |
| transition-delay: 0s; | |
| background: darken($r, 10%); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| .wheeltoggle { | |
| box-shadow: 0 0 0 1px #efefef, 0 10px 20px -20px $p; | |
| border-radius: 3px; | |
| transition: 0.3s ease-in-out; | |
| pointer-events: none; | |
| filter: saturate(0); | |
| opacity: 0.5; | |
| background: #fff; | |
| z-index: 9; | |
| &:before { | |
| content: ""; | |
| position: absolute; | |
| width: 100%; | |
| height: 50px; | |
| top: 0; | |
| transition: 0.4s ease-in-out; | |
| } | |
| @for $i from 1 through 4 { | |
| &:nth-of-type(#{$i}) { | |
| &:after { | |
| content: "Wheel Type #{$i}"; | |
| position: absolute; | |
| width: 100%; | |
| top: 55px; | |
| font-size: 10px; | |
| text-align: center; | |
| line-height: 1.25; | |
| color: $p; | |
| text-transform: uppercase; | |
| } | |
| &:before { | |
| background: url(https://assets.codepen.io/383755/wheel#{$i}.png) | |
| 50% | |
| 50% / | |
| 80% | |
| auto | |
| no-repeat; | |
| } | |
| } | |
| } | |
| } | |
| input[type="radio"], | |
| .wheeltoggle { | |
| position: absolute; | |
| z-index: 999; | |
| width: 50px; | |
| height: 90px; | |
| z-index: 999; | |
| pointer-events: none; | |
| &.wheel1, | |
| &:not(input):nth-of-type(1) { | |
| grid-area: 11 / 14 / 12 / 15; | |
| } | |
| &.wheel2, | |
| &:not(input):nth-of-type(2) { | |
| grid-area: 11 / 13 / 12 / 14; | |
| } | |
| &.wheel3, | |
| &:not(input):nth-of-type(3) { | |
| grid-area: 11 / 12 / 12 / 13; | |
| } | |
| &.wheel4, | |
| &:not(input):nth-of-type(4) { | |
| grid-area: 11 / 11 / 12 / 12; | |
| } | |
| @for $i from 1 through 4 { | |
| &.wheel#{$i} { | |
| &:checked ~ .wheeltoggle { | |
| &:nth-of-type(#{$i}) { | |
| box-shadow: 0 0 0 1px $r, 0 10px 20px -30px $p; | |
| } | |
| } | |
| &:hover ~ .wheeltoggle { | |
| &:nth-of-type(#{$i}) { | |
| box-shadow: 0 0 0 1px #efefef, 0 10px 20px -10px $p; | |
| transform: scale(1.05); | |
| &:before { | |
| transform: rotate(180deg); | |
| } | |
| } | |
| } | |
| &:checked { | |
| & ~ .frame { | |
| > div.wheel { | |
| animation: wheelout#{$i} 0.75s ease-in-out 1 forwards 0.25s; | |
| .inner { | |
| &:before { | |
| background-image: url(https://assets.codepen.io/383755/wheel#{$i}.png); | |
| animation: wheelroll#{$i} 1s ease-in-out 1 forwards 0s; | |
| @keyframes wheelroll#{$i} { | |
| from { | |
| transform: rotate(0deg); | |
| } | |
| to { | |
| transform: rotate(720deg); | |
| } | |
| } | |
| @keyframes wheelroll6 { | |
| from { | |
| transform: rotate(0deg); | |
| } | |
| to { | |
| transform: rotate(360deg); | |
| } | |
| } | |
| } | |
| } | |
| &.back { | |
| animation: wheelback#{$i} 0.75s $ease1 1 forwards 0.25s; | |
| @keyframes wheelback#{$i} { | |
| 0% { | |
| transform: translate(0px); | |
| } | |
| 50% { | |
| transform: translateX(-700px); | |
| } | |
| 100% { | |
| transform: translate(0px); | |
| } | |
| } | |
| } | |
| @keyframes wheelout#{$i} { | |
| 0% { | |
| transform: translate(0px); | |
| } | |
| 50% { | |
| transform: translateX(700px); | |
| } | |
| 100% { | |
| transform: translate(0px); | |
| } | |
| } | |
| } | |
| > div:not(.wheel) { | |
| animation: jump#{$i} 0.75s $ease1 1 forwards 0.25s; | |
| @keyframes jump#{$i} { | |
| 0% { | |
| transform: translateY(0); | |
| } | |
| 50% { | |
| transform: translateY(-75px) rotate(-2.5deg); | |
| } | |
| 100% { | |
| transform: translateY(0); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| &:checked { | |
| & ~ .frame { | |
| > div:not(.wheel) { | |
| animation: jump 1s ease-in-out 1 forwards; | |
| } | |
| } | |
| } | |
| } | |
| input.initial:checked { | |
| & ~ .toggle { | |
| box-shadow: -5px 0 0 $r; | |
| &:not(.expand) { | |
| box-shadow: -5px 0 0 rgba(255, 255, 255, 0.15); | |
| } | |
| } | |
| & ~ *:not(.two):not(i):not(.buy):not(h1):not(h2):not(h3):not(.toggle) { | |
| transform: rotate(0deg); | |
| margin-left: 0px; | |
| *:not(.two):not(i):not(.buy):not(h1):not(h2):not(h3):not(.toggle) { | |
| transform: rotate(0deg); | |
| margin-left: 0px; | |
| &:before, | |
| &:after { | |
| transform: rotate(0deg); | |
| } | |
| } | |
| &.background { | |
| &:after { | |
| transform: scaleY(1.25) translateX(30px); | |
| } | |
| &:before { | |
| transition: 0.5s $ease1; | |
| } | |
| } | |
| &.frame { | |
| transform: scale(0.7) rotate(0deg) translateY(50px); | |
| margin-left: -25px; | |
| } | |
| &:before, | |
| &:after { | |
| transform: rotate(0deg); | |
| } | |
| } | |
| } | |
| * { | |
| transition: transform 0.3s $ease1, margin-left 0.3s $ease1; | |
| &.frame { | |
| transition: transform 0.6s $ease1, margin-left 0.4s $ease1; | |
| transition-delay: 0.2s, 0.4s; | |
| } | |
| &:before, | |
| &:after { | |
| transition: transform 0.3s $ease1, margin-left 0.3s $ease1; | |
| } | |
| } | |
| .background { | |
| position: absolute; | |
| width: 100%; | |
| height: 100%; | |
| left: 0; | |
| top: 0; | |
| background: $p; | |
| overflow: hidden; | |
| &:before { | |
| content: ""; | |
| position: absolute; | |
| width: 65%; | |
| height: 100%; | |
| left: 35%; | |
| top: 0; | |
| background: #fff; | |
| z-index: 2; | |
| transition: $ease1 0.5s ease-in-out; | |
| } | |
| &:after { | |
| content: "IF Mode"; | |
| position: absolute; | |
| z-index: 0; | |
| width: 100%; | |
| height: 80%; | |
| top: 10%; | |
| left: 50px; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| font-size: 200px; | |
| font-weight: 900; | |
| color: darken($p, 5%); | |
| transition: 1s ease-in-out; | |
| transform: scaleY(1.25); | |
| } | |
| } | |
| .frame { | |
| position: absolute; | |
| top: 60px; | |
| left: 85px; | |
| width: 427px; | |
| height: 365px; | |
| z-index: 2; | |
| transform-origin: 190px 210px; | |
| transform: scale(0.8) rotate(-62.5deg); | |
| div { | |
| position: absolute; | |
| background-size: cover; | |
| width: 100%; | |
| height: 100%; | |
| top: 0; | |
| left: 0; | |
| &.wheel { | |
| &.two, | |
| &.three, | |
| &.four { | |
| &.front { | |
| transform: translateX(700px); | |
| margin-left: 0px; | |
| } | |
| &.back { | |
| transform: translateX(-700px); | |
| } | |
| } | |
| &.front { | |
| transform-origin: 273px 190px; | |
| margin-left: -75px; | |
| transform: rotate(115deg); | |
| transition-delay: 0.5s, 0.8s; | |
| z-index: 2; | |
| } | |
| &.back { | |
| z-index: -1; | |
| .inner { | |
| left: -40px; | |
| } | |
| } | |
| .inner { | |
| position: absolute; | |
| width: 210px; | |
| height: 210px; | |
| border-radius: 100%; | |
| z-index: -1; | |
| top: 170px; | |
| left: 300px; | |
| &:before { | |
| content: ""; | |
| position: absolute; | |
| width: 100%; | |
| height: 100%; | |
| background-image: url("https://assets.codepen.io/383755/wheel1.png"); | |
| background-size: contain; | |
| transform: rotate(360deg); | |
| transition: transform 1.25s $ease1, | |
| background-image 0s ease-in-out; | |
| transition-delay: 0.1s, 0.5s; | |
| } | |
| } | |
| } | |
| &.rear { | |
| background-image: url("https://assets.codepen.io/383755/rear.png"); | |
| } | |
| &.stem { | |
| background-image: url("https://assets.codepen.io/383755/stem.png"); | |
| transform-origin: 273px 190px; | |
| margin-left: -105px; | |
| transform: rotate(115deg); | |
| transition-delay: 0.5s, 0.8s; | |
| } | |
| &.shaft { | |
| background-image: url("https://assets.codepen.io/383755/shaft.png"); | |
| transform-origin: 220px 200px; | |
| transform: translateX(-70px) translateY(40px); | |
| transition-delay: 0.8s; | |
| } | |
| &.seat { | |
| background-image: url("https://assets.codepen.io/383755/seat.png"); | |
| transform: translateY(100px) translateX(40px); | |
| transition: 0.4s ease-in-out; | |
| transition-delay: 0.65s; | |
| z-index: -1; | |
| } | |
| } | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" rel="stylesheet" /> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment