Vissza a webes elemekhez
Fejlécek

Üzleti radar

Élő előnézet – a komponens teljes méretben.

Élő előnézet
HTML · CSS · JS
HTML
<section class="hero-uzleti-radar" id="heroUzletiRadar">

    <div class="ur-grid"></div>
    <div class="ur-glow"></div>

    <div class="ur-content">

        <div class="ur-kicker">
            <span></span>
            <em class="ur-typing"></em>
            <i></i>
        </div>

        <h1>
            Lásd meg<br>
            <strong>a lehetőséget.</strong>
        </h1>

        <p>
            Jó döntésekhez tiszta kép kell.
            Tervezz, építs és haladj magabiztosan
            a következő célod felé.
        </p>

        <a href="#" class="ur-button">
            Megnézem
            <span>↗</span>
        </a>

    </div>


    <!-- RADAR -->

    <div class="ur-radar">

        <div class="ur-radar-circle ur-circle-1"></div>
        <div class="ur-radar-circle ur-circle-2"></div>
        <div class="ur-radar-circle ur-circle-3"></div>
        <div class="ur-radar-circle ur-circle-4"></div>

        <div class="ur-cross ur-cross-x"></div>
        <div class="ur-cross ur-cross-y"></div>

        <div class="ur-scan"></div>

        <div class="ur-center">
            <span></span>
        </div>

        <div class="ur-target ur-target-1">
            <span></span>
        </div>

        <div class="ur-target ur-target-2">
            <span></span>
        </div>

        <div class="ur-target ur-target-3">
            <span></span>
        </div>

        <div class="ur-target ur-target-4">
            <span></span>
        </div>

        <div class="ur-radar-label ur-label-1">
            LEHETŐSÉG
        </div>

        <div class="ur-radar-label ur-label-2">
            NÖVEKEDÉS
        </div>

        <div class="ur-radar-label ur-label-3">
            IRÁNY
        </div>

    </div>


    <div class="ur-bottom">

        <span>13</span>
        <i></i>
        <small>
            STRATÉGIA · NÖVEKEDÉS · EREDMÉNY
        </small>

    </div>

</section>
CSS
/* =========================================================
   13. ÜZLETI RADAR
   ========================================================= */

.hero-uzleti-radar {
    position: relative;
    width: 100%;
    height: 760px;
    overflow: hidden;
    isolation: isolate;

    background:
        radial-gradient(
            circle at 78% 42%,
            rgba(56, 166, 151, 0.16),
            transparent 25%
        ),
        radial-gradient(
            circle at 18% 78%,
            rgba(212, 188, 130, 0.08),
            transparent 30%
        ),
        linear-gradient(
            135deg,
            #071b1a 0%,
            #0b2927 50%,
            #061514 100%
        );

    color: #f3efe5;

    /*
       A HERO valódi aszimmetriája.
       Az alja ferde, nem a tartalom ugrál.
    */
    clip-path: polygon(
        0 0,
        100% 0,
        100% 87%,
        0 100%
    );
}


/* =========================================================
   HÁTTÉR RÁCS
   ========================================================= */

.ur-grid {
    position: absolute;
    inset: 0;

    background-image:
        linear-gradient(
            rgba(255,255,255,.025) 1px,
            transparent 1px
        ),
        linear-gradient(
            90deg,
            rgba(255,255,255,.025) 1px,
            transparent 1px
        );

    background-size: 70px 70px;

    opacity: .7;

    pointer-events: none;

    z-index: -3;

    animation: urGridMove 18s linear infinite;
}

@keyframes urGridMove {
    from {
        background-position: 0 0, 0 0;
    }

    to {
        background-position: 70px 70px, 70px 70px;
    }
}


/* =========================================================
   HÁTTÉR FÉNY
   ========================================================= */

