显示块和css转换的解决方法不触发

inc*_*ess 6 javascript css repaint

很抱歉这个问题有很多更新,我很高兴每个人都想帮助我.我认为下面有一个更清楚的方法来理解这个问题:

如果在更改附加了转换的属性之前将元素的display属性设置为阻止,则CSS转换将不适用.请考虑以下代码:

CSS:

#creative {
    display: none;
    opacity: 0;
    transition: opacity 0.5s; 
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<div id="creative">
    <span>Sample text</span>
</div>
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

var dom = {};
dom.creative = document.getElementById('creative');
dom.creative.style.display = 'block';
dom.creative.style.opacity = 1;
Run Code Online (Sandbox Code Playgroud)

该元素将正确显示,但没有任何过渡.此问题的解决方法是通过访问元素的一个可视属性来强制重绘:

dom.creative.style.display = 'block';
var a = dom.creative.offsetHeight; /* <-- forces repaint */
dom.creative.style.opacity = 1;
Run Code Online (Sandbox Code Playgroud)

这有什么好方法吗?好吧,我的意思是每次我需要更改显示属性和附加转换的属性时不添加额外的javascript代码行.

LGS*_*Son 2

根据您在问题中提出的代码,我将在这里采用完全不同的方式,并使用animation它,这将使整个重绘问题消失

使用脚本更新将 div 设置为display: block

var dom = {};
dom.creative = document.getElementById('creative');
dom.creative.style.display = 'none';

var butt = document.getElementById('button');
butt.addEventListener('click', function(e) {
  
  if (dom.creative.style.display == 'block') {
    dom.creative.style.display = 'none';    
  } else {
    dom.creative.style.display = 'block';
  }

})
Run Code Online (Sandbox Code Playgroud)
#creative {
  display: none;
  opacity: 0;
  animation: opac 1s forwards;
  margin: 20px;
}
@keyframes opac {
  100% {
    opacity: 1;
  }
}
button {
  margin: 20px;
}
Run Code Online (Sandbox Code Playgroud)
<button id="button">Toggle display</button>

<div id="creative">
  <span>Sample text</span>
</div>
Run Code Online (Sandbox Code Playgroud)

如果display: none不需要,可以使用transition并简单地切换这样的类

var dom = {};
dom.creative = document.getElementById('creative');

var butt = document.getElementById('button');
butt.addEventListener('click', function(e) {
  
  dom.creative.classList.toggle('show');

})
Run Code Online (Sandbox Code Playgroud)
#creative {
  opacity: 0;
  transition: opacity 1s;
  margin: 20px;
}
#creative.show {
  opacity: 1;
  transition: opacity 1s;
}
button {
  margin: 20px;
}
Run Code Online (Sandbox Code Playgroud)
<button id="button">Toggle display</button>

<div id="creative">
  <span>Sample text</span>
</div>
Run Code Online (Sandbox Code Playgroud)

对于transition,除了offsetHeight和 的setTimeout解决方案外,还有一个 3:rd,与切换显示块/无具有相同的视觉效果,将高度/宽度设置为 0。

var dom = {};
dom.creative = document.getElementById('creative');

var butt = document.getElementById('button');
butt.addEventListener('click', function(e) {
  
  dom.creative.classList.toggle('show');

})
Run Code Online (Sandbox Code Playgroud)
#creative {
  width: 0;
  height: 0;
  opacity: 0;
  transition: opacity 1s, width 0s 1s;
  margin: 20px 0;
}
#creative.show {
  width: 100%;
  height: auto;
  opacity: 1;
  transition: opacity 1s, width 0s;
}
button {
  margin: 20px 0;
}
Run Code Online (Sandbox Code Playgroud)
<button id="button">Toggle display</button>

<div id="creative">
  <span>Sample text</span>
</div>

<div>Other content</div>
Run Code Online (Sandbox Code Playgroud)

  • 我不知道 OP 需要它的真正原因,但我可以想象在很多情况下你会想要 `display:none`,例如,如果你不希望 `.creative` 将其后面的内容下推,直到或者如果“.creative”实际上是一个叠加层怎么办?仅仅始终保持透明是不够的 (2认同)