从特效入手,深入了解CSS(二):鼠标 hover 特效

2023-11-16

不建议跳跃阅读!
这篇文章将从头开始介绍如何实现一个特效
中间偶尔会穿插一些css3或平时接触不多的css属性

首先看一看这一期的特效:

ezgif-3-06a065eb00

HTML部分

<h1>Hover Me</h1>

CSS 部分

首先通过grid布局place-content: center;让元素水平垂直居中:

body {
    min-block-size: 100%;
    min-inline-size: 100%;
    margin: 0;
    box-sizing: border-box;
    display: grid;
    place-content: center;
    font-family: system-ui, sans-serif;
}

然后为这个h1内容设置一个基本样式:

h1 {
    position: relative;
    font-size: 5rem;
    cursor: pointer;
}

好,现在我们来考虑特效是如何实现的:

当鼠标移动到文字上方的时候,蓝色的背景从左往右出现;当鼠标移开时,蓝色背景向右移出

可是,既然是设置文字的背景颜色,那么在一开始的时候,背景颜色就会填充元素的盒子区域,看起来很难实现背景颜色的移动效果

不过先试试,考虑使用伪元素before来制作最左边的元素,因为此时的背景颜色是作用在伪元素身上的,如果说可以让伪元素置于目标元素的下方,就可以模拟元素的背景颜色

h1::before {
    content: " ";
    display: block;
    position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
    /* 上面那句话可以写成这句简写形式,inset用于定义物理偏移量*/
    /* 比如 inset: 1em 2em 3em; 可以等价于 top: 1em; right: 2em; bottom: 3em; left: 2em; */
    inset: 0 0 0 0;
    background: hsl(200 100% 80%);
    /* 这一步很关键 */
    /* 让伪元素置于目标元素的下方 */
    z-index: -1;
}

此时的效果如下:

image-20220417091758100

现在再来实现鼠标悬浮后的特效变化。

为了去掉这里的背景颜色,我们可以在初始的时候设置transform: scaleX(0);,让伪元素缩小为0倍,此时就不会展示伪元素了。

h1::before {  
    transform: scaleX(0); 
    transform-origin: bottom right;
}

来看看css3的新特性transform-origin

transform-origin

在没有设置transform-origin属性时,CSS变形进行的旋转、移位、缩放等操作都是以元素自己中心(变形原点/中心点)位置进行变形的,比如对一个正方形设置transform: rotate(30deg),正方形会以它的正中心为坐标原点进行旋转30度的操作。而 CSS3 中的transform-origin属性可以用于设置旋转元素的基点位置。

以MDN文档中的例子来说:

image-20220417092455223

image-20220417092509502

transform-origin CSS属性让你更改一个元素变形的原点。例如,rotate()函数的转换原点是旋转中心,即默认的转换原点是 center

  • 一个值:
    • 必须是长度(px),或百分比(%),或 left, center, right, top, bottom关键字中的一个。
  • 两个值:
    • 其中一个必须是长度(px),或百分比(%),或left, center, right关键字中的一个。
    • 另一个必须是长度(px),或百分比(%),或top, center, bottom关键字中的一个。
  • 三个值:
    • 前两个值和只有两个值时的用法相同。
    • 第三个值必须是长度(px)。它始终代表Z轴偏移量。

比如:

/* 这俩等价,从左上角的原点出发,转换原点的x坐标在50%处,y坐标在0%处 */
transform-origin:50% 0;
transform-origin:center top;

/* 这俩等价,从左上角的原点出发,转换原点的x坐标在100%处,y坐标在50%处 */
transform-origin:100% 50%;
transform-origin:right center;

现在再来看看我们之前对h1的伪元素做了什么:

h1::before {  
    transform: scaleX(0); 
    transform-origin: bottom right;
}

首先通过transform: scaleX(0);让它不显示出来,在通过transform-origin: bottom right;设置之后动画的转换原点位于右下角。

当我们将鼠标移动至h1元素上方时:

h1:hover::before {
    transform: scaleX(1);
    transform-origin: bottom left;
}

让伪元素展示出来,从0倍变为1倍,然后设置动画的转换原点位于左下角。

为什么要改变转换原点呢?

对成品代码做一个修改,如果代码长这样:

h1::before {  
    transform: scaleX(0); 
    transform-origin: bottom right;
}
h1:hover::before {
    transform: scaleX(1);
}

你会发现最终所有的变化效果都是相对于右下角来进行的:

