JSFiddle - React, Tailwind, and code Playground

by ZooeyLai

HTML

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <div id="app" class="wrap">
        <div class="alert alert-primary">
            <i class="fa-solid fa-face-smile"></i>
            <span class="text">歡迎您點擊「抖內」按鈕,以實際行動支持我們。</span>
            <button class="btn-close"><i class="fa-solid fa-xmark"></i></button>
        </div>
        <hr>
        <div class="alert alert-success">
            <i class="fa-solid fa-circle-check"></i>
            <span class="text">您已成功下訂單!以下為您的訂單詳細資訊。</span>
            <button class="btn-close"><i class="fa-solid fa-xmark"></i></button>
        </div>
        <hr>
        <div class="alert alert-danger">
            <i class="fa-solid fa-circle-exclamation"></i>
            <span class="text">抱歉,系統發生錯誤,請稍後重新嘗試。</span>
            <button class="btn-close"><i class="fa-solid fa-xmark"></i></button>
        </div>
        <hr>
        <div class="alert alert-warning">
            <i class="fa-solid fa-triangle-exclamation"></i>
            <span class="text">請注意,以下內容包含「劇透」爆雷資訊。</span>
            <button class="btn-close"><i class="fa-solid fa-xmark"></i></button>
        </div>
    </div>

SCSS

*{
    box-sizing: border-box;
}
$primary: #2563eb;
$primary-100: #dbeafe;
$primary-800: #1e40af;
$success: #059669;
$success-100: #d1fae5;
$success-800: #065f46;
$danger: #e11d48;
$danger-100: #ffe4e6;
$danger-800: #9f1239;
$warning: #ea580c;
$warning-100: #ffedd5;
$warning-800: #9a3412;

.wrap{
    width: 600px;
    margin: 0 auto;
}

@mixin alert-version($background, $color, $border) {
    background: $background;
    color: $color;
    border-color: $border;
}

hr{
    border: 1px solid #e4e6eb;
}
.btn-close{
    padding: 0.5rem;
    cursor: pointer;
    background: transparent;
    border: none;
    font-size: 1rem;
    transition: all 0.6s;
    &:hover{
      opacity: 0.5;
    }
}
.alert{
    padding: 1rem;
    border-left: 4px solid transparent;
    font-size: 1rem;
    display: flex;
    gap: 0.5rem;
    align-items: center;
    border-radius: 0.25rem;
    opacity: 1;
    transition: opacity 0.6s;
    .text{
        flex: 1 auto;
    }
    &.alert-primary{
        @include alert-version($primary-100, $primary-800 , $primary);
        .btn-close{
            color: $primary-800;
        }
    }
    &.alert-success{
        @include alert-version($success-100, $success-800 , $success);
        .btn-close{
            color: $success-800;
        }
    }
    &.alert-danger{
        @include alert-version($danger-100, $danger-800 , $danger);
        .btn-close{
            color: $danger-800;
        }
    }
    &.alert-warning{
        @include alert-version($warning-100, $warning-800 , $warning);
        .btn-close{
            color: $warning-800;
        }
    }
}

JavaScript

let closeBtns = document.querySelectorAll('.btn-close');

        closeBtns.forEach((button) =>{
            button.addEventListener('click', ()=>{
            let alertEl = button.closest('.alert'); //closest寫法
            alertEl.style.opacity = '0';
                setTimeout(function(){
                    alertEl.remove();
                }, 600)
            })
        })