我试图将此元素置于屏幕中央,当我悬停时也是如此。
在下面的示例中,div 没有居中,即使我将其悬停时知道我也进行了 50% 变换,并且顶部/左侧也进行了变换,这就是我用来使元素居中的有用方法。
* {
box-sizing: border-box;
}
body {
position: relative }
.zoom {
padding: 50px;
background-color: green;
transition: transform .2s;
width: 200px;
height: 200px;
margin: 0 auto;
transform: scale(.2) translate(-50%, -50%);
position: absolute;
top: 50%;
left: 50%;
}
.zoom:hover {
-ms-transform: scale(1.5); /* IE 9 */
-webkit-transform: scale(1.5); /* Safari 3-8 */
transform: scale(1.5);
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="zoom"></div>
</body>
</html>
请记住,变换的顺序决定了元素的显示方式。首先移动元素
top: 50%; left: 50%;
,将其置于右下象限。然后将其变小transform: scale(0.2)
,然后然后将其向左移动现在较小尺寸的 50% translate(-50%, -50%)
。
通过首先放置翻译,元素会在变小之前居中。当您增加大小时,请记住还包括 translate(-50%, -50%)
,因为随后的翻译将覆盖当前的翻译,而不是添加到它。
* {
box-sizing: border-box;
}
html, body {
height: 100%;
}
body {
position: relative }
.zoom {
padding: 50px;
background-color: green;
transition: transform .2s;
width: 200px;
height: 200px;
margin: 0 auto;
transform: translate(-50%, -50%) scale(.2);
position: absolute;
top: 50%;
left: 50%;
}
.zoom:hover {
-ms-transform: translate(-50%, -50%) scale(1.5); /* IE 9 */
-webkit-transform: translate(-50%, -50%) scale(1.5); /* Safari 3-8 */
transform: translate(-50%, -50%) scale(1.5);
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="zoom"></div>
</body>
</html>
:hover
选择器中,因为变换中没有
translate()
,您基本上将其重置为 0,这不是您想要的。 因为它会忘记之前的内容并覆盖它。
这里有一个简单的解决方案:
❌
.zoom:hover {
transform: scale(1.5);
}
✅
.zoom:hover {
transform:
scale(1.5)
translate(-50%, -50%); /* add this */
}
这里简单解释一下:
现代解决方案(更少的代码):
使用CSS网格https://developer.mozilla.org/en-US/docs/Web/CSS/grid
使用place-items
它将自动居中,无需任何转换或位置...https://developer.mozilla.org/en-US/docs/Web/CSS/place-items 此外,您不必在开始时进行
0.2
缩放,只需从
scale(1)
开始,然后在悬停时使用更大的比例使其更大,例如
4
。 (因此,在没有任何悬停的情况下,它不会在从 200px 到 0.2scale 过渡开始时产生该错误)
但是您的用户使用的是现代浏览器,因此为了提高可读性并更简单地使用 Flexbox 或网格可能是一个好主意。
如需了解更多信息,请使用
https://caniuse.com(例如,从 2020 年开始,任何浏览器都支持 95% 的网格,从 2017 年开始,Chrome 浏览器也支持网格)
这里是 CSS 网格解决方案
html,
body {
height: 100%;
}
body {
display: grid;
place-items: center;
margin: 0;
}
.zoom {
background-color: green;
width: 50px;
height: 50px;
transition: transform 0.2s;
}
.zoom:hover {
transform: scale(4);
}
<body>
<div class="zoom"></div>
</body>
translate(-50%, -50%)
放在
scale(0.2)
之前。另外,您需要在
translate(-50%, -50%)
规则中包含
hover
,否则它会缩放,但会将翻译部分重置为其默认值。
* {
box-sizing: border-box;
}
html,
body {
height: 100%;
margin: 0;
}
body {
position: relative
}
.zoom {
padding: 50px;
background-color: green;
transition: transform .2s;
width: 200px;
height: 200px;
margin: 0 auto;
transform: translate(-50%, -50%) scale(0.2);
position: absolute;
top: 50%;
left: 50%;
transform-origin: center;
}
.zoom:hover {
-ms-transform: translate(-50%, -50%) scale(1.5);
/* IE 9 */
-webkit-transform: translate(-50%, -50%) scale(1.5);
/* Safari 3-8 */
transform: translate(-50%, -50%) scale(1.5);
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="zoom"></div>
</body>
</html>