div中心的CSS过渡宽度和高度

Posted

技术标签:

【中文标题】div中心的CSS过渡宽度和高度【英文标题】:CSS transition width and height from center of div 【发布时间】:2017-04-09 19:18:11 【问题描述】:

我有 position: absolute; 元素,我想在某些情况下进行过渡。但是,宽度和高度过渡的起点似乎取决于顶部/底部左/右值。

有什么方法可以更好地控制这个吗?

我特别希望从 div 的中心过渡。

是否有任何不依赖于转换顶部/底部左/右值的解决方案?


编辑

我想保持宽度和高度的过渡。

感谢您的回答,但在这种情况下使用 变换比例不是解决方案。 Transform property 中的百分比是指元素边框的大小,而不是容器的大小。参见例如this JSFiddle,将鼠标悬停在两个元素上的最终结果有何不同。


JSFiddle

div, span 
  width:30%;
  height:30%;
  background:pink;
  transition:all 1s ease;
  position:absolute;

*:hover
  width:10%;
  height:10%;

div
  top:10%;
  left:10%;

span
  bottom:10%;
  right:10%;
<div></div>
<span></span>

【问题讨论】:

你玩过transition-origin 的各种值吗?喜欢transition-origin: 50% 50%; Just did。好像没什么效果。 我明白了。问题是您的元素仍然基于顶部/左侧位置放置,并且不受过渡的影响。唯一想到的就是调整:hover 的左/上属性,或者使用scale() 像这样:jsfiddle.net/36hhyvkg/2 transform: scale 可以完成这项工作,您只需要正确使用它即可。您展示比例如何在元素上工作的小提琴,而不是它的容器,有一个很大的缺陷,使用宽度/高度调整大小的样本设置为 33%(从 30 到 10),因此比例应该匹配是 0.33,而不是 0.1 ...更新小提琴jsfiddle.net/6gyp3f7k/1 【参考方案1】:

这是你想要达到的目标吗?使用translate会根据元素本身的宽度和高度改变元素的位置。

div, span 
  width:30%;
  height:30%;
  background:pink;
  transition:all 1s ease;
  position:absolute;
  transform: translate(-50%, -50%);

*:hover
  width:10%;
  height:10%;

div
  top:25%;
  left:25%;

span
  top:75%;
  left:75%;
<div></div>
<span></span>

【讨论】:

这太神奇了,我不明白你的答案受欢迎程度低..【参考方案2】:

最好的方法是使用矩阵,这可以让你结合转换和转换。 矩阵有 6 个参数

变换:矩阵(a,b,c,d,e,f);

在哪里

a= 缩放 X 轴

b=skewX

c=skewY

d= 缩放 Y 轴

e= X 位置

f= Y 位置

在这种情况下,我将 X 轴上的比例(这将改变宽度)设置为悬停后初始宽度的两倍。 (值 2 表示初始比例乘以 2) Y 轴上的比例没有改变(值 1 表示初始比例乘以 1,因此高度不会改变)其余参数为 0,因为在这种情况下您不需要使用它们。

.example 
  width: 30%;
  height: 30%;
  background-color: pink;
  position: absolute;
  top: 35%;
  left: 35%;
  transition: width, height, transform 1s;

.example:hover 
  transform: matrix(2, 0, 0, 1, 0, 0);
&lt;div class="example"&gt;&lt;/div&gt;

【讨论】:

【参考方案3】:

您可以尝试使用transform: translate(-50%, -50%); 看看是否有帮助。

.example 
  width: 30%;
  height: 30%;
  background: pink;
  transition: all 1s ease;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);

.example:hover 
  width: 10%;
  height: 10%;
&lt;div class="example"&gt;&lt;/div&gt;

【讨论】:

【参考方案4】:

不确定这是否正是您要寻找的,但此解决方案不是基于transform: scale,您可以手动设置悬停时 div 的所需宽度和高度,甚至以百分比表示。

而且百分比是相对于容器的宽度而言的。

HTML

<div id="container">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>

