一个元素纯CSS实现开关按钮【介绍box-shadow、单边或多重阴影、appearance属性】

news2024/11/25 22:43:52

借助checkbox表单元素、:checked伪类、::before/::after伪元素,就可以只需一个input[type="checkbox"]元素,通过纯CSS实现Switch开关效果的按钮。

主要用到的属性:

  • appearance 默认css元素样式
  • box-shadow 阴影效果
  • transition css动画过渡属性

实现过程

  • 添加一个input元素
<input class="switch-button" type="checkbox"> 
  • 基本样式
*{margin: 0;padding: 0;box-sizing: border-box;
}
body{background-color: #e3a380;display: flex;justify-content: center;align-items: center;height: 100vh;
} 
  • appearance设置浏览器默认的input[type="checkbox"]元素样式为none,即无样式。

设置outline: none;,有的浏览器在设置无样式后,仍会有外线框效果(和border不太一样),需要去除。

box-shadow给一个很淡的内层阴影。

.switch-button{position: relative;width: 80px;height: 40px;border-radius: 20px;appearance: none;background-color: #c6c6c6;outline: none;box-shadow: inset 0 0 5px rgba(0, 0, 0, .2);transition: .5s;
} 

可以看一下添加内层阴影后的不同。

  • :checked伪类设置input[type="checkbox"]选中后背景颜色修改为蓝色。
.switch-button:checked{background-color: #03a9f4;
} 
  • 添加一个before伪类,绝对定位,样式为白色的圆点。添加外侧底部阴影。
.switch-button::before{content: '';position: absolute;width: 40px;height: 40px;border-radius: 50%;top: 0;left: 0;background-color: #fff;box-shadow: 0 2px 5px rgba(0, 0, 0,/3);transition: .5s;
} 
  • transform: scale(1.1);transform: scale(.9); 放大或缩小圆点按钮
  • :checked选中时移动圆点按钮的位置
.switch-button:checked:before{left: 40px;
} 

选中时。

  • 看一下.switch-button不设置背景的效果,将使用父元素的背景颜色。
.switch-button{background-color: unset;
} 

或者不指定background-color属性。

appearance属性

appearance表示浏览器的默认样式,其具体样式依据的是操作系统。

The appearance CSS property is used to control native appearance of UI controls, that are based on operating system’s theme.

appearance 属性允许设置元素显示为浏览器提供的标准界面。

比如:

appearance: normal|icon|window|button|menu|field; 

● normal:正常呈现元素

● icon:作为一个小图片来呈现元素。

● window:作为一个视口来呈现元素。

● button:作为一个按钮来呈现元素。

● menu:作为一个用户选项设定来呈现元素选择。

● field:作为一个输入字段来呈现元素。

appearance可参考的设置值如下,更多或详细介绍参见 MDN appearance

/* CSS Basic User Interface Module Level 4 values */
appearance: none;
appearance: auto;
appearance: menulist-button;
appearance: textfield;

/* "Compat-auto" values, which have the same effect as 'auto' */
appearance: button;
appearance: searchfield;
appearance: textarea;
appearance: push-button;
appearance: slider-horizontal;
appearance: checkbox;
appearance: radio;
appearance: square-button;
appearance: menulist;
appearance: listbox;
appearance: meter;
appearance: progress-bar;

/* Partial list of available values in Gecko */
-moz-appearance: scrollbarbutton-up;
-moz-appearance: button-bevel;

/* Partial list of available values in WebKit/Blink (as well as Gecko and Edge) */
-webkit-appearance: media-mute-button;
-webkit-appearance: caret;

/* Global values */
appearance: inherit;
appearance: initial;
appearance: revert;
appearance: revert-layer;
appearance: unset; 

box-shadow 阴影效果

box-shadow

box-shadow用于设置元素的阴影效果,如果要设置多个阴影效果,需要用逗号,分开。

box-shadow: <offset-x> <offset-y> <blur-radius> <spread-radius> <color>; 

box-shadow属性值的含义依次为:阴影的 X 轴偏移量、Y 轴偏移量、模糊半径、扩散半径(扩展半径)和颜色。以及一个可选的inset值(一般放最前面),表示内层阴影。

  • inset

默认阴影是外层的。指定inset表示内层阴影,即阴影落在元素盒模型的内部,效果通常就是内容被压低了【阴影位于边框内,背景之上,内容之下】。

  • <offset-x> <offset-y>

前两个长度值表示x、y轴的偏移量(垂直向下为y正方向)。

<offset-x>水平方向,正值表示阴影位于元素右边,负值表示阴影位于元素左边;<offset-y>垂直方向,正值表示阴影位于元素下方,负值表示阴影位于元素上方。

