scale和transform-origin控制动画的方向

从左进入,右边离开

我们将一个 hover 动画分解为 3 个部分:

  1. hover 进入状态
  2. hover 停留状态
  3. hover 离开状态
但是,对于一个 hover 效果而言,正常来说,只有初始状态,和hover状态两种。可能我们的代码是这样:
div {
     xxxx...
}
 
div:hover {
     xxxx...
}

对于一个 hover transition 动画,它应该是从:

  • 正常状态 -> hover状态 -> 正常状态 (三个步骤,两种状态)

所以,必须要有一种方法,能够使得 hover 动画的进入与离开产生两种不一样的效果,实现:

  • 状态1 -> hover状态 -> 状态2 (三个步骤,三种状态)

实现控制动画方向的关键点

所以,这里的关键点就在于(划重点):

使得 hover 动画的进入与离开产生两种不一样的效果 。

接下来,也就是本文的关键所在,使用 transform: scale() 以及 transform-origin 实现这个效果。

transform: scale() 实现线条运动

transform: scale 大家应该都很熟悉了,通俗来说是用于缩放,用官方的话说,就是:

CSS 函数 scale() 用于修改元素的大小。可以通过向量形式定义的缩放值来放大或缩小元素,同时可以在不同的方向设置不同的缩放值。

这里我们使用 transform: scaleX(0) 与 transform: scaleX(1) 来改变线条的显示与隐藏,它的 CSS 代码简单来看,可能是这样:

div {
     position : absolute ;
     width : 200px ;
     height : 60px ;
}
 
div::before {
     content : "" ;
     position : absolute ;
     left : 0 ;
     bottom : 0 ;
     width : 200px ;
     height : 2px ;
     background : deeppink;
     transition: transform . 5 s;
     transform: scaleX( 0 );
}
 
div:hover::before {
     transform: scaleX( 1 );
}
嗯?为什么是要用 transform: scale() 来实现线条的动画?因为它可以配合 transform-origin 实现动画的不同运动方向:

transform-origin 实现线条运动方向

transform-origin 让我们可以更改一个元素变形(transform)的原点,transform-origin 属性可以使用一个,两个或三个值来指定,其中每个值都表示一个偏移量。 没有明确定义的偏移将重置为其对应的初始值。

本效果最最最重要的地方就在于这里,我们使用 transform-origin 去改变 transform: scale() 的原点实现线条运动的方向。

  1. 我们给线条设置一个默认的 transform-origin 记为状态1
  2. hover 的时候,设置另外一个不同的 transform-origin, 记为状态2

所以,当然我们 hover 的时候,会读取状态2的transform-origin,从该原点开始放大至 scaleX(1),hover 离开的时候,会读取状态1的transform-origin,从scaleX(1)状态缩小至该原点。

<div>Hover Me</div>
body {
    padding: 50px;
}

div {
    position: absolute;
    width: 200px;
    height: 60px;
    line-height: 60px;
    font-size: 32px;
    cursor: pointer;
    color: #333;
    text-align: center;
    transition: color .5s;
    margin: 20px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

div::before {
    content: "";
    position: absolute;
    left: 0%;
    bottom: 0;
    width: 200px;
    transform: scaleX(0);
    height: 2px;
    background: deeppink;
    z-index: -1;
    transition: transform .5s;
    transform-origin: 100% 0;
}

div:hover::before {
    transform: scaleX(1);
    transform-origin: 0 0;
}

注意,这里使用了 transform-origin 去改变 transform: scale() 的原点实现线条运动的方向,而没有借助诸如 position 位移,transform: translate(),或者 margin 等位置属性去改变线条所在的位置。

所以,有趣的是,线条其实没有产生过任何位移,这里其实也是障眼法,让它看上去,它好像在移动。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
        body {
  padding: 30px;
}

div {
  position: relative;
  width: 200px;
  height: 60px;
  line-height: 60px;
  font-size: 32px;
  cursor: pointer;
  color: #333;
  text-align: center;
  transition: color .5s;
  margin: 10px;
}

div::before {
  content: "";
  position: absolute;
  left: 0;
  width: 200px;
  height: 60px;
  background: deeppink;
  z-index: -1;
  -webkit-transform: scale3d(0, 1, 1);
          transform: scale3d(0, 1, 1);
  -webkit-transform-origin: 100% 50%;
          transform-origin: 100% 50%;
  transition: -webkit-transform .5s;
  transition: transform .5s;
  transition: transform .5s, -webkit-transform .5s;
}

div:hover {
  color: #fff;
}
div:hover::before {
  -webkit-transform: scale3d(1, 1, 1);
          transform: scale3d(1, 1, 1);
  -webkit-transform-origin: 0% 50%;
          transform-origin: 0% 50%;
  transition-timing-function: ease-in;
}

.two::before {
  -webkit-transform: scale3d(0, 0, 1);
          transform: scale3d(0, 0, 1);
  -webkit-transform-origin: 100% 100%;
          transform-origin: 100% 100%;
}

.two:hover {
  color: #fff;
}
.two:hover::before {
  -webkit-transform: scale3d(1, 1, 1);
          transform: scale3d(1, 1, 1);
  -webkit-transform-origin: 0% 0%;
          transform-origin: 0% 0%;
}

.three::before {
  -webkit-transform: scale3d(0, 0, 1);
          transform: scale3d(0, 0, 1);
  -webkit-transform-origin: 50% 100%;
          transform-origin: 50% 100%;
}

.three:hover {
  color: #fff;
}
.three:hover::before {
  -webkit-transform: scale3d(1, 1, 1);
          transform: scale3d(1, 1, 1);
  -webkit-transform-origin: 50% 0%;
          transform-origin: 50% 0%;
}
        </style>
    </head>
    <body>


<div>Hover Me</div>

<div class="two">Hover Me</div>

<div class="three">Hover Me</div>


    </body>
</html>


transform-origin属性用于设置元素的变形基点位置。这个属性的值可以是百分比、em、px等具体的值,也可以是top、right、bottom、left和center这样的关键词。在没有设置transform-origin属性时,CSS变形操作默认以元素自身的中心点为基点进行变形。而设置了transform-origin属性之后,可以改变元素的基点位置,从而实现元素沿着某一基点进行旋转、位移等操作。 下面分三个方面介绍transform-origin属性的详解: 1. 通过设置scale(x,y)来对元素进行缩放变形,基点位置默认在元素的中心位置。 2. 通过设置scaleX()来在X轴(水平方向)缩放元素,基点位置同样在元素的中心位置。可以通过transform-origin属性来改变基点位置。 3. 通过设置scaleY()来在Y轴(垂直方向)缩放元素,基点位置同样在元素的中心位置。可以通过transform-origin属性来改变基点位置。 通过理解和使用transform-origin属性,我们可以更加灵活地控制元素的变形效果,实现各种动画效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [CSS3之transform-origin详解](https://blog.csdn.net/qq_32013641/article/details/89070248)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [css3的transformscale缩放详解](https://download.csdn.net/download/weixin_38624437/14828334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值