.ur-glow {
    position: absolute;

    width: 620px;
    height: 620px;

    right: -150px;
    top: 30px;

    border-radius: 50%;

    background:
        radial-gradient(
            circle,
            rgba(71, 185, 167, .15),
            rgba(71,185,167,.04) 40%,
            transparent 70%
        );

    filter: blur(18px);

    pointer-events: none;

    z-index: -2;

    animation:
        urGlowMove 9s ease-in-out infinite alternate;
}

@keyframes urGlowMove {
    from {
        opacity: .55;
    }

    to {
        opacity: .9;
    }
}


/* =========================================================
   FŐ TARTALOM
   ========================================================= */

.ur-content {
    position: absolute;

    left: max(7%, calc((100% - 1180px) / 2));
    top: 50%;

    width: 560px;

    transform: translateY(-50%);

    z-index: 5;
}


/* =========================================================
   KICKER
   ========================================================= */

.ur-kicker {
    display: flex;

    align-items: center;

    min-height: 24px;

    margin-bottom: 24px;

    color: #d4bc82;

    font-family:
        Arial,
        Helvetica,
        sans-serif;

    font-size: 11px;
    font-weight: 700;

    letter-spacing: .22em;

    text-transform: uppercase;
}


.ur-kicker span {
    display: block;

    width: 34px;
    height: 1px;

    margin-right: 14px;

    background: #d4bc82;

    box-shadow:
        0 0 12px rgba(212,188,130,.45);
}


.ur-kicker em {
    min-width: 220px;

    font-style: normal;
}


.ur-kicker i {
    width: 6px;
    height: 6px;

    margin-left: 10px;

    border-radius: 50%;

    background: #d4bc82;

    box-shadow:
        0 0 12px rgba(212,188,130,.8);

    animation:
        urKickerDot 1.3s ease-in-out infinite alternate;
}


@keyframes urKickerDot {
    from {
        opacity: .35;
    }

    to {
        opacity: 1;
    }
}


/* =========================================================
   FŐCÍM
   ========================================================= */

.ur-content h1 {
    margin: 0;

    color: #f5f1e8;

    font-family:
        Georgia,
        "Times New Roman",
        serif;

    font-size: clamp(70px, 8vw, 124px);

    font-weight: 400;

    line-height: .86;

    letter-spacing: -.065em;
}


.ur-content h1 strong {
    display: block;

    margin-left: 12%;

    color: #d4bc82;

    font-weight: 400;

    font-style: italic;
}


/* =========================================================
   LEÍRÁS
   ========================================================= */

.ur-content p {
    max-width: 470px;

    margin: 38px 0 30px;

    color: rgba(243,239,229,.68);

    font-family:
        Arial,
        Helvetica,
        sans-serif;

    font-size: 16px;

    line-height: 1.8;
}


/* =========================================================
   GOMB
   ========================================================= */

.ur-button {
    display: inline-flex;

    align-items: center;
    justify-content: center;

    gap: 20px;

    min-width: 145px;

    padding: 15px 22px;

    color: #071b1a;

    background: #d4bc82;

    border: 1px solid #d4bc82;

    text-decoration: none;

    font-family:
        Arial,
        Helvetica,
        sans-serif;

    font-size: 11px;

    font-weight: 700;

    letter-spacing: .15em;

    text-transform: uppercase;

    box-sizing: border-box;

    transition:
        background .3s ease,
        color .3s ease,
        box-shadow .3s ease;
}


.ur-button span {
    font-size: 18px;

    line-height: 1;

    transition:
        transform .3s ease;
}


.ur-button:hover {
    color: #071b1a;

    background: #ead9a9;

    border-color: #ead9a9;

    box-shadow:
        0 12px 35px rgba(0,0,0,.25);
}


.ur-button:hover span {
    transform: translate(4px,-4px);
}


/* =========================================================
   RADAR
   ========================================================= */