通常两者设置为0,通过 <blur-radius><spread-radius> 指定阴影平均地向四周显示。

  • <blur-radius>

第三个长度值,表示模糊半径,值越大,阴影越远处逐渐模糊变淡。默认值为0,没有模糊效果,阴影边缘锐利。通常不会使用默认值。

  • <spread-radius>

第四个长度值,表示阴影的范围或扩散范围。默认0,阴影与元素大小相同。赋值将会向内扩展。

  • <color> 阴影颜色

阴影效果

div {width: 150px;height: 150px;background-color: #fff;box-shadow: 120px 80px 40px 20px #0ff;/* 顺序为: offset-x, offset-y, blur-radius, spread-radius, color */
} 

多重box-shadow叠加

通过对元素添加多个阴影,查看其叠加效果,已经对应的x、y方向。

<div class="shadows"></div> 
.shadows{width: 130px;height: 50px;background-color: darkcyan;box-shadow: 5px 5px #6fff00,10px 10px #ff0000,15px 15px #000000;
} 

其效果如下,在x、y正方向上扩展出的阴影,多个阴影叠加。

多个阴影,写在前面的权重大,阴影重合部分权重大的值在上面。

background-color:#fff;
box-shadow: blue 0px 0px 0px 2px inset, rgba(255, 255, 255) 10px -10px 0px -3px, rgb(31, 193, 27) 10px -10px,rgb(255, 255, 255) 20px -20px 0px -3px, rgb(255, 217, 19) 20px -20px, rgb(255, 255, 255) 30px -30px 0px -3px, rgb(255, 156, 85) 30px -30px, rgb(255, 255, 255) 40px -40px 0px -3px,rgb(255, 85, 85) 40px -40px; 
box-shadow: rgb(85, 91, 255) 0px 0px 0px 3px, rgb(31, 193, 27) 0px 0px 0px 6px, rgb(255, 217,19) 0px 0px 0px 9px, rgb(255, 156, 85) 0px 0px 0px 12px, rgb(255, 85, 85) 0px 0px 0px 15px; 

设置实现单边阴影

要想实现真正的单边阴影(防止其他边出现阴影),则<blur-radius> <spread-radius>模糊半径和扩展半径都应该为0,两个如果为正值,则会影响其他边也有阴影效果。

单边阴影效果:

.shadows-side{width: 120px;height: 120px;box-shadow: 5px 0px 0px 0px #87f;
} 

不模糊和不扩展的情况下,四个单边的阴影互不影响

box-shadow: 10px 0px 0px 0px #87f,0px -10px 0px 0px rgb(52, 163, 18),-10px 0px 0px 0px rgb(233, 98, 15),0px 10px 0px 0px rgb(9, 186, 133); 

如果要想使用模糊的单边,则会影响其他边也有阴影。一个相对较好的解决办法是指定扩展半径为适当的负值(即向内扩展)。

box-shadow: 15px 0px 10px -5px #87f,0px -15px 10px -5px rgb(52, 163, 18),-15px 0px 10px -5px rgb(233, 98, 15),0px 15px 10px -5px rgb(9, 186, 133); 

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ICG maleimide, ICG-MAL,2143933-81-5,ICG和PEG链接可在体内长循环.

英文名&#xff1a;ICG maleimide ICG-MAL CAS&#xff1a;2143933-81-5 分子式: C51H56N4O6S 分子量: 853.09 外 观&#xff1a;绿色粉末 溶解度&#xff1a;二氯甲烷 纯 度&#xff1a;95% 结构式&#xff1a; ICG is a tricarbocyanine-type dye with NIR-absorb…

Jenkins自动化测试Robot Framework详解

目录 1. Robot Framework 概念 2. Robot Framework 安装 3. Pycharm Robot Framework 环境搭建 4. Robot Framework 介绍 5. Jenkins 自动化测试 总结 重点&#xff1a;配套学习资料和视频教学 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;…

MySQL——怎么给字符串字段加索引

现在&#xff0c;几乎所有的系统都支持邮箱登录&#xff0c;如何在邮箱这样的字段上建立合理的索引&#xff0c;是本篇文章要讨论的问题。 假设&#xff0c;现在维护一个支持邮箱登录的系统&#xff0c;用户表是这么定义的&#xff1a; mysql> create table SUser( ID big…

Hive 分析银行转账风险

文章目录创建数据源基于转账记录&#xff0c;计算 7 天内各个账号的转账金额找出相同收付款人 5 天内连续转账3次或以上的记录创建数据源 数据来源&#xff1a;数据源 drop table transfer_log;CREATE TABLE transfer_log ( log_id bigint, -- idlog_ts timestamp, -- 操作时…

128-152-spark-核心编程-源码

