javascript - 我不能用 JS 操作 CSS 显示属性?
问题描述
我正在尝试在单击呼叫按钮后将模式的显示值设置为阻止。如果我进行了拼写,我无法弄清楚为什么即使我仔细检查了 JS 表也无法更改它(我的意思是通过窗口控制台检查值并检查它是否与我编写的 JS 表匹配)错误或以不同方式命名元素,但我确定没有错误。一旦我认为该onclick = () =>
方法可能效果不佳,我就使用addEventListener()
了。我确信当我在窗口控制台中对其进行编码时,它成功地将显示更改为阻塞,我也确信它作为普通模式显示在其他元素上,因此它也不会隐藏。我浏览过一些论坛,其中包括初学者级别的问题,例如写作style.display = block
而不是style.display: "block"
但找不到任何相似之处。我一直在想我的类/id 符号有问题。
所以这里的代码:(index.scss)
.call {
position: fixed;
display: block;
}
.modal {
display: none;
position: fixed;
&-content {
display: block;
&-close {
display: block;
}
}
}
(index.js)
var call = document.querySelector("#call");
var modal = document.querySelector("#modal");
var close = document.querySelector("#close");
const openModal = () => {
if(modal.style.display === "none") {
modal.style.display = "block";
}
};
const closeModal = () => {
if(modal.style.display === "block") {
modal.style.display = "none";
}
}
call.addEventListener("click", openModal);
modal.addEventListener("click", closeModal);
(index.pug)
.call#call Iletisim
.modal#modal
.modal-content#content
span.modal-content-close#close ×
解决方案
HTML 元素的.style
属性仅显示该元素具有的内联样式。那是直接使用<a style="display: block;" />
或使用 Javascript添加到元素的样式,所以您遇到的问题是您在访问时element.style.display = "block";
收到一个,所以您永远不会是真的。作为程序员提示,解决此类问题的第一件事是在你的and函数中放置一个以检查它们是否被调用,并检查代码是否按预期运行。使用 a你会注意到这一点。undefined
style.display
style.display === "block" or "none"
console.log
openModal
closeModal
console.log(model.style.display)
要获得计算出的 CSS 样式,您必须调用window.getComputedStyle(element);
(此处为 DOC),但是当您拥有漂亮的 CSS 时,这非常消耗 CPU 并且实际上并不是很好的做法,所以您可以做的最好的方法是假设一个初始状态(如果没有显示状态,然后假设是none
),或使用类(这是我推荐的方式,根据我的经验),如下所示:
.modal {
display: none;
position: fixed;
&-content {
display: block;
&-close {
display: block;
}
}
&.shown { // Notice the shown class I added here
display: block;
}
}
然后,您可以在模态中添加或删除.shown
该类,它会在您方便时隐藏和显示:
const openModal = () => {
if(!modal.classList.contains("shown")) {
modal.classList.add("shown");
}
};
const closeModal = () => {
if(modal.classList.contains("shown")) {
modal.classList.remove("shown");
}
}
顺便说一句,add
并且remove
已经在contains
内部(或多或少)做了一个,所以你不需要检查:
const openModal = () => {
modal.classList.add("shown");
};
const closeModal = () => {
modal.classList.remove("shown");
}
注意:最好为样式使用类而不是修改内联样式,因为将来您可以更改样式以显示动画(例如),而无需从 Javascript 更改任何内容。
推荐阅读
- vue.js - Vue + Vuetify 性能
- laravel - Laravel 5.8 多对多关系子关系使用外键不起作用
- kubernetes - 无法使用 YAML 配置在 GoCD Kubernetes 中获取 ENV 变量
- php - 将 PHP 与 LDAP 一起使用会将所有结果返回到一条连接线上
- qt - 使用带有数据的 Qt QImage 颜色通道正在发生变化,我不知道为什么
- asp.net - 如何使用我的 vb.net 代码发送电子邮件?
- json - VIM:删除 JSON 值,但保留键
- python - 如何在pyspark中遍历数据框中的行
- docker - Docker Desktop 无法设置大磁盘大小
- vb.net - VB.Net从目录中的文件中删除锁定属性