Z-Index von :before

Sempervivum

Erfahrenes Mitglied
Das war jetzt wieder eine harte Nuss. Ich habe die Lösung hier gefunden:
Is it possible to set the stacking order of pseudo-elements below their parent element?
und zwar die Antwort von Eugen Govorun.
Offenbar sind die Transformationen die Schuldigen und man kann das ::before und ::after durch eine Verschiebung auf der z-Achse wieder nach hinten bringen.
Meine Testdatei:
Code:
<!DOCTYPE html>
<html lang="de">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Random Image</title>
    <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
    <script src="https://unpkg.co/gsap@3/dist/gsap.min.js"></script>

    <style>
        body {
            margin: 30px;
            background: #F5F5F7;
        }

        .colorwheel {
            position: relative;
            width: 300px;
            height: 300px;
            border: 10px solid #fff;
            border-radius: 100%;
            box-shadow: 0 0 1em rgba(0, 0, 0, .3), inset 0 0 1em rgba(0, 0, 0, .3);
            overflow: hidden;
        }

        .colorwheel .wheel {
            position: absolute;
            top: 50%;
            left: 50%;
            z-index: 1;
        }

        .colorwheel .centerwheel {
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%) rotate(330deg);
            width: 100px;
            height: 100px;
            background: #D4E6C2;
            border-radius: 100%;
            border: 10px solid #fff;
            box-shadow: 0 0 1em rgba(0, 0, 0, .3), inset 0 0 1em rgba(0, 0, 0, .3);
            transform-style: preserve-3d;

        }

        .colorwheel .centerwheel:after {
            content: '';
            position: absolute;
            left: 50%;
            top: -50px;
            transform: translateX(-50%) translateZ(-1px);
            width: 0;
            height: 0;
            border-left: 20px solid transparent;
            border-right: 20px solid transparent;
            border-bottom: 50px solid #fff;
            z-index: -1;
        }

        .colorwheel .centerwheel:before {
            content: '';
            position: absolute;
            left: 50%;
            top: -50px;
            transform: translateX(-50%) translateZ(-1px);
            width: 0;
            height: 0;
            border-left: 20px solid transparent;
            border-right: 20px solid transparent;
            border-bottom: 50px solid rgba(0, 0, 0, .3);
            filter: blur(.5em);
            z-index: -1;
        }

        .colorwheel .wheel .colorname {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%)
        }

        .colorwheel .colorfields {
            position: absolute;
            left: 50%;
            top: 0;
        }

        .colorwheel .color {
            position: absolute;
            border-style: solid;
            box-sizing: border-box;
            border-width: 150px 87px 0 87px;
            transform-origin: bottom;
            width: 0;
            height: 0;
            background: none;
            padding: 0;
        }

        .colorwheel .color:hover {
            cursor: pointer;
        }

        .colorwheel .color01 {
            transform: translateX(-50%) rotate(30deg);
            border-color: #F3A8A8 transparent transparent transparent;
        }

        .colorwheel .color02 {
            transform: translateX(-50%) rotate(90deg);
            border-color: #FFC700 transparent transparent transparent;
        }

        .colorwheel .color03 {
            transform: translateX(-50%) rotate(150deg);
            border-color: #ffffff transparent transparent transparent;
        }

        .colorwheel .color04 {
            transform: translateX(-50%) rotate(210deg);
            border-color: #000000 transparent transparent transparent;
        }

        .colorwheel .color05 {
            transform: translateX(-50%) rotate(270deg);
            border-color: #9CD1C3 transparent transparent transparent;
        }

        .colorwheel .color06 {
            transform: translateX(-50%) rotate(330deg);
            border-color: #D4E6C2 transparent transparent transparent;
        }

        .colorname.schwarz,
        .colorname.black {
            color: #fff;
        }
    </style>

</head>

<body>

    <body>

        <div id="colorWheel" class="colorwheel">
            <div class="wheel">
                <div id="centerWheel" class="centerwheel"></div>
                <!-- <div class="colorname grün">Green</div> -->
            </div>

            <div class="colorfields">
                <button id="color01" class="color color01" data-degree="30deg_short" data-colorname="Rosa"></button>
                <button id="color02" class="color color02" data-degree="90deg_short" data-colorname="Gelb"></button>
                <button id="color03" class="color color03" data-degree="150deg_short" data-colorname="Weiß"></button>
                <button id="color04" class="color color04" data-degree="210deg_short" data-colorname="Schwarz"></button>
                <button id="color05" class="color color05" data-degree="270deg_short" data-colorname="Blau"></button>
                <button id="color06" class="color color06" data-degree="330deg_short" data-colorname="Grün"></button>
            </div>
        </div>
        <script>
            let pointer = document.querySelector('.wheel');
            let circleParts = document.querySelectorAll('#colorWheel .color');

            circleParts.forEach((circlePart) => {
                circlePart.addEventListener('click', function (e) {
                    var colorName = circlePart.dataset.colorname;
                    var colorNameContainer = document.querySelector('.colorname');

                    colorNameContainer.innerText = colorName;
                    colorNameContainer.className = '';
                    colorNameContainer.classList.add('colorname', colorName.toString().toLowerCase());
                });


                circlePart.addEventListener('mouseenter', function (e) {
                    gsap.to(pointer, {
                        rotate: circlePart.dataset.degree,
                        transformOrigin: 'center center',
                        ease: 'power1.out'
                    });
                });

                circlePart.addEventListener('click', function (e) {
                    let activeColor = window.getComputedStyle(circlePart).borderTopColor;

                    console.log(activeColor);

                    pointer.style.backgroundColor = activeColor;
                });
            });

        </script>

    </body>

</html>
</body>

</html>
 
Zuletzt bearbeitet:

Jan-Frederik Stieler

Monsterator
Moderator
Hi,
crazy. ich hab den Beitrag auf SO auc hgelesen aber der Antwort mit dem transformZ(-1px) hab ich nicht wirklich Beachtung geschenkt. Kam mir irgendwie etwas unsinnig vor.
 

Sempervivum

Erfahrenes Mitglied
Auf den ersten Blick ja, aber z-index und transformZ spielen sich ja beide auf der z-Achse der Darstellung ab. Also bei genauerer Betrachtung ist es schon plausibel.
 

Neue Beiträge