.ur-radar {
    position: absolute;

    width: min(470px, 40vw);
    aspect-ratio: 1 / 1;

    right: 7%;
    top: 50%;

    /*
       EZ CSAK POZICIONÁL.
       NINCS JS-ES MOZGATÁS.
    */
    transform: translateY(-50%);

    z-index: 3;

    pointer-events: none;
}


/* =========================================================
   RADAR KÖRÖK
   ========================================================= */

.ur-radar-circle {
    position: absolute;

    left: 50%;
    top: 50%;

    border-radius: 50%;

    border: 1px solid rgba(89,183,166,.25);

    box-sizing: border-box;

    transform: translate(-50%, -50%);
}


.ur-circle-1 {
    width: 100%;
    height: 100%;
}


.ur-circle-2 {
    width: 76%;
    height: 76%;
}


.ur-circle-3 {
    width: 52%;
    height: 52%;
}


.ur-circle-4 {
    width: 28%;
    height: 28%;
}


.ur-circle-1 {
    box-shadow:
        0 0 45px rgba(61,168,151,.07);
}


/* =========================================================
   KERESZTVONALAK
   ========================================================= */

.ur-cross {
    position: absolute;

    left: 50%;
    top: 50%;

    background:
        rgba(105,190,176,.16);
}


.ur-cross-x {
    width: 100%;
    height: 1px;

    transform: translate(-50%, -50%);
}


.ur-cross-y {
    width: 1px;
    height: 100%;

    transform: translate(-50%, -50%);
}


/* =========================================================
   SUGÁRVONALAK HELYETT FINOM SEGÉDVONALAK
   ========================================================= */

.ur-radar::before,
.ur-radar::after {
    content: "";

    position: absolute;

    left: 50%;
    top: 50%;

    width: 100%;
    height: 1px;

    transform-origin: center;

    background:
        linear-gradient(
            to right,
            transparent,
            rgba(105,190,176,.13),
            transparent
        );
}


.ur-radar::before {
    transform: translate(-50%, -50%) rotate(35deg);
}


.ur-radar::after {
    transform: translate(-50%, -50%) rotate(125deg);
}


/* =========================================================
   RADAR PÁSZTÁZÁS
   ========================================================= */

.ur-scan {
    position: absolute;

    left: 50%;
    top: 50%;

    width: 50%;
    height: 50%;

    transform-origin: 0 0;

    background:
        conic-gradient(
            from 0deg,
            rgba(80,200,175,0),
            rgba(80,200,175,.18),
            rgba(80,200,175,0)
        );

    border-top-right-radius: 100%;

    animation:
        urRadarScan 4.5s linear infinite;
}


@keyframes urRadarScan {
    from {
        transform: rotate(0deg);
    }

    to {
        transform: rotate(360deg);
    }
}


/* =========================================================
   KÖZÉPSŐ PONT
   ========================================================= */

.ur-center {
    position: absolute;

    left: 50%;
    top: 50%;

    width: 22px;
    height: 22px;

    transform: translate(-50%, -50%);

    border-radius: 50%;

    background:
        rgba(212,188,130,.12);

    border:
        1px solid rgba(212,188,130,.5);

    box-shadow:
        0 0 20px rgba(212,188,130,.4);
}


.ur-center span {
    position: absolute;

    left: 50%;
    top: 50%;

    width: 8px;
    height: 8px;

    transform: translate(-50%, -50%);

    border-radius: 50%;

    background: #d4bc82;

    box-shadow:
        0 0 20px rgba(212,188,130,.9);

    animation:
        urCenterPulse 2s ease-in-out infinite;
}


@keyframes urCenterPulse {

    0%,
    100% {
        transform: translate(-50%, -50%) scale(1);
        opacity: .7;
    }

    50% {
        transform: translate(-50%, -50%) scale(1.5);
        opacity: 1;
    }
}


/* =========================================================
   CÉLPONTOK
   ========================================================= */