ezgif-2-a6860efdd3

所以设置转换原点的变换,可以让我们的变化更加的灵活。

最后为h1的伪元素身上绑定一个transition属性实现最终的转换动画效果:

h1::before {
    content: " ";
    display: block;
    position: absolute;
    inset: 0 0 0 0;
    background: hsl(200 100% 80%);
    z-index: -1;
    transition: transform .3s ease;
}

transition

通常,当一个元素的样式属性值发生变化时,我们会立即看到页面元素发生变化,也就是页面元素从旧的属性值立即变成新的属性值的效果。css属性transition能让页面元素慢慢的从一种状态变成另外一种状态,从而表现出一种动画过程。

看看MDN上是如何介绍的:

transition CSS 属性是 transition-propertytransition-durationtransition-timing-functiontransition-delay 的一个简写属性

过渡可以为一个元素在不同状态之间切换的时候定义不同的过渡效果。比如在不同的伪元素之间切换,像是 :hover:active 或者通过 JavaScript 实现的状态变化。

现在来看看我们做了什么:

transition: transform .3s ease;
  1. h1transition-property:transform元素设置transition效果
  2. 动画的持续时间transition-duration时长为0.3s
  3. 动画的变换效果transition-timing-function为平滑变换
  4. 这里没有设置延迟时间

至于为什么是给transform元素设置动画效果,是因为在前面的代码分析中,鼠标悬浮在h1元素上时,具体变换的就是transform属性,transition仅仅是让这个变化变得缓慢罢了。

搞定,看看最终的效果吧:

ezgif-3-06a065eb00

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>黑猫几绛 |</title>
  <style>
    h1::before {  
      transform: scaleX(0);
      transform-origin: bottom right;
    }

    h1:hover::before {
      transform: scaleX(1);
      transform-origin: bottom left;
    }

    h1::before {
      content: " ";
      display: block;
      position: absolute;
      inset: 0 0 0 0;
      background: hsl(200 100% 80%);
      z-index: -1;
      transition: transform .3s ease;
    }

    h1 {
      position: relative;
      font-size: 5rem;
      cursor: pointer;
    }

    html {
      block-size: 100%;
      inline-size: 100%;
    }

    body {
      min-block-size: 100%;
      min-inline-size: 100%;
      margin: 0;
      box-sizing: border-box;
      display: grid;
      place-content: center;
      font-family: system-ui, sans-serif;
    }

    @media (orientation: landscape) {
      body {
        grid-auto-flow: column;
      }
    }
  </style>
</head>
<body>
  <h1>Hover Me</h1>
</body>
</html>

思考

在这一期中我们接触到了transform-origin属性,可以改变元素的动画基准旋转位置,那么我们来试试利用这个属性实现旋转加载的效果吧。

提示:我们可以为每个转动的小球设置一个动画的延迟效果,来避免元素的重叠。

最终成品如下:

ezgif-5-c1caa2cf40

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从特效入手,深入了解CSS(二):鼠标 hover 特效 的相关文章

