javascript - 添加多次后 Div 不起作用

标签 javascript html css function

我正在使用this code创建一个礼品盒,当只有一个盒子时效果很好。

但是,当我在当前礼品盒旁边水平添加一个新礼品盒时,我可以看到添加的礼品盒,但无法打开它。礼品盒似乎按预期工作,直到用户尝试打开添加的盒子。

我该如何解决这个问题?

感谢您的宝贵时间!

var to = 'Friend!';
        var gift_url = 'https://stackoverflow.com/';
        var gift_image_url = 'https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon@2.png';

        var nametag = document.getElementById("nametag");
        var present = document.getElementById("present");
        var presentImage = document.getElementById("present-image");

        function init() {

            var _giftLink,
                _giftImg;

            if (gift_url) {
                _giftLink = document.createElement("a");
                _giftLink.href = gift_url;
                _giftLink.target = "_blank";
                presentImage.appendChild(_giftLink);
            }

            if (gift_image_url) {
                _giftImg = document.createElement("img");
                _giftImg.src = gift_image_url;
                if (_giftLink) {
                    _giftLink.appendChild(_giftImg);
                } else {
                    presentImage.appendChild(_giftImg);
                }
            }

            present.addEventListener("click", function(e) {
                present.classList.toggle("open");
            }, false);

            nametag.innerText = to;
        }

        init();
