登录页面一些有趣的css效果

前言

今天无意看到一个登录页,inputfocusplaceholder上移变成label的效果,无聊没事干就想着自己来实现一下,登录页面能做文章的,普遍的就是按钮动画,title的动画,以及input的动画,这是最终的效果图(如下), 同时附上预览页以及实现源码

title 的动画实现

首先描述一下大概的实现效果, 我们需要一个镂空的一段白底文字,在鼠标移入时给一个逐步点亮的效果。 文字镂空我们可以使用text-stroke, 逐步点亮只需要使用filter即可

text-stroke

text-stroke属性用于在文本的边缘周围添加描边效果,即文本字符的外部轮廓。这可以用于创建具有描边的文本效果。text-stroke属性通常与-webkit-text-stroke前缀一起使用,因为它目前主要在WebKit浏览器(如Chrome和Safari)中支持

text-stroke属性有两个主要值:

  1. 宽度(width) :指定描边的宽度,可以是像素值、百分比值或其他长度单位。
  2. 颜色(color) :指定描边的颜色,可以使用颜色名称、十六进制值、RGB值等。

filter

filter是CSS属性,用于将图像或元素的视觉效果进行处理,例如模糊、对比度调整、饱和度调整等。它可以应用于元素的背景图像、文本或任何具有视觉内容的元素。

filter属性的值是一个或多个滤镜函数,这些函数以空格分隔。以下是一些常见的滤镜函数和示例:

  1. 模糊(blur) : 通过blur函数可以实现模糊效果。模糊的值可以是像素值或其他长度单位。

    css 复制代码
    .blurred-image {
      filter: blur(5px);
    }
  2. 对比度(contrast) : 通过contrast函数可以调整对比度。值为百分比,1表示原始对比度。

    css 复制代码
    .high-contrast-text {
      filter: contrast(150%);
    }
  3. 饱和度(saturate) : 通过saturate函数可以调整饱和度。值为百分比,1表示原始饱和度。

    css 复制代码
    .desaturated-image {
      filter: saturate(50%);
    }
  4. 反色(invert) : 通过invert函数可以实现反色效果。值为百分比,1表示完全反色。

    css 复制代码
    .inverted-text {
      filter: invert(100%);
    }
  5. 灰度(grayscale) : 通过grayscale函数可以将图像或元素转换为灰度图像。值为百分比,1表示完全灰度。

    css 复制代码
    .gray-text {
      filter: grayscale(70%);
    }
  6. 透明度(opacity) : 通过opacity函数可以调整元素的透明度。值为0到1之间的数字,0表示完全透明,1表示完全不透明。

    css 复制代码
    .semi-transparent-box {
      filter: opacity(0.7);
    }
  7. 阴影(drop-shadow) :用于在图像、文本或其他元素周围添加阴影效果。这个属性在 CSS3 中引入,通常用于创建阴影效果,使元素看起来浮在页面上或增加深度感

    xml 复制代码
    drop-shadow(<offset-x> <offset-y> <blur-radius>? <spread-radius>? <color>?)

    各个值的含义如下:

    • <offset-x>: 阴影在 X 轴上的偏移距离。
    • <offset-y>: 阴影在 Y 轴上的偏移距离。
    • <blur-radius> (可选): 阴影的模糊半径。默认值为 0。
    • <spread-radius> (可选): 阴影的扩散半径。默认值为 0。
    • <color> (可选): 阴影的颜色。默认值为当前文本颜色。

filter属性的支持程度因浏览器而异,因此在使用时应谨慎考虑浏览器兼容性。

实现移入标题点亮的效果

想实现移入标题点亮的效果我们首先需要两个通过定位重叠的span元素,一个做镂空用于展示,另一个作为 hover时覆盖掉镂空元素,并通过filter: drop-shadow实现光影效果,需要注意的是这里需要使用inline元素实现效果。

input 的动画实现

input的效果比较简单,只需要在focusspan(placeholder)上移变成span(label)同时给inputborder-bottom做一个底色的延伸,效果确定了接着就看看实现思路。

input placeholder 作为 label

