Hey guys! I decided to create this simple Film Review UI Concept! I hope you like it! Made using Angular JS! I got my inspiration from this Dribble shot - https://dribbble.com/shots/2335651-Hotel-profile-widget
A Pen by Jack Thomson on CodePen.
Hey guys! I decided to create this simple Film Review UI Concept! I hope you like it! Made using Angular JS! I got my inspiration from this Dribble shot - https://dribbble.com/shots/2335651-Hotel-profile-widget
A Pen by Jack Thomson on CodePen.
<html ng-app='filmReviewer' ng-cloak='true'> | |
<div class='container'> | |
<div class='card' ng-controller='filmController as vm'> | |
<div class='card_controls'> | |
<i class='material-icons' ng-click='vm.next()'>keyboard_arrow_right</i> | |
<i class='material-icons' ng-click='vm.prev()'>keyboard_arrow_left</i> | |
<div class='rating fade-in' ng-if='vm.id == film.id' ng-repeat='film in vm.films track by $index'> | |
<p>{{film.rating}}</p> | |
</div> | |
</div> | |
<div class='card_sub_information top-to-bottom' ng-if='vm.id == film.id' ng-repeat='film in vm.films track by $index'> | |
<h1>{{film.title}}</h1> | |
<p>{{film.genre}}</p> | |
<button ng-if='film.booking'>Book {{film.title}}</button> | |
<button ng-if='!film.booking'>Buy {{film.title}}</button> | |
</div> | |
<div class='card_overlay fade-in' ng-if='vm.id == film.id' ng-repeat='film in vm.films track by $index'> | |
<div class="img-container"> | |
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/217538/{{film.image}}.jpg" /> | |
</div> | |
<div class='card_overlay__information fade-in' ng-if='vm.id == film.id' ng-repeat='film in vm.films'> | |
<h1>{{film.title}}</h1> | |
<p>{{film.information}}</p> | |
<i class='material-icons'>query_builder</i> | |
<span>{{film.length}}</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
</html> |
(function() { | |
'use strict' | |
angular | |
.module('filmReviewer', ['ngAnimate']) | |
.controller('filmController', filmController) | |
function filmController() { | |
var vm = this, | |
index; | |
vm.id = 1; | |
vm.films = [{ | |
id: 1, | |
title: 'Ex Machina', | |
information: 'A young programmer is selected to participate in a ground-breaking experiment in synthetic intelligence by evaluating the human qualities of a breath-taking humanoid A.I', | |
rating: 9.8, | |
genre: 'Sci-fi', | |
length: '1h 50min', | |
image: 'ex-machina', | |
booking: false | |
}, { | |
id: 2, | |
title: 'Divergent', | |
information: 'In a world divided by factions based on virtues, Tris learns shes Divergent and wont fit in. When she discovers a plot to destroy Divergents, Tris and the mysterious Four must find out what makes Divergents dangerous before its too late', | |
rating: 7.9, | |
genre: 'Adventure', | |
length: '2h 20min', | |
image: 'divergent', | |
booking: true | |
}, { | |
id: 3, | |
title: 'Deadpool', | |
information: 'A former Special Forces operative turned mercenary is subjected to a rogue experiment that leaves him with accelerated healing powers, adopting the alter ego Deadpool', | |
rating: 9.5, | |
genre: 'Action', | |
length: '1h 48min', | |
image: 'deadpool', | |
booking: true | |
}]; | |
vm.next = next; | |
vm.prev = prev; | |
function next() { | |
if (vm.id < vm.films.length) { | |
vm.id++; | |
} else { | |
return false; | |
} | |
} | |
function prev() { | |
if (vm.id == 1) { | |
return false; | |
} else { | |
vm.id--; | |
} | |
} | |
} | |
})(); |
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.14/angular.min.js"></script> | |
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.14/angular-animate.min.js"></script> |
// General Variables | |
$bg-color: #D8DBE2; | |
$accent-color: #58A4B0; | |
$primary-color: #373F51; | |
$secondary-color: #FFF; | |
$easing: cubic-bezier(0.680, -0.550, 0.265, 1.550) 1s 0s; | |
// Card Variables | |
$c-width: 30em; | |
$c-height: $c-width - 10; | |
$c-shadow: 10px 10px 20px darken($bg-color, 9%); | |
* { | |
box-sizing: border-box; | |
margin: 0; padding :0; | |
font-family: 'Mallanna', sans-serif; | |
} | |
html { | |
overflow: hidden; | |
} | |
body { | |
background: $bg-color; | |
transform:translate3d(0,0,0); | |
} | |
.container { | |
display: flex; | |
justify-content: center; | |
align-items: center; | |
margin-top: 2.5em; | |
margin-left: 5em; | |
height: 100vh; | |
} | |
.card { | |
background: $secondary-color; | |
width: $c-width; | |
height: $c-height; | |
position: relative; | |
box-shadow: $c-shadow; | |
&_controls { | |
position: absolute; | |
right: 0; | |
i { | |
background: $primary-color; | |
color: #FFF; | |
font-size: 2.4em; | |
width: 2.09em; | |
height: 2.05em; | |
line-height: 2em; | |
text-align: center; | |
display: block; | |
cursor: pointer; | |
font-style: normal; | |
} | |
.rating { | |
background: $accent-color; | |
color: #FFF; | |
font-size: 2.4em; | |
width: 2.09em; | |
height: 2.05em; | |
line-height: 2em; | |
overflow: hidden; | |
position: absolute; | |
text-align: center; | |
cursor: pointer; | |
font-style: normal; | |
cursor: default; | |
p { | |
font-size: 0.7em; | |
} | |
} | |
} | |
&_sub_information { | |
position: absolute; | |
bottom: 0; | |
height: 26.4%; | |
width: 100%; | |
padding: 1em; | |
h1 { | |
color: $primary-color; | |
font-size: 1.2em; | |
} | |
p { | |
margin: -0.8em 0; | |
color: lighten($primary-color, 12%); | |
} | |
button { | |
background: $accent-color; | |
color: #FFF; | |
font-weight: 700; | |
text-transform: uppercase; | |
font-size: 0.6em; | |
border: none; | |
padding: 1em 1.5em; | |
cursor: pointer; | |
position: absolute; | |
right: 0; | |
top: 0; | |
margin: 2.5em 1.7em; | |
outline: none; | |
} | |
} | |
&_overlay { | |
background-size: cover; | |
position: absolute; | |
width: $c-width; | |
height: $c-height; | |
transform: translateX($c-width / -6) translateY($c-height / -3.8); | |
.img-container { | |
display: inline-block; | |
overflow: hidden; | |
position: absolute; | |
z-index: -1; | |
height: $c-height; | |
} | |
img { | |
display: block; | |
width: 100%;; | |
height: 100%; | |
object-fit: cover; | |
animation: zoom ease-in 20s forwards; | |
} | |
&__information { | |
background: rgba(0, 0, 0, 0.5); | |
height: 100%; | |
padding: 1em; | |
z-index: 1; | |
h1, p, i, span { | |
color: rgba(255, 255, 255, 1); | |
} | |
i { | |
margin: 0.9em 0; | |
border-radius: 100%; | |
cursor: default; | |
font-size: 1.4em; | |
vertical-align: middle; | |
} | |
span { | |
font-size: 0.9em; | |
} | |
} | |
} | |
} | |
// Animations | |
@keyframes rock { | |
0% { | |
transform: rotate(0deg); | |
} | |
50% { | |
transform: rotate(15deg); | |
} | |
100% { | |
transform: rotate(0deg); | |
} | |
} | |
@keyframes zoom { | |
from { | |
transform: scale(1); | |
} | |
to { | |
transform: scale(1.5); | |
} | |
} | |
// Fade In | |
.fade-in.ng-enter, .fade-in.ng-leave { | |
transition: opacity $easing; | |
} | |
.fade-in.ng-enter, | |
.fade-in.ng-leave.ng-leave-active { | |
opacity: 0; | |
} | |
.fade-in.ng-leave, | |
.fade-in.ng-enter.ng-enter-active { | |
opacity: 1; | |
} | |
// Top To Bottom | |
.top-to-bottom.ng-enter, .top-to-bottom.ng-leave { | |
transition: all $easing; | |
} | |
.top-to-bottom.ng-enter, | |
.top-to-bottom.ng-leave.ng-leave-active { | |
opacity: 0; | |
transform: translateY(1em); | |
} | |
.top-to-bottom.ng-leave, | |
.top-to-bottom.ng-enter.ng-enter-active { | |
opacity: 1; | |
transform: translateY(0); | |
} |