div.container
div.form
div.input-group
label Card Number
input(type="text").js-card-number
div.input-group
label Card Name
input(type="text").js-card-name
div.input-group
label Expire Date
input(type="text").js-card-expire-date
div.card
div.chip
div.card-informations
div.card-numbers
p.card-letter.card-number.first4 ••••
p.card-letter.card-number.second4 ••••
p.card-letter.card-number.third4 ••••
p.card-letter.card-number.fourth4 ••••
div.card-information
div.card-date-expire
p.date-expire__title Expires end
p.card-letter.date-expire__date ••/••
p.card-letter.card-name •••••••
div.logo
img(src="", alt="")
View Compiled
@import url('https://fonts.googleapis.com/css?family=Cutive+Mono|Rationale');
*{
box-sizing: border-box;
}
body,html{
height: 100%;
background-color: #eee;
}
.container{
display: flex;
justify-content: center;
padding: 3rem 2rem;
width: 80%;
margin: 0 auto;
}
.form{
margin-right: 5rem;
}
.input-group{
width: 100%;
display:flex;
flex-direction: column;
margin: .5rem;
}
.card{
background: linear-gradient(to bottom right,#2C3E50,#7f8c8d);
color: #ECECEC;
width: 8.5cm;
height: 5.4cm;
border-radius: 10px;
padding: .8cm .8cm .4cm;
}
.chip{
width: 1.1cm;
height: .8cm;
margin-top: 1cm;
margin-bottom: .3cm;
border: 1px solid gold;
border-radius: 5px;
}
.card-informations{
display: flex;
flex-wrap: wrap;
}
.card-numbers{
font-family: 'Rationale', sans-serif;
font-size: 18.90px;
height: 18.90px;
letter-spacing: 3.77px;
width: 6.8cm;
display: flex;
justify-content: space-between;
margin-bottom: .4cm;
}
.card-information{
font-family: 'Cutive Mono', monospace;
display: flex;
flex-direction: column;
font-size: .73rem;
}
.card-letter{
font-weight: bold;
text-transform: uppercase;
}
.card-date-expire{
display: flex;
align-self: center;
flex-direction: row;
align-items: center;
}
.card-date-expire > p{
display: inline-block;
}
.date-expire__title{
font-family: 'Arial', sans-serif;
font-size: .24375rem;
margin-right: 5px;
width: 20px;
text-align: right;
}
.card-name{
letter-spacing: 1px;
}
.logo{
width: 20%;
height: 40px;
margin-left: auto;
}
.logo img{
width: 100%;
}
const $cardNumber = document.querySelector(".js-card-number");
const $cardName = document.querySelector(".js-card-name");
const $cardExpireDate = document.querySelector(".js-card-expire-date");
const $logoImg = document.querySelector('.logo img')
const setTextOnElement = (element, text) => (element.textContent = text);
const setLogo = urlLogo => $logoImg.src = urlLogo
const logosUrl = {
master: 'https://seeklogo.com/images/M/MasterCard-logo-4C5D228602-seeklogo.com.png',
visa: 'https://upload.wikimedia.org/wikipedia/commons/5/5e/Visa_Inc._logo.svg'
}
const handleCardNumber = event => {
const number = event.target.value
const arrayOfNumbersBy4 = number.split(" ").map(number => number.substr(0,4));
const arrayLenght = arrayOfNumbersBy4.length;
/* Elems */
const $first4 = document.querySelector(".first4");
const $second4 = document.querySelector(".second4");
const $third4 = document.querySelector(".third4");
const $fourth4 = document.querySelector(".fourth4");
const resetNumbers = () => {
setTextOnElement($first4, 9999);
setTextOnElement($second4, 9999);
setTextOnElement($third4, 9999);
setTextOnElement($fourth4, 9999);
};
if (arrayLenght === 1 && !arrayOfNumbersBy4[0]) {
resetNumbers();
return;
}
debugger
if (arrayLenght === 1) {
setTextOnElement($first4, arrayOfNumbersBy4[0]);
if(arrayOfNumbersBy4[0] == 4){
setLogo(logosUrl.visa)
}
} else if (arrayLenght === 2) {
setTextOnElement($first4, arrayOfNumbersBy4[0]);
setTextOnElement($second4, arrayOfNumbersBy4[1]);
const firstNumber = arrayOfNumbersBy4[0].charAt(0)
const secondNumber = arrayOfNumbersBy4[0].charAt(1)
if(
(firstNumber == 5 && (secondNumber >= 1 && secondNumber <=5)) || (firstNumber == 2 && (secondNumber >= 2 && secondNumber <=7))
) {
setLogo(logosUrl.master)
}
/*
First digit must be 5 and second digit must be in the range 1 through 5 inclusive. The range is 510000 through 559999.
First digit must be 2 and second digit must be in the range 2 through 7 inclusive. The range is 222100 through 272099.
*/
} else if (arrayLenght === 3) {
setTextOnElement($first4, arrayOfNumbersBy4[0]);
setTextOnElement($second4, arrayOfNumbersBy4[1]);
setTextOnElement($third4, arrayOfNumbersBy4[2]);
} else if (arrayLenght === 4) {
setTextOnElement($first4, arrayOfNumbersBy4[0]);
setTextOnElement($second4, arrayOfNumbersBy4[1]);
setTextOnElement($third4, arrayOfNumbersBy4[2]);
setTextOnElement($fourth4, arrayOfNumbersBy4[3]);
}
};
const handleCardName = event => {
const regexValidation = /[A-Za-z]/gi
if(!regexValidation.test(event.key)) event.preventDefault()
const text = event.target.value
const $cardField = document.querySelector('.card-name')
setTextOnElement($cardField,text)
}
const handleExpireDate = event =>{
const $dateField = document.querySelector('.date-expire__date')
console.log($dateField)
const date = event.target.value
setTextOnElement($dateField,date)
}
VMasker($cardNumber).maskPattern("9999 9999 9999 9999");
VMasker($cardExpireDate).maskPattern("99/99");
$cardNumber.addEventListener("keyup", handleCardNumber);
$cardExpireDate.addEventListener("keydown", handleExpireDate);
$cardName.addEventListener('keyup',handleCardName)
View Compiled
This Pen doesn't use any external CSS resources.