轮播页edit icon

作者:
藤原
Fork(复制)
下载
嵌入
设置
BUG反馈
index.html
style.css
index.js
现在支持上传本地图片了!
            
            <!DOCTYPE html>
<html data-bs-theme="dark">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>轮播图演示 - 带发光效果</title>
    <!-- 引入Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <!-- 引入jQuery -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        /* 全局样式 */
        html {
            height: 100vh;
        }
        body,
        body.bg-dark {
            --bg-color: rgb(23 24 25);
            background: repeating-linear-gradient(
                    -25deg,
                    #0000 0 4px,
                    #0000000f 4px 5px,
                    #0000 5px 10px
                ),
                var(--bg-color) !important;
            font-family: "Fira Sans", sans-serif;
        }

        /* 标题字体设置 */
        h1, h2, h3, h4, h5, h6 {
            font-family: "Barlow Semi Condensed", sans-serif;
            font-weight: 600;
        }

        /* 轮播图控制按钮图标颜色修复 */
        [data-bs-theme="dark"] .carousel .carousel-control-next-icon,
        [data-bs-theme="dark"] .carousel .carousel-control-prev-icon,
        [data-bs-theme="dark"].carousel .carousel-control-next-icon,
        [data-bs-theme="dark"].carousel .carousel-control-prev-icon {
            filter: unset !important;
        }

        /* 轮播图文字阴影效果 */
        .carousel p, .carousel h1, .carousel h2, .carousel h3, .carousel h4, .carousel h5, .carousel h6 {
            text-shadow: 0 0.075em 0.15em rgb(0 0 0 / 20%),
                0 0.125em 0.2em rgb(0 0 0 / 15%), 0 0.2em 0.4em rgb(0 0 0 / 5%),
                0 0.2em 1em rgb(0 0 0 / 5%);
        }

        /* 轮播图控制按钮样式 */
        .carousel button.carousel-control-next,
        .carousel button.carousel-control-prev {
            mix-blend-mode: luminosity;
            transition: all 250ms ease-out !important;
            z-index: 10; /* 确保按钮在最上层 */
            width: 8%; /* 适当增加点击区域 */
            opacity: 0.8; /* 默认透明度 */
        }

        .carousel button.carousel-control-next:active,
        .carousel button.carousel-control-prev:active {
            transition: all 100ms ease-out !important;
        }

        /* 下一张按钮悬停效果 */
        .carousel button.carousel-control-next {
            padding-left: 3%;
        }
        .carousel button.carousel-control-next:hover {
            padding-left: 2.5%;
            opacity: 1;
            box-shadow: inset -4px 0 2px -3px #ffffff2b,
                inset -20px 0 10px -14px #ffffff77, inset -8px 0 0px -0px #000000cc,
                inset -13px 0px 2px -3px #ffffff14, inset -60px 0 60px -60px #ffffffbf,
                inset -10vmin 0 15vmin -20vmin #ffffffbb,
                inset -25vmin 0 15vmin -35vmin #dededeee;
        }
        .carousel button.carousel-control-next:active {
            padding-left: 4%;
            box-shadow: inset -3px 0 2px -3px #ffffff2b,
                inset -20px 0 10px -20px #dedede66, inset -0px 0 0px -0px #000000ff,
                inset -4px 0px 2px -3px #ffffff14, inset -60px 0 60px -60px #ffffff55,
                inset -11vmin 0 18vmin -22vmin #dedede44,
                inset -26vmin 0 18vmin -32vmin #dedede55;
        }

        /* 上一张按钮悬停效果 */
        .carousel button.carousel-control-prev {
            padding-right: 3%;
        }
        .carousel button.carousel-control-prev:hover {
            padding-right: 2.5%;
            opacity: 1;
            box-shadow: inset 4px 0 2px -3px #ffffff2b, inset 20px 0 10px -14px #ffffff77,
                inset 8px 0 0px -0px #000000cc, inset 13px 0px 2px -3px #ffffff14,
                inset 60px 0 60px -60px #ffffffbf, inset 10vmin 0 15vmin -20vmin #ffffffbb,
                inset 25vmin 0 15vmin -35vmin #dededeee;
        }
        .carousel button.carousel-control-prev:active {
            padding-right: 4%;
            box-shadow: inset 3px 0 2px -3px #ffffff2b, inset 20px 0 10px -20px #dedede66,
                inset 0px 0 0px -0px #000000ff, inset 4px 0px 2px -3px #ffffff14,
                inset 60px 0 60px -60px #ffffff55, inset 11vmin 0 18vmin -22vmin #dedede44,
                inset 26vmin 0 18vmin -32vmin #dedede55;
        }

        /* 轮播图标题暗化效果 */
        .carousel-caption.darken {
            position: relative;
        }
        .carousel-caption.darken * {
            z-index: 1 !important;
        }
        .carousel-caption.darken:before {
            content: "";
            position: absolute;
            inset: 0;
            z-index: 0;
            background: linear-gradient(#0000 70%, #00000066 85%, #000000aa);
        }

        /* 模糊发光效果层 */
        .blur-aura {
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            pointer-events: none;
        }
        .blur-aura:after {
            content: "";
            position: absolute;
            opacity: 0.5;
            backdrop-filter: saturate(160%) blur(8rem);
            filter: saturate(175%);

            --radius: var(--bs-border-radius-xl) !important;
            --border: min(14rem, 40vmin);
            --feather: min(7rem, 10vmin);
            --offsetX: 0rem;
            --offsetY: 1rem;

            --inset: calc(var(--border) * -1);
            --feather-clamp: min(var(--feather), var(--border));

            inset: calc(var(--inset) + var(--offsetY) * 1)
                calc(var(--inset) + var(--offsetX) * -1)
                calc(var(--inset) + var(--offsetY) * -1)
                calc(var(--inset) + var(--offsetX) * 1);
            padding: calc(var(--border) - var(--offsetY))
                calc(var(--border) + var(--offsetX)) calc(var(--border) + var(--offsetY))
                calc(var(--border) - var(--offsetX));

            --mask: linear-gradient(#000 0, #000 100%) exclude,
                radial-gradient(
                        var(--radius) at var(--radius) var(--radius),
                        #000 99.5%,
                        #fff0 100%
                    )
                    0 0 / calc(var(--radius) * 2) calc(var(--radius) * 2) space content-box
                    fill-box,
                linear-gradient(
                        90deg,
                        #fff0 var(--radius),
                        #000 0 calc(100% - var(--radius)),
                        #fff0 0
                    )
                    0 50% / 100% 100% no-repeat content-box,
                linear-gradient(
                        #fff0 var(--radius),
                        #000 0 calc(100% - var(--radius)),
                        #fff0 0
                    )
                    50% 0 / 100% 100% no-repeat content-box,
                linear-gradient(#000 0, #000 100%) exclude,
                linear-gradient(
                        90deg,
                        #0000 0,
                        #000 var(--feather-clamp) calc(100% - var(--feather-clamp)),
                        #0000 100%
                    )
                    0 50% /100% calc(
                        100% - (var(--feather-clamp) * 2) - (var(--feather-clamp) * 2)
                    ) repeat-x,
                linear-gradient(
                        #0000,
                        #000 var(--feather-clamp) calc(100% - var(--feather-clamp)),
                        #0000 100%
                    )
                    50% 0 / calc(100% - (var(--feather-clamp) * 2) - (var(--feather-clamp) * 2))
                    100% repeat-y,
                radial-gradient(
                        calc(var(--feather-clamp) * 2) at calc(var(--feather-clamp) * 2)
                            calc(var(--feather-clamp) * 2),
                        #000 50%,
                        #0000 100%
                    )
                    0px 0px / calc(var(--feather-clamp) * 4) calc(var(--feather-clamp) * 4)
                    space padding-box intersect,
                linear-gradient(90deg, #000 calc(var(--feather-clamp) * 4), #0000 0)
                    calc(var(--feather-clamp) * -2) 50% / 100%
                    calc(100% - (var(--feather-clamp) * 4)) repeat-x exclude,
                linear-gradient(#000 calc(var(--feather-clamp) * 4), #0000 0) 50%
                    calc(var(--feather-clamp) * -2) / calc(100% - (var(--feather-clamp) * 4))
                    100% repeat-y exclude,
                linear-gradient(#000 0, #000 100%);

            mask: var(--mask);
        }

        /* 第二层模糊效果 */
        .blur-aura:nth-of-type(2n):after {
            opacity: 0.5;
            backdrop-filter: brightness(105%) saturate(215%) blur(3.75rem);
            filter: saturate(175%) blur(1rem);

            --offsetX: 0rem;
            --offsetY: 1rem;
            --border: min(4.5rem, 40vmin);
            --feather: min(4.5rem, 6vmin);
        }

        /* 第三层模糊效果 */
        .blur-aura:nth-of-type(3n-1):after {
            opacity: 0.55;
            backdrop-filter: saturate(175%) blur(8rem);
            filter: blur(2rem);

            --offsetX: 0rem;
            --offsetY: 2rem;
            --border: min(28rem, 40vmin);
            --feather: min(13rem, 6vmin);
        }

        /* 渐变叠加效果 */
        .gradient-overlay {
            box-shadow: 0 4px 8px rgba(0 0 0 / 10%), 0 6px 16px rgba(0 0 0 / 10%),
                0 8px 30px rgba(0 0 0 / 5%), inset -44px -44px 56px -16px rgb(0 0 0 / 2%),
                inset -24px -24px 32px -12px rgb(0 0 0 / 5%),
                inset -12px -12px 22px -12px rgb(0 0 0 / 8%),
                inset -12px -12px 18px -18px rgb(0 0 0 / 18%),
                inset 44px 44px 56px -16px rgb(255 255 255 / 0.5%),
                inset 12px 12px 22px -12px rgb(255 255 255 / 0.5%),
                inset 12px 12px 18px -18px rgb(255 255 255 / 3%);
        }
        .gradient-overlay:before,
        .gradient-overlay:after {
            content: "";
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            pointer-events: none;
        }
        .gradient-overlay:before {
            border-radius: inherit;
            background: linear-gradient(150deg, #aaa7, #5555);
            mix-blend-mode: overlay;
            box-shadow: 0 4px 8px rgba(0 0 0 / 10%), 0 6px 16px rgba(0 0 0 / 10%),
                0 8px 30px rgba(0 0 0 / 5%), inset -44px -44px 56px -16px rgb(0 0 0 / 5%),
                inset -24px -24px 32px -12px rgb(0 0 0 / 8%),
                inset -12px -12px 22px -12px rgb(0 0 0 / 10%),
                inset -12px -12px 16px -12px rgb(0 0 0 / 18%),
                inset 44px 44px 56px -16px rgb(255 255 255 / 5%),
                inset 24px 24px 32px -12px rgb(255 255 255 / 6%),
                inset 12px 12px 22px -12px rgb(255 255 255 / 7%),
                inset 12px 12px 16px -12px rgb(255 255 255 / 8%);
        }
        .gradient-overlay:after {
            content: "";
            border-radius: inherit;
            opacity: 0.35;
            mix-blend-mode: hard-light;
            box-shadow: 0 4px 8px rgba(0 0 0 / 30%), 0 6px 16px rgba(0 0 0 / 20%),
                0 8px 30px rgba(0 0 0 / 15%), inset -44px -44px 56px -16px rgb(0 0 0 / 5%),
                inset -24px -24px 32px -12px rgb(0 0 0 / 8%),
                inset -12px -12px 22px -12px rgb(0 0 0 / 12%),
                inset -12px -12px 16px -12px rgb(0 0 0 / 18%),
                inset 44px 44px 56px -16px rgb(255 255 255 / 5%),
                inset 24px 24px 32px -12px rgb(255 255 255 / 6%),
                inset 12px 12px 22px -12px rgb(255 255 255 / 7%),
                inset 12px 12px 16px -12px rgb(255 255 255 / 8%);
        }

        /* 导航栏模糊背景 */
        .blur-bg {
            background: unset !important;
        }
        .blur-bg:before {
            content: "";
            position: absolute;
            inset: -1rem 0 0 0;
            z-index: -1;
            opacity: 0.99;
            background: linear-gradient(rgba(42, 43, 45, 0.2), rgba(42, 43, 45, 0.2)),
                url(https://grainy-gradients.vercel.app/noise.svg), rgba(42, 43, 45, 0.6);
            background-blend-mode: saturation;
            background: cross-fade(
                    url(https://grainy-gradients.vercel.app/noise.svg) 40%, 
                    rgba(32, 33, 35, 1) 100%
                );
            background: -webkit-cross-fade(
                    url(https://grainy-gradients.vercel.app/noise.svg) 40%, 
                    rgba(32, 33, 35, 1) 100%
                );
            backdrop-filter: contrast(125%) brightness(145%) blur(0.75rem) saturate(300%);
        }

        /* 彩色漩涡背景效果 */
        .bg-swirl {
            background-image: linear-gradient(
                316deg,
                #00a5ad,
                #ff7e00,
                #00ff00,
                #ff00ab,
                #89ff00,
                #ff0000,
                #fa00b2,
                #0000ff
            );
            background-size: 1000% 1000%;
            background-position: 0% 37%;
            background-blend-mode: plus-lighter;
            transition: background-position 250ms ease-in-out, box-shadow 200ms ease-in-out;
            -webkit-animation: GradientAnimated 5s ease infinite;
            -moz-animation: GradientAnimated 5s ease infinite;
            animation: GradientAnimated 5s ease infinite;
        }
        @-webkit-keyframes GradientAnimated {
            0% { background-position: 0% 37%; }
            50% { background-position: 100% 64%; }
            100% { background-position: 0% 37%; }
        }
        @-moz-keyframes GradientAnimated {
            0% { background-position: 0% 37%; }
            50% { background-position: 100% 64%; }
            100% { background-position: 0% 37%; }
        }
        @keyframes GradientAnimated {
            0% { background-position: 0% 37%; }
            50% { background-position: 100% 64%; }
            100% { background-position: 0% 37%; }
        }

        /* 启用Gamma/Luma滤镜时的特殊样式 */
        body:has(#gamma-filter-toggle:checked) .carousel p,
        body:has(#gamma-filter-toggle:checked) .carousel h1,
        body:has(#gamma-filter-toggle:checked) .carousel h2,
        body:has(#gamma-filter-toggle:checked) .carousel h3,
        body:has(#gamma-filter-toggle:checked) .carousel h4,
        body:has(#gamma-filter-toggle:checked) .carousel h5,
        body:has(#gamma-filter-toggle:checked) .carousel h6 {
            text-shadow: 0 0.075em 0.15em rgb(0 0 0 / 20%),
                0 0.125em 0.2em rgb(0 0 0 / 15%), 0 0.2em 0.4em rgb(0 0 0 / 5%),
                0 0.2em 1em rgb(0 0 0 / 5%);
            width: fit-content;
            padding: 0.1em 0.25em 0.125em;
            background: rgb(0 0 0 / 30%);
            margin-inline: auto;
        }

        /* 浅色主题样式 */
        body:has(#light-theme-toggle:checked) {
            --bg-color: rgb(213 214 215);
        }
    </style>
</head>

<body class='dark h-100 w-100 bg-dark m-0 overflow-x-hidden'>
    <!-- 导航栏 -->
    <nav class="navbar sticky-top navbar-expand-lg bg-secondary-subtle border-0 mb-5 blur-bg" data-bs-theme="dark">
        <div class="container-fluid px-4 px-sm-3 px-xl-5">
            <a class="navbar-brand ps-2 ps-sm-3 ps-lg-5" href="#">
                <img src="https://getbootstrap.com/docs/5.3/assets/brand/bootstrap-logo.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top">
            </a>
            <button class="navbar-toggler me-2 me-lg-5" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor02" aria-controls="navbarColor02" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse pt-2 pt-lg-0 px-1 px-sm-4 px-lg-0" id="navbarColor02">
                <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                    <li class="nav-item py-2 py-lg-2">
                        <a class="nav-link px-3 px-sm-4 px-lg-2 rounded-3 active" aria-current="page" href="#">首页</a>
                    </li>
                    <li class="nav-item py-2 py-lg-2">
                        <a class="nav-link px-3 px-sm-4 px-lg-2 rounded-3" href="#">功能</a>
                    </li>
                    <li class="nav-item py-2 py-lg-2">
                        <a class="nav-link px-3 px-sm-4 px-lg-2 rounded-3" href="#">价格</a>
                    </li>
                    <li class="nav-item py-2 py-lg-2">
                        <a class="nav-link px-3 px-sm-4 px-lg-2 rounded-3" href="#">关于</a>
                    </li>
                </ul>
                <form class="d-flex px-0 ps-lg-0 pe-lg-5" role="search">
                    <input class="form-control me-2" type="search" placeholder="搜索" aria-label="Search">
                    <button class="btn btn-outline-light" type="submit">搜索</button>
                </form>
            </div>
        </div>
    </nav>
    
    <!-- 轮播图区域 -->
    <header class='container position-relative'>
        <div class='row row-cols-auto justify-content-center pt-1 pt-lg-4 pb-3 pb-lg-4'>
            <div class='col-12'>
                <!-- 轮播图主体 -->
                <div id="carouselExample" class="carousel slide rounded rounded-4">
                    <!-- 轮播指示器 -->
                    <div class="carousel-indicators">
                        <button type="button" data-bs-target="#carouselExample" data-bs-slide-to="0" class="bg-light active" aria-current="true" aria-label="Slide 1" title="图片演示"></button>
                        <button type="button" data-bs-target="#carouselExample" data-bs-slide-to="1" class="bg-light" aria-label="Slide 2" title="视频演示"></button>
                        <button type="button" data-bs-target="#carouselExample" data-bs-slide-to="2" class="bg-light" aria-label="Slide 3" title="视频演示"></button>
                        <button type="button" data-bs-target="#carouselExample" data-bs-slide-to="3" class="bg-light" aria-label="Slide 4" title="图片演示"></button>
                        <button type="button" data-bs-target="#carouselExample" data-bs-slide-to="4" class="bg-light" aria-label="Slide 5" title="图片演示"></button>
                        <button type="button" data-bs-target="#carouselExample" data-bs-slide-to="5" class="bg-light" aria-label="Slide 6" title="图片演示"></button>
                    </div>
                    
                    <!-- 轮播内容 -->
                    <div class="carousel-inner rounded rounded-4">
                        <!-- 第一张 - 图片 -->
                        <div class="carousel-item ratio ratio-16x9 active">
                            <img src="https://project-contingency.com/assets/img/blog/R4PWV.jpg" class="d-block object-fit-cover w-100" alt="..." style="scale: 125%;translate: -4% 2%;rotate: -7deg;">
                            <div class="carousel-caption darken text-light d-none d-md-flex flex-column justify-content-end align-items-center pb-4">
                                <h5 class="fs-1 text-uppercase rounded-2">第一张幻灯片</h5>
                                <p class="mb-4 text-lowercase rounded-2">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
                            </div>
                        </div>
                        
                        <!-- 第二张 - YouTube视频 -->
                        <div class="carousel-item ratio ratio-16x9">
                            <iframe id="demo-vid-1" width="560" height="315" class="d-block object-fit-cover w-100" src="https://www.youtube.com/embed/e1QD2dBkESE?enablejsapi=1&controls=0&loop=1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
                        </div>
                        
                        <!-- 第三张 - YouTube视频(可更换) -->
                        <div class="carousel-item ratio ratio-16x9">
                            <iframe id="demo-vid-2" width="560" height="315" class="d-block object-fit-cover w-100" src="https://www.youtube.com/embed/GdNjjhJUibU?enablejsapi=1&controls=0&loop=1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
                        </div>
                        
                        <!-- 第四张 - 图片 -->
                        <div class="carousel-item ratio ratio-16x9">
                            <img src="https://project-contingency.com/assets/img/blog/TT3LY.jpg" class="d-block object-fit-cover w-100" alt="...">
                            <div class="carousel-caption darken text-light d-none d-md-flex flex-column justify-content-end align-items-center pb-4">
                                <h5 class="fs-1 text-uppercase rounded-2">第四张幻灯片</h5>
                                <p class="mb-4 text-lowercase rounded-2">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
                            </div>
                        </div>
                        
                        <!-- 第五张 - 图片 -->
                        <div class="carousel-item ratio ratio-16x9">
                            <img src="https://project-contingency.com/assets/img/blog/PL06X.jpg" class="d-block object-fit-cover w-100" alt="...">
                            <div class="carousel-caption darken text-light d-none d-md-flex flex-column justify-content-end align-items-center pb-4">
                                <h5 class="fs-1 text-uppercase rounded-2">第五张幻灯片</h5>
                                <p class="mb-4 text-lowercase rounded-2">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
                            </div>
                        </div>
                        
                        <!-- 第六张 - 彩色背景 -->
                        <div class="carousel-item ratio ratio-16x9">
                            <div class="d-block object-fit-cover w-100 bg-swirl"></div>
                            <div class="carousel-caption text-light d-none d-md-flex flex-column justify-content-end align-items-center pb-4">
                                <h5 class="fs-1 text-uppercase rounded-2">第六张幻灯片</h5>
                                <p class="mb-4 text-lowercase rounded-2">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
                            </div>
                        </div>
                    </div>
                    
                    <!-- 上一张/下一张控制按钮 -->
                    <button class="carousel-control-prev rounded-start-4" type="button" data-bs-target="#carouselExample" data-bs-slide="prev">
                        <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                        <span class="visually-hidden">上一张</span>
                    </button>
                    <button class="carousel-control-next rounded-end-4" type="button" data-bs-target="#carouselExample" data-bs-slide="next">
                        <span class="carousel-control-next-icon" aria-hidden="true"></span>
                        <span class="visually-hidden">下一张</span>
                    </button>
                    
                    <!-- 模糊发光效果层 -->
                    <div class="blur-aura rounded-4"></div>
                    <div class="blur-aura rounded-4"></div>
                    <div class="blur-aura rounded-4"></div>
                    <div class="gradient-overlay rounded-4"></div>
                </div>
            </div>
        </div>
    </header>
    
    <!-- 主要内容区域 -->
    <main class='container position-relative pb-5'>
        <div class='row row-cols-auto pt-2 pt-md-3 pb-5 px-2 px-md-3 px-lg-5'>
            <div class='col-8 col-lg-7 pe-md-2 pe-lg-5'>
                <h2 class="border-bottom border-light border-opacity-25 pb-3 mb-3">
                    带背光效果的卡片轮播
                </h2>
                <p class="mb-1">
                    这种发光效果是通过叠加一个或多个具有背景滤镜模糊的元素,并使用复杂的渐变蒙版堆栈来屏蔽中心原始内容,同时使效果向边缘淡出来实现的。
                </p>
                <p class="mb-3">
                    不是通过在背景中复制元素来伪造的!
                </p>
                <p class="mb-4">
                    目前在<em>基于Chromium的浏览器中效果最佳</em>,仍在研究如何让Firefox在模糊效果显示时表现更好。另外,请确保<u>启用GPU硬件加速</u>以避免卡顿行为!
                </p>
                <hr>
                <p class="mb-4">
                    由于该效果位于内容之上,不需要复制您想要应用效果的内容,因此它几乎适用于任何类型的内容和媒体。您还可以使用z-index或DOM中的位置将特定内容弹出到效果之上以排除它。
                </p>
                <p>
                    我计划添加一种自定义效果的方法,因为所有变量(如圆角半径、外部"边框"宽度及其羽化)都设置为CSS变量。
                </p>
                <p class="mb-4">
                    不幸的是,为了获得最佳效果,我不得不叠加3个这些效果,每个效果的变量值不同,所以我需要想办法优化同时自定义多个层。我仍在研究这个问题,但我可能会先设置一种只自定义蒙版本身的方法。
                </p>
                <p class="mb-3">
                    在此期间,您可以从这个codepen中获取代码(抱歉有点乱)。或者只是坐下来享受演示 😉
                </p>
                <h5 class="border-bottom border-light border-opacity-25 pt-3 pb-2 mb-3">
                    已知问题:
                </h5>
                <ul class="mb-4">
                    <li>
                        <p class="mb-1">
                            在基于Chromium的浏览器中,"SVG Gamma/Luma蒙版"模式下出现颜色条带。
                        </p>
                    </li>
                    <li>
                        <p class="mb-1">
                            当浏览器中未启用图形硬件加速时,性能问题严重。
                        </p>
                    </li>
                    <li>
                        <p>
                            Firefox中的发光效果不完全匹配预期视觉效果。
                        </p>
                    </li>
                    <li>
                        <p>
                            在Firefox中,当轮播滑动时滚动会使动画变慢和卡顿。
                        </p>
                    </li>
                </ul>
            </div>
            <div class='col-4 offset-lg-1'>
                <h4 class="border-bottom border-light border-opacity-25 pt-3 pb-2 mb-3">
                    配置演示
                </h4>
                <div class="form-check form-switch" title="一种粗糙的SVG滤镜,用于屏蔽最暗的色调">
                    <input class="form-check-input" type="checkbox" role="switch" id="gamma-filter-toggle">
                    <label class="form-check-label" for="gamma-filter-toggle">启用Gamma/Luma蒙版滤镜</label>
                </div>
                <div class="form-check form-switch" title="闪光弹模式(与Gamma/Luma滤镜配合不佳)">
                    <input class="form-check-input" type="checkbox" role="switch" id="light-theme-toggle">
                    <label class="form-check-label" for="light-theme-toggle">切换页面深色/浅色模式</label>
                </div>
                <div class="mt-3 mb-4">
                    <label for="yt-embed-id" class="form-label small">幻灯片3 - YouTube视频ID</label>
                    <input type="text" class="form-control form-control-sm" id="yt-embed-id" placeholder="GdNjjhJUibU" value="GdNjjhJUibU">
                </div>
                
                <h4 class="border-bottom border-light border-opacity-25 pt-3 pb-2 mb-3">
                    配置光晕效果
                </h4>
                <p class="small">
                    <i class="small">
                        下面自定义模糊光晕效果属性尚不支持。
                    </i>
                </p>
                <label for="customRange3" class="form-label">边框/内边距</label>
                <input type="range" class="form-range" min="0" max="50" step="1" value="20" id="customRange3">
                <label for="customRange3" class="form-label">圆角半径</label>
                <input type="range" class="form-range" min="0" max="5" step="0.25" value="2" id="customRange3">
                <label for="customRange3" class="form-label">羽化</label>
                <input type="range" class="form-range" min="0" max="0.5" step="0.01" value="8" id="customRange3">
                <label for="customRange3" class="form-label">X偏移</label>
                <input type="range" class="form-range" min="0" max="15" step="0.5" value="0" id="customRange3">
                <label for="customRange3" class="form-label">Y偏移</label>
                <input type="range" class="form-range" min="0" max="15" step="0.5" value="6" id="customRange3">
                <hr>
                <div class="mb-3">
                    <label for="outputHTML" class="form-label">HTML</label>
                    <textarea class="form-control text-white text-opacity-25 pe-none" id="outputHTML" rows="3" disabled readonly>自定义模糊光晕效果尚不支持。</textarea>
                </div>
                <div class="mb-3">
                    <label for="outputCSS" class="form-label">CSS</label>
                    <textarea class="form-control text-white text-opacity-25 pe-none" id="outputCSS" rows="9" disabled readonly>自定义模糊光晕效果尚不支持。</textarea>
                </div>
            </div>
        </div>
    </main>
    
    <!-- 页脚 -->
    <nav class="navbar navbar-expand-lg bg-body-tertiary py-5 mt-5">
        <div class="container pb-4">
            <a class="navbar-brand" href="#">
                <img src="https://getbootstrap.com/docs/5.3/assets/brand/bootstrap-logo.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top">
            </a>
            <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                <li class="nav-item">
                    <a class="nav-link active" aria-current="page" href="#">首页</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">功能</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">价格</a>
                </li>
            </ul>
        </div>
    </nav>
    
    <!-- 提示Toast -->
    <div class="toast-container position-fixed p-3 mb-4 d-none d-lg-block start-50 bottom-0 translate-middle-x">
        <div class="toast bg-primary rounded-3" role="alert" aria-live="assertive" aria-atomic="true" data-bs-animation="true" data-bs-autohide="true" data-bs-delay="15000">
            <div class="d-flex">
                <div class="toast-body">请确保启用GPU加速!</div>
                <button type="button" class="bg-white btn-close m-auto me-2 p-1" data-bs-dismiss="toast" aria-label="关闭"></button>
            </div>
        </div>
    </div>

    <!-- 引入Bootstrap JS -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    
    <!-- 自定义JavaScript -->
    <script>
        // 初始化轮播图
        document.addEventListener('DOMContentLoaded', function() {
            // 获取轮播图元素
            let myCarouselElement = document.querySelector("#carouselExample");
            
            // 初始化Bootstrap轮播图
            let carousel = new bootstrap.Carousel(myCarouselElement, {
                interval: 2000,  // 自动轮播间隔2秒
                touch: true      // 启用触摸支持
            });

            // 初始化Toast提示
            const toastElList = document.querySelectorAll(".toast");
            const toastList = [...toastElList].map(
                (toastEl) => new bootstrap.Toast(toastEl)
            );
            // 2.5秒后显示Toast提示
            setTimeout(() => {
                toastList[0].show();
            }, 2500);

            // 主题切换功能
            document.getElementById('light-theme-toggle').addEventListener('change', function() {
                // 切换深色/浅色主题
                document.documentElement.setAttribute('data-bs-theme', 
                    (document.documentElement.getAttribute('data-bs-theme') == 'dark') ? 'light' : 'dark');
            });

            // 加载YouTube IFrame API
            var tag = document.createElement("script");
            tag.src = "https://www.youtube.com/iframe_api";
            var firstScriptTag = document.getElementsByTagName("script")[0];
            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

            // 存储YouTube播放器实例
            var players = [];

            // YouTube API准备就绪时的回调函数
            window.onYouTubeIframeAPIReady = function() {
                var allMovieIframes = myCarouselElement.getElementsByTagName("iframe");
                
                // 为每个iframe初始化YouTube播放器
                for (let currentIFrame of allMovieIframes) {
                    players.push(
                        new YT.Player(currentIFrame.id, {
                            events: {
                                onReady: onPlayerReady
                            }
                        })
                    );
                }
            };

            // 播放器准备就绪时的回调
            function onPlayerReady(event) {
                event.target.setVolume(15);  // 设置音量
                event.target.setPlaybackQuality("highres");  // 设置播放质量
            }

            // 轮播图滑动事件处理
            myCarouselElement.addEventListener('slide.bs.carousel', function(event) {
                try {
                    // 暂停所有视频播放
                    if (players != undefined) {
                        players.forEach((player) => {
                            if (player.pauseVideo) {
                                player.pauseVideo();
                            }
                        });
                    }
                } catch (e) {
                    console.error("暂停视频时出错:", e);
                }
            });

            // YouTube视频ID输入框变化事件
            document.getElementById('yt-embed-id').addEventListener('change', function(event) {
                let ytid = event.target.value || "GdNjjhJUibU";
                let url = `https://www.youtube.com/embed/${ytid}?enablejsapi=1&controls=0&loop=1`;
                
                // 更新视频源
                document.getElementById("demo-vid-2").src = url;
            });

            // 输入框获取焦点时全选文本
            document.getElementById('yt-embed-id').addEventListener('focus', function(event) {
                this.select();
            });
        });
    </script>
</body>
</html>
        
预览
控制台