%body.trans-quick
.bg-word.trans-quick#behind
.bg-word.trans-quick#infront
#container
%button#last
%button#next
#card.trans-quick
%h1#word
%span#language
%p#description
%a{:href => "http://www.thebookoflife.org/untranslatable-words/", :target => "_blank"}
%img{:src => "https://s3-us-west-2.amazonaws.com/s.cdpn.io/380275/bookoflifelogo.png"}
View Compiled
$_bg: #AEE5D8;
$_copy: #555;
$_secondary: #e0b0d5;
$_card: #FFF;
$font-stack: 'Libre Baskerville', Georgia, serif;
$cardWidth: 21rem;
html, body {
height: 100%;
padding: 0;
margin: 0;
font-size: 18px;
}
body {
overflow: hidden;
background: $_bg url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/380275/paper-3.png") repeat fixed center;
font-family: $font-stack;
color: $_copy;
}
a {
width: 100px;
height: 100px;
z-index: 200;
position: absolute;
bottom: 0.2rem;
left: 0.2rem;
opacity: 0.3;
transition: all 0.2s;
}
a:hover {
opacity: 0.5;
}
a img{
padding: 0;
margin: 0;
height: 100%;
width: auto;
}
.trans-quick {
transition: all 0.4s;
}
#container {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
flex-direction: row;
}
.bg-word{
cursor: default;
padding: 2rem 0;
user-select: none;
font-size: 40vw;
line-height: 34vw;
word-wrap: break-word;
position: absolute;
top: 0; bottom: 0; left: 0; right: 0;
}
#behind {
color: $_secondary;
opacity: 0.3;
}
#infront {
color: $_copy;
opacity: 0.035;
z-index: 20;
}
#card {
overflow: hidden;
z-index: 10;
padding: 3rem;
width: 95vw;
max-width: $cardWidth;
min-height: 3 * $cardWidth / 4; //4:3 aspect ratio
box-shadow: 0 50px 70px -50px rgba(0, 0, 0, 0.45),
0 50px 200px -50px rgba(0, 0, 0, 0.5);
background: $_card;
display: flex;
align-items: flex-start;
justify-content: center;
flex-direction: column;
}
#card * {
transition: opacity 0.4s, text-shadow 0.8s, color 0.4s, transform 0s;
opacity: 1;
}
#word {
align-self: flex-end;
font-size: 2rem;
line-height: 1rem;
}
#language {
font-size: 1.1rem;
align-self: flex-end;
font-style: italic;
line-height: auto;
color: $_secondary;
}
#description {
width: 100%;
}
button {
margin: 20px;
width: 0px;
height: 0px;
z-index: 25;
background: transparent;
border-radius: 0;
outline: none;
border: none;
}
#last {
border-top: 20px solid transparent;
border-bottom: 20px solid transparent;
border-right: 20px solid rgba(255,255,255,0.5);
transition: 0.1s;
&:hover {
border-right: 20px solid rgba(255,255,255,0.9);
}
}
#next {
order: 3;
border-top: 20px solid transparent;
border-bottom: 20px solid transparent;
border-left: 20px solid rgba(255,255,255,0.5);
transition: 0.1s;
&:hover {
border-left: 20px solid rgba(255,255,255,0.9);
}
}
#container > button:active ~ #card{
transition: 0.05s 0s;
transform: translateY(0.5rem);
}
body.fadeout {
background: $_secondary url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/380275/paper-3.png") repeat fixed center;
}
body.fadeout .bg-word#infront {
opacity: 0;
}
#card.fadeout #word,
#card.fadeout #description,
#card.fadeout #language, {
opacity: 0;
color: transparent;
text-shadow: 0 0 5px rgba(0,0,0,0.5);
transform: translateY(-$cardWidth) scale(3);
transition: all 1.2s 0.1s, color 0.5s 0s, text-shadow 0.5s 0s;
}
#card.fadeout #description {
transform: translateY($cardWidth) translateX(-6rem) scale(2);
}
@media (max-width: 600px) {
a {
width: 50px;
height: 50px;
}
button{
padding: 0;
}
#last {
margin: 0 0.4rem 0 0;
}
#next {
margin: 0 0 0 0.4rem;
}
#card {
padding: 1rem;
min-height: 10rem;
}
#word {
font-size: 1.5rem;
}
#language, #description {
font-size: 0.8rem;
}
}
View Compiled
var words = [{
id: 1,
word: 'Forelsket',
language: 'Norwegian',
description: 'The indescribable euphoria experienced as you begin to fall in love.'
}, {
word: 'Saudade',
language: 'Portuguese',
description: 'A bitter-sweet melancholic yearning for something beautiful that is now gone.'
}, {
word: 'Eudaimonia',
language: 'Ancient Greek',
description: 'Often translated as ‘happiness’, it really means the deepest kind of fulfilment, often comprising a flourishing work and love life.'
}, {
word: 'Querencia',
language: 'Spanish',
description: 'A place where we feel safe, a ‘home’ from which we draw our strength and inspiration.'
}, {
word: 'Mono no aware',
language: 'Japanese',
description: 'An acute sensitivity to the transience of lovely things; a melancholic awareness that everything nice will fade combined with a rich enjoyment of this short-lived beauty.'
}, {
word: 'Dustsceawung',
language: 'Old English',
description: 'Contemplation of the fact that dust used to be other things – the walls of a city, the chief of the guards, a book, a great tree: dust is always the ultimate destination. Such contemplation may loosen the grip of our worldly desires.'
}, {
word: 'Yūgen',
language: 'Japanese',
description: 'A mood in which one feels that the universe as a whole possesses a mysterious, elusive, but real, beauty. Moonlight, snow on distant mountains, birds flying very high in the evening sky all feed this sensibility.'
}, {
word: 'Fika',
language: 'Swedish',
description: 'A traditional break from work usually involving a drink of coffee or tea. In Swedish offices, you are strongly expected to take a fika, no matter how busy you are. It’s democracy and community in a beverage.'
}, {
word: 'Iktsuarpok',
language: 'Inuit',
description: 'A feeling of edgy anticipation that makes one keep on looking out the window to see if an expected visitor is coming up the path.'
}, {
word: 'Ataraxia',
language: 'Ancient Greek',
description: 'A state of calm that Stoic philosophers aspired to. It’s a lack of agitation that comes from understanding the ways of the universe, accepting fate, knowing what one can control and focusing only on the things one can actually change.'
}, {
word: 'Wabi-Sabi',
language: 'Japanese',
description: 'The quality of being attractive because of being imperfect in some way. Instead of getting annoyed and upset by imperfections, wabi-sabi suggests that we should see the flaw itself as being part of what is charming.'
}, {
word: 'Verschlimmbessern',
language: 'German',
description: 'To accidentally make something worse in the process of attempting to mend or improve it.'
}, {
word: 'Ya’aburnee',
language: 'Arabic',
description: 'The desire to die before another person, because of how unbearable it would be to learn of their death.'
}, {
word: 'Gökotta',
language: 'Swedish',
description: 'To wake up early in the morning with the specific purpose of going outside to hear the first birds sing.'
}];
var body = document.body,
card = document.getElementById('card'),
cardWord = document.getElementById('word'),
cardLang = document.getElementById('language'),
cardDesc = document.getElementById('description'),
bgWordBehind = document.getElementById('behind'),
bgWordInfront = document.getElementById('infront'),
lastBtn = document.getElementById('last'),
nextBtn = document.getElementById('next'),
i = 0,
numWords = words.length,
cardUrl = 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/380275/lightpaperfibers.png',
cardImg = new Image();
bgWordBehind.textContent = words[i].word;
bgWordInfront.textContent = words[i].word;
cardWord.textContent = words[i].word;
cardLang.textContent = words[i].language;
cardDesc.textContent = words[i].description;
cardImg.onload = function() {
card.style.background = "#FFF url(" + cardUrl + ") repeat fixed center";
}
cardImg.src = cardUrl;
document.onkeydown = checkKey;
function checkKey(e) {
e = e || window.event;
if (e.keyCode == '37') {
goLeft();
} else if (e.keyCode == '39') {
goRight();
}
}
lastBtn.addEventListener("click", function(e) {
goLeft();
}, false);
nextBtn.addEventListener("click", function(e) {
goRight();
}, false);
function goLeft() {
if (i > 0)
i--;
else
i = numWords - 1;
changeCard();
}
function goRight() {
if (i < numWords - 1)
i++;
else
i = 0;
changeCard();
}
function changeCard() {
setTimeout(loadBG, 400);
setTimeout(loadCard, 900);
card.className += " fadeout";
body.className += " fadeout";
}
function loadBG() {
bgWordBehind.textContent = words[i].word;
bgWordInfront.textContent = words[i].word;
removeClass(body, "fadeout");
}
function loadCard() {
removeClass(card, "fadeout");
cardWord.textContent = words[i].word;
cardLang.textContent = words[i].language;
cardDesc.textContent = words[i].description;
}
//Function to easily remove classes, it takes two parameters:
//1. The element to have a class removed
//2. The name of the class we want to remove from our element
function removeClass(el, _class) {
//Check if the element exists,
//if it has a class,
//& specifically if it has the class we want to remove
if (el && el.className && el.className.indexOf(_class) >= 0) {
//Find the class to be removed (including any white space around it) using a regex search pattern
var pattern = new RegExp('\\s*' + _class + '\\s*');
//Replace that search with white space, therefore removing the class
el.className = el.className.replace(pattern, ' ');
}
}
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.