Модал не отображается с bulma css - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу отобразить модальный режим, когда кнопка нажата, но не работает. Вот код:

    <button class="button is-warning is-pulled-right" onclick="refs.modalEdicion.open()">
        <span>Editar</span>
    </button>
    <div class="modal" id="modalEdicion">
        <div class="modal-background"></div>
        <div class="modal-content">
            <p class="image is-4by3">
            <img src="https://bulma.io/images/placeholders/1280x960.png" alt="">
            </p>
        </div>
        <button class="modal-close is-large" aria-label="close"></button>
    </div>

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

Я столкнулся с этой проблемой на этой неделе, и нашел ссылку . Он содержит официальный (в соответствии с ним) код javascript страницы Bulma Modal Doc. Я скопировал и уменьшил его на одну или две строки, и он работает для всех модов bulma, которые вы будете иметь в своем коде.

Обратите внимание, что это довольно открытый код. Ответ Али - идеальный путь для подражания, но если вы не хотите тратить время на написание кодов для модов, просто скопируйте этот сегмент в свой код.

document.addEventListener('DOMContentLoaded', function () {

    // Modals

    var rootEl = document.documentElement;
    var allModals = getAll('.modal');
    var modalButtons = getAll('.modal-button');
    var modalCloses = getAll('.modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button');

    if (modalButtons.length > 0) {
        modalButtons.forEach(function (el) {
            el.addEventListener('click', function () {
                var target = document.getElementById(el.dataset.target);
                rootEl.classList.add('is-clipped');
                target.classList.add('is-active');
            });
        });
    }

    if (modalCloses.length > 0) {
        modalCloses.forEach(function (el) {
            el.addEventListener('click', function () {
                closeModals();
            });
        });
    }

    document.addEventListener('keydown', function (event) {
        var e = event || window.event;
        if (e.keyCode === 27) {
            closeModals();
        }
    });

    function closeModals() {
        rootEl.classList.remove('is-clipped');
        allModals.forEach(function (el) {
            el.classList.remove('is-active');
        });
    }

    // Functions

    function getAll(selector) {
        return Array.prototype.slice.call(document.querySelectorAll(selector), 0);
    }
});
0 голосов
/ 29 апреля 2018

Хорошо, во-первых, вы должны опубликовать свой javascript и css для соответствующего ответа, но я обрисую способ, которым я это делаю.

Вы можете реализовать, как показано ниже:

//One Modal
function OpenModal() {
    //Get element with Id= "modal"
    var modal = document.getElementById("modal");
    //Change style to display = "block"
    modal.style.display = "block";
}

//Multiple Modals
function OpenMore(n) {
    //Get elements with class="modal" into an array
    var modal = document.getElementsByClassName("modal");
    //Change style of modal number [n] to display = "block"
    modal[n].style.display = "block";
}

//This will close the modal once you click on it
window.onclick = function(event) {

    //For single modal
    var modal = document.getElementById("modal");
    //If the click was on the modal the modal style display = "none"
    if (event.target == modal) {
        modal.style.display = "none";
    }

    //For multiple modals
    var more = document.getElementsByClassName("modal");
    //i represents which modal. It will go through all modals
    for (var i = 0; i < more.length; i++) {
        //If the click was on the modal for one of the modals display = "none"
        //for all of them
        if (event.target == more[i]) {
            more[i].style.display = "none";
        }
    }
}
.modal {
    display: none;
    background-color: yellow;
    height: 100vh;
    width: 100vw;
    position: fixed;
    top: 0;
    left: 0;
}
#modal {
    display: none;
    background-color: yellow;
    height: 100vh;
    width: 100vw;
    position: fixed;
    top: 0;
    left: 0;
}
.button {
    margin: 50px auto;
}
<!-- For One Modal --> 
<button class="button" onclick="OpenModal()"> SingleModal </button>
<div id="modal"> hardidar </div>

<!-- For Multiple Modals -->
<button class="button" onclick="OpenMore(0)"> MultipleModal1 </button>
<div class="modal"> 1st Modal </div>

<button class="button" onclick="OpenMore(1)"> MultipleModal2 </button> 
<div class="modal"> 2nd Modal </div>

Идея состоит в том, что начальное отображение модального режима в соответствии с правилами css будет display: none, как только вы нажмете кнопку, метод Javascript запустится и изменит его на display:block

Вы могли бы изменить это поведение, чтобы сделать совсем немного. Вы можете переключить класс, вы можете изменить transform: scale(), что является моим личным предпочтением.

Пример является рабочим.

0 голосов
/ 20 августа 2018

Перед запуском простой способ открыть модал должен быть таким:

yourElem.classList.toggle('is-active')

В моем проекте у меня много модальностей. Поэтому я не всегда хотел использовать как выше. Из-за этого я создал базовый модальный приемник событий. Я знаю, что этого недостаточно для тебя. Потому что будут другие ситуации, чтобы открывать и закрывать модалы.

В этом случае вы можете открывать и закрывать ваши модалы, даже если вы можете слушать шоу и закрывать события.

Я использовал этот ресурс Mozilla для создания пользовательских событий. Например, вы хотите создать два события с именем modal: show и modal: close . Чтобы сделать это, вы должны написать несколько кодов, как показано ниже:

Событие на выставке

var event = new Event('modal:show')

yourElem.dispatchEvent(event);