128-spark-核心编程-源码&#xff08;主要以了解基本原理和流程为主&#xff09;&#xff1a; 总体相关 ​ 1.环境准备(Yarn 集群) ​ (1) Driver, Executor ​ 2.组件通信 ​ (1) Driver > Executor ​ (2) Executor > Driver ​ (3) Executor > Executor ​ 3.应用…

Unity异步加载AB包

Unity异步加载AB包写在前面效果关键讲解项目地址写在后面写在前面 最近项目需要在Unity中完成一个非常耗时的工作&#xff0c;所以学习了下异步加载的流程&#xff0c;这里做了一个demo&#xff0c;异步加载AB包&#xff0c;其实异步加载场景等&#xff0c;原理差不多。 效果…

Tomcat的Maven插件使用方法(在idea里面运行Tomcat)

目录 一、概述 二、下载和导入插件 三、测试使用方式 四、总结 一、概述 使用这个插件可以快速的运行Tomcat&#xff0c;比在本地配置快得多。 二、下载和导入插件 1.下载插件Maven Helper ps&#xff1a;已经有下载过这个插件的可以跳过此步骤 &#xff08;1&#xff…

一、导论——可解释性机器学习(DataWhale组队学习)

目录导言一、什么是可解释人工智能?二、学可解释机器学习有什么用?2.1学习可解释机器学习的原因2.2 Machine Teaching :人工智能教人类学习2.3 细粒度图像分类2.4前沿AI三、本身可解释性好的机器学习模型四、传统机器学习算法的可解释性分析五、卷积神经网络的可解释性分析5.…

前端基础(二)_HTML常用标签(块级标签、行级标签、行块级标签)

HTML常用标签 我们可以分为三类&#xff1a; 1.块级标签 2.行级标签 3.行块级标签 一、块级标签 1.1 h系类标签 标题标签 H1~h6 大到小 H1 在同一个页面中只能使用一次 其他标签可以重复 特点&#xff1a;默认宽度100% 高度自适应 独立成行 自带间距加粗 <body><…

java计算机毕业设计ssm制造型企业仓储管理系统i0180(附源码、数据库)

java计算机毕业设计ssm制造型企业仓储管理系统i0180&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

[附源码]计算机毕业设计的项目管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

基于小波变换的图像压缩解压缩的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 图像压缩的类别 对于图像压缩&#xff0c;主要有两类方法&#xff1a;无损的图像压缩以及有损的图像压缩&#xff0c;分别称为lossless image compression and lossy image compression。 对于无…

[附源码]Node.js计算机毕业设计动漫网站Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

第37篇 网络(七)TCP(一)

导语 TCP即TransmissionControl Protocol&#xff0c;传输控制协议。与UDP不同&#xff0c;它是面向连接和数据流的可靠传输协议。也就是说&#xff0c;它能使一台计算机上的数据无差错的发往网络上的其他计算机&#xff0c;所以当要传输大量数据时&#xff0c;我们选用TCP协议…

ssm+Vue计算机毕业设计校园生活服务预约管理系统(程序+LW文档)

ssmVue计算机毕业设计校园生活服务预约管理系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;…

spring切入点表达式(一)

前面写到切入点表达式&#xff0c;如果把全部方法都作为切入点的话&#xff0c;用execution(* *(..))表达式&#xff0c;这个表达式代表什么意思呢&#xff1f; public void login (String name,String address){} * * ( . . ) * *(..)对应方法如上图 * -------->代表修…

【GRU回归预测】基于鲸鱼算法优化门控循环单元WOA-GRU神经网络实现多输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

网络协议—应用层的HTTPS协议

用 HTTP 协议&#xff0c;看个新闻还没有问题&#xff0c;但是换到更加严肃的场景中&#xff0c;就存在很多的安全风险。例如&#xff0c;你要下单做一次支付&#xff0c;如果还是使用普通的 HTTP 协议&#xff0c;那你很可能会被黑客盯上。例如在点外卖的环境中&#xff0c;发…

面试题 —— 真实面试题分享

文章目录 一、对BFC的理解。二、CSS中”::“和”:”的区别&#xff1f;三、对vue生命周期的理解&#xff1f; 四、vue组件通信的方式 五、vue中给data中的对象添加一个新的属性会发生什么&#xff0c;如何解决? 六.微信小程序组件的生命周期 七、javascript原型与继承的理解…

【vue基础】关于组件之间的通信

目录 &#xff08;1&#xff09;父组件向子组件传递信息 1.props&#xff1a; 2.第二种是直接从子组件里面利用&#xffe5;parent和root引用&#xff0c;获取根组件和父组件中的数据 &#xff08;2&#xff09;子组件数据传入父组件 1.通过自定义事件 2.通过$refs引用集合…