三种效果演示:(为了方便观看效果,我将时间调整为了1秒)
方案1:悬停时图标滑入
/* 方案:悬停时图标滑入 */
a {
position: relative; /* 定位上下文 */
display: inline-block; /* 确保padding不会影响其他行内元素 */
padding-left: 0;
transition: padding-left 0.3s ease; /* 为padding-left添加过渡 */
}
a::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%) translateX(-100%); /* 初始位置:完全在左侧外面 */
width: 16px;
height: 16px;
background: url("图标.svg") center/contain no-repeat;
opacity: 0;
transition: all 0.3s ease;
}
a:hover {
padding-left: 24px; /* 16px图标宽度+8px间距 */
}
a:hover::before {
opacity: 1;
transform: translateY(-50%) translateX(0); /* 滑入到左侧位置 */
}
【提示】如果链接是行内元素(inline),需要改为inline-block,否则padding-left可能不会生效。如果希望图标在文字右侧,可以调整left为auto, right为0,并修改transform和padding方向。
方案二:透明度过渡
/* 给链接添加相对定位作为参照 */
a {
position: relative;
padding-left: 0;
transition: padding-left 0.3s ease; /* 平滑过渡效果 */
}
/* 使用::before伪元素创建图标 */
a::before {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 16px; /* 图标宽度 */
height: 16px; /* 图标高度 */
background-image: url("图标路径.svg"); /* 图标资源 */
background-size: contain;
background-repeat: no-repeat;
opacity: 0; /* 初始完全透明 */
transition: opacity 0.3s ease; /* 透明度过渡效果 */
}
/* 鼠标悬停时显示图标 */
a:hover::before {
opacity: 1; /* 完全不透明 */
}
/* 悬停时添加左边距避免文字重叠 */
a:hover {
padding-left: 24px; /* 图标宽度 + 间距 */
}
补充:带缩放样式
a::before {
/* ...其他样式... */
transform: translateY(-50%) scale(0); /* 初始缩放为0 */
transition: transform 0.3s ease;
}
a:hover::before {
transform: translateY(-50%) scale(1); /* 悬停时恢复原始大小 */
opacity: 1;
}