.ur-target {
    position: absolute;

    width: 12px;
    height: 12px;

    border-radius: 50%;

    background: #71c9b8;

    box-shadow:
        0 0 0 4px rgba(113,201,184,.08),
        0 0 20px rgba(113,201,184,.7);
}


.ur-target span {
    position: absolute;

    left: 50%;
    top: 50%;

    width: 28px;
    height: 28px;

    transform: translate(-50%, -50%);

    border:
        1px solid rgba(113,201,184,.25);

    border-radius: 50%;

    animation:
        urTargetPulse 2.2s ease-in-out infinite;
}


@keyframes urTargetPulse {

    0%,
    100% {
        transform: translate(-50%, -50%) scale(.8);
        opacity: .35;
    }

    50% {
        transform: translate(-50%, -50%) scale(1.15);
        opacity: 1;
    }
}


.ur-target-1 {
    left: 67%;
    top: 24%;
}


.ur-target-2 {
    left: 23%;
    top: 63%;
}


.ur-target-3 {
    left: 73%;
    top: 72%;
}


.ur-target-4 {
    left: 34%;
    top: 31%;


/* =========================================================
   RADAR FELIRATOK
   ========================================================= */

.ur-radar-label {
    position: absolute;

    padding: 7px 10px;

    color: rgba(243,239,229,.62);

    background:
        rgba(5,22,21,.6);

    border-left:
        1px solid rgba(212,188,130,.45);

    backdrop-filter: blur(7px);

    font-family:
        Arial,
        Helvetica,
        sans-serif;

    font-size: 9px;

    font-weight: 700;

    letter-spacing: .16em;
}


.ur-label-1 {
    left: 72%;
    top: 17%;
}


.ur-label-2 {
    left: 8%;
    top: 67%;
}


.ur-label-3 {
    left: 72%;
    top: 78%;
}


/* =========================================================
   ALSÓ INFORMÁCIÓ
   ========================================================= */

.ur-bottom {
    position: absolute;

    left: max(7%, calc((100% - 1180px) / 2));
    bottom: 52px;

    display: flex;

    align-items: center;

    gap: 18px;

    color: rgba(243,239,229,.4);

    font-family:
        Arial,
        Helvetica,
        sans-serif;

    z-index: 10;
}


.ur-bottom span {
    color: #d4bc82;

    font-family:
        Georgia,
        "Times New Roman",
        serif;

    font-size: 18px;
}


.ur-bottom i {
    display: block;

    width: 42px;
    height: 1px;

    background: #d4bc82;
}


.ur-bottom small {
    font-size: 9px;

    font-weight: 700;

    letter-spacing: .2em;
}


/* =========================================================
   TABLET
   ========================================================= */

@media (max-width: 900px) {

    .hero-uzleti-radar {
        height: 850px;

        clip-path: polygon(
            0 0,
            100% 0,
            100% 94%,
            0 100%
        );
    }


    .ur-content {
        left: 40px;
        top: 90px;

        width: calc(100% - 80px);

        transform: none;
    }


    .ur-content h1 {
        font-size: clamp(60px, 12vw, 95px);
    }


    .ur-content p {
        max-width: 500px;
    }


    .ur-radar {
        width: 390px;

        right: 50%;
        top: auto;
        bottom: 40px;

        transform: translateX(50%);
    }


    .ur-bottom {
        left: 40px;
        bottom: 25px;
    }
}


/* =========================================================
   MOBIL
   ========================================================= */

@media (max-width: 560px) {

    .hero-uzleti-radar {
        height: 820px;
    }


    .ur-content {
        left: 20px;
        top: 55px;

        width: calc(100% - 40px);
    }


    .ur-kicker {
        font-size: 9px;

        letter-spacing: .15em;
    }


    .ur-kicker em {
        min-width: 160px;
    }


    .ur-content h1 {
        font-size: 57px;
    }


    .ur-content h1 strong {
        margin-left: 8%;
    }


    .ur-content p {
        margin-top: 26px;

        font-size: 14px;

        line-height: 1.65;
    }


    .ur-radar {
        width: 285px;

        bottom: 55px;
    }


    .ur-radar-label {
        padding: 5px 7px;

        font-size: 7px;
    }


    .ur-bottom {
        left: 20px;
        bottom: 18px;

        gap: 10px;
    }


    .ur-bottom small {
        font-size: 7px;

        letter-spacing: .12em;
    }


    .ur-bottom i {
        width: 25px;
    }
}


/* =========================================================
   MOZGÁS CSÖKKENTÉSE
   ========================================================= */

@media (prefers-reduced-motion: reduce) {

    .hero-uzleti-radar *,
    .hero-uzleti-radar::before,
    .hero-uzleti-radar::after {
        animation: none !important;
        transition: none !important;
    }
}
JavaScript
/* =========================================================
   13. ÜZLETI RADAR
   Stabil JS – nincs parallax, nincs hero ugrálás
   ========================================================= */

document.addEventListener("DOMContentLoaded", () => {

    const hero = document.querySelector(".hero-business-radar");

    if (!hero) return;


    /* -----------------------------------------------------
       Típusírógép a kis felső szöveghez
       ----------------------------------------------------- */

    const kicker = hero.querySelector(".radar-kicker");

    if (kicker) {

        const phrases = [
            "Üzleti lehetőségek",
            "Tudatos növekedés",
            "Jó döntések",
            "Erősebb irányok"
        ];

        let phraseIndex = 0;
        let charIndex = phrases[0].length;
        let deleting = true;

        /*
         * Az első szöveg már látható,
         * ezért innen törléssel indulunk.
         */

        function typeRadarText() {

            const current = phrases[phraseIndex];

            if (deleting) {

                charIndex--;

                kicker.textContent =
                    current.substring(0, charIndex);

                if (charIndex <= 0) {

                    deleting = false;

                    phraseIndex =
                        (phraseIndex + 1) % phrases.length;

                    charIndex = 0;

                    setTimeout(typeRadarText, 350);

                    return;
                }

                setTimeout(typeRadarText, 45);

            } else {

                const next = phrases[phraseIndex];

                charIndex++;

                kicker.textContent =
                    next.substring(0, charIndex);

                if (charIndex >= next.length) {

                    deleting = true;

                    setTimeout(typeRadarText, 1800);

                    return;
                }

                setTimeout(typeRadarText, 70);
            }
        }


        /*
         * Kicsit később indul,
         * hogy az első betöltés ne rángassa a layoutot.
         */

        setTimeout(typeRadarText, 1800);
    }


    /* -----------------------------------------------------
       FONTOS:
       Nincs egér-parallax.
       
       Nem mozgatjuk:
       - a teljes hero-t
       - a radar külső konténerét
       - a tartalmat
       - a clip-path-ot
       
       Így a fejléc stabil marad.
       ----------------------------------------------------- */


    /* -----------------------------------------------------
       Radar állapotjelző – teljesen belső animáció
       ----------------------------------------------------- */

    const targets = hero.querySelectorAll(".radar-target");

    targets.forEach((target, index) => {

        /*
         * Az animációt CSS végzi.
         * Itt direkt nem használunk transformot.
         */

        target.setAttribute(
            "data-radar-target",
            String(index + 1)
        );
    });


    /* -----------------------------------------------------
       Biztonsági ellenőrzés:
       a hero méretét nem engedjük JS-ből módosítani.
       ----------------------------------------------------- */

    hero.style.transform = "none";


    /* -----------------------------------------------------
       Ha valamilyen külső CSS/JS transformot rakna rá,
       azonnal visszaállítjuk.
       ----------------------------------------------------- */

    const observer = new MutationObserver(() => {

        if (hero.style.transform !== "none") {
            hero.style.transform = "none";
        }

    });

    observer.observe(hero, {
        attributes: true,
        attributeFilter: ["style"]
    });

});