。
const modal = document. getElementById("modal") 。
const modalDarkBackground = document.getElementById("modalDarkBackground") 。
document.getElementById("openModal") 。 onclick = function() {
modal.style.opacity = "1"/span>;
modal.style.zIndex = "9999"/span>;
modal.style.transform = "translate(-50%, -50%) scale(1)"/span>。
modalDarkBackground.style.zIndex = "9998"/span>;
modalDarkBackground.style.opacity = "1"/span>;
}
document.getElementById("closeModal"/span>)。 onclick = function() {
modal.style.transform = "translate(-50%, -50%) scale(1.1)"/span>;
setTimeout(function() {
modal.style.opacity = "0"/span>;
modal.style.zIndex = "-1"/span>;
modal.style.transform = "translate(-50%, -50%) scale(0) ";
modalDarkBackground.style.zIndex = "-1"/span>;
modalDarkBackground.style.opacity = "0"/span>;
}, 500)。)
}
* {
margin: 0;
padding: 0;
font-family: 'Roboto', sans-serif;
}
#modalDarkBackground {
height: 100vh;
width: 100%;
background: rgba(0,0,0,0.5) 。
transition: 所有0.5s。
position: absolute;
top: 0;
left: 0;
opacity: 0;
z-index: -1;
}
#modal {
width: 300px;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0)。
overflow: hidden;
transition: 所有0.5s。
opacity: 0;
background: #fff。
}
#modal h1 {
background: #E6E6E6;
color: #ff0C0C;
字體大小。20px;
padding: 0.5em;
border-bottom: 1px solid #C0C0C0;
}
#modal p {
min-height: 70px;
padding: 0.5em;
color: #ff0C0C;
font-weight: 400;
字體大小。15px;
}
#modal button {
display: block;
width: 50%;
padding: 0.5em 1em;
background: #EDB44C;
color: #fff;
字體大小: 15px;
margin: 0 auto 0.5em auto;
border: 1px solid #BEBEBE;
border-radius: 3px;
}
< link rel="preconnect" href="https: //fonts. googleapis.com">
<link rel="preconnect"/span> href="https://fonts. gstatic.com"crossorigin>
<link href="https://fonts.googleapis. com/css2?family=Roboto:wght@100;300;400&display=swap" rel="styleheet">
<meta name="viewport" content="width=device width, initial-scale=1. 0">
<button id="openModal"/span>>
打開模態
</button>打開模式
<div id="modalDarkBackground"/span>> </div>>
<div id="modal">/span>
<h1>Error</h1>
<p id="modalContent">/span>
你似乎沒有互聯網連接。
請檢查您的連接。
</p>
<button id="closeModal">/span>
確定
</button>
</div>
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
我注意到,我的JavaScript代碼的行內樣式非常糟糕,而且太長了。有沒有辦法用例如AddClass來優化這些JavaScript代碼,或者把它變成一個單一的函式?對不起,我是一個JavaScript新手
。預先感謝!
uj5u.com熱心網友回復:
與其硬性規定受影響的DOM節點的預期行為,不如將CSS資料也烘烤到JavaScript代碼中,我們可以給一個組件(DOM)和模塊(JavaScript)的方法,而不僅僅是一個想法。
在頂部,我們將影片行為完全留給CSS,通過一組共同的css類名來定位這個行為,這將被JavaScript邏輯使用。
當然,我們必須從更通用、結構更好的標記開始。尤其是嵌套對于我們如何定位布局規則至關重要,甚至對于我們如何實作精細定位特定元素的 CSS 轉換也至關重要。
因此,OP 的原始 CSS 根據新的標記進行了輕微的重新組合。
OP可能也注意到了 該模塊只具有兩個方法 因此每個modal相關的元素節點都可以被模塊的 每個專案都擁有兩個方法 因此,組件方法允許在同一個檔案中使用不止一個modal組件。它允許其他程式邏輯或組件通過它們的元素節點參考來單獨檢索和使用 最終的可執行片段的 ... ......確實針對任何被 最后,任何觸發元素將通過 但是對于通過其相關的元素節點參考來存盤和檢索模態專案的方法來說,還有許多選擇。
uj5u.com熱心網友回復: 你可以在css類中描述過渡,并添加/洗掉它們來顯示/隱藏模態active、before-deactivation和deactivating下的類名特定規則,它們分別針對just or still raised modal組件的特定狀態,并且可以通過每個modal組件根節點的相關data-*屬性進行自定義。
modals-module背后的想法是方便和靈活。該模塊在內部通過每個專案對應的元素節點來存盤modal專案。
get和initialize。后者通過特定的data-component-modal屬性來識別所有modal相關的元素節點,并創建一個節點特定的modal-item。
get方法使用,要么檢索一個已經存在的modal-item,要么創建、存盤和獲取一個新的元素節點特定的modal-item。
activate和deactivate,根據它的命名/措辭來觸發一個行為。
modal-items,例如,觸發modal行為,如提升/打開(activate)或關閉(deactivate)與modal相關的元素節點。
main函式的實作確實示范了剛才所說的典范...function main() {
modals.initialize()。
document.
.querySelectorAll('[data-activate-modal]'/span>)
.forEach(triggerNode => document
.querySelectorAll(triggerNode.dataset.activateModal)
.forEach(componentNode => triggerNode
.addEventListener('click', modals.get(componentNode).activated)
)
);
}
modals首先被初始化。然后有一些按鈕,我們希望它們成為引發不同模態的觸發器。這樣的按鈕/觸發器由其data-activate-modal屬性來識別。而后者的值將被用作目標模態的元素查詢。例如,一個像...<button data-activate-modal='#warningModal'/span>>/span>
打開警告模式
</button>打開警告模式。
'#warningModal'查詢到的模態,由于使用了基于id的選擇器,這個例子中的模態只是一個單獨的模態組件。激活來處理它的任何目標modal-專案,在這樣一個觸發器的例如點擊事件上的每個相關專案。
// `modals`模塊。
const modals = (function () {
function getSafeInteger(value) {
value = parseInt(value, 10) 。
return Number.isSafeInteger(value) ? value : 0。
}
function activateBoundModalTarget(/span>) {
this.classList.add('active')。
}
function deactivateBoundModalTarget(/span>) {
const modalNode = this;
let {
deactivationDuration: delayDefault,
deactivationDelay: delayBefore,
} = modalNode.dataset;
delayDefault = getSafeInteger(delayDefault)。
delayBefore = getSafeInteger(delayBefore)。
modalNode.classList.add('before-deactivation', 'deactivating') 。
setTimeout(() => {
modalNode.classList.remove('active'/span>, 'before-deactivation')。
setTimeout(() => )
modalNode.classList.remove('deactivating'), delayDefault
);
}, delayBefore)。
}
//`modal`專案/型別工廠。
function createModal(rootNode) {
const activate = activateBoundModalTarget.bind(rootNode)。
const deactivate = deactivateBoundModalTarget.bind(rootNode)。
根節點
.querySelectorAll('[data-trigger-inactive]'/span>)
.forEach(triggerNode => triggerNode
.addEventListener('click'/span>, deactivate)
);
return {
rootNode,
激活。
停用
}
}
const storage = new WeakMap;
function getModal(rootNode){
let modal = storage.get(rootNode)。
if (
!modal &&
(rootNode instanceof HTMLElement) &&
rootNode.hasAttribute('data-component-modal'/span>)
) {
if (modal = createModal(rootNode) ) {
storage.set(rootNode, modal)。
}
}
return modal ? null。
}
function initialize() {
document.
.querySelectorAll('[data-component-modal]'/span>)
.forEach(getModal)。
}
//匯出模塊.。
return {
get: getModal,
初始化。
};
}());
function main() {
modals.initialize()。
document.
.querySelectorAll('[data-activate-modal]'/span>)
.forEach(triggerNode => document)
.querySelectorAll( triggerNode.dataset.activateModal)
.forEach(componentNode => triggerNode
.addEventListener('click', modals.get(componentNode).activate)
)
);
}
main(); * {
margin: 0;
padding: 0;
font-family: 'Roboto', sans-serif;
}
[data-component-modal]/span> {
z-index: -1;
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%。
}
[data-component-modal]/span> .background {
opacity: 0;
z-index: 0;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100vh;
background: rgba(192, 192, 192, 0.9) 。
transition: 所有0.5s。
}
[data-component-modal] .content {
zoom: .8;
opacity: 0;
z-index: 1;
position: absolute;
left: 50%;
top: 50%;
width: 300px;
background: #fff;
overflow: hidden;
transition: all 0.5s;
transform: translate(-50%, -50%) scale(1)。
}
[data-component-modal].deactivating,
[data-component-modal].active {
z-index: 99;
}
[data-component-modal].active .background,
[data-component-modal]/span>.active .content {
opacity: 1;
}
[data-component-modal].active.before-deactivation .content{
transform: translate(-50%, -50%) scale(1.1)。
}
[data-component-modal].error .background {
background: rgba(255, 192, 192, 0.9) 。
}
[data-component-modal]/span> .content h1 {
background: #E6E6E6;
字體大小: 20px;
padding: 0.5em;
border-bottom: 1px solid #C0C0C0;
}
[data-component-modal] .content p{
min-height: 70px;
padding: 0.5em;
font-weight: 400;
字體大小。15px;
}
[data-component-modal].error .contenth1,
[data-component-modal].error .content p{
color: #ff0C0C;
}
[data-component-modal] .content button {
display: block;
width: 50%;
padding: 0.5em 1em;
background: #EDB44C;
color: #fff;
字體大小: 15px;
margin: 0 auto 0.5em auto;
border: 1px solid #BEBEBE;
border-radius: 3px;
}
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
< link rel="preconnect" href="https: //fonts. googleapis.com">
<link rel="preconnect"/span> href="https://fonts. gstatic.com"crossorigin>
<link href="https://fonts.googleapis. com/css2?family=Roboto:wght@100;300;400&display=swap" rel="styleheet">
<meta name="viewport" content="width=device width, initial-scale=1. 0">
<button data-activate-modal='#errorModal'/span>>
打開錯誤模式
</button>打開錯誤模式。
<button data-activate-modal='#warningModal'/span>>
打開警告模式
</button>打開警告模式。
<button data-activate-modal='#errorModal'>/span>
打開錯誤模式
</button>打開錯誤模式。
<button data-activate-modal='#warningModal'>/span>
打開警告模式
</button>打開警告模式。
<div
data-component-modal
data-deactivation-duration='500
id="errorModal"
class="error"/span>
>
<div class="content">
<h1>Error</h1>
<p id="modalContent">/span>
你似乎沒有互聯網連接。
請檢查您的連接。
</p>
<button data-trigger-inactive>/span>
確定
</button>
</div>
<div class="background"/span>> </div>>
</div>/span>
<div
data-component-modal
data-deactivation-duration='500
data-deactivation-delay='500
id="warningModal"
>
<div class="content">
<h1>Warning</h1>
<p id="modalContent">/span>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</p>/span>
<button data-trigger-inactive>/span>
確定
</button>
<button data-trigger-inactive>
關閉
</button>
</div>/span>
<div class="background"/span>> </div>>
</div>/span>
const modal = document. getElementById("modal") 。
const modalDarkBackground = document.getElementById("modalDarkBackground") 。
const show = (/span>) => {
modal.classList.add('show'/span>)。
modalDarkBackground.classList.add('show')。
};
const hide = (/span>) => {
modal.classList.add('prepare-hide'/span>)。
setTimeout(function() {
modal.classList.remove('prepare-hide') 。
modal.classList.remove('show')。
modalDarkBackground.classList.remove('show')。
}, 500)。)
};
modalDarkBackground.onclick = hide;
document.getElementById("openModal").onclick = show。
document.getElementById("closeModal").onclick = hide;
* {
margin: 0;
padding: 0;
font-family: 'Roboto', sans-serif;
}
#modalDarkBackground {
height: 100vh;
width: 100%;
background: rgba(0,0,0,0.5) 。
transition: 所有0.5s。
position: absolute;
top: 0;
left: 0;
opacity: 0;
z-index: -1;
}
#modal {
width: 300px;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0)。
overflow: hidden;
transition: 所有0.5s。
opacity: 0;
background: #fff。
}
#modal h1 {
background: #E6E6E6;
color: #ff0C0C;
字體大小。20px;
padding: 0.5em;
border-bottom: 1px solid #C0C0C0;
}
#modal p {
min-height: 70px;
padding: 0.5em;
color: #ff0C0C;
font-weight: 400;
字體大小。15px;
}
#modal button {
display: block;
width: 50%;
padding: 0.5em 1em;
background: #EDB44C;
color: #fff;
字體大小: 15px;
margin: 0 auto 0.5em auto;
border: 1px solid #BEBEBE;
border-radius: 3px;
}
#modalDarkBackground.show {
z-index: 9998;
opacity: 1;
}
#modal.show {
opacity: 1;
z-index: 9999;
transform: translate(-50%, -50%) scale(1)。
}
#modal.prepare-hide {
transform: translate(-50%, -50%) scale(1.1)。
}
< link rel="preconnect" href="https: //fonts. googleapis.com">
<link rel="preconnect"/span> href="https://fonts. gstatic.com"crossorigin>
<link href="https://fonts.googleapis. com/css2?family=Roboto:wght@100;300;400&display=swap" rel="styleheet">
<meta name="viewport" content="width=device width, initial-scale=1. 0">
<button id="openModal"/span>>
打開模態
</button>打開模式
<div id="modalDarkBackground"/span>> </div>>
<div id="modal">/span>
<h1>Error</h1>
<p id="modalContent">/span>
你似乎沒有互聯網連接。請檢查您的連接。
</p>
<button id="closeModal">/span>
確定
</button>
</div>
<iframe name="sif3" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
uj5u.com熱心網友回復:
你可以使用樣式類重寫JS代碼。
而且我把樣式從JS移到了樣式塊中。
現在JS看起來很好。
現在,JS看起來更好了。
。const modal = document. getElementById('modal') 。
const modalDarkBackground = document.getElementById('modalDarkBackground') 。
document.getElementById('openModal') 。 onclick = function() {
模態
.classList.add('openModal')。
modalDarkBackground
.classList.add('modalDarkBackgroundOpen') 。
}
document.getElementById('closeModal') 。 onclick = function() {
模態
.classList.add('transformScale')。
setTimeout(function() {
模態
.classList.replace('openModal', 'closeModal') 。
灰色背景(modalDarkBackground
.classList.replace('modalDarkBackgroundOpen', 'modalDarkBackgroundClose')。
}, 500)。)
}
* {
margin: 0;
padding: 0;
font-family: 'Roboto', sans-serif;
}
#modalDarkBackground {
height: 100vh;
width: 100%;
background: rgba(0,0,0,0.5) 。
transition: 所有0.5s。
position: absolute;
top: 0;
left: 0;
opacity: 0;
z-index: -1;
}
#modal {
width: 300px;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0)。
overflow: hidden;
transition: 所有0.5s。
opacity: 0;
background: #fff。
}
#modal h1 {
background: #E6E6E6;
color: #ff0C0C;
字體大小。20px;
padding: 0.5em;
border-bottom: 1px solid #C0C0C0;
}
#modal p {
min-height: 70px;
padding: 0.5em;
color: #ff0C0C;
font-weight: 400;
字體大小。15px;
}
#modal button {
display: block;
width: 50%;
padding: 0.5em 1em;
background: #EDB44C;
color: #fff;
字體大小: 15px;
margin: 0 auto 0.5em auto;
border: 1px solid #BEBEBE;
border-radius: 3px;
}
#modal.openModal {
opacity: 1;
z-index: 9999;
transform: translate(-50%, -50%) scale(1)。
}
#modal.closeModal {
opacity: 0;
z-index: -1;
transform: translate(-50%, -50%) scale(0)。
}
#modal.transformScale {
transform: translate(-50%, -50%) scale(1.1)。
}
#modalDarkBackground.modalDarkBackgroundOpen {
z-index: 9998;
opacity: 1;
}
#modalDarkBackground.modalDarkBackgroundClose {
z-index: -1;
opacity: 0;
}
< link rel="preconnect" href="https: //fonts. googleapis.com">
<link rel="preconnect"/span> href="https://fonts. gstatic.com"crossorigin>
<link href="https://fonts.googleapis. com/css2?family=Roboto:wght@100;300;400&display=swap" rel="styleheet">
<meta name="viewport" content="width=device width, initial-scale=1. 0">
<button id="openModal"/span>>
打開模態
</button>打開模式
<div id="modalDarkBackground"/span>> </div>>
<div id="modal">/span>
<h1>Error</h1>
<p id="modalContent">/span>
你似乎沒有互聯網連接。
請檢查您的連接。
</p>
<button id="closeModal">/span>
確定
</button>
</div>
<iframe name="sif4" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
uj5u.com熱心網友回復:
你可以在關閉模態時添加一個close類,它可以有不同的過渡屬性--這個屬性將使用cubic-berzier來給出擴大模態的效果,然后再完全收縮它。然后你可以使用setTimeout來移除close類。
下面是代碼:
。 const modal = document. getElementById("modal") 。
const modalDarkBackground = document.getElementById("modalDarkBackground") 。
document.getElementById("openModal") 。 onclick = function() {
modal.classList.add("open"/span>)。
modalDarkBackground.classList.add("open") 。
}
document.getElementById("closeModal") 。 onclick = function() {
modal.classList.add("close")。
modal.classList.remove("open")。
modalDarkBackground.classList.remove("open") 。
setTimeout(function () { modal. classList.remove("close"); }, 500)。)
}
* {
margin: 0;
padding: 0;
font-family: 'Roboto', sans-serif;
}
#modalDarkBackground {
height: 100vh;
width: 100%;
background: rgba(0, 0, 0, 0.5)。
transition: 所有0.5s。
position: absolute;
top: 0;
left: 0;
opacity: 0;
z-index: -1;
}
#modalDarkBackground.open {
opacity: 1;
z-index: 9998;
}
#modal {
width: 300px;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0)。
overflow: hidden;
transition: 所有0.5s。
opacity: 0;
background: #fff。
}
#modal.open {
opacity: 1;
z-index: 9999;
transform: translate(-50%, -50%) scale(1)。
}
#modal.close {
opacity: 0;
transform: translate(-50%, -50%) scale(0)。
transition: 所有0.5s cubic-bezier(0. 17, -0.16, 0.54, -0.42) ! important。
}
#modal h1 {
background: #E6E6E6;
color: #ff0C0C;
字體大小。20px;
padding: 0.5em;
border-bottom: 1px solid #C0C0C0;
}
#modal p {
min-height: 70px;
padding: 0.5em;
color: #ff0C0C;
font-weight: 400;
字體大小。15px;
}
#modal button {
display: block;
width: 50%;
padding: 0.5em 1em;
background: #EDB44C;
color: #fff;
字體大小: 15px;
margin: 0 auto 0.5em auto;
border: 1px solid #BEBEBE;
border-radius: 3px;
}
<button id="openModal">
打開模態
</button>打開模式
<div id="modalDarkBackground"/span>> </div>>
<div id="modal">/span>
<h1>Error</h1>
<p id="modalContent">/span>
你似乎沒有互聯網連接。請檢查您的連接。
</p>
<button id="closeModal">/span>
確定
</button>
</div>
<iframe name="sif5" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/320455.html
標籤:
