作者: dw666

  • 如何用JS实现代码雨特效

    如何用JS实现代码雨特效// 知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用JS实现代码雨特效”吧。

    html代码

    <canvas id="code_rain_canvas" width="1440" height="900"></canvas>

    js 代码

    window.onload = function() {
             //获取画布对象
             var canvas = document.getElementById("code_rain_canvas");
             //获取画布的上下文
             var context = canvas.getContext("2d");
             var s = window.screen;
             var W = canvas.width = s.width;
             var H = canvas.height;
             //获取浏览器屏幕的宽度和高度
             //var W = window.innerWidth;
             //var H = window.innerHeight;
             //设置canvas的宽度和高度
             canvas.width = W;
             canvas.height = H;
             //每个文字的字体大小
             var fontSize = 12;
             //计算列
             var colunms = Math.floor(W / fontSize);
             //记录每列文字的y轴坐标
             var drops = [];
             //给每一个文字初始化一个起始点的位置
             for (var i = 0; i < colunms; i++) {
                 drops.push(0);
             }
             //运动的文字
             var str = "WELCOME TO WWW.ITRHX.COM";
             //4:fillText(str,x,y);原理就是去更改y的坐标位置
             //绘画的函数
             function draw() {
                 context.fillStyle = "rgba(238,238,238,.08)"; //遮盖层
                 context.fillRect(0, 0, W, H);
                 //给字体设置样式
                 context.font = "600 " + fontSize + "px  Georgia";
                 //给字体添加颜色
                 context.fillStyle = ["#33B5E5", "#0099CC", "#AA66CC", "#9933CC", "#99CC00", "#669900", "#FFBB33", "#FF8800", "#FF4444", "#CC0000"][parseInt(Math.random() * 10)]; //randColor();可以rgb,hsl, 标准色,十六进制颜色
                 //写入画布中
                 for (var i = 0; i < colunms; i++) {
                     var index = Math.floor(Math.random() * str.length);
                     var x = i * fontSize;
                     var y = drops[i] * fontSize;
                     context.fillText(str[index], x, y);
                     //如果要改变时间,肯定就是改变每次他的起点
                     if (y >= canvas.height && Math.random() > 0.99) {
                         drops[i] = 0;
                     }
                     drops[i]++;
                 }
             };
    
             function randColor() { //随机颜色
                 var r = Math.floor(Math.random() * 256);
                 var g = Math.floor(Math.random() * 256);
                 var b = Math.floor(Math.random() * 256);
                 return "rgb(" + r + "," + g + "," + b + ")";
             }
             draw();
             setInterval(draw, 35);
         };

    展示效果:

  • plugin-legacy 动态读取 .browserslistrc配置

    前言

    在前端开发中,为了确保一致和良好的用户体验,我们通常需要处理不同浏览器对 HTML、CSS 和 JavaScript 的支持差异。

    在 Vite 生态中,我们通常使用 .browserslistrc 文件来统一管理目标浏览器范围。像 postcss-preset-env 这样的工具会自动读取它来进行 CSS 降级。然而,一个常见痛点是 @vitejs/plugin-legacy 插件的 modernTargets 选项并不会自动读取该文件,需要我们手动配置。

    这就导致了同一个配置需要维护在两个地方:一份在 .browserslistrc 中给 PostCSS 使用,另一份在 vite.config.ts 中给 plugin-legacy 使用。这种重复不仅繁琐,还极易因忘记同步更新而出错。

    本文将分享一个简洁的解决方案,通过代码实现配置的统一管理。

    解决方案

    我们的目标很明确:让 vite.config.ts 能够取 .browserslistrc 文件的内容,并将其传递给 @vitejs/plugin-legacy 的 modernTargets 选项。

    幸运的是,几乎所有处理浏览器列表的工具(包括 Vite、Webpack 和 PostCSS 插件)都依赖同一个核心库:browserslist。我们可以直接利用这个库来 programmatic地 读取配置。

    1. 安装依赖

    首先,我们需要在项目中安装 browserslist 作为开发依赖。

    pnpm i browserslist -D

    2. 修改 Vite 配置

    // vite.config.ts
    import legacy from "@vitejs/plugin-legacy";
    import browserslist from "browserslist";
    
    export default defineConfig(({ mode }) => {
      const cwdPath = process.cwd();
    
      return {
        plugins: [
          // 兼容性
          legacy({
            modernTargets: browserslist.loadConfig({ path: cwdPath }),
            renderLegacyChunks: false
          })
        ]
      }
    })

    代码解析:

    • 我们使用 browserslist.loadConfig({ path: '.' }) 方法,它会自动在当前项目根目录process.cwd( )下查找并解析 .browserslistrc 文件。
    • 该方法返回一个字符串数组(string[]),其格式完全符合 modernTargets 选项的要求。
    • 这样,modernTargets 的值就从硬编码的数组变成了动态读取的结果。

    3. 创建 .browserslistrc 文件

    如果在你的项目根目录还没有这个文件,请创建一个,并填入你的目标浏览器配置。

    # .browserslistrc # 更多规则请参考 browserslist 官方文档 # https://github.com/browserslist/browserslist Chrome >= 61 Firefox >= 60 Safari >= 11 Edge >= 16 iOS >= 11

    注意:Vite 底层的打包工具 esbuild 不支持将代码转换为 ES5。因此,即使你在 .browserslistrc 中设置了非常旧的浏览器(如 IE11),Vite 也无法生成完全兼容的 ES5 代码。这里的配置主要是为 @vitejs/plugin-legacy 和 PostCSS 提供统一的目标范围,确保语法转换和 Polyfill 的目标一致。

    总结

    通过在 vite.config.ts 中引入 browserslist 包,我们成功地让 @vitejs/plugin-legacy 插件动态读取了 .browserslistrc 文件的内容。

    这种方法不仅优雅地解决了配置重复的问题,还确保了项目中所有与浏览器兼容性相关的工具(如 PostCSS)都使用同一份配置,真正实现了“单一数据源”(Single Source of Truth),大大提升了项目的可维护性和健壮性。

  • 唯美动态漂亮个人404页面

    404.html

    <!doctype html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=375px,user-scalable=no,viewport-fit=cover" homon="true">
      <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
      <meta name="ahot-aplus" content="1">
      <meta name="aplus-rate-ahot" content="0.5">
      <title>404页面</title>
    <link rel="stylesheet" href="css/index.css">
    </head>
    
    <body>
    <div class="aliyun-module">
        <div class="componenet-wrap ace-render-2">
            <div class="" style="max-width: 100%;">
                <div class="ace-yunqi-homepagetop-0907">
                    <h1 class="text-h1">背景切换</h1>
                    <div class="background">
                    <img alt="背景图片-静态" src="picture/1.jpg" class="background-image-nagetive">
                    <img alt="背景图片-动态" src="picture/123.gif" class="background-image-active">
                    <img alt="背景图片-PC静态" src="picture/111.jpg" class="background-image-active-pc">
                    <video class="background-video" src="https://lumi.mihoyo.com/medias/bgvideo.13edb8ad.mp4" preload="auto" autoplay="" loop="" style="opacity: 1; transition: opacity 0.5s linear 0s;"></video></div>
    <div class="frame">
        <div class="image-frame"><img src="picture/1.png" class="image is-visible" alt="主页图片"></div>
        <div class="button-group">
        <a href="https://www.zhanid.com/">首页<div class="border-bottom"></div></a>
        <a href="http://wpa.qq.com/msgrd?v=3&amp;uin=123456&amp;site=qq&amp;menu=yes">联系我<div class="border-bottom"></div></a>
        </div>
    </body>
    </body>
    </html>

    index.css

    .ace-yunqi-homepagetop-0907{position:unset;width:100%;display:flex;flex-direction:column;align-items:center}.ace-yunqi-homepagetop-0907 .text-h1{display:none}.ace-yunqi-homepagetop-0907 .background{position:fixed;top:0;left:0;width:100%;height:100%}.ace-yunqi-homepagetop-0907 .background .background-image-active,.ace-yunqi-homepagetop-0907 .background .background-image-active-pc,.ace-yunqi-homepagetop-0907 .background .background-image-nagetive,.ace-yunqi-homepagetop-0907 .background .background-video{width:100%;height:100%;object-fit:fill;position:absolute;left:0;top:0}.ace-yunqi-homepagetop-0907 .return-button{color:#333!important;position:absolute;display:flex;align-items:center}.ace-yunqi-homepagetop-0907 .arrow_down{position:relative;z-index:3;padding-top:58px;width:58px;animation:move 1.2s linear 0s infinite alternate}@media only screen and (max-width:768px){.ace-yunqi-homepagetop-0907 .arrow_down{display:none}}.ace-yunqi-homepagetop-0907 .arrow_down img{width:100%;height:46px}@keyframes move{0%{top:0}50%{top:-10px}to{top:0}}@media only screen and (min-width:769px){.ace-yunqi-homepagetop-0907{height:100vh;justify-content:center}.ace-yunqi-homepagetop-0907 .background .background-image-active,.ace-yunqi-homepagetop-0907 .background .background-image-nagetive{display:none}.ace-yunqi-homepagetop-0907 .background .background-image-active-pc,.ace-yunqi-homepagetop-0907 .background .background-video{object-fit:cover;display:block}.ace-yunqi-homepagetop-0907 .background .background-image-active-pc{z-index:1}.ace-yunqi-homepagetop-0907 .background .background-video{z-index:2}.ace-yunqi-homepagetop-0907 .return-button{left:10px;top:85px;z-index:2}.ace-yunqi-homepagetop-0907 .bottom-operator{position:absolute;height:144px;width:100%;display:flex;justify-content:center;padding-top:28px;bottom:0}}@media only screen and (max-width:768px){.ace-yunqi-homepagetop-0907{height:calc(100vh - 20px);justify-content:start}.ace-yunqi-homepagetop-0907 .background{position:absolute}.ace-yunqi-homepagetop-0907 .background .background-image-active,.ace-yunqi-homepagetop-0907 .background .background-image-nagetive{display:block;object-fit:cover}.ace-yunqi-homepagetop-0907 .background .background-image-negative{z-index:1}.ace-yunqi-homepagetop-0907 .background .background-image-active{z-index:2}.ace-yunqi-homepagetop-0907 .background .background-image-active-pc,.ace-yunqi-homepagetop-0907 .background .background-video,.ace-yunqi-homepagetop-0907 .return-button{display:none}}.share-btn-box{cursor:pointer;display:inline-flex;height:30px}.share-btn-box>img{margin:6.75px 8px;width:16.5px;height:16.5px}.share-btn-box .share-btn{padding:0;border:0;height:30px;font-size:16px;color:#ff6a00;letter-spacing:.18px;text-align:center;line-height:30px}.yqdh-share-dialog{width:654px!important}.yqdh-share-dialog .ace-dialog-body{overflow:hidden!important;margin-bottom:0;padding:0}.yqdh-share-dialog .ace-dialog-close .ace-dialog-close-icon.ace-icon{margin-top:-10px}.yqdh-share-dialog .yqdh-share-box{display:flex}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-share-list{width:313px;display:flex}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-share-list>li{display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0 63px 0 0}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-share-list>li>img{height:48px;width:48px;cursor:pointer}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-share-list>li>h5{margin-bottom:0;margin-top:3px;height:24px;font-size:14px;color:"#3c3c3c";text-align:justify;line-height:24px;font-weight:400}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-copy-link{margin-top:14px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-copy-link>p{height:24px;font-size:14px;color:"#3c3c3c";line-height:24px;margin-bottom:8px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-copy-link>div{display:flex}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-copy-link>div .ace-custom-input.ace-input.ace-medium{height:36px;width:210px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-copy-link>div .ace-custom-input.ace-input.ace-medium input{height:34px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-copy-link>div .link_copy_btn{border:0 none;height:36px;margin-left:-1px;width:81px;text-align:center;color:#fff;font-size:16px;cursor:pointer}.yqdh-share-dialog .yqdh-share-box .yqdh-share-left .yqdh-copy-link>div .link_copy_btn:hover{background-color:#ff6900}.yqdh-share-dialog .yqdh-share-box .left-right-hr{height:160px;width:1px;opacity:.4;border-right:1px solid #c3c5c6}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right{display:flex;width:316px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right .right-box-left{width:137px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right .right-box-left>ul{height:140px;margin-bottom:0}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right .right-box-left>ul>li{display:flex;flex-direction:row;justify-content:center;align-items:center;margin:0 0 20px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right .right-box-left>ul>li>img{height:48px;width:48px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right .right-box-left>ul>li>h5{font-size:14px;color:#3d3d3d;margin-left:7px;margin-bottom:0;font-weight:400}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right .right-box-left>h3{margin-bottom:0;margin:0 auto;text-align:center;line-height:20px;font-size:14px;font-weight:400;color:#3d3d3d}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right .right-box-right{width:154px}.yqdh-share-dialog .yqdh-share-box .yqdh-share-right .right-box-right>img{height:154px;width:154px}.frame{width:auto;display:flex;flex-direction:column;align-items:center;z-index:3}.frame .button-group,.frame .image-frame{display:flex;justify-content:center}.frame .button-group{padding:20px}@media only screen and (min-width:769px){.frame .button-group a{display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:13px;height:40px;width:150px;color:#181818!important;line-height:37px;border:none;transition:none;cursor:pointer}.frame .button-group a .border-bottom{height:2px;width:30px;background:#4a4a4a;animation:animationVisible 1s linear 0s infinite alternate}.frame .button-group a:last-child .border-bottom{animation-delay:1s}.frame .button-group a:hover{background:hsla(0,0%,100%,.7);background-color:#ff6a00;color:#fff!important}.frame .button-group a:hover .border-bottom{background:transparent}}@media only screen and (max-width:768px){.frame .button-group a{height:40px;width:161px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:16px;background-image:linear-gradient(90deg,#ff6a005c 4%,#ff530000 86%)}}@media only screen and (max-width:768px){.frame .button-group .second-button{margin-left:12px}}@keyframes animationVisible{0%{opacity:0}to{opacity:1}}.frame .button-group a:active,.frame .button-group a:link,.frame .button-group a:visited{text-decoration:none}.frame .email{display:flex;justify-content:center;height:17px;opacity:.6;font-family:PingFangSC-Regular;font-size:12px;color:#fff;letter-spacing:0}.frame .email .email-link{text-decoration:underline;cursor:pointer}.text-frame{display:flex;justify-content:center}.text-frame .date,.text-frame .text{font-family:PingFangSC-Regular;color:#fff;letter-spacing:0;text-align:left}.text-frame .border{color:#fff;margin:0 12px}@media only screen and (min-width:769px){.button-icon{display:block;width:18px;height:18px;margin-right:8px}.image-frame{width:932px;padding-bottom:40px}.image-frame .image{object-fit:contain;width:932px;height:190px;opacity:0;transform:translate3d(0,30px,0)}.image-frame .is-visible{opacity:1;transition:opacity .8s,transform .8s;transform:translateZ(0)}.text-frame{margin-bottom:40px}.border,.date,.text{font-size:29px;line-height:48px}.text{font-size:29px}}@media only screen and (max-width:768px){.button-icon{display:none}.image-frame{padding-top:75%;padding-bottom:20px;border-bottom:none}.image-frame .image{width:330px;height:260px;object-fit:contain}.text-frame{margin-bottom:120px}.border,.date,.text{font-size:16px}}.ace-overlay-wrapper .ace-overlay-backdrop{background-color:rgba(0,0,0,.75)}.video{background:#000}.video,.video .ace-dialog-body{padding:0}.play-button{width:160px;height:36px;z-index:3}.play-button .button{width:100%;height:100%;border:none;display:flex;align-items:center;justify-content:start;border-color:transparent;border-style:none;overflow:hidden;padding:0}@media only screen and (max-width:768px){.play-button .button{justify-content:center}}.play-button .button .play-text{display:none;line-height:36px;color:#181818;transition:all .8s}@media only screen and (max-width:768px){.play-button .button .play-text{display:inline;height:20px;line-height:20px;font-size:14px;color:#fe5300;letter-spacing:0;text-decoration:underline}}.play-button .play-icon{width:30px;height:30px;margin-right:14px;transition:all .8s}@media only screen and (max-width:768px){.play-button .play-icon{display:none}}.play-button:hover .play-icon{margin-left:0}.play-button:hover .play-text{display:inline}@media only screen and (min-width:769px){.play-button{position:absolute;color:#fff;right:90px;bottom:68px}.video{max-height:none!important;overflow:inherit}.video .ace-dialog-body{max-height:1000px!important;overflow-y:hidden!important}.video .dark-mask{width:100%;height:calc(100% - 50px);top:50px;padding-bottom:50px;display:flex;flex-direction:column;justify-content:center;align-items:center;position:absolute;z-index:3}.video .dark-mask .mask-image{width:70px;height:70px;cursor:pointer}.video .dark-mask .mask-text{margin-top:20px;font-size:14px;color:#181818}.gif-image{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);height:60px;width:200px;color:#fff;background:url(https://img.alicdn.com/tfs/TB13Kd_ToY1gK0jSZFCXXcwqXXa-420-71.gif);background-repeat:no-repeat;background-size:contain}video{width:100%;height:100%;object-fit:fill}}@media only screen and (max-width:768px){.play-button{position:relative!important}.ace-dialog-container{padding:0}.video{width:100%;min-height:158px!important;height:190px!important;margin:0;overflow:initial}.video .ace-dialog-body{padding:0;max-height:264px!important}.video video{width:100%;height:190px}.video .ace-dialog-close{z-index:2004;position:fixed;right:20px!important;top:46px!important}}.ace-drawer-box{position:relative;width:100%;height:524px;margin:0 0 32px;overflow:hidden;box-shadow:0 0 10px 0 #d6dcea}.ace-drawer-box-item{display:flex;flex-direction:column;position:absolute;z-index:2;top:0;left:0;height:100%;width:100%;background-color:#c0c3ca;box-shadow:-5px 0 10px 0 hsla(222,9%,77%,.5);transition:transform .3s cubic-bezier(1,0,0,1);transform:translateZ(0);overflow:hidden}.ace-drawer-box-item,.ace-drawer-box-item div{cursor:pointer}.ace-drawer-box-bg-content{position:relative;flex:1;overflow:hidden;background-color:#c0c3ca}.ace-drawer-box-bg{transition:opacity .3s,filter .3s;flex:1;opacity:.55;filter:brightness(1.2);height:418px;background-size:cover;background-position:0}.ace-drawer-box-header{display:flex;align-items:center;height:106px;background-color:#fff;overflow:hidden}.ace-drawer-box-no{transition:all .2s cubic-bezier(1,0,0,1);font-size:24px;color:#3d3d3d;text-align:center;flex-shrink:0;z-index:2;top:418px;left:0;width:80px;height:106px;line-height:106px}.ace-drawer-box-titleMain{font-size:20px;color:#181818;white-space:nowrap;line-height:24px}.ace-drawer-box-titleEn{font-size:12px;color:#181818;white-space:nowrap;opacity:.6;line-height:18px;margin-top:6px}.ace-drawer-box-desc{flex:10;font-size:14px;color:#646464;overflow:hidden;padding-left:44px;padding-right:10%;line-height:0;padding-top:2px}.ace-drawer-box-desc>div{display:-webkit-box;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;line-height:23px;max-height:46px}.ace-drawer-box-link{display:inline-block;overflow:hidden;white-space:nowrap;margin-top:4px;line-height:23px;padding-right:15px;background:url(https://img.alicdn.com/tfs/TB1GCR7Thz1gK0jSZSgXXavwpXa-14-24.png) no-repeat 100%/7px 12px}.ace-drawer-box-link,.ace-drawer-box-link:active,.ace-drawer-box-link:hover,.ace-drawer-box-link:link,.ace-drawer-box-link:visited{text-decoration:none;cursor:pointer}.ace-drawer-box-link,.ace-drawer-box-link:link,.ace-drawer-box-link:visited{color:#ff6a00}.ace-drawer-box-link:hover{color:#ff791a}.ace-drawer-box-link:active{color:#f65f00}.ace-drawer-box-current,.ace-drawer-box-current div{cursor:default}.ace-drawer-box-current .ace-drawer-box-bg{opacity:1;filter:brightness(1)}
    /*!
    Animate.css - http://daneden.me/animate
    Licensed under the MIT license - http://opensource.org/licenses/MIT
    Copyright (c) 2013 Daniel Eden*/.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}@keyframes bounce{0%,20%,53%,80%,to{transition-timing-function:cubic-bezier(.215,.61,.355,1);transform:translateZ(0)}40%,43%{transition-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-30px,0)}70%{transition-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-15px,0)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{0%{transform:scaleX(1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scaleX(1)}}.pulse{animation-name:pulse}@keyframes rubberBand{0%{transform:scaleX(1)}30%{transform:scale3d(1.25,.75,1)}40%{transform:scale3d(.75,1.25,1)}50%{transform:scale3d(1.15,.85,1)}65%{transform:scale3d(.95,1.05,1)}75%{transform:scale3d(1.05,.95,1)}to{transform:scaleX(1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{0%,to{transform:translateZ(0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes swing{20%{transform:rotate(15deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(5deg)}80%{transform:rotate(-5deg)}to{transform:rotate(0deg)}}.swing{transform-origin:top center;animation-name:swing}@keyframes tada{0%{transform:scaleX(1)}10%,20%{transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{transform:scaleX(1)}}.tada{animation-name:tada}@keyframes wobble{0%{transform:none}15%{transform:translate3d(-25%,0,0) rotate(-5deg)}30%{transform:translate3d(20%,0,0) rotate(3deg)}45%{transform:translate3d(-15%,0,0) rotate(-3deg)}60%{transform:translate3d(10%,0,0) rotate(2deg)}75%{transform:translate3d(-5%,0,0) rotate(-1deg)}to{transform:none}}.wobble{animation-name:wobble}@keyframes bounceIn{0%,20%,40%,60%,80%,to{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scaleX(1)}}.bounceIn{animation-name:bounceIn;animation-duration:.75s}@keyframes bounceInDown{0%,60%,75%,90%,to{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{0%,60%,75%,90%,to{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{0%,60%,75%,90%,to{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{0%,60%,75%,90%,to{transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}.bounceOut{animation-name:bounceOut;animation-duration:.75s}@keyframes bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-100%,0)}to{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{0%{opacity:0;transform:translate3d(0,-2000px,0)}to{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-100%,0,0)}to{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{0%{opacity:0;transform:translate3d(-2000px,0,0)}to{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(100%,0,0)}to{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{0%{opacity:0;transform:translate3d(2000px,0,0)}to{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{0%{opacity:0;transform:translate3d(0,2000px,0)}to{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{0%{opacity:1}to{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{0%{transform:perspective(400px) rotateY(-1turn);animation-timing-function:ease-out}40%{transform:perspective(400px) translateZ(150px) rotateY(-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translateZ(150px) rotateY(-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(.95,.95,.95);animation-timing-function:ease-in}to{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;animation-name:flip}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInX}@keyframes flipInY{0%{transform:perspective(400px) rotateY(90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateY(-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotateY(10deg);opacity:1}80%{transform:perspective(400px) rotateY(-5deg)}to{transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInY}@keyframes flipOutX{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateX(-20deg);opacity:1}to{transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{animation-name:flipOutX;animation-duration:.75s;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutY{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateY(-15deg);opacity:1}to{transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipOutY;animation-duration:.75s}@keyframes lightSpeedIn{0%{transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{transform:skewX(20deg);opacity:1}80%{transform:skewX(-5deg);opacity:1}to{transform:none;opacity:1}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{0%{opacity:1}to{transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{0%{transform-origin:center;transform:rotate(-200deg);opacity:0}to{transform-origin:center;transform:none;opacity:1}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{0%{transform-origin:right bottom;transform:rotate(45deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;transform:rotate(45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{0%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{0%{transform-origin:center;opacity:1}to{transform-origin:center;transform:rotate(200deg);opacity:0}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(-45deg);opacity:0}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(90deg);opacity:0}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate(80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%,80%{transform:rotate(60deg);transform-origin:top left;animation-timing-function:ease-in-out;opacity:1}to{transform:translate3d(0,700px,0);opacity:0}}.hinge{animation-name:hinge}@keyframes rollIn{0%{opacity:0;transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0) rotate(120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{animation-name:zoomOutUp}.ace-hot-events-accordion{margin:0 auto;position:relative;z-index:1}.ace-hot-events-accordion .ace-hot-events-accordion-bg{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1;background-color:hsla(0,0%,100%,.2)}.ace-hot-events-accordion .ace-hot-events-accordion-content{width:1180px;margin:0 auto;position:relative;z-index:2;overflow:hidden}.ace-hot-events-ac-title{overflow:hidden}.ace-hot-events-ac-title h2,.ace-hot-events-ac-title h3{font-weight:400;line-height:30px;text-align:left}.ace-hot-events-ac-title>h2{font-size:32px;color:#333;margin:23px 0 22px}.ace-hot-events-ac-title>h3{font-size:22px;color:#ff6a00;margin:0 0 41px}@media only screen and (min-width:769px){.ace-hot-events-accordion{display:block}}@media only screen and (max-width:768px){.ace-hot-events-accordion{display:none}}@font-face{font-family:swiper-icons;src:url("data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA") format("woff");font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}.swiper-container{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1}.swiper-container-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{transform:translateZ(0)}.swiper-container-multirow>.swiper-wrapper{flex-wrap:wrap}.swiper-container-multirow-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-container-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-container-3d{perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:linear-gradient(270deg,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-right{background-image:linear-gradient(90deg,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-top{background-image:linear-gradient(0deg,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(180deg,rgba(0,0,0,.5),transparent)}.swiper-container-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-container-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-container-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-container-horizontal.swiper-container-css-mode>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-container-vertical.swiper-container-css-mode>.swiper-wrapper{scroll-snap-type:y mandatory}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(-1 * var(--swiper-navigation-size)/ 2);z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;text-transform:none;font-variant:normal;line-height:1}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{left:10px;right:auto}.swiper-button-prev:after,.swiper-container-rtl .swiper-button-next:after{content:"prev"}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{right:10px;left:auto}.swiper-button-next:after,.swiper-container-rtl .swiper-button-prev:after{content:"next"}.swiper-button-next.swiper-button-white,.swiper-button-prev.swiper-button-white{--swiper-navigation-color:#fff}.swiper-button-next.swiper-button-black,.swiper-button-prev.swiper-button-black{--swiper-navigation-color:#000}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;transition:opacity .3s;transform:translateZ(0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active,.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet-active{opacity:1;background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:6px 0;display:block}.swiper-container-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-container-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:transform .2s,top .2s}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 4px}.swiper-container-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-container-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,left .2s}.swiper-container-horizontal.swiper-container-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,right .2s}.swiper-pagination-progressbar{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progressbar,.swiper-container-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:4px;left:0;top:0}.swiper-container-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-container-vertical>.swiper-pagination-progressbar{width:4px;height:100%;left:0;top:0}.swiper-pagination-white{--swiper-pagination-color:#fff}.swiper-pagination-black{--swiper-pagination-color:#000}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;animation:swiper-preloader-spin 1s infinite linear;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{to{transform:rotate(1turn)}}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-container-fade.swiper-container-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube.swiper-container-rtl .swiper-slide{transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;filter:blur(50px);z-index:0}.swiper-container-flip{overflow:visible}.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}@media only screen and (min-width:769px){.ace-hotevents{display:none}}@media only screen and (max-width:768px){.ace-hotevents{display:block;width:100%;height:725px!important;padding-top:39px;background:#fff}.ace-hotevents h2,.ace-hotevents h3,.ace-hotevents h4{font-weight:400;margin-bottom:0}.ace-hotevents h2{height:45px;font-size:32px;color:#ff6a00;letter-spacing:.36px;text-align:left;margin-left:20px}.ace-hotevents h3,.ace-hotevents h4{height:30px;margin-left:20px;font-size:18px;color:#333;letter-spacing:0;text-align:left;line-height:30px}.ace-hotevents h4{margin-bottom:40px}.ace-hotevents .swiper-container-mob{width:100%;overflow:hidden;margin-top:40px}.ace-hotevents .swiper-container-mob .swiper-pagination-bullets{bottom:40px}.ace-hotevents .swiper-container-mob .swiper-slide{height:400px;margin-top:40px;margin-bottom:67px;position:relative;display:flex;justify-content:center;transition:.5s}.ace-hotevents .swiper-container-mob .swiper-slide img{width:100%}.ace-hotevents .swiper-container-mob .swiper-slide .content{display:none;position:absolute;bottom:0;width:292px;height:112px;box-sizing:border-box;background:rgba(0,0,0,.6);padding:12px 20px 15px}.ace-hotevents .swiper-container-mob .swiper-slide .content .content-title{height:25px;font-size:18px;color:#fff;letter-spacing:1.01px;text-align:left;margin-bottom:10px}.ace-hotevents .swiper-container-mob .swiper-slide .content p{display:block;height:50px;width:252px;font-size:12px;color:#fff;letter-spacing:0;text-align:justify;line-height:17px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3}.ace-hotevents .swiper-container-mob .swiper-slide-active{width:292px!important;height:483px!important;margin-top:0!important;margin-bottom:24px!important}.ace-hotevents .swiper-container-mob .swiper-slide-active .content{display:block!important}.ace-hotevents .swiper-pagination{bottom:40px}.ace-hotevents .swiper-pagination-bullet{width:10px;height:10px}.ace-hotevents .my-bullet-active{background:#f60;opacity:1}.ace-hotevents .swiper-container-pc{display:none!important}.ace-hotevents .swiper-container-mob{display:block!important}}.componenet-wrap{background-color:transparent!important}.background-video{transform:translateZ(0)}.componenet-wrap{background-color:transparent!important}.dist-guest-view{position:relative}.dist-guest-view .dist-guest-bg{position:relative;z-index:2}.dist-guest-view h2,.dist-guest-view h4{overflow:hidden;white-space:nowrap;margin-bottom:0}.dist-guest-view h3{white-space:nowrap}.dist-guest-view h5{text-overflow:ellipsis;overflow:hidden;display:-webkit-box}.dist-guest-view .ant-spin-dot-item{background-color:#ff6a00}@media only screen and (min-width:769px){.dist-guest-mobile{display:none}.dist-guest-pc{width:100%}.dist-guest-pc-content{width:1180px;margin:0 auto}.dist-guest-pc-content .dist-guest-title-box{z-index:1;padding-top:56px;overflow:hidden}.dist-guest-pc-content .dist-guest-h2-index{margin:0 0 22px;font-weight:400;height:30px;font-size:32px;color:#333;letter-spacing:0;text-align:left;line-height:30px}.dist-guest-pc-content .dist-guest-h3-index{margin:0 0 40px;height:30px;font-size:22px;color:#ff6a00;letter-spacing:.25px;text-align:left;font-weight:400}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap{position:relative}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-next,.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-prev{font-family:sans-serif;position:absolute;top:50%;margin-top:-26px;z-index:1;display:block;width:20px;height:40px;text-align:center;line-height:40px;cursor:pointer;outline:none}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-next:after,.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-prev:after{display:none!important}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-prev{left:-45px;background:url(https://img.alicdn.com/tfs/TB17WGgThv1gK0jSZFFXXb0sXXa-42-80.png) no-repeat center 0;background-size:20px 40px}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-end,.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-next{right:-45px;background:url(https://img.alicdn.com/tfs/TB1Hk0_TeH2gK0jSZJnXXaT1FXa-42-80.png) no-repeat center 0;background-size:20px 40px}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-end{font-family:sans-serif;position:absolute;top:50%;margin-top:-26px;z-index:1;display:block;width:20px;height:40px;text-align:center;line-height:40px;cursor:pointer;outline:none}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-end:after{display:none!important}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-button-disabled{display:none}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest{user-select:none}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide{transition:all .5s ease;box-shadow:0 2px 10px 0 rgba(0,0,0,.1);height:375px;width:280px;position:relative}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide *{box-sizing:border-box}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide>img{height:100%;width:100%}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-img-bg{border:2px solid;border-image:linear-gradient(90deg,#fff,hsla(0,0%,86%,0)) 30 30 stretch;border-left-width:0;border-right-width:0;z-index:1;height:100px;width:280px;background-image:linear-gradient(-60deg,hsla(0,0%,100%,.1),hsla(0,0%,100%,.75) 88%);backdrop-filter:blur(5px);position:absolute;bottom:24px;left:0;right:0}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top{z-index:4;opacity:1;height:150px;width:280px;transition:bottom .5s ease;position:absolute;bottom:-145.7px;left:0;right:0;text-align:left}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top>div{margin-left:20px;height:1.1px;width:244.3px;opacity:.3;background:#fff;background-color:#fff}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top h3,.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top h4,.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top h5{font-weight:400}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top>h3{font-size:24px;color:#fff;letter-spacing:0;margin:17px 0 0 20px}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top>h4{height:22px;font-size:16px;color:#fff;letter-spacing:0;margin-left:20px;margin-bottom:0}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top .positionsCn-2{margin-bottom:24px}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top>h5{width:244px;font-size:12px;color:#fff;letter-spacing:0;margin:12px 20px}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-top-bg{z-index:3;background-image:linear-gradient(270deg,#ffa23e,#ff6b03);opacity:1;height:150px;width:280px;transition:bottom .5s ease;position:absolute;bottom:-145.7px;left:0;right:0}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-bottom{z-index:2;position:absolute;height:100px;width:280px;bottom:24px;left:0;right:0;text-align:left;padding:12px 0 12px 10px}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-bottom h3,.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-bottom h4,.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-bottom h5{font-weight:400}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-bottom>h3{height:33px;font-size:24px;color:#333;letter-spacing:0;margin-bottom:0}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide .dist-guest-hov-div-bottom>h4{height:22px;font-size:16px;color:#333;letter-spacing:0;margin-bottom:0}.dist-guest-pc-content .swiper-demo-container-dist-guest-wrap .swiper-demo-container-dist-guest .swiper-slide.no-data{width:1180px!important;display:flex;justify-content:center;align-items:center;font-size:18px;color:rgba(0,0,0,.25)}.dist-guest-pc-content-index{padding-bottom:72px}}@media only screen and (max-width:768px){.dist-guest-pc{display:none}.dist-guest-mobile-guest .dist-guest-mobile-h2-index,.dist-guest-mobile .dist-guest-mobile-h2-index{height:45px;font-size:32px;color:#ff6a00;letter-spacing:.36px;text-align:left;margin:0 5px 16px 20px;white-space:nowrap;font-weight:400}.dist-guest-mobile-guest .dist-guest-mobile-h3-index,.dist-guest-mobile .dist-guest-mobile-h3-index{height:30px;font-size:18px;color:#333;text-align:left;margin:0 0 40px 20px;font-weight:400}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest,.dist-guest-mobile .swiper-mobile-container-dist-guest{width:100%;padding-bottom:21px}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-wrapper,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-wrapper{align-items:center}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide{text-align:center;font-size:18px;background:#ccc;display:flex;width:80%;justify-content:center;align-items:center}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide *,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide *{box-sizing:border-box}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a{position:relative;display:block;width:100%;padding-bottom:134%}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a>img,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a>img{position:absolute;top:0;left:0;z-index:1;width:100%;height:100%}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img{z-index:3;position:absolute;bottom:0;left:0;right:0;padding:0 20px 17px;text-align:left}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img h3,.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img h4,.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img h5,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img h3,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img h4,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img h5{font-weight:400}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img>h3,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img>h3{height:25px;font-size:18px;color:#fff;margin-bottom:7px}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img>h4,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a>.dist-guest-mob-img>h4{height:17px;font-size:12px;color:#fff}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide>a .dist-guest-mob-img-bg,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide>a .dist-guest-mob-img-bg{z-index:2;background-image:linear-gradient(180deg,transparent,rgba(0,0,0,.1),#000);position:absolute;height:150px;bottom:0;left:0;right:0}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide .swiper-slide-shadow-left,.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .swiper-slide .swiper-slide-shadow-right,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide .swiper-slide-shadow-left,.dist-guest-mobile .swiper-mobile-container-dist-guest .swiper-slide .swiper-slide-shadow-right{display:none}.dist-guest-mobile-guest .swiper-mobile-container-dist-guest .no-data,.dist-guest-mobile .swiper-mobile-container-dist-guest .no-data{display:flex;justify-content:center;align-items:center;font-size:16px;color:rgba(0,0,0,.25);width:100%;height:375px}.dist-guest-mobile-index{padding-top:47px;padding-bottom:40px}}@font-face{font-family:swiper-icons;src:url("data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA") format("woff");font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}.swiper-container{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1}.swiper-container-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{transform:translateZ(0)}.swiper-container-multirow>.swiper-wrapper{flex-wrap:wrap}.swiper-container-multirow-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-container-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-container-3d{perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:linear-gradient(270deg,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-right{background-image:linear-gradient(90deg,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-top{background-image:linear-gradient(0deg,rgba(0,0,0,.5),transparent)}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(180deg,rgba(0,0,0,.5),transparent)}.swiper-container-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-container-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-container-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-container-horizontal.swiper-container-css-mode>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-container-vertical.swiper-container-css-mode>.swiper-wrapper{scroll-snap-type:y mandatory}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(-1 * var(--swiper-navigation-size)/ 2);z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;text-transform:none;font-variant:normal;line-height:1}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{left:10px;right:auto}.swiper-button-prev:after,.swiper-container-rtl .swiper-button-next:after{content:"prev"}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{right:10px;left:auto}.swiper-button-next:after,.swiper-container-rtl .swiper-button-prev:after{content:"next"}.swiper-button-next.swiper-button-white,.swiper-button-prev.swiper-button-white{--swiper-navigation-color:#fff}.swiper-button-next.swiper-button-black,.swiper-button-prev.swiper-button-black{--swiper-navigation-color:#000}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;transition:opacity .3s;transform:translateZ(0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active,.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet-active{opacity:1;background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:6px 0;display:block}.swiper-container-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-container-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:transform .2s,top .2s}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 4px}.swiper-container-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-container-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,left .2s}.swiper-container-horizontal.swiper-container-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:transform .2s,right .2s}.swiper-pagination-progressbar{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progressbar,.swiper-container-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:4px;left:0;top:0}.swiper-container-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-container-vertical>.swiper-pagination-progressbar{width:4px;height:100%;left:0;top:0}.swiper-pagination-white{--swiper-pagination-color:#fff}.swiper-pagination-black{--swiper-pagination-color:#000}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;animation:swiper-preloader-spin 1s infinite linear;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{to{transform:rotate(1turn)}}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-container-fade.swiper-container-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube.swiper-container-rtl .swiper-slide{transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;filter:blur(50px);z-index:0}.swiper-container-flip{overflow:visible}.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}

    路径位置、文件夹、名称、图片等代码内都有请自行替换。

  • 低成本高性能AI开发神器!极摩客EVO-X2桌面Mini AI工作站深度评测

    今年初的CES上,AMD发布了专门针对AI PC领域的高算力移动平台——AMD锐龙AI Max+,这一系列处理器基于AMD Zen5架构设计,最大亮点是集成多达40个RDNA3.5架构的图形计算单元,并且提供了高达256GB/s的超高带宽内存接口,同时还集成了50TOPS算力的XDNA2架构NPU。

    了解AI的朋友都知道,当前AI应用硬件层面的主要瓶颈就在于GPU与内存,无论是Stable Diffusion的文生图、图生图、文生视频等应用,还是围绕各种大模型的智能体类应用,只要涉及到本地化部署和使用,主要瓶颈就是GPU和内存。锐龙AI Max+就瞄准了这两大痛点,通过高算力图形计算单元以及高容量、高带宽内存方案,让AI PC、迷你电脑也具备了堪比台式机的AI算力水平。因此,锐龙AI Max+平台堪称当前性能最强、AI算力最为彪悍的移动级处理器。

    今天我们拿到的是搭载AMD锐龙AI Max+ 395处理器的极摩客EVO-X2迷你电脑,它的定位是”Mini AI工作站”。

    作为当前少数搭载AMD锐龙AI Max+ 395处理器的迷你电脑,极摩客EVO-X2桌面AI超算中心在AI应用方面究竟会有怎样的表现?通过本篇评测,我们来一探究竟。

    ·硬件配置与性能表现

    首先我们看看这款机器的配置与性能表现。

    极摩客EVO-X2桌面AI超算中心搭载的AMD锐龙AI Max+ 395处理器,是锐龙AI Max+系列的顶配型号,原生16颗超大核心32线程设计,最高加速频率5.1GHz,总缓存高达80MB,NPU峰值AI算力为50TOPS,cTDP为45-120W,集成40个图形核心的Radeon 8060S iGPU。

    【CPU单核/多核性能】

    参考CINEBENCH R23和2024测试,锐龙AI Max+ 395处理器在R23测试标准下,单核得分1985,多核得分36648;2024标准下单核得分113,多核得分1752,整体性能表现非常出色,甚至可以探到移动端HX级别处理器的性能水准。因此锐龙AI Max+ 395并非”AI偏科生”,而是有着极其扎实的单核和多核性能实力。

    【CPU功耗释放】

    得益于极摩客EVO-X2桌面AI超算中心较大体积带来的内部空间,AIDA 64 FPU CPU单烤机实测这颗处理器的长时稳定功耗释放可以保持在103W附近,平均核心温度99.1℃,3分钟以内的短时功耗释放甚至可以达到120W。

    【内存读写性能】

    锐龙AI Max+ 395在设计时针对AI应用角度的这种特性,大幅提升了内存带宽,所以AIDA 64内存性能测试的结果极为出色。这款机器配备的双通道128GB LPDDR5x 8000高速内存读取速度高达119.34GB/s,写入速度高达210.1GB/s,拷贝速度高达153.49GB/s,速度极快。

    【硬盘读写性能】

    存储方面,极摩客EVO-X2桌面AI超算中心一步到位配备了2TB容量的雷克沙PCIe 4.0固态硬盘,实测顺序读取速度为7116.8MB/s,顺序写入速度为6440.38MB/s,4K随机读取速度为69.5MB/s,4K随机写入速度为207.96MB/s,达到了PCIe 4.0固态硬盘的高端性能水准。这非常有助于大参数量大语言模型的载入速度。

    【GPU图形性能】

    锐龙AI Max+ 395之所以能够胜任大参数量AI大模型的需求,很重要的原因在于它集成的Radeon 8060S iGPU,这颗GPU在集成显卡中可以说是超模的存在。它拥有2560个流处理器,6GB LPDDR5显存,128GB/s显存带宽,核心频率高达2900MHz,显存频率1000MHz,比当前任何一款集成显卡的性能都要强很多。

    参考3DMark各项测试可以看到,Radeon 8060S iGPU在Speed Way DX12性能方面得分达到了2025,远超其它iGPU性能。Port Royal光追性能达到了5884分,基本达到了RTX 4060独显的水平(5957分左右)。而Time Spy以及Fire Strike图形分也分别达到了11498和30713分,作为集成显卡,它的理论图形性能其实达到甚至超越了RTX 4060独显的水平,着实让人感到惊艳。

    ·综合应用性能评估

    CPU、内存、硬盘、GPU理论性能了解之后,我们来看看如此出色的综合性能能够在实际应用中获得怎样的体验?

    【CPU应用性能】

    首先是CPU相关的应用性能表现。

    7-Zip压缩与解压缩测试中,锐龙AI Max+ 395处理器得益于16颗超大核心32线程设计,压缩速度达到了150617KB/s,解压缩速度达到了2063057KB/s,总评分高达177.76GIPS,是目前移动级处理器中T0级别的性能水准。

    视频编码方面,x264 Benchmark实测编码2500帧的帧速率为77.31fps,完成时间为32秒,相对于HX系列的处理器要略慢一些。

    渲染方面,V-Ray Bencmark 1分钟采样率达到38813 vsamples;Corona Benchmark渲染速度达到了11248700Rays/sec,渲染用时仅43秒。

    总体来说,锐龙AI Max+ 395处理器在压缩、解压缩以及物理渲染方面有着远高于其它移动端处理器的性能表现,而视频编码能力满足生产力需求也是不成问题的。

    【GPU应用性能】

    接下来再看看GPU相关的应用性能。

    首先是V-Ray Benchmark的加速测试,1分钟渲染速度达到了1812 vpaths,在集成显卡中鹤立鸡群。

    Blender benchmark的表现同样出色,monster、junkshop、classroom三项渲染采样率分别达到560.23、199.86以及252.34 samples/min,同样远超当前其它集成显卡的性能。

    综合应用性能】

    最后看看综合应用性能。

    生产力理论性能我们参考PCMark 10办公模式测试:常用基本功能,包含Web浏览、视频会议、应用程序启动等得分为11425分,说明其完成这些基础办公任务没有任何问题;生产力项目测试中得分高达10717分,表明其拥有卓越的电子表格、文档工作性能;数位内容创作评分高达16366分,说明其能够非常高效地完成图片、视频编辑、图形渲染等工作;综合得分9039,应对日常办公、娱乐应用没有任何问题。

    生产力应用性能我们参考UL Procyon的照片编辑和视频编辑测试,二者评分分别达到了8955和22765分,可以相当轻松地胜任RAW格式原片处理,并且在2K、4K视频剪辑上也能提供极为出色的性能支持。

    AI性能评估

    搭载AMD锐龙AI Max+ 395处理器的极摩客EVO-X2售价为14999元,对于大众用户这个价格不便宜,但是如果将它与动辄数万、数十万元的AI一体机来做对比的话,这款机器可以说是目前成本相当低的AI学习、开发、应用平台,对初步上手AI的人群来说非常适合。

    了解AI的朋友都知道,显存和内存在AI应用中非常重要,Radeon 8060S虽然图形性能极为出色,但其显存也不过就是6GB,应对AI大语言模型的应用需求有点捉襟见肘。不过通过AMD独特的统一内存技术,在AMD软件控制中心,我们可以将极摩客EVO-X2的128GB内存分配给集成显卡作显存,最高可以分配96GB,这样就可以承担起大参数量大语言模型的应用需求了。

    理论性能了解之后,我们看看锐龙AI Max+ 395在实际AI应用中的表现。

    首先通过UL Procyon测试了Phi-3.5 4B、Mistral 7B、Llama 3.1 8B以及Llama 2 13B四款经典大语言模型,生成速度分别达到了69.56 tokens/s、44.87 tokens/s、38.01 tokens/s以及25.45 tokens/s,速度非常快。另外值得一提的是,即便是RTX 5060笔记本电脑GPU,因为其作为独立显卡也只有可怜的8GB显存,所以也无法正常运行参数量较大的Llama 2大模型,而Radeon 8060S不仅成功运行,且生成速度能够达到25.45 tokens/s,日常应用完全没有问题。此时,锐龙AI Max+ 395平台的独特优势就彻底显现出来了。

    首先在各类小参数量稠密大模型测试中可以看到,锐龙AI Max+ 395表现非常出色,凭借内存分配带来的超大显存支持,即便是遇到BF16高精度的Mistral-small 24B以及Gemma 2 27B大模型,生成速度也分别达到了12.37 tokens/s和11.62 tokens/s,表现出色。而对于更高性能的DeepSeek R1 14B、Phi-4 15B,速度也能达到19.63 tokens/s和12.24 tokens/s;低精度的DeepSeek R1 7B生成速度更是达到了41.94 tokens/s,而DeepSeek R1 1.5B则达到了92.67 tokens/s,可见在面对小参数量大模型时,锐龙AI Max+ 395无论是面对高精度模型还是低精度模型,都能提供足够快的生成速度。

    另外这里要说明的一点是,Qwen3-235B-A22B-IQ2_S这个模型虽然参数量达到了235B,但它并非是常见的稠密模型,而是MoE(Mixtureofexperts)混合专家模型。简单来说,MoE模型虽然总参数量很大,但以Qwen3-235B-A22B-IQ2_S模型为例,它虽然拥有235B总参数量,但运行时实际只会调用22B(模型中A22B标识就表示运行时只会调用22B参数量)的参数进行计算,因此对于硬件的压力要小很多。

    也正是因为有着这种大参数、低算力特性,MoE模型或许会成为未来大模型发展的主流趋势。

    反之,稠密模型每一次计算都会调用所有参数,这也就是为什么235B的Qwen3-235B-A22B-IQ2_S生成速度反而比DeepSeek R1 32B、QWQ 32B大模型要快的原因。

    AI测试的最后一部分,我们使用了针对AMD锐龙平台打造的Amuse这款Stable Diffusion工具,它支持文生图、图生图、文生视频等应用,使用起来非常方便。

    锐龙AI Max+ 395集成的Radeon 8060S本身拥有相当不错的图形性能,因此对于游戏玩家来说也是不错的选择。所以性能测试的最后一部分,我们进行了四款热门游戏的测试。

    《三角洲行动》,极高画质(次高画质),2560×1600分辨率,平均帧率可以达到96fps,流畅运行无压力。

    《荒野大镖客2》,中等画质,2560×1600分辨率,开启FSR,平均帧率可以达到89fps,运行非常流畅。

    《赛博朋克2077》,超级画质,未开启光追,2560×1600分辨率,平均帧率可以达到59.23fps,接近60fps的表现已经远超当前其它集成显卡了。

    《黑神话:悟空》,超高画质(非影视级画质),2560×1600分辨率,平均帧率达到了62fps,可以流畅游玩。

    可见极摩客EVO-X2不仅拥有出色的AI性能,同时还有着不错的游戏性能,再加上出色的生产力性能,这款产品可以说是相当能打的一款综合性迷你主机了。而且确实不负”桌面AI超算中心”之名!

    简约干练的外观设计

    作为一款较大体积的迷你电脑,极摩客EVO-X2桌面AI超算中心在设计上还是很有看点的。这款机器整体采用了类似”夹心饼干”的设计方式,顶部和底部采用银色金属面板打造,中间采用黑色配色,从外观配色上就给人一种很极客的感觉。

    这款机器的设计风格简约,卧放时正面的切角区域印有”GMKtec”的品牌LOGO,五边形切角设计打破了正方形机身”循规蹈矩”的感觉。正如其独特的配置一样,仿佛彰显着不拘一格、打破壁垒的产品语言。

    这款机器支持卧放和立放,可以适应不同尺寸的办公空间。另外可以看到切角对应的区域设计有一枚三角形按键,它的作用是一键切换风扇的灯效模式。可以很方便的在常亮、呼吸等灯效模式中快速切换。极摩客EVO-X2桌面AI超算中心有着非常出色的接口扩展能力,机身前端配有电源键和P-Mode性能模式切换快捷键。同时还配有标准的SD卡插槽,1个USB4接口,2个USB 3.2 Type-A接口以及3.5mm耳麦插孔。机身背部接口就更加丰富了。包括安全锁孔,电源插孔,3.5mm耳麦插孔,RJ45以太网口,1个USB 3.2 Gen 2 Type-A接口,1个USB4接口,1个DP1.4视频端口,1个HDMI2.1视频端口以及2个USB2.0接口。另外可以看到在接口区域下方,还设计有四个散热格栅。同时机身底部面板也开有大面积的散热孔,整体散热效率得到保障。

    ·评测总结年初我在CES参加AMD发布会时,就对锐龙AI Max+ 395产生了极大兴趣。因为在整个行业里,锐龙AI Max+是颇为独特的存在,它从CPU的角度赋予了AI PC更加确切的定义,让移动端的AI处理器与传统移动端处理器产生了区隔。不过说实话,当时对于锐龙AI Max+的实际表现还是颇有疑问的,毕竟集成显卡跑出超越独立显卡的AI性能,在年初还是一件相当魔幻的事情。

    不过在这次对锐龙AI Max+ 395处理器和极摩客EVO-X2桌面AI超算Mini工作站的深入测试中,此前的疑虑被彻底打破。MoE混合专家模型的出现,或许是未来锐龙AI Max+ 395这类处理器切入大参数量模型本地部署和应用的主要方式,而且实际效果真心不错。

    此外,锐龙AI Max+ 395有着非常不错的生产力性能和游戏性能,对于迷你电脑、笔记本电脑来说也是相当靠谱的硬件解决方案。

    而对于极摩客EVO-X2桌面AI超算中心这款产品来说,笔者个人认为它非常适合正在学习AI、研究AI、或者本地部署使用AI的工作室、小型企业用户选择,算得上是当前极低成本的高算力AI解决方案了。

  • 体重计算器 HTML

    <在HTML中创建体重计算器,你可以使用HTML表单(form)和JavaScript来收集用户输入并计算体重。下面是一个简单的示例,展示了如何创建一个基本的体重计算器。

    HTML部分

    首先,你需要创建一个HTML文件,并添加一个表单和一些输入字段,例如身高和体重(这里我们使用BMI(Body Mass Index,身体质量指数)作为示例)。

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>体重计算器</title>
        <script src="calculator.js"></script> <!-- 引入JavaScript文件 -->
    </head>
    <body>
        <h2>体重计算器</h2>
        <form id="weightCalculator">
            <label for="height">身高 (cm):</label>
            <input type="number" id="height" name="height" required><br><br>
            <label for="weight">体重 (kg):</label>
            <input type="number" id="weight" name="weight" required><br><br>
            <button type="button" onclick="calculateBMI()">计算BMI</button>
        </form>
        <p>您的BMI是:<span id="bmiResult">--</span></p>
    </body>
    </html>

    JavaScript部分

    接下来,创建一个名为calculator.js的JavaScript文件,并添加以下代码来处理BMI的计算。

    function calculateBMI() {
        var height = document.getElementById('height').value; // 获取身高输入值
        var weight = document.getElementById('weight').value; // 获取体重输入值
        var bmi;
     
        if (height === "" || weight === "") {
            alert("请填写所有字段!");
            return; // 如果没有填写完整,则不进行计算并返回
        }
     
        // 计算BMI值
        bmi = weight / ((height / 100) * (height / 100));
        document.getElementById('bmiResult').textContent = bmi.toFixed(2); // 显示结果,保留两位小数
    }

    解释

    1. HTML部分:表单包含两个输入字段,分别用于输入身高(厘米)和体重(千克)。还有一个按钮,当点击时调用calculateBMI()函数。结果显示在<p>标签内。
    2. JavaScript部分calculateBMI()函数首先获取用户输入的身高和体重值。然后,它计算BMI值,并将其显示在页面上。如果任何输入字段为空,则显示一个警告消息。

    确保将calculator.js文件放在与HTML文件相同的目录中,或者根据需要调整<script>标签中的src属性。这样,当用户填写完表单并点击“计算BMI”按钮时,页面上就会显示计算出的BMI值。

    ps:仅供参考。

  • HTML 简易计算器

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset=utf-8/>
        <title>Calculator</title>
        <style id="jsbin-css">
            div, span {
                margin: 0;
                padding: 0;
                font-weight: bold;
                font: bold 16px Arial, sans-serif;
                /*禁止选中文本*/
                -moz-user-select: none;
                -webkit-user-select: none;
                -o-user-select: none;
                user-select: none;
            }
    
            body {
                background: radial-gradient(circle, #fff, #aaa);
                background: -webkit-radial-gradient(circle, #fff, #aaa);
                background: -o-radial-gradient(circle, #fff, #aaa);
                background: -moz-radial-gradient(circle, #fff, #aaa);
                background-size: cover;
            }
    
            #calculator {
                width: 325px;
                height: auto;
                margin: 100px auto;
                padding: 20px;
                background: linear-gradient(#9dd2ea, #8bceec);
                background: -o-linear-gradient(#9dd2ea, #8bceec);
                background: -webkit-linear-gradient(#9dd2ea, #8bceec);
                background: -moz-linear-gradient(#9dd2ea, #8bceec);
                border-radius: 5px;
                box-shadow: 0 7px 8px #0000ff
            }
    
            .keys, .head {
                overflow: hidden;
            }
    
            .keys span, .clear {
                float: left;
                width: 66px;
                height: 40px;
                margin: 0 5px 10px 8px;
                text-align: center;
                line-height: 40px;
                border-radius: 3px;
                background: #eee;
                box-shadow: 0 5px 1px #999;
                cursor: pointer;
                transition: all 0.3s ease;
            }
    
            .keys span:hover {
                background: #87cefa;
                box-shadow: 0 5px 1px #1e90ff;
                color: #fff;
            }
    
            .keys .sign {
                background: #fffacd;
            }
    
            .clear {
                float: left;
                background: #ffb6c1;
                box-shadow: 0 5px 1px #ff86c1;
            }
    
            .clear:hover {
                background: #ff96a1;
                box-shadow: 0 5px 1px #ff4691;
                color: #fff;
            }
    
            .show {
                width: 213px;
                height: 40px;
                float: right;
                margin: 0 16px 5px 0;
                border-radius: 3px;
                background: #999;
                font-size: 20px;
                line-height: 40px;
                text-align: right;
                padding-right: 10px;
                box-shadow: inset 0 4px 5px #333;
            }
        </style>
    </head>
    <body>
    <div id="calculator">
        <div class="head">
            <span class="clear">c</span>
            <div class="show"></div>
        </div>
        <div class="keys">
            <span>7</span>
            <span>8</span>
            <span>9</span>
            <span class="sign">+</span>
            <span>4</span>
            <span>5</span>
            <span>6</span>
            <span class="sign">-</span>
            <span>1</span>
            <span>2</span>
            <span>3</span>
            <span class="sign">*</span>
            <span>0</span>
            <span>.</span>
            <span>=</span>
            <span class="sign">/</span>
        </div>
    </div>
    <script>
        window.onload = function () {
            var oShow = getByClass("calculator", "show")[0];
            var aNum = document.getElementById("calculator").getElementsByTagName("span");
            for (var i = 0, iLen = aNum.length; i < iLen; i++) {
                aNum[i].onclick = function () {
                    var oShowVal = oShow.innerHTML;
                    var oNumVal = this.innerHTML;
                    var num1, num2 = null;
                    num1 = oShowVal;
                    //判断按键
                    if (oNumVal == "c") {
                        oShow.innerHTML = "";
                    }
                    else if (oNumVal == "=") {
                        var oResult = eval(oShowVal);
                        console.log(oResult);
                        oShow.innerHTML = oResult==undefined?'0':oResult;
                    }
                    else {
                        oShow.innerHTML += oNumVal;
                    }
                }
            }
        };
        function getByClass(root, sClass) {
            var obj = document.getElementById(root);
            var arr = [];
            var aItems = obj.getElementsByTagName("*");
            for (var i = 0; i < aItems.length; i++) {
                if (aItems[i].className == sClass) {
                    arr.push(aItems[i]);
                }
            }
            return arr;
        }
    </script>
    </body>
    </html>
  • 数据可视化大屏

    作为大数据的学生,每次想实现前端数据可视化大屏就头疼,不会前端就很烦,所以这次特定不断调教AI,再加上自己不断的改改改,终于花了一个下午改成了一个还过得去的可视化大屏,所以直接把源码分享在这里了,但是要自己导入echarts组件。 index.html页面

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>电商数据可视化大屏</title>
        <script src="./StyleUtils/js/utils/echarts.min.js"></script>
        <script src="./StyleUtils/map/china.js"></script>
        <script src="./StyleUtils/js/utils/jQuery.js"></script>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
    <div class="decoration decoration-1"></div>
    <div class="decoration decoration-2"></div>
    <div class="grid-line"></div>
     
    <div class="dashboard">
        <div class="header">
            <h1>电商数据智能分析平台</h1>
            <div id="timeDisplay"></div>
        </div>
     
        <!-- 第二行 -->
        <div class="card">
            <div class="card-title">
                <i>📊</i> 商品销售排行
            </div>
            <div class="chart-container" id="barChart1"></div>
        </div>
     
        <div class="card">
            <div class="card-title">
                <i>📈</i> 核心数据指标
            </div>
            <div class="stats-container">
                <div class="stat-card">
                    <h3>今日销售额</h3>
                    <div class="stat-value">¥ 1,248,560</div>
                    <div class="stat-trend trend-up">↑ 12.5% 较昨日</div>
                </div>
                <!--      <div class="stat-card">-->
                <!--        <h3>订单完成量</h3>-->
                <!--        <div class="stat-value">24,856</div>-->
                <!--        <div class="stat-trend trend-up">↑ 8.3% 较昨日</div>-->
                <!--      </div>-->
                <!--      <div class="stat-card">-->
                <!--        <h3>用户访问量</h3>-->
                <!--        <div class="stat-value">186,423</div>-->
                <!--        <div class="stat-trend trend-down">↓ 3.2% 较昨日</div>-->
                <!--      </div>-->
                <!--      <div class="stat-card">-->
                <!--        <h3>转化率</h3>-->
                <!--        <div class="stat-value">13.4%</div>-->
                <!--        <div class="stat-trend trend-up">↑ 1.7% 较昨日</div>-->
                <!--      </div>-->
            </div>
        </div>
     
        <div class="card">
            <div class="card-title">
                <i>📊</i> 品类销售占比
            </div>
            <div class="chart-container" id="barChart2"></div>
        </div>
     
        <!-- 第三行 -->
        <div class="card">
            <div class="card-title">
                <i>📈</i> 销售趋势分析
            </div>
            <div class="chart-container" id="lineChart1"></div>
        </div>
     
        <div class="card map-container">
            <div class="card-title">
                <i>🗺️</i> 全国销售热力图
            </div>
            <div class="chart-container" id="mapChart"></div>
        </div>
     
        <div class="card">
            <div class="card-title">
                <i>📈</i> 用户活跃趋势
            </div>
            <div class="chart-container" id="lineChart2"></div>
        </div>
     
        <!-- 第四行 -->
        <div class="card">
            <div class="card-title">
                <i>🍰</i> 用户年龄分布
            </div>
            <div class="chart-container" id="pieChart1"></div>
        </div>
     
        <div class="card">
            <div class="card-title">
                <i>🍰</i> 支付方式占比
            </div>
            <div class="chart-container" id="pieChart2"></div>
        </div>
     
        <div class="footer">
            <p>数据更新时间: 2023年11月15日 14:28:35 | © 2023 电商数据平台 版权所有</p>
        </div>
    </div>
     
    <script src="style.js"></script>
    </body>
    </html>

    index.css

    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-family: 'Microsoft YaHei', sans-serif;
    }
     
    body {
        background: linear-gradient(135deg, #0f172a, #1e293b);
        color: #e2e8f0;
        min-height: 100vh;
        padding: 20px;
        overflow-x: hidden;
    }
     
    .dashboard {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        grid-template-rows: auto;
        gap: 20px;
        max-width: 1920px;
        margin: 0 auto;
    }
     
    .header {
        grid-column: 1 / span 3;
        background: rgba(15, 23, 42, 0.8);
        border-radius: 16px;
        padding: 20px;
        text-align: center;
        border: 1px solid rgba(100, 116, 139, 0.3);
        box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4);
        backdrop-filter: blur(10px);
        margin-bottom: 20px;
    }
     
    .header h1 {
        font-size: 2.8rem;
        margin-bottom: 10px;
        background: linear-gradient(90deg, #38bdf8, #818cf8);
        -webkit-background-clip: text;
        background-clip: text;
        color: transparent;
        letter-spacing: 2px;
    }
     
    .header p {
        font-size: 1.2rem;
        color: #94a3b8;
        max-width: 800px;
        margin: 0 auto;
    }
     
    .card {
        background: rgba(15, 23, 42, 0.7);
        border-radius: 16px;
        border: 1px solid rgba(100, 116, 139, 0.3);
        padding: 20px;
        box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
        backdrop-filter: blur(10px);
        transition: transform 0.3s ease, box-shadow 0.3s ease;
        height: 100%;
        display: flex;
        flex-direction: column;
    }
     
    .card:hover {
        transform: translateY(-5px);
        box-shadow: 0 12px 25px rgba(0, 0, 0, 0.5);
        border-color: rgba(56, 189, 248, 0.5);
    }
     
    .card-title {
        font-size: 1.3rem;
        margin-bottom: 15px;
        color: #38bdf8;
        display: flex;
        align-items: center;
        gap: 10px;
    }
     
    .card-title i {
        font-size: 1.5rem;
    }
     
    .chart-container {
        flex: 1;
        min-height: 300px;
    }
     
    .stats-container {
        display: grid;
        grid-template-columns: 1fr;
        gap: 15px;
    }
     
    .stat-card {
        background: rgba(30, 41, 59, 0.6);
        border-radius: 12px;
        padding: 15px;
        display: flex;
        flex-direction: column;
        justify-content: center;
        border: 1px solid rgba(100, 116, 139, 0.2);
    }
     
    .stat-card h3 {
        font-size: 1rem;
        color: #94a3b8;
        margin-bottom: 8px;
    }
     
    .stat-value {
        font-size: 2rem;
        font-weight: bold;
        color: #38bdf8;
    }
     
    .stat-trend {
        display: flex;
        align-items: center;
        font-size: 0.9rem;
        margin-top: 5px;
    }
     
    .trend-up {
        color: #10b981;
    }
     
    .trend-down {
        color: #ef4444;
    }
     
    .map-container {
        grid-row: 3 / span 2;
        grid-column: 2;
    }
     
    .footer {
        grid-column: 1 / span 3;
        text-align: center;
        padding: 20px;
        font-size: 0.9rem;
        color: #64748b;
        margin-top: 20px;
    }
     
    /* 响应式调整 */
    @media (max-width: 1200px) {
        .dashboard {
            grid-template-columns: 1fr 1fr;
        }
     
        .header, .footer {
            grid-column: 1 / span 2;
        }
     
        .map-container {
            grid-row: auto;
            grid-column: 1 / span 2;
        }
    }
     
    @media (max-width: 768px) {
        .dashboard {
            grid-template-columns: 1fr;
        }
     
        .header, .footer {
            grid-column: 1;
        }
     
        .map-container {
            grid-column: 1;
        }
    }
     
    /* 装饰元素 */
    .decoration {
        position: absolute;
        z-index: -1;
        opacity: 0.1;
    }
     
    .decoration-1 {
        width: 400px;
        height: 400px;
        border-radius: 50%;
        background: linear-gradient(135deg, #38bdf8, #818cf8);
        top: -100px;
        right: -100px;
    }
     
    .decoration-2 {
        width: 300px;
        height: 300px;
        border-radius: 50%;
        background: linear-gradient(135deg, #8b5cf6, #ec4899);
        bottom: -100px;
        left: -100px;
    }
     
    .grid-line {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background:
                linear-gradient(to right, rgba(100, 116, 139, 0.05) 1px, transparent 1px),
                linear-gradient(to bottom, rgba(100, 116, 139, 0.05) 1px, transparent 1px);
        background-size: 40px 40px;
        z-index: -1;
    }

    index.js(我自己加了一个后端获取的通用方法,到时根据自己需求稍微改改代码就可以了,数据都是静态数据,后续有时间我就更新怎么从后端获取数据,然后进行数据显示)。

    // 通用数据获取
    async function fetchData(url, params = {}) {
        try {
            const response = await fetch(url, {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(params),
            })
            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
            return await response.json();
        } catch (error) {
            console.error(error);
            return null;
        }
    }
     
     
    // 初始化所有图表
    document.addEventListener('DOMContentLoaded', function() {
        // 更新时间显示
        function updateTime() {
            const now = new Date();
            const timeDisplay = document.getElementById('timeDisplay');
            const options = {
                year: 'numeric',
                month: 'long',
                day: 'numeric',
                weekday: 'long',
                hour: '2-digit',
                minute: '2-digit',
                second: '2-digit',
                hour12: false
            };
            timeDisplay.textContent = now.toLocaleDateString('zh-CN', options);
        }
     
        // 初始化时间并设置定时器
        updateTime();
        setInterval(updateTime, 1000);
     
        function initOption() {
            bar1()
            bar2()
            line1()
            line2()
            pie1()
            pie2()
            map()
        }
     
        // 商品销售排行
        function bar1() {
            const barChart1 = echarts.init(document.getElementById('barChart1'));
            const option = {
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'shadow'
                    }
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    top: '15%',
                    containLabel: true
                },
                xAxis: {
                    type: 'category',
                    data: ['智能手机', '笔记本电脑', '智能手表', '蓝牙耳机', '平板电脑', '相机', '游戏主机'],
                    axisLine: {
                        lineStyle: {
                            color: '#64748b'
                        }
                    }
                },
                yAxis: {
                    type: 'value',
                    name: '销售额 (万元)',
                    nameTextStyle: {
                        color: '#94a3b8'
                    },
                    axisLine: {
                        lineStyle: {
                            color: '#64748b'
                        }
                    },
                    splitLine: {
                        lineStyle: {
                            color: 'rgba(100, 116, 139, 0.2)'
                        }
                    }
                },
                series: [{
                    name: '销售额',
                    type: 'bar',
                    data: [125, 98, 76, 65, 58, 42, 35],
                    itemStyle: {
                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                            { offset: 0, color: '#38bdf8' },
                            { offset: 1, color: '#0ea5e9' }
                        ])
                    },
                    label: {
                        show: true,
                        position: 'top',
                        color: '#e2e8f0'
                    }
                }]
            };
     
            barChart1.setOption(option);
        }
     
        // 品类销售占比
        function bar2() {
            const barChart2 = echarts.init(document.getElementById('barChart2'));
            const option = {
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'shadow'
                    }
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    top: '15%',
                    containLabel: true
                },
                xAxis: {
                    type: 'value',
                    axisLine: {
                        lineStyle: {
                            color: '#64748b'
                        }
                    },
                    splitLine: {
                        lineStyle: {
                            color: 'rgba(100, 116, 139, 0.2)'
                        }
                    }
                },
                yAxis: {
                    type: 'category',
                    data: ['数码电子', '家用电器', '服装鞋帽', '美妆护肤', '食品生鲜', '家居用品', '图书文具'],
                    axisLine: {
                        lineStyle: {
                            color: '#64748b'
                        }
                    }
                },
                series: [{
                    name: '占比',
                    type: 'bar',
                    data: [35, 28, 22, 18, 15, 12, 8],
                    itemStyle: {
                        color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [
                            { offset: 0, color: '#818cf8' },
                            { offset: 1, color: '#6366f1' }
                        ])
                    },
                    label: {
                        show: true,
                        position: 'right',
                        color: '#e2e8f0'
                    }
                }]
            }
            barChart2.setOption(option);
        }
     
        // 销售趋势分析
        function line1() {
            const lineChart1 = echarts.init(document.getElementById('lineChart1'));
            const option = {
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: ['销售额', '订单量'],
                    textStyle: {
                        color: '#94a3b8'
                    },
                    right: 10,
                    top: 0
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    top: '20%',
                    containLabel: true
                },
                xAxis: {
                    type: 'category',
                    boundaryGap: false,
                    data: ['11/09', '11/10', '11/11', '11/12', '11/13', '11/14', '11/15'],
                    axisLine: {
                        lineStyle: {
                            color: '#64748b'
                        }
                    }
                },
                yAxis: {
                    type: 'value',
                    name: '销售额 (万元)',
                    nameTextStyle: {
                        color: '#94a3b8'
                    },
                    axisLine: {
                        lineStyle: {
                            color: '#64748b'
                        }
                    },
                    splitLine: {
                        lineStyle: {
                            color: 'rgba(100, 116, 139, 0.2)'
                        }
                    }
                },
                series: [
                    {
                        name: '销售额',
                        type: 'line',
                        data: [820, 932, 1560, 1434, 1290, 1030, 1248],
                        smooth: true,
                        lineStyle: {
                            width: 3,
                            color: '#38bdf8'
                        },
                        symbol: 'circle',
                        symbolSize: 8,
                        itemStyle: {
                            color: '#38bdf8'
                        },
                        areaStyle: {
                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                { offset: 0, color: 'rgba(56, 189, 248, 0.5)' },
                                { offset: 1, color: 'rgba(56, 189, 248, 0.1)' }
                            ])
                        }
                    },
                    {
                        name: '订单量',
                        type: 'line',
                        yAxisIndex: 0,
                        data: [18.2, 19.5, 32.4, 28.6, 25.3, 20.8, 24.8],
                        smooth: true,
                        lineStyle: {
                            width: 3,
                            color: '#8b5cf6'
                        },
                        symbol: 'circle',
                        symbolSize: 8,
                        itemStyle: {
                            color: '#8b5cf6'
                        }
                    }
                ]
            }
            lineChart1.setOption(option);
        }
     
        // 用户活跃趋势
        function line2() {
            const lineChart2 = echarts.init(document.getElementById('lineChart2'));
            const option = {
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: ['活跃用户', '新增用户'],
                    textStyle: {
                        color: '#94a3b8'
                    },
                    right: 10,
                    top: 0
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    top: '20%',
                    containLabel: true
                },
                xAxis: {
                    type: 'category',
                    boundaryGap: false,
                    data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
                    axisLine: {
                        lineStyle: {
                            color: '#64748b'
                        }
                    }
                },
                yAxis: {
                    type: 'value',
                    name: '用户量 (万)',
                    nameTextStyle: {
                        color: '#94a3b8'
                    },
                    axisLine: {
                        lineStyle: {
                            color: '#64748b'
                        }
                    },
                    splitLine: {
                        lineStyle: {
                            color: 'rgba(100, 116, 139, 0.2)'
                        }
                    }
                },
                series: [
                    {
                        name: '活跃用户',
                        type: 'line',
                        data: [132, 145, 158, 142, 168, 185, 162],
                        smooth: true,
                        lineStyle: {
                            width: 3,
                            color: '#10b981'
                        },
                        symbol: 'circle',
                        symbolSize: 8,
                        itemStyle: {
                            color: '#10b981'
                        }
                    },
                    {
                        name: '新增用户',
                        type: 'line',
                        data: [28, 32, 36, 31, 35, 42, 38],
                        smooth: true,
                        lineStyle: {
                            width: 3,
                            color: '#f59e0b'
                        },
                        symbol: 'circle',
                        symbolSize: 8,
                        itemStyle: {
                            color: '#f59e0b'
                        }
                    }
                ]
            }
            lineChart2.setOption(option);
        }
     
        // 用户年龄分布
        function pie1() {
            const pieChart1 = echarts.init(document.getElementById('pieChart1'));
            const option = {
                tooltip: {
                    trigger: 'item',
                    formatter: '{a} <br/>{b}: {c} ({d}%)'
                },
                legend: {
                    orient: 'vertical',
                    right: 10,
                    top: 'center',
                    textStyle: {
                        color: '#94a3b8'
                    }
                },
                series: [
                    {
                        name: '年龄分布',
                        type: 'pie',
                        radius: ['40%', '70%'],
                        center: ['40%', '50%'],
                        avoidLabelOverlap: false,
                        itemStyle: {
                            borderRadius: 10,
                            borderColor: '#0f172a',
                            borderWidth: 2
                        },
                        label: {
                            show: false,
                            position: 'center'
                        },
                        emphasis: {
                            label: {
                                show: true,
                                fontSize: '18',
                                fontWeight: 'bold'
                            }
                        },
                        labelLine: {
                            show: false
                        },
                        data: [
                            { value: 28, name: '18岁以下', itemStyle: { color: '#38bdf8' } },
                            { value: 145, name: '18-25岁', itemStyle: { color: '#818cf8' } },
                            { value: 235, name: '26-35岁', itemStyle: { color: '#8b5cf6' } },
                            { value: 187, name: '36-45岁', itemStyle: { color: '#ec4899' } },
                            { value: 95, name: '46-60岁', itemStyle: { color: '#f59e0b' } },
                            { value: 42, name: '60岁以上', itemStyle: { color: '#10b981' } }
                        ]
                    }
                ]
            }
            pieChart1.setOption(option);
        }
     
        // 支付方式占比
        function pie2() {
            const pieChart2 = echarts.init(document.getElementById('pieChart2'));
            const option = {
                tooltip: {
                    trigger: 'item',
                    formatter: '{a} <br/>{b}: {c} ({d}%)'
                },
                series: [
                    {
                        name: '支付方式',
                        type: 'pie',
                        radius: '70%',
                        center: ['50%', '50%'],
                        roseType: 'radius',
                        itemStyle: {
                            borderRadius: 5,
                            borderColor: '#0f172a',
                            borderWidth: 2
                        },
                        label: {
                            color: '#e2e8f0'
                        },
                        data: [
                            { value: 45, name: '支付宝', itemStyle: { color: '#1677ff' } },
                            { value: 30, name: '微信支付', itemStyle: { color: '#07c160' } },
                            { value: 15, name: '银行卡', itemStyle: { color: '#0ea5e9' } },
                            { value: 8, name: '云闪付', itemStyle: { color: '#eb2f96' } },
                            { value: 2, name: '其他方式', itemStyle: { color: '#f59e0b' } }
                        ]
                    }
                ]
            }
            pieChart2.setOption(option);
        }
     
        // 随机数
        function randomData() {
            return Math.round(Math.random() * 500);
        }
        // 全国销售热力图
        function map() {
            const mapChart = echarts.init(document.getElementById('mapChart'));
            const mydata = [
                {name: '北京',value: randomData() },{name: '天津',value: randomData() },
                {name: '上海',value: randomData() },{name: '重庆',value: randomData() },
                {name: '河北',value: randomData() },{name: '河南',value: randomData() },
                {name: '云南',value: randomData() },{name: '辽宁',value: randomData() },
                {name: '黑龙江',value: randomData() },{name: '湖南',value: randomData()},
                {name: '安徽',value: randomData() },{name: '山东',value: randomData() },
                {name: '新疆',value: randomData() },{name: '江苏',value: randomData() },
                {name: '浙江',value: randomData() },{name: '江西',value: randomData() },
                {name: '湖北',value: randomData() },{name: '广西',value: randomData() },
                {name: '甘肃',value: randomData() },{name: '山西',value: randomData() },
                {name: '内蒙古',value: randomData() },{name: '陕西',value: randomData()},
                {name: '吉林',value: randomData() },{name: '福建',value: randomData() },
                {name: '贵州',value: randomData() },{name: '广东',value: randomData() },
                {name: '青海',value: randomData() },{name: '西藏',value: randomData() },
                {name: '四川',value: randomData() },{name: '宁夏',value: randomData() },
                {name: '海南',value: randomData() },{name: '台湾',value: randomData() },
                {name: '香港',value: randomData() },{name: '澳门',value: randomData() }
            ];
            const option = {
                //backgroundColor: '#FFFFFF',
                // 标题
                title: {
                    text: '各省份的总成交量对比',
                    textStyle:{color:'#fff'},
                    //subtext: '纯属虚构',
                    x:'center',
                    show: true
                },
                // 提示框
                tooltip : {
                    trigger: 'item'
                },
                visualMap: {
                    show : true,
                    x: 'left',
                    y: 'bottom',
                    //layoutCenter:['30%','30%'],
                    splitList: [
                        {start: 500, end:600},{start: 400, end: 500},
                        {start: 300, end: 400},{start: 200, end: 300},
                        {start: 100, end: 200},{start: 0, end: 100},
                    ],
                    // color: ['#ff0', '#ffff00', '#0E94EB','#6FBCF0', '#F0F06F', '#00CC00']
                    color:['#5bc2e7', '#6980c5', '#70dfdf', '#f7f1ee', '#3390FF']
                },
                series: [{
                    name: '各省份的总成交量对比',
                    type: 'map',
                    mapType: 'china',
                    label: {
                        normal: {
                            show: false
                        },
                        emphasis: {
                            show: false
                        }
                    },
                    data:mydata
                }]
            };
            mapChart.setOption(option);
        }
     
        initOption()
     
     
        // 响应式调整
        window.addEventListener('resize', function() {
            bar1.resize();
            bar2.resize();
            line1.resize();
            mapChart.resize();
            lineChart2.resize();
            pieChart1.resize();
            pieChart2.resize();
        });
    });

    效果图

  • html制作悬浮图标可以拖拽

    <div style="display: inline;z-index:20" @click="showMessage" v-if="rightFlags.shareRight">
          <img :src="require('@/assets/monitor/send.png')" style="width: 60px;position: fixed;"
            :style="{ bottom: sendPageInfo.bottom + 'px', right: sendPageInfo.right + 'px', cursor: sendPageInfo.active ? 'move' : 'pointer' }"
            @mousedown.stop="startDragging" @mouseup.stop="stopDragging" @mousemove.stop="dragging"
            @touchstart="startDragging" @touchend="stopDragging" @touchmove="dragging" id="imgdraggable">
        </div>

    PC端的话可以使用 mouseXXXX系列,平板手机的话可以使用 touchXXX系列。

    let agent = window.navigator.userAgent.toLowerCase();
        if (["android", "iphone", "symbianos", "windows phone", "ipad", "ipod"].some(i => agent.indexOf(i) > 0)) {
          this.sendPageInfo.isPhone = true;
        } else {
          this.sendPageInfo.isPhone = false;
        }

    拖拽代码

    dragging(e) {
          if (this.sendPageInfo.active) {
            e.preventDefault();
    
            this.sendPageInfo.hasDrag = true;
    
            if (this.sendPageInfo.isPhone) {
              this.sendPageInfo.posX = e.touches[0].clientX - this.sendPageInfo.offsetX;
              this.sendPageInfo.posY = e.touches[0].clientY - this.sendPageInfo.offsetY;
    
              this.sendPageInfo.bottom = this.clientHeight - this.sendPageInfo.posY
              this.sendPageInfo.right = this.clientWidth - this.sendPageInfo.posX
            } else {
              this.sendPageInfo.posX = e.clientX - this.sendPageInfo.offsetX;
              this.sendPageInfo.posY = e.clientY - this.sendPageInfo.offsetY;
    
              this.sendPageInfo.bottom = this.clientHeight - this.sendPageInfo.posY
              this.sendPageInfo.right = this.clientWidth - this.sendPageInfo.posX
            }
          }
    
        },
        startDragging(e) {
          this.sendPageInfo.active = true;
    
          if (this.sendPageInfo.isPhone) {
            this.sendPageInfo.posX = this.clientWidth - this.sendPageInfo.right
            this.sendPageInfo.posY = this.clientHeight - this.sendPageInfo.bottom
    
            this.sendPageInfo.offsetX = e.touches[0].clientX - this.sendPageInfo.posX;
            this.sendPageInfo.offsetY = e.touches[0].clientY - this.sendPageInfo.posY;
          } else {
            window.addEventListener('mousemove', this.dragging)
    
            this.sendPageInfo.posX = this.clientWidth - this.sendPageInfo.right
            this.sendPageInfo.posY = this.clientHeight - this.sendPageInfo.bottom
    
            this.sendPageInfo.offsetX = e.clientX - this.sendPageInfo.posX;
            this.sendPageInfo.offsetY = e.clientY - this.sendPageInfo.posY;
          }
    
    
    
        },
        stopDragging(e) {
          this.sendPageInfo.active = false;
          if (this.sendPageInfo.isPhone) this.sendPageInfo.hasDrag = false;
    
        },
        showMessage() {
          if (this.sendPageInfo.hasDrag) {
            this.sendPageInfo.hasDrag = false;
          } else {
            this.showSendPersonFlag = true;
          }
        },

    hasDrag 是PC端的时候拖拽和点击会有冲突,所以用这个当一个阻止标识。