使用div作为容器包裹inputspanspan首先绝对定位到框内,伪装为placeholder, 当input状态为focus提高spantop值,即可伪装成label, 这里有两个问题是:

  1. 当用户输入了值的时候,span并不需要恢复为之前的top , 这里我们使用css或者js 去判断都可以, js就是拿到输入框的值,这里不多做赘述,css 有个比较巧妙的做法, 给input required属性值设置为required, 这样可以使用css:valid伪类去判断input是否有值。

  2. 由于span层级高于input,当点击span时无法触发input的聚焦 ,这个问题我们可以使用pointer-events: none; 来解决。pointer-events 是一个CSS属性,用于控制元素是否响应用户的指针事件(例如鼠标点击、悬停、触摸等)。这个属性对于控制元素的可交互性和可点击性非常有用。

    pointer-events 具有以下几个可能的值:

    1. auto(默认值):元素会按照其正常行为响应用户指针事件。这是默认行为。
    2. none:元素不会响应用户的指针事件,就好像它不存在一样。用户无法与它交互。
    3. visiblePainted:元素在绘制区域上响应指针事件,但不在其透明区域上响应。这使得元素的透明部分不会响应事件,而其他部分会。
    4. visibleFill:元素在其填充区域上响应指针事件,但不在边框区域上响应。
    5. visibleStroke:元素在其边框区域上响应指针事件,但不在填充区域上响应。
    6. painted:元素会在其绘制区域上响应指针事件,包括填充、边框和透明区域。
    7. fill:元素在其填充区域上响应指针事件,但不在边框区域上响应。
    8. stroke:元素在其边框区域上响应指针事件,但不在填充区域上响应。

pointer-events 属性非常有用,特别是在创建交互性复杂的用户界面时,可以通过它来控制元素的响应区域。例如,你可以使用它来创建自定义的点击区域,而不仅仅是元素的边界。它还可以与其他CSS属性和JavaScript事件处理程序结合使用,以创建特定的交互效果。

input border bottom 延伸展开效果

效果比较简单,input被聚焦的时候,一个紫色的边从中间延伸覆盖白色的底边即可。 在使用一个span作为底部的边, 初始不可见, focus时从中间向两边延伸直至充满, 唯一头痛的就是怎么从中间向两边延伸,这里可以使用transform变形,首先使用transform: scaleX(0);达到不可见的效果, 然后设置变形原点为中间transform-origin: center;,这样效果就可以实现了

input 的动画实现效果

按钮的动画实现

关于按钮的动画很多,我们这里就实现一个移入的散花效果,移入时发散出一些星星,这里需要使用到动画去实现了,首先通过伪类创建一些周边元素,这里需要用到 background-image(radial-gradient)

background-image(radial-gradient)

background-image 属性用于设置元素的背景图像,而 radial-gradient 是一种 CSS 渐变类型,可用于创建径向渐变背景。这种径向渐变背景通常以一个中心点为基础,然后颜色渐变向外扩展,形成一种放射状的效果。

radial-gradient 的语法如下:

arduino 复制代码
background-image: radial-gradient([shape] [size] at [position], color-stop1, color-stop2, ...);
  • [shape]: 可选,指定渐变的形状。常用的值包括 "ellipse"(椭圆)和 "circle"(圆形)。
  • [size]: 可选,指定渐变的大小。可以是长度值或百分比值。
  • at [position]: 可选,指定渐变的中心点位置。
  • color-stopX: 渐变的颜色停止点,可以是颜色值、百分比值或长度值。

按钮移入动画效果实现

结尾

css 能实现的效果越来越多了,遇到有趣的效果,可以自己想想实现方式以及动手实现一下,思路毕竟是思路,具体实现起来说不定会遇到什么坑,逐步解决问题带来的成就感满足感还是很强的。

相关推荐
空中海1 小时前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js
前端之虎陈随易3 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
好运的阿财4 小时前
OpenClaw工具拆解之host_workspace_write+host_workspace_edit
前端·javascript·人工智能·机器学习·ai编程·openclaw·openclaw工具
XiYang-DING4 小时前
JavaScript
开发语言·javascript·ecmascript
空中海5 小时前
02 React Native状态、导航、数据流与设备能力
javascript·react native·react.js
空中海6 小时前
02 状态、Hooks、副作用与数据流
开发语言·javascript·ecmascript
空中海6 小时前
04 React Native工程化、质量、发布与生态选型
javascript·react native·react.js
杨超凡7 小时前
豆包收费了?我特么自己用“意念”搓了一个!
javascript
龙猫里的小梅啊7 小时前
CSS(七)CSS列表控制
前端·css