这(经过一些试验和错误)实际上主要通过 CSS 实现,纯 JavaScript 仅用于切换类名(当单击块和单击关闭链接时)。
如果将 CSS 中的 .block.active 替换为 .block:hover 以便每个块在悬停时展开,并删除关闭链接(和样式),则根本不需要 JS。
HTML:
<div class="block">
<div class="closelink">X</div>
</div>
<div class="block">
<div class="closelink">X</div>
</div>
<div class="block">
<div class="closelink">X</div>
</div>
<div class="block">
<div class="closelink">X</div>
</div>
CSS:
body {
text-align: center
}
.block {
display: inline-block;
position: relative;
width: 60px;
height: 60px;
background: #08f;
margin: 50px;
cursor: pointer;
border-radius: 8px;
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
transition: margin 1s;
-moz-transition: margin 1s;
-webkit-transition: margin 1s;
-o-transition: margin 1s;
-ms-transition: margin 1s;
user-select: none;
-moz-user-select: none;
-webkit-user-select: none
}
.block .closelink {
position: absolute;
width: 20px;
height: 20px;
right: -20px;
top: -20px;
visibility: hidden;
font-size: 14px;
font-family: Segoe UI, Tahoma, Arial, Verdana, sans-serif;
background: #ccc;
border-radius: 4px;
-moz-border-radius: 4px;
-webkit-border-radius: 4px
}
.block.active {
margin-left: 200px;
margin-right: 200px
}
.block.active .closelink {
visibility: visible
}
JavaScript:
window.addEventListener('load', init, false);
function init() {
var blocks = document.getElementsByClassName('block');
var closeLinks = document.getElementsByClassName('closelink');
for(i = 0; i < blocks.length; i++) {
blocks[i].addEventListener('click', blockClicked, false);
}
for(i = 0; i < closeLinks.length; i++) {
closeLinks[i].addEventListener('click', closeLinkClicked, false);
}
}
function blockClicked(e) {
var blocks = document.getElementsByClassName('block');
for(i = 0; i < blocks.length; i++) {
blocks[i].className = 'block';
}
e.target.className = 'block active';
}
function closeLinkClicked(e) {
e.stopPropagation();
e.target.parentElement.className = 'block';
}