如何实现着陆页三垂直分栏?布局与过渡问题排查
三垂直区块着陆页布局与过渡异常问题排查及修复
嘿,我来帮你解决这两个头疼的问题:中间区块没居中,还有过渡效果重叠的异常。咱们一步步拆解问题并修正:
问题1:中间区块未处于页面中心
错误原因
.split.middle没有设置正确的绝对定位位置,你添加的display: inline-block对绝对定位元素无效——因为绝对定位元素脱离了文档流,这个属性起不到居中作用。而左右两个区块分别用left: 0和right: 0固定了位置,中间区块需要手动设置left: 33.33%来占据三分之一的中间位置。
修复代码(修改CSS)
.split.middle { left: 33.33%; /* 新增:固定中间区块的左侧定位 */ background: url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat; background-size: cover; }
删除原来的display: inline-block,这个属性对绝对定位元素完全多余。
问题2:过渡效果重叠
错误原因
- 选择器语法错误:比如
.hover-right .middle:before .left:before是错误的嵌套选择器,应该用逗号分隔两个独立的伪元素选择器; - z-index设置逻辑错误:部分hover状态下,没有将当前hover区块的伪元素设为最高层级,导致其他区块的伪元素覆盖上来;
- hover状态的z-index目标错误:比如
.hover-left里错误地给中间区块的伪元素设置z-index,应该给当前hover的左侧区块伪元素设置最高层级。
修复代码(修改CSS)
- 修正
.hover-left的z-index目标:
.hover-left .left:before { z-index: 2; /* 改为给左侧hover区块的伪元素设置最高层级 */ }
替换原来的.hover-left .middle:before { z-index: 2; }
- 修正
.hover-middle的z-index目标:
.hover-middle .middle:before { z-index: 2; /* 改为给中间hover区块的伪元素设置最高层级 */ }
替换原来的.hover-middle .right:before { z-index: 2; }
- 修正
.hover-right的选择器语法:
.hover-right .middle:before, .hover-right .left:before { z-index: 2; /* 用逗号分隔两个独立选择器,同时设置中间和左侧伪元素的层级 */ }
替换原来的.hover-right .middle:before .left:before { z-index: 2; }
完整修复后的CSS代码
:root { --container-bg-color: #333; --left-bg-color: rgba(223, 39, 39, 0.7); --left-button-hover-color: rgba(161, 11, 11, 0.3); --middle-bg-color: rgba(39, 217, 223, 0.7); --middle-button-hover-color: rgba(14, 32, 196, 0.151); --right-bg-color: rgba(43, 43, 43, 0.8); --right-button-hover-color: rgba(92, 92, 92, 0.3); --hover-width: 70%; --other-width: 15%; --speed: 1000ms; } html, body { padding: 0; margin: 0; font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; width: 100%; height: 100%; overflow-x: hidden; } h1 { font-size: 3rem; color: #fff; position: absolute; left: 50%; top: 20%; transform: translateX(-50%); white-space: nowrap; } .button { display: block; position: absolute; left: 50%; top: 40%; height: 2.5rem; padding-top: 1.3rem; width: 15rem; text-align: center; color: #fff; border: #fff solid 0.2rem; font-size: 1rem; font-weight: bold; text-transform: uppercase; text-decoration: none; transform: translateX(-50%); } .split.left .button:hover { background-color: var(--left-button-hover-color); border-color: var(--left-button-hover-color); } .split.middle .button:hover { background-color: var(--middle-button-hover-color); border-color: var(--middle-button-hover-color); } .split.right .button:hover { background-color: var(--right-button-hover-color); border-color: var(--right-button-hover-color); } .container { position: relative; width: 100%; height: 100%; background: var(--container-bg-color); } .split { position: absolute; width: 33.33%; height: 100%; overflow: hidden; } .split.left { left: 0; background: url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat; background-size: cover; } .split.left:before { position: absolute; content: ""; width: 100%; height: 100%; background: var(--left-bg-color); } .split.middle { left: 33.33%; background: url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat; background-size: cover; } .split.middle:before { position: absolute; content: ""; width: 100%; height: 100%; background: var(--middle-bg-color); } .split.right { right: 0; background: url('https://image.ibb.co/m3ZbRb/programmer.png') center center no-repeat; background-size: cover; } .split.right:before { position: absolute; content: ""; width: 100%; height: 100%; background: var(--right-bg-color); } .split.left, .split.middle, .split.right, .split.right:before, .split.left:before, .split.middle:before { transition: var(--speed) all ease-in-out; } .hover-left .left { width: var(--hover-width); } .hover-left .middle { width: var(--other-width); } .hover-left .right { width: var(--other-width); } .hover-left .left:before { z-index: 2; } .hover-middle .middle { width: var(--hover-width); } .hover-middle .left { width: var(--other-width); } .hover-middle .right { width: var(--other-width); } .hover-middle .middle:before { z-index: 2; } .hover-right .right { width: var(--hover-width); } .hover-right .middle { width: var(--other-width); } .hover-right .left { width: var(--other-width); } .hover-right .middle:before, .hover-right .left:before { z-index: 2; } @media(max-width: 800px) { h1 { font-size: 2rem; } .button { width: 12rem; } } @media(max-height: 700px) { .button { top: 70%; } }
效果验证
修改后,三个区块会默认垂直平分页面宽度,鼠标hover任意区块时:
- 当前区块平滑扩展到70%宽度
- 另外两个区块收缩到15%宽度
- 过渡过程中不会出现重叠覆盖的问题
内容的提问来源于stack exchange,提问作者Ashish Dhase
相关产品推荐
相关产品推荐