При закрытии события

var event = new Event('modal:close')

yourElem.dispatchEvent(event);

Теперь мы можем слушать вышеописанные события.

Пример прослушивания для показа события

yourElem.addEventListener('modal:show', function() {
    console.log("opened")
})

Пример прослушивания события закрытия

yourElem.addEventListener("modal:close", function() {
    console.log("closed")
})

Мы знаем, как открывать и закрывать модал из раздела «Легкий путь». Но иногда пользователи могут щелкнуть модальный фон или кнопки "X" или Cancel . Если это так, нам нужно обработать эти события. Для этого мы можем использовать этот код

var modalClose = yourelem.querySelectorAll("[data-bulma-modal='close'], 
  .modal-background")

modalClose.forEach(function(e) {
    e.addEventListener("click", function() {

        yourelem.classList.toggle('is-active')

            var event = new Event('modal:close')

            yourelem.dispatchEvent(event);
        })
})

Вот и все. Мы знаем, как открыть или закрыть мод Bulma. Даже мы можем слушать их шоу и близкие события. Давайте сделаем это немного проще

Создание класса BulmaModal

class BulmaModal {
    constructor(selector) {
        this.elem = document.querySelector(selector)
        this.close_data()
    }

    show() {
        this.elem.classList.toggle('is-active')
        this.on_show()
    }

    close() {
        this.elem.classList.toggle('is-active')
        this.on_close()
    }

    close_data() {
        var modalClose = this.elem.querySelectorAll("[data-bulma-modal='close'], 
        .modal-background")

        var that = this
        modalClose.forEach(function(e) {
            e.addEventListener("click", function() {

                that.elem.classList.toggle('is-active')

                var event = new Event('modal:close')

                that.elem.dispatchEvent(event);
            })
        })
    }

    on_show() {
        var event = new Event('modal:show')

        this.elem.dispatchEvent(event);
    }

    on_close() {
        var event = new Event('modal:close')

        this.elem.dispatchEvent(event);
    }

    addEventListener(event, callback) {
        this.elem.addEventListener(event, callback)
    }
}

Использование

var btn = document.querySelector("#btn")
var mdl = new BulmaModal("#myModal")

btn.addEventListener("click", function () {
    mdl.show()
})

mdl.addEventListener('modal:show', function() {
    console.log("opened")
})

mdl.addEventListener("modal:close", function() {
    console.log("closed")
})

Давайте посмотрим на этот простой фрагмент

class BulmaModal {
	constructor(selector) {
		this.elem = document.querySelector(selector)
		this.close_data()
	}
	
	show() {
		this.elem.classList.toggle('is-active')
		this.on_show()
	}
	
	close() {
		this.elem.classList.toggle('is-active')
		this.on_close()
	}
	
	close_data() {
		var modalClose = this.elem.querySelectorAll("[data-bulma-modal='close'], .modal-background")
		var that = this
		modalClose.forEach(function(e) {
			e.addEventListener("click", function() {
				
				that.elem.classList.toggle('is-active')

				var event = new Event('modal:close')

				that.elem.dispatchEvent(event);
			})
		})
	}
	
	on_show() {
		var event = new Event('modal:show')
	
		this.elem.dispatchEvent(event);
	}
	
	on_close() {
		var event = new Event('modal:close')
	
		this.elem.dispatchEvent(event);
	}
	
	addEventListener(event, callback) {
		this.elem.addEventListener(event, callback)
	}
}

var btn = document.querySelector("#btn")
var mdl = new BulmaModal("#myModal")

btn.addEventListener("click", function () {
	mdl.show()
})

mdl.addEventListener('modal:show', function() {
	console.log("opened")
})

mdl.addEventListener("modal:close", function() {
	console.log("closed")
})
<link href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.1/css/bulma.min.css" rel="stylesheet"/>

<div class="modal" id="myModal">
  <div class="modal-background"></div>
  <div class="modal-card">
    <header class="modal-card-head">
      <p class="modal-card-title">Modal title</p>
      <button class="delete" aria-label="close" data-bulma-modal="close"></button>
    </header>
    <section class="modal-card-body">
      <p>There is something here</p>
    </section>
    <footer class="modal-card-foot">
      <button class="button is-success">Save changes</button>
      <button class="button" data-bulma-modal="close">Cancel</button>
    </footer>
  </div>
</div>

<button id="btn">Click active Modal</button>

Надеюсь, этот ответ поможет новичкам Булмы.

0 голосов
/ 29 апреля 2018

Bulma CSS - это только CSS-фреймворк, и все поведение javascript должно быть написано вручную. Это означает, что для модального стиля были написаны все CSS-классы для сокрытия и отображения модального режима, и вам нужно просто правильно связать события. Если вы посетите страницу модального документа (https://bulma.io/documentation/components/modal/), вы увидите предупреждение No Javascript о том, что

Bulma не включает никакого взаимодействия с JavaScript. Тебе придется реализовать класс, чтобы переключить себя.

Просто определите функцию refs.modalEdicion.open, чтобы добавить класс is-active согласно событиям doc и bind на кнопке закрытия, чтобы удалить тот же класс CSS. При желании вы также можете привязать событие к элементу наложения, если хотите отключить модальное, нажав наложение.

Вот желаемая реализация. https://codepen.io/anon/pen/KRaqxG

...