Simple tabs element with pure js and animation effect example

Simple tabs element with pure js and animation effect example

by 25058214

HTML

<div class="tabs v1">
            <div class="t-btn-container">
                <p class="t-btn active" data-name="profile">Profile</p>
                <p class="t-btn" data-name="messages">Messages </p>
                <p class="t-btn" data-name="settings"> Settings</p>
            </div>
            <div class="t-panel-container">
                <div class="t-panel profile active">
                    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque pariatur odit, optio exercitationem vitae accusamus at aliquam quas laudantium similique excepturi rem ullam eaque tempora cupiditate suscipit porro natus quod alias iste saepe est nihil explicabo libero! Id optio unde recusandae, error doloremque minus ducimus eveniet, repellat, atque quaerat porro.</p>
                </div>
                <div class="t-panel messages">
                    <h3>Lorem ipsum dolor sit amet.</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia temporibus vitae minima modi, quaerat provident impedit voluptates, rem earum maxime dicta placeat tempore veritatis animi beatae optio ad, veniam ducimus.</p>
                </div>
                <div class="t-panel settings">
                    <h3>Lorem ipsum dolor sit amet.</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quia temporibus vitae minima modi, quaerat provident impedit voluptates, rem earum maxime dicta placeat tempore veritatis animi beatae optio ad, veniam ducimus.</p>
                    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quia veniam voluptas mollitia quisquam corporis pariatur aliquid accusamus minima distinctio debitis! Explicabo aut veritatis est minima quidem sapiente reiciendis rerum accusamus.</p>
                </div>
            </div>
        </div>

SCSS

body{
    margin: 0;
    padding: 0;
    background: #FFC371;
    background: linear-gradient(to right, #FF5F6D, #FFC371);
    font-family: 'Quicksand', sans-serif;
    color: #262626;
}
*{
    box-sizing: border-box;
}
.logo {
    position: relative;
    display: flex;
    margin: 10px;
    flex-direction: row;
    z-index: 1000;
    
    a {
        display: block;
        height: 30px;
        width: auto;
        cursor: pointer;
        margin-right: 10px;
        img {
            height: 100%;
            width: auto;
        }
    }
  }

.container{
    display: flex;
    flex-direction: column;
    width: 100%;
    max-width: 1000px;
    margin: 0 auto;
    padding: 10px 10px 100px 10px;
    h1{
        text-align: center;
        margin-bottom: 30px;
        font-weight: 500;
    }
    h2{
        font-weight: 500;
    }
}

.tabs.v1{
    display: flex;
    flex-direction: column;
    width: 100%;
    height: auto;
    min-height: 300px; //only for demo porpuses
    .t-btn-container{
        display: flex;
        flex-direction: row;
        width: 100%;
        height: 60px;
        align-items: center;
        background-color: #262626;
        border-radius: 5px;
        padding: 0 20px;
        box-shadow: 0 20px 25px -5px rgba(0,0,0,.15),0 10px 10px -5px rgba(0,0,0,.1)!important;
        position: s;
        .t-btn{
            padding: 5px 10px;
            margin-right: 10px;
            color: #bdbdbd;
            font-weight: 400;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 15px;
            padding-left: 10px;
            font-weight: 400;
            cursor: pointer;
            transition: all 0.3s ease-in-out;
            &.active{
                color: #fff;
            }
        }
    }
    .t-panel-container{
        padding: 20px;
        .t-panel{
            color: #262626;
            transition: all 0.2s ease-in-out;
            opacity: 0;
           ...

JavaScript

function initTab(elem){
    document.addEventListener('click', function (e) {
        if (!e.target.matches(elem+' .t-btn')) return;
        else{
            if(!e.target.classList.contains('active')){
                findActiveElementAndRemoveIt(elem+' .t-btn');
                findActiveElementAndRemoveIt(elem+' .t-panel');
                e.target.classList.add('active');  
                setTimeout(function(){                 
                    var panel = document.querySelectorAll(elem+' .t-panel.'+e.target.dataset.name);
                    Array.prototype.forEach.call(panel, function (el) {
                        el.classList.add('active');
                    });
                }, 200);
            }
        }
    });
}

function findActiveElementAndRemoveIt(elem){
    var elementList = document.querySelectorAll(elem);
    Array.prototype.forEach.call(elementList, function (e) {
        e.classList.remove('active');
    });
}

initTab('.tabs.v1');
initTab('.tabs.v2');