【问题标题】:Modal Window on card click JS CSS PHP卡上的模态窗口点击 JS CSS PHP
【发布时间】:2021-05-10 16:52:28
【问题描述】:

所以我的 html 上有 6 张卡片。每点击一次需要弹出一个模态窗口(这个模态窗口是一张卡片,信息比较多,所以每个模态窗口对应一张卡片)。

我不知道该怎么做。在网上搜索了一天后,我在这里寻求您的帮助。

我尝试制作 html animal_card 和我的模态 appart。那么所有的内容都会随着php而改变。 并且 Javascript 需要在点击时将模态窗口 css 属性更改为绝对。

有人知道如何用 Javascript 做到这一点吗?

HTML:

<div class="animal_card">
    <div class="card_title">
        <h3>title</h3>
    </div>

    <div class="card_image">
        <img src="image.img" alt="">
    </div>
    <div class="card_text">
        <div class="card_info">
            <div class="card_info_age">
                <h4>Age</h4>
                <p>14</p>
            </div>
            <div class="card_info_gender">
                <h4>Gender :</h4>
                <p>Female</p>
            </div>
        </div>
        <h4>Who am I</h4>
        <p>Description Text</p>
    </div>
</div> 

<div class="bg-modal">
            <div class="modal-content">

                <div class="modal-animal">
                    <h1>Animal Name</h1>
                    <button class="close" onclick="closeModal()">&times</button>
                    <div><img src="img/greciaprofile.jpg" alt=""></div>

                    <div class="animal-informations">
                        <div class="left">
                            <label for="">Age</label>
                            <p>14</p>
                            <label for="">Sexe</label>
                            <p>Female</p>
                        </div>
                        <div class="right">
                            <label for="">Description</label>
                            <p>
                                Text
                            </p>
                        </div>
                    </div>

                    <div>
                        <button class="main">Adopt</button>
                        <button class="secondary">Support</button>
                    </div>
                </div>
            </div>
        </div>

CSS:

.bg-modal {
    width: 100%;
    height: 100%;
    background-color: rgba(0,0,0,0.7);
    position: absolute;
    top: 0;
    left: 0;
    display: flex;
    justify-content: center;
}

.modal-content {
    position: absolute;
    margin-top: 5rem;
    width: 75vw;
    background-color: $white;
    border-radius: 15px;
}

Javascript:

const cards = document.querySelectorAll('.animal_card');
const modal = document.getElementsByClassName('bg-modal');

const onCardClick = async (e) => {
    const card = e.currentTarget;

    modal.style.position = 'absolute';
}

cards.forEach(card => card.addEventListener('click', onCardClick));

function closeModal() {
    modal[0].style.position = 'none';
}

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    const cards = document.querySelectorAll('.animal_card');
    const modal = document.getElementsByClassName('bg-modal');
    
    const getKeyMap = (modal) => {
     if (modal) {
        let i;
        let keyMap = {};
        for (i = 0; i < modal.length; i++) {
          const item = modal[i];
          const key = item.getAttribute('key');
          keyMap[key] = item;
        }
        
        return keyMap;
     }
     
     return null;
    };
    
    const modalMap = getKeyMap(modal);
    
    const onCardClick = async (e) => {
        const card = e.currentTarget && e.currentTarget.getAttribute('key') || null;
        const selectedModal = modalMap[card] || null;
        
       if (selectedModal) {
         selectedModal.style.position = 'absolute';
       } 
    }
    
    cards.forEach(card => card.addEventListener('click', onCardClick));
    .bg-modal {
        width: 100%;
        height: 100%;
        background-color: rgba(0,0,0,0.7);
        /* position: absolute; */
        top: 0;
        left: 0;
        display: flex;
        justify-content: center;
    }
    
    .modal-content {
        position: absolute;
        margin-top: 5rem;
        width: 75vw;
        background-color: $white;
        border-radius: 15px;
    }
    <div key="5" class="animal_card">
        <div class="card_title">
            <h3>title</h3>
        </div>
    
        <div class="card_image">
            <img src="image.img" alt="">
        </div>
        <div class="card_text">
            <div class="card_info">
                <div class="card_info_age">
                    <h4>Age</h4>
                    <p>14</p>
                </div>
                <div class="card_info_gender">
                    <h4>Gender :</h4>
                    <p>Female</p>
                </div>
            </div>
            <h4>Who am I</h4>
            <p>Description Text</p>
        </div>
    </div> 
    
    <div class="bg-modal" key="5">
                <div class="modal-content">
    
                    <div class="modal-animal">
                        <h1>Animal Name</h1>
                        <button class="close">&times</button>
                        <div><img src="img/greciaprofile.jpg" alt=""></div>
    
                        <div class="animal-informations">
                            <div class="left">
                                <label for="">Age</label>
                                <p>14</p>
                                <label for="">Sexe</label>
                                <p>Female</p>
                            </div>
                            <div class="right">
                                <label for="">Description</label>
                                <p>
                                    Text
                                </p>
                            </div>
                        </div>
    
                        <div>
                            <button class="main">Adopt</button>
                            <button class="secondary">Support</button>
                        </div>
                    </div>
                </div>
            </div>

    因此,使用您的示例的直接答案是 onCardClick 上的 modal 返回一个集合,而不是单个元素。所以选择第一个modal[0] 将修复位置更新。我附上了一个例子。

    如果您要根据您点击的卡片显示不同的模态,您通常需要一种方法来跟踪它们。真的取决于你想如何做到这一点,基于 id 或索引位置等。无论如何,如果这有帮助,请告诉我。

    【讨论】:

    • const modal = document.getElementsByClassName('bg-modal');这部分返回一个集合?
    • 是的,完全正确。所以它将返回[modal1, modal2, modal3, ...etc]。所以在示例中,由于只有一个,所以我使用modal[0] 来获取您在示例代码中提供的模态。
    • 非常感谢,这很好。所以你说如果我要根据我点击的卡片显示不同的模式,我需要一种方法来跟踪它们。 animal_card 与模态框在同一个文件中。所有内容都随着 php 变化(例如:卡片和模式上的动物名称相同)。我用 php (for (i=0;i &lt;6, i++) { include 'card + modal' }) 复制了这个文件,所以现在我有 6 张卡片和 6 个模态。我想如果我用 php 添加一个 id="i" 到卡片和模式中,我可以用 js 像这样选择它们。但不允许使用相同的 ID。你的方法是什么?
    • 更新了示例^。使用 attr key 将卡片链接到模态。所以,这里的变化是获取所有模态的列表,按键映射它们。在示例中,密钥为5。当用户点击一张卡片时,抓住目标键并将其与模态图匹配。如果该键存在模式,则显示它,否则什么也不做。让我知道这是否有意义或对您的方案有帮助。
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    相关资源
    最近更新 更多