为什么主要部分在这种情况下重绘?

时间:2017-11-08 08:13:10

标签: css repaint

这是一个简单的jsbin示例:http://jsbin.com/gusaditako/edit?html,css,output

任何人都可以解释为什么主题部分在将鼠标悬停在菜单项上时重新绘制? (从chrome devtools启用Paint闪烁以确保)。

正如我所看到的那样,伪:before选择器应该受到指责,但无法确切地知道原因。如果删除最后一个ul#menu li:hover:before部分,则不再触发主要部分重新绘制......

以上jsbin的代码:

HTML:

  <div id="sidebar">
    <ul id="menu">
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>  
  </div>

  <div id="main">Main part. Why does this repaint on menu hover?</div>

CSS:

ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

#sidebar {
  width: 200px;
  float: left;
  background-color: lightgreen;
}

#main {
  margin-left: 200px;
  width: 500px;
}

ul#menu li {
  height: 30px;
  line-height: 30px;
  padding-left: 20px;
  position: relative;
}

ul#menu li:hover {
  background-color: lightblue;
}

ul#menu li:hover:before {
  content: "";
  width: 4px;
  background-color: red;
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
}

1 个答案:

答案 0 :(得分:0)

嗯,我猜Chrome在内部认为必须重新绘制正确的部分,因为您正在插入一个可能影响主要内容的新元素。一个快速解决方法是将整个侧边栏设置为position:absolute;,如果在您的情况下可以。

#sidebar {
  position: absolute;
  width: 200px;
  float: left;
  background-color: lightgreen;
}

http://jsbin.com/lilusajufe/4/edit?html,css,output