随机推荐

  • Python解决OpenCV系列库安装报错问题

    1 pip install dlib 这个库的安装很大概率出现问题 可以去参考 Python dlib 无需编译安装 dlib 19 23 0 cp39 cp39 win amd64 whl 这里放一个百度网盘的链接 要求Python3 9
  • C#中Linq用法汇集

    C 中Linq常用用法 LINQ查询语法 有两种基本的方法来编写一个LINQ查询IEnumerable集合或IQueryable数据源 1 查询语法或查询表达式语法 2 方法语法或方法扩展语法或Fluent LINQ查询语法 查询语法与数据
  • linux各目录详细介绍

    bin 二进制可执行命令 dev 设备特殊文件 etc 系统管理和配置文件 etc rc d 启动的配置文件和脚本 home 用户主目录的基点 比如用户user的主目录就是 home user 可以用 user表示 lib 标准程序设计库
  • stm32定时器外部计数模式 最大频率计算。

    本 外部时钟模式下 外部信号通过内部时钟 CK INT 采样得到 外部信号周期的计算方法是 2xTINT 20ns 这里的TINT是CK INT的周期时间 例如 内部时钟频率为72MHz 则TINT 13 89ns 这时外部信号的最高频率是
  • flask 第七章 简陋版智能玩具 +MongoDB初识和基本操作

    1 简陋版web智能玩具 FAQ py文件 import os from aip import AipSpeech AipNlp from uuid import uuid4 你的 APPID AK SK APP ID 16027160 A
  • Git命令查看以及修改用户名和密码

    一 查看 查看用户名 git config user name 查看密码 git config user password 查看邮箱 git config user email 查看配置信息 git config list 二 修改 修改用
  • ios删除分割线_iOS开发中隐藏导航栏的分割线

    iOS开发中经常会遇到需要隐藏导航栏的分割线的需求 之前已经有两种方法 方法一 直接设置navigationBar的ShadowImage和BackgroundImag 这样做可以一劳永逸 在当前导航控制器的所有子控制器页面看到的导航栏都是
  • js判断时间大小以及计算时间差

    有些时候我们需要使用JS判断一下不同格式的时间的大小该怎判断呢 例如 2019 06 26 14 00 00 这个格式的时间 如何判断是否大于现在的时间 function compareTimeNow time var strArray t
  • osgEarth的Rex引擎原理分析(十五)分页瓦片加载器在更新遍历时对请求处理过程

    目标 十四 中的34 osgEarthDrivers engine rex Loader cpp void PagerLoader traverse osg NodeVisitor nv for count 0 count lt merge
  • Java-基于SSM的智能仓储管理系统

    项目背景 随着科学技术的飞速发展 社会的方方面面 各行各业都在努力与现代的先进技术接轨 通过科技手段来提高自身的优势 智能仓储系统当然也不能排除在外 智能仓储系统是以实际运用为开发背景 运用软件工程开发方法 采用jsp技术构建的一个管理系统
  • React 项目中添加 react-redux 状态管理

    redux作为一个单独的库 他可以搭配 Angular vue react以及jQuery使用 今天我们再项目中搭配react redux来使用 Redux的核心概念其实很简单 将需要修改的state都存入到store里 发起一个actio
  • java中设计思想及设计原则及设计模式解析

    前言 在java开发过程中 或者各种语言在编程过程中 对基础知识的累计 这其中就会包含java的设计思想及设计原则及设计模式 我们想对当前的架构以及某些功能逻辑进行优化 及繁简 更加适合当前业务的开发 如何让人一看就能懂得代码 以及各种热门
  • 10071 - Back to High School Physics

    Back to High School Physics Time limit 3 000 seconds A partical 电 质点 has inital velocity and accerleration 初速度与加速度 If it
  • SQL6 查找学校是北大的学生信息

    描述 题目 现在运营想要筛选出所有北京大学的学生进行用户调研 请你从用户信息表中取出满足条件的数据 结果返回设备id和学校 示例 user profile id device id gender age university provinc
  • Linux--消息队列

    目录 一 线程和进程的概念 1 线程 2 进程 3 ipcs 二 消息队列代码 写消息 man msgget返回值问题 添加消息队列 man msgsnd 运行代码 运行结果图 进程和消息的状态 三 消息队列代码 读消息 b c读取消息 执
  • 微信公众号html教程,公众号排版简易教程

    微信公众号文章排版流程 1 将文章转换成Markdown格式 2 使用Typora渲染Markdown格式 3 使用印象笔记 生成图表 流程图 时序图等 并转换成图片 4 将Markdown格式转换为Html格式 5 将Html格式内容复制
  • 企业微信开始代开发应用 配置代开发应用回调URL

    用到的php版本是7 4 开发时间 2022 11 2 在做公司的项目时因为企业微信的更新 同一个服务器ip不能在多个企业项目中出现否则就会被判定为第三方服务商 所以新建应用时只能新建代开发应用 在配置回调的时候走了很多坑 在这里梳理一下
  • Dialog DA14585——基本硬件资源配置

    GPIO DA14585共有3中类型的封装 WLCSP34pin QFN40pin QFN48pin 除去专用的RST GND XTAL ANT VBAT脚后 分别有14 25 32个IO口可用 目前最常用的封装类型是QFN40 处理单元
  • ssh key创建本地和git的安全连接 && ssh key的创建与github/gitlab中ssh key的添加

    如未创建ssh key会报该问题 The authenticity of host can t be established Permission denied publickey ssh key的作用 创建本地和gitlab的安全连接 S
  • 从特效入手,深入了解CSS(二):鼠标 hover 特效

    不建议跳跃阅读 这篇文章将从头开始介绍如何实现一个特效 中间偶尔会穿插一些css3或平时接触不多的css属性 首先看一看这一期的特效 HTML部分 h1 Hover Me h1 CSS 部分 首先通过grid布局的place content