CSS

#container
  width: 400px;
  height: 400px;
  background: #eee;
  position: relative;


.box
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: #000;
  width: 20%;
  height: 20%;
  transition: 0.3s;
  cursor: pointer;


.box:hover
  width: 7%;
  height: 10%;


.box:nth-child(2)
  left: 20%;


.box:nth-child(3)
  top: 20%;


.box:nth-child(4)
  top: 20%;
  left: 20%;

#container 
  width: 400px;
  height: 400px;
  background: #eee;
  position: relative;

.box 
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: #000;
  width: 20%;
  height: 20%;
  transition: 0.3s;
  cursor: pointer;

.box:hover 
  width: 7%;
  height: 10%;

.box:nth-child(2) 
  left: 20%;

.box:nth-child(3) 
  top: 20%;

.box:nth-child(4) 
  top: 20%;
  left: 20%;
<div id="container">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>

【讨论】:

【参考方案5】:

你可以同时改变位置来模拟效果。但我和其他人在一起:transform: scale 是解决这个问题的更好方法。

div, span 
  width:30%;
  height:30%;
  background:pink;
  transition:all 1s ease;
  position:absolute;

div
  top:10%;
  left:10%;

div:hover
  width:10%;
  height:10%;
  top: 20%;
  left: 20%;

span
  bottom:10%;
  right:10%;

span:hover
  width:10%;
  height:10%;
  bottom: 20%;
  right: 20%;
<div></div>
<span></span>

带变换的版本:

div, span 
  width:30%;
  height:30%;
  background: red;
  transition: all 1s ease;
  position: absolute;

div
  top:10%;
  left:10%;

div:hover
  transform-origin: 50% 50%;
  transform: scale(0.3);

span
  bottom:10%;
  right:10%;

span:hover
  transform-origin: 50% 50%;
  transform: scale(0.3);
<div></div>
<span></span>

【讨论】:

谢谢乔迪。这是我的想法,但让我们看看其他人是否有其他方法。正如我在其他评论中所说,Transform 中的百分比指的是元素本身,而不是容器,因此它不是解决方案。 我使用转换添加了一个新的 sn-p,@Alvaro【参考方案6】:

我建议在动画位置时使用transform: translate,因为它是better for performance,然后您可以使用transform-origin 控制它的原点。

如果你想改变宽度或高度,同样可以使用transform: scale

假设你想从中心向外加倍大小。那么你只需要写transform: scale(2.0),因为transform-origin的默认值是50% 50%

在此处查看示例:https://jsfiddle.net/ydpx284g/

【讨论】:

能否请您详细说明一下。【参考方案7】:

好吧,你总是可以使用 transform - scale 来解决这个问题:

div 
  background:pink;
  width:200px;
  height:200px;
  transition:all 1s ease;

div:hover
        -webkit-transform: scale(0.1);
        -ms-transform: scale(0.1);
        transform: scale(0.1);
&lt;div&gt;&lt;/div&gt;

【讨论】:

谢谢,但我想使用宽度和高度值更改。 宽度和高度为元素的内容,从左到右,从上到下。您可以使用关键帧实现这种动画,同时为左/右/上/下边距设置动画,还可以使用另一个包装元素来保持动画的方向。但是有很多样板代码。我相信 transform + scale 是最好的解决方案——对于不支持此功能的浏览器(1% 的用户),他们只是不会显示动画,仅此而已。 因为我使用的是百分比。 Transform 中的百分比指的是元素本身,而不是容器。 (而且我不想使用 javascript 来设置确切的比例值)。

以上是关于div中心的CSS过渡宽度和高度的主要内容,如果未能解决你的问题,请参考以下文章

DIV的宽度和高度在外部CSS时候设置无效?

CSS如何怎么设置div边框颜色宽度和高度

div css布局网页如何实现网页自动适应屏幕高度和宽度

div标签怎么设置div的宽度

不应用 CSS div 高度和宽度

CSS如何怎么设置div边框颜色宽度和高度?