html,
        body {
            margin: 0;
        }
        
        .above-fold {
            height: 100vh;
            width: 100vw;
            padding: 0;
            margin: 0;
            -webkit-perspective: 800px;
            perspective: 800px;
            -webkit-perspective-origin: 50% 200px;
            perspective-origin: 50% 200px;
            display: -webkit-box;
            display: flex;
            flex-wrap: wrap;
            position: relative;
        }
        
        .above-fold .info-text {
            width: 100%;
            display: block;
            text-align: center;
            margin: 0;
            padding: 0;
            color: #555;
            font-family: 'Avenir';
            font-weight: 100;
            font-size: 13px;
            height: 25px;
            align-self: flex-end;
        }
        
        .wrap-present {
            width: 100%;
            display: -webkit-box;
            display: flex;
            align-self: flex-end;
        }
        
        .present-box {
            -webkit-transform-style: preserve-3d;
            transform-style: preserve-3d;
            width: 200px;
            height: 200px;
            margin: auto;
            -webkit-animation: rotate 11s alternate linear infinite;
            animation: rotate 11s alternate linear infinite;
            cursor: pointer;
        }
        
        .present-box:hover {
            -webkit-animation: staticFront 700ms ease forwards;
            animation: staticFront 700ms ease forwards;
        }
        
        .present-box.open {
            /*&>.side.top{
      opacity: .2;
  }*/
            -webkit-animation: zoomIn 1s ease-in forwards;
            animation: zoomIn 1s ease-in forwards;
            -webkit-transform: rotateX(-103deg) rotateY(-180deg);
            transform: rotateX(-103deg) rotateY(-180deg);
            -webkit-transition: -webkit-transform 400ms;
            transition: -webkit-transform 400ms;
            transition: transform 400ms;
            transition: transform 400ms, -webkit-transform 400ms;
        }
        
        .present-box.open .present {
            pointer-events: auto;
            visibility: visible;
        }
        
        .present-box.open .present .img-wrap {
            opacity: 1;
            -webkit-transition: opacity 800ms 200ms, -webkit-transform 600ms 800ms;
            transition: opacity 800ms 200ms, -webkit-transform 600ms 800ms;
            transition: transform 600ms 800ms, opacity 800ms 200ms;
            transition: transform 600ms 800ms, opacity 800ms 200ms, -webkit-transform 600ms 800ms;
            -webkit-transform: translateZ(0px);
            transform: translateZ(0px);
        }
        
        .present-box.open > .side {
            opacity: .3;
            -webkit-transition: opacity 500ms 600ms;
            transition: opacity 500ms 600ms;
        }
        
        .present-box.open > .side.back {
            opacity: 0.7;
            -webkit-transform: translateZ(-101px) rotateY(180deg);
            transform: translateZ(-101px) rotateY(180deg);
        }
        
        .present-box.open > .side.front {
            -webkit-transition: opacity 500ms 600ms, -webkit-transform 800ms 0s;
            transition: opacity 500ms 600ms, -webkit-transform 800ms 0s;
            transition: transform 800ms 0s, opacity 500ms 600ms;
            transition: transform 800ms 0s, opacity 500ms 600ms, -webkit-transform 800ms 0s;
            -webkit-transform: translateZ(100px) rotateY(190deg) translateX(0px);
            transform: translateZ(100px) rotateY(190deg) translateX(0px);
            -webkit-transform-origin: 0% 0%;
            transform-origin: 0% 0%;
            opacity: 0.3;
        }
        
        .present-box .present {
            position: absolute;
            width: 200px;
            height: 200px;
            z-index: 50;
            -webkit-transform: rotateY(-180deg) rotateX(180deg) translateZ(-100px);
            transform: rotateY(-180deg) rotateX(180deg) translateZ(-100px);
            display: -webkit-box;
            display: flex;
            -webkit-perspective: 600px;
            perspective: 600px;
            pointer-events: none;
            visibility: hidden;
        }
        
        .present-box .present > .img-wrap {
            width: 200px;
            align-self: center;
            -webkit-transition: -webkit-transform 400ms;
            transition: -webkit-transform 400ms;
            transition: transform 400ms;
            transition: transform 400ms, -webkit-transform 400ms;
            opacity: 0;
            -webkit-transform: translateZ(-80px);
            transform: translateZ(-80px);
        }
        
        .present-box .present > .img-wrap a {
            -webkit-transition: -webkit-transform 300ms;
            transition: -webkit-transform 300ms;
            transition: transform 300ms;
            transition: transform 300ms, -webkit-transform 300ms;
            position: relative;
            display: block;
            -webkit-transform: scale(0.94);
            transform: scale(0.94);
        }
        
        .present-box .present > .img-wrap a:hover {
            -webkit-transform: scale(1);
            transform: scale(1);
        }
        
        .present-box .present > .img-wrap img {
            max-width: 100%;
            height: auto;
        }
        
        .present-box > .side {
            width: 200px;
            height: 200px;
            position: absolute;
            display: block;
            background: repeating-linear-gradient(45deg, #cc2000, #cc2000 20px, #ffffff 20px, #ffffff 40px);
            top: 0;
            left: 0;
            -webkit-transition: -webkit-transform 400ms;
            transition: -webkit-transform 400ms;
            transition: transform 400ms;
            transition: transform 400ms, -webkit-transform 400ms;
        }
        
        .present-box > .side.back {
            -webkit-transform: translateZ(-100px) rotateY(180deg);
            transform: translateZ(-100px) rotateY(180deg);
        }
        
        .present-box > .side.right {
            -webkit-transform: rotateY(-270deg) translateX(100px);
            transform: rotateY(-270deg) translateX(100px);
            -webkit-transform-origin: top right;
            transform-origin: top right;
        }
        
        .present-box > .side.left {
            -webkit-transform: rotateY(270deg) translateX(-100px);
            transform: rotateY(270deg) translateX(-100px);
            -webkit-transform-origin: center left;
            transform-origin: center left;
        }
        
        .present-box > .side.top {
            -webkit-transform: rotateX(-90deg) translateY(-100px);
            transform: rotateX(-90deg) translateY(-100px);
            -webkit-transform-origin: top center;
            transform-origin: top center;
            -webkit-transform-style: preserve-3d;
            transform-style: preserve-3d;
            -webkit-perspective: 100px;
            perspective: 100px;
            text-align: center;
        }
        
        .present-box > .side.top .to {
            display: inline-block;
            font-family: cursive;
            position: relative;
            padding: 10px 10px 30px 10px;
            border: 5px dotted #ff6666;
            border-width: 2px;
            background: #fff;
            margin: auto;
            -webkit-transform: translateZ(-2px) translateY(50px);
            transform: translateZ(-2px) translateY(50px);
        }
        
        .present-box > .side.top .to:after {
            content: 'Merry Christmas';
            display: inline-block;
            -webkit-transform: rotateY(180deg);
            transform: rotateY(180deg);
            color: #990000;
        }
        
        .present-box > .side.top .to .name {
            display: block;
            position: absolute;
            -webkit-transform: translateY(20px) rotateY(180deg) translateX(10px);
            transform: translateY(20px) rotateY(180deg) translateX(10px);
            text-align: center;
            width: 100%;
            font-size: 1.1rem;
            color: green;
        }
        
        .present-box > .side.bottom {
            -webkit-transform: rotateX(90deg) translateY(100px);
            transform: rotateX(90deg) translateY(100px);
            -webkit-transform-origin: bottom center;
            transform-origin: bottom center;
        }
        
        .present-box > .side.front {
            -webkit-transform: translateZ(100px);
            transform: translateZ(100px);
        }
        
        @-webkit-keyframes rotate {
            100% {
                -webkit-transform: rotateY(-360deg) rotateX(180deg);
                transform: rotateY(-360deg) rotateX(180deg);
            }
        }
        
        @keyframes rotate {
            100% {
                -webkit-transform: rotateY(-360deg) rotateX(180deg);
                transform: rotateY(-360deg) rotateX(180deg);
            }
        }
        
        @-webkit-keyframes staticFront {
            100% {
                -webkit-transform: rotateX(-100deg) rotateY(-180deg);
                transform: rotateX(-100deg) rotateY(-180deg);
            }
        }
        
        @keyframes staticFront {
            100% {
                -webkit-transform: rotateX(-100deg) rotateY(-180deg);
                transform: rotateX(-100deg) rotateY(-180deg);
            }
        }
        
        @-webkit-keyframes zoomIn {
            50% {
                -webkit-transform: rotateX(-143deg) rotateY(-180deg) translateZ(-15px);
                transform: rotateX(-143deg) rotateY(-180deg) translateZ(-15px);
            }
            100% {
                -webkit-transform: rotateX(-167deg) rotateY(-180deg) translateZ(-15px) scale(1.2);
                transform: rotateX(-167deg) rotateY(-180deg) translateZ(-15px) scale(1.2);
            }
        }
        
        @keyframes zoomIn {
            50% {
                -webkit-transform: rotateX(-143deg) rotateY(-180deg) translateZ(-15px);
                transform: rotateX(-143deg) rotateY(-180deg) translateZ(-15px);
            }
            100% {
                -webkit-transform: rotateX(-167deg) rotateY(-180deg) translateZ(-15px) scale(1.2);
                transform: rotateX(-167deg) rotateY(-180deg) translateZ(-15px) scale(1.2);
            }
        }
    <section class="above-fold">
        <div class="wrap-present">
            <div class="present-box" id="present">
                <div class="present">
                    <div class="img-wrap" id="present-image">

                    </div>
                </div>
                <div class="side front"></div>
                <div class="side back"></div>
                <div class="side left"></div>
                <div class="side right"></div>
                <div class="side top">
                    <span class="to">
          <span class="name" id="nametag">
          </span>
                    </span>
                </div>
                <div class="side bottom"></div>
            </div>

        </div>
        <p class="info-text">Click to Open</p>
    </section>

最佳答案

Coderman 很接近,但 Javascript 中没有单一形式的 GetElementsByClassName。

您需要迭代该类的所有实例并向每个实例添加一个处理程序。

var to = 'Friend!';
        var gift_url = 'https://stackoverflow.com/';
        var gift_image_url = 'https://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon@2.png';

        var nametag = document.getElementById("nametag");
        var present = document.getElementsByClassName("present-box");
        var presentImage = document.getElementById("present-image");

        function init() {

            var _giftLink,
                _giftImg;

            if (gift_url) {
                _giftLink = document.createElement("a");
                _giftLink.href = gift_url;
                _giftLink.target = "_blank";
                presentImage.appendChild(_giftLink);
            }

            if (gift_image_url) {
                _giftImg = document.createElement("img");
                _giftImg.src = gift_image_url;
                if (_giftLink) {
                    _giftLink.appendChild(_giftImg);
                } else {
                    presentImage.appendChild(_giftImg);
                }
            }

            for (var i = 0; i < present.length; i++) {
                present[i].addEventListener("click", function(e) {
                  this.classList.toggle("open");
              }, false);
            }


            nametag.innerText = to;
        }

        init();
html,
        body {
            margin: 0;
        }
        
        .above-fold {
            height: 100vh;
            width: 100vw;
            padding: 0;
            margin: 0;
            -webkit-perspective: 800px;
            perspective: 800px;
            -webkit-perspective-origin: 50% 200px;
            perspective-origin: 50% 200px;
            display: -webkit-box;
            display: flex;
            flex-wrap: wrap;
            position: relative;
        }
        
        .above-fold .info-text {
            width: 100%;
            display: block;
            text-align: center;
            margin: 0;
            padding: 0;
            color: #555;
            font-family: 'Avenir';
            font-weight: 100;
            font-size: 13px;
            height: 25px;
            align-self: flex-end;
        }
        
        .wrap-present {
            width: 100%;
            display: -webkit-box;
            display: flex;
            align-self: flex-end;
        }
        
        .present-box {
            -webkit-transform-style: preserve-3d;
            transform-style: preserve-3d;
            width: 200px;
            height: 200px;
            margin: auto;
            -webkit-animation: rotate 11s alternate linear infinite;
            animation: rotate 11s alternate linear infinite;
            cursor: pointer;
        }
        
        .present-box:hover {
            -webkit-animation: staticFront 700ms ease forwards;
            animation: staticFront 700ms ease forwards;
        }
        
        .present-box.open {
            /*&>.side.top{
      opacity: .2;
  }*/
            -webkit-animation: zoomIn 1s ease-in forwards;
            animation: zoomIn 1s ease-in forwards;
            -webkit-transform: rotateX(-103deg) rotateY(-180deg);
            transform: rotateX(-103deg) rotateY(-180deg);
            -webkit-transition: -webkit-transform 400ms;
            transition: -webkit-transform 400ms;
            transition: transform 400ms;
            transition: transform 400ms, -webkit-transform 400ms;
        }
        
        .present-box.open .present {
            pointer-events: auto;
            visibility: visible;
        }
        
        .present-box.open .present .img-wrap {
            opacity: 1;
            -webkit-transition: opacity 800ms 200ms, -webkit-transform 600ms 800ms;
            transition: opacity 800ms 200ms, -webkit-transform 600ms 800ms;
            transition: transform 600ms 800ms, opacity 800ms 200ms;
            transition: transform 600ms 800ms, opacity 800ms 200ms, -webkit-transform 600ms 800ms;
            -webkit-transform: translateZ(0px);
            transform: translateZ(0px);
        }
        
        .present-box.open > .side {
            opacity: .3;
            -webkit-transition: opacity 500ms 600ms;
            transition: opacity 500ms 600ms;
        }
        
        .present-box.open > .side.back {
            opacity: 0.7;
            -webkit-transform: translateZ(-101px) rotateY(180deg);
            transform: translateZ(-101px) rotateY(180deg);
        }
        
        .present-box.open > .side.front {
            -webkit-transition: opacity 500ms 600ms, -webkit-transform 800ms 0s;
            transition: opacity 500ms 600ms, -webkit-transform 800ms 0s;
            transition: transform 800ms 0s, opacity 500ms 600ms;
            transition: transform 800ms 0s, opacity 500ms 600ms, -webkit-transform 800ms 0s;
            -webkit-transform: translateZ(100px) rotateY(190deg) translateX(0px);
            transform: translateZ(100px) rotateY(190deg) translateX(0px);
            -webkit-transform-origin: 0% 0%;
            transform-origin: 0% 0%;
            opacity: 0.3;
        }
        
        .present-box .present {
            position: absolute;
            width: 200px;
            height: 200px;
            z-index: 50;
            -webkit-transform: rotateY(-180deg) rotateX(180deg) translateZ(-100px);
            transform: rotateY(-180deg) rotateX(180deg) translateZ(-100px);
            display: -webkit-box;
            display: flex;
            -webkit-perspective: 600px;
            perspective: 600px;
            pointer-events: none;
            visibility: hidden;
        }
        
        .present-box .present > .img-wrap {
            width: 200px;
            align-self: center;
            -webkit-transition: -webkit-transform 400ms;
            transition: -webkit-transform 400ms;
            transition: transform 400ms;
            transition: transform 400ms, -webkit-transform 400ms;
            opacity: 0;
            -webkit-transform: translateZ(-80px);
            transform: translateZ(-80px);
        }
        
        .present-box .present > .img-wrap a {
            -webkit-transition: -webkit-transform 300ms;
            transition: -webkit-transform 300ms;
            transition: transform 300ms;
            transition: transform 300ms, -webkit-transform 300ms;
            position: relative;
            display: block;
            -webkit-transform: scale(0.94);
            transform: scale(0.94);
        }
        
        .present-box .present > .img-wrap a:hover {
            -webkit-transform: scale(1);
            transform: scale(1);
        }
        
        .present-box .present > .img-wrap img {
            max-width: 100%;
            height: auto;
        }
        
        .present-box > .side {
            width: 200px;
            height: 200px;
            position: absolute;
            display: block;
            background: repeating-linear-gradient(45deg, #cc2000, #cc2000 20px, #ffffff 20px, #ffffff 40px);
            top: 0;
            left: 0;
            -webkit-transition: -webkit-transform 400ms;
            transition: -webkit-transform 400ms;
            transition: transform 400ms;
            transition: transform 400ms, -webkit-transform 400ms;
        }
        
        .present-box > .side.back {
            -webkit-transform: translateZ(-100px) rotateY(180deg);
            transform: translateZ(-100px) rotateY(180deg);
        }
        
        .present-box > .side.right {
            -webkit-transform: rotateY(-270deg) translateX(100px);
            transform: rotateY(-270deg) translateX(100px);
            -webkit-transform-origin: top right;
            transform-origin: top right;
        }
        
        .present-box > .side.left {
            -webkit-transform: rotateY(270deg) translateX(-100px);
            transform: rotateY(270deg) translateX(-100px);
            -webkit-transform-origin: center left;
            transform-origin: center left;
        }
        
        .present-box > .side.top {
            -webkit-transform: rotateX(-90deg) translateY(-100px);
            transform: rotateX(-90deg) translateY(-100px);
            -webkit-transform-origin: top center;
            transform-origin: top center;
            -webkit-transform-style: preserve-3d;
            transform-style: preserve-3d;
            -webkit-perspective: 100px;
            perspective: 100px;
            text-align: center;
        }
        
        .present-box > .side.top .to {
            display: inline-block;
            font-family: cursive;
            position: relative;
            padding: 10px 10px 30px 10px;
            border: 5px dotted #ff6666;
            border-width: 2px;
            background: #fff;
            margin: auto;
            -webkit-transform: translateZ(-2px) translateY(50px);
            transform: translateZ(-2px) translateY(50px);
        }
        
        .present-box > .side.top .to:after {
            content: 'Merry Christmas';
            display: inline-block;
            -webkit-transform: rotateY(180deg);
            transform: rotateY(180deg);
            color: #990000;
        }
        
        .present-box > .side.top .to .name {
            display: block;
            position: absolute;
            -webkit-transform: translateY(20px) rotateY(180deg) translateX(10px);
            transform: translateY(20px) rotateY(180deg) translateX(10px);
            text-align: center;
            width: 100%;
            font-size: 1.1rem;
            color: green;
        }
        
        .present-box > .side.bottom {
            -webkit-transform: rotateX(90deg) translateY(100px);
            transform: rotateX(90deg) translateY(100px);
            -webkit-transform-origin: bottom center;
            transform-origin: bottom center;
        }
        
        .present-box > .side.front {
            -webkit-transform: translateZ(100px);
            transform: translateZ(100px);
        }
        
        @-webkit-keyframes rotate {
            100% {
                -webkit-transform: rotateY(-360deg) rotateX(180deg);
                transform: rotateY(-360deg) rotateX(180deg);
            }
        }
        
        @keyframes rotate {
            100% {
                -webkit-transform: rotateY(-360deg) rotateX(180deg);
                transform: rotateY(-360deg) rotateX(180deg);
            }
        }
        
        @-webkit-keyframes staticFront {
            100% {
                -webkit-transform: rotateX(-100deg) rotateY(-180deg);
                transform: rotateX(-100deg) rotateY(-180deg);
            }
        }
        
        @keyframes staticFront {
            100% {
                -webkit-transform: rotateX(-100deg) rotateY(-180deg);
                transform: rotateX(-100deg) rotateY(-180deg);
            }
        }
        
        @-webkit-keyframes zoomIn {
            50% {
                -webkit-transform: rotateX(-143deg) rotateY(-180deg) translateZ(-15px);
                transform: rotateX(-143deg) rotateY(-180deg) translateZ(-15px);
            }
            100% {
                -webkit-transform: rotateX(-167deg) rotateY(-180deg) translateZ(-15px) scale(1.2);
                transform: rotateX(-167deg) rotateY(-180deg) translateZ(-15px) scale(1.2);
            }
        }
        
        @keyframes zoomIn {
            50% {
                -webkit-transform: rotateX(-143deg) rotateY(-180deg) translateZ(-15px);
                transform: rotateX(-143deg) rotateY(-180deg) translateZ(-15px);
            }
            100% {
                -webkit-transform: rotateX(-167deg) rotateY(-180deg) translateZ(-15px) scale(1.2);
                transform: rotateX(-167deg) rotateY(-180deg) translateZ(-15px) scale(1.2);
            }
        }
   <section class="above-fold">
        <div class="wrap-present">
            <div class="present-box" id="present">
                <div class="present">
                    <div class="img-wrap" id="present-image">

                    </div>
                </div>
                <div class="side front"></div>
                <div class="side back"></div>
                <div class="side left"></div>
                <div class="side right"></div>
                <div class="side top">
                    <span class="to">
          <span class="name" id="nametag">
          </span>
                    </span>
                </div>
                <div class="side bottom"></div>
            </div>

        </div>
        <p class="info-text">Click to Open</p>
    </section>
    
     <section class="above-fold">
        <div class="wrap-present">
            <div class="present-box" id="present2">
                <div class="present">
                    <div class="img-wrap" id="present-image">

                    </div>
                </div>
                <div class="side front"></div>
                <div class="side back"></div>
                <div class="side left"></div>
                <div class="side right"></div>
                <div class="side top">
                    <span class="to">
          <span class="name" id="nametag">
          </span>
                    </span>
                </div>
                <div class="side bottom"></div>
            </div>

        </div>
        <p class="info-text">Click to Open</p>
    </section>

关于javascript - 添加多次后 Div 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60022176/

相关文章:

javascript - Bootstrap Accordion 被迫显示打开的 Accordion

html - Vue.js:在元素处于正确位置之前不显示元素

html - 为什么带有滚动条的列表将一个元素分成两行

javascript - 在 javascript 中设置和使用 HTML 对象的自定义属性

javascript - 获取表格中行的背景以通过单击更改?

html - :hover inherit the link color by default怎么可以

javascript - Firefox 未在切换的 div 中加载 wuFoo 表单

css - 在实现 css 中更改 float 按钮位置?

仅适用于 1 个 DIV 的 CSS 多背景

javascript - 可手动操作。获取所有验证错误的列表