从特效入手,深入了解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 特效 的相关文章

  • 无法正确显示行

    我应该在这个问题的开头说我完全没有 html css javascript 背景 所以请对我宽容点 如果我使用了错误的术语或者问了一个愚蠢的问题 没有提供足够的信息 请抱歉 我正在尝试让一个可扩展的表工作 通过阅读论坛线程 教程 将 nex
  • 单击导航项锚链接时如何关闭切换菜单

    请看我的FIDDLE http jsfiddle net ayhpp8ax 我有一个带有 响应式 导航菜单 带有指向页面上元素的锚链接 的 1 页网站 当浏览器视口小于特定宽度 在我的情况下为 767px 时 使用此 javascript
  • html 电子邮件内的背景图像 css - Gmail 不支持

    我想向我的用户发送如下所示的带有背景图像 css 的 html 正文电子邮件 div style width 500px height 1000px background color black background image none
  • 如何在Yii框架中向Form添加类?

    我在 Yii 中有一个表单 我想向该表单添加一个类
  • javascript 选择自定义光标 (svg)

    我正在动态地将光标更改为悬停时的本地 svg element on mouseover function this css cursor url svgs pointer svg 9 30 auto 工作正常 但我想选择该 svg 来操纵其
  • 合并 2 个大型 CSS 文件的有效方法

    我正在寻找一个可以合并 2 个大型 CSS 文件的工具 到目前为止我尝试过的所有方法 例如CSSMerge 都没有成功 其中一些只是随机删除属性 其他人则因 webkit 和 moz 等非标准属性而窒息 并给我错误 我还需要保留每条规则大小
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • Webpack 4:如何使用 LESS 获取 CSS 源映射?

    多年来我一直在尝试让 CSS 源映射在 webpack 中工作 但没有成功 我不确定链条中哪里出了问题 我希望有人能指出我正确的方向 这是发生的事情 行号是错误的 实际上文件名也是错误的 main less只是包含一堆 import也就是说
  • SVG 动画不适用于 Chrome 中的 favicon

    In the SVG 图标已设置 这是旋转内圆的SVG文件的内容 Favicon 动画在 Chrome 中根本不起作用 如何让它在 Chrome 中工作 在 Firefox 中可以正常工作 在 Edge 中则不行 但 Chrome 是最重要
  • 如何为 HTML 元素创建鼠标拖动滑块?

    我发现的许多滑块插件要么仅单击以查看下一个图像 要么如果它们确实具有鼠标拖动或触摸拖动功能 则仅允许图像 有谁知道为任何 html 元素编写鼠标拖动滑块的插件或可能的方法 我专门使用 SVG 但将来如果能在 div 元素之间滑动就更好了 H
  • 如何在有序列表中组合数字和字母?

    如何在 CSS 中用数字和字母递增有序列表 ol nested margin bottom 0 counter reset item ol nested li display block position relative ol neste
  • 自定义rc-time-picker的样式

    我在用rc time picker我的项目的包 但我在自定义样式时遇到问题pop up of my time picker成分 这是我的组件的屏幕截图 首先 我需要更改时间的背景颜色item在当时li from light grey 在屏幕
  • 如何隐藏div元素中太长的文本?

    如何隐藏 div 中的溢出 如果文本比 div 长 则文本将换行到新行 div style width 50px border 1px solid black test test test test div 也许是 CSS 属性text o
  • 在表格上使用上下文样式将点边框应用于特定单元格

    我以前有过问了一个问题 https stackoverflow com questions 6326266 issue with applying dotted border to cells in table design在这个问题上 你
  • 悬停此元素时隐藏元素后的伪元素

    我的菜单垂直放置在页面左侧和菜单之间 li 我有一个 after那是一个分隔符 我想要的是当我悬停元素本身 如果它是第一个元素 时隐藏 after 元素 或者当它是中间元素时隐藏上面和底部的元素 如果它是最后一个子元素 则隐藏 after前
  • 删除子元素上的 CSS 过滤器

    我的 CSS 代码有问题 正如您所看到的 我在 li 元素上有过滤器 但它覆盖了其他元素 我需要使其他两个元素没有过滤器 有没有可能这样做 main width 300px height 300px background color blu
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • HTML 锚点,禁用样式

    我有一些 html 锚链接代码 与文档的其余部分不同 我希望它看起来不是链接 有没有一种简单的方法可以禁用由于将文本包装在锚标记中而引起的样式更改 而不必强行使其相同 即 如果我更改正文字体样式 我不必也更改其他一些 link东西 将颜色设
  • 在 Nexus 7 2013 上更改方向时 CSS 媒体查询不起作用

    我目前正在我的笔记本电脑 台式电脑和 Nexus 7 2013 上测试 CSS 媒体查询 除了 Nexus 7 之外 它们在台式机和笔记本电脑上都运行良好 当我更改方向时 除非刷新页面 否则样式不会应用 例如 以纵向模式握住设备时 页面正常

随机推荐

  • 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