纯CSS实现酷炫的滑动开关按钮【介绍CSS变量】

简介: 纯CSS通过自定义样式,借助:checked伪类实现switch开关效果的按钮。 为了便于修改和调节,使用了css变量控制按钮的大小。并添加属性变化的动画效果...

纯CSS通过自定义样式,借助checkbox表单元素的:checked伪类实现switch开关效果的按钮。

为了便于修改和调节,使用了css变量--width--height控制按钮的大小。

主要用到的css技术:

  • css自定义变量,变量的获取和计算;
  • flex布局;
  • position水平垂直居中;
  • border-radius圆角;
  • box-shadow内外阴影效果;
  • transitionCSS动画中的过渡属性;
  • transformCSS动画形变的缩放;
  • ::before伪元素和:checked伪类;

html元素结构

<label class="swith-indicate-label" style="--width:80;--height:40">
    <input type="checkbox">
    <span></span>
    <i class="indicator"></i>
</label>

CSS实现

body内的元素水平垂直居中,flex-directioncolumn垂直方向。

body{
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    flex-direction: column;
    background-color: #36d0f3;
}

设置label鼠标cursor为小手,position: relative控制其内.indicator按钮开关的相对位置。隐藏其内默认的input。

.swith-indicate-label{
    margin: 5px 0;
    position: relative;
    cursor: pointer;
}
.swith-indicate-label input{
    /* appearance: none; */
    display: none;
}

span作为按钮的整体轮廓,其大小和设置的--width--height相同;box-shadow设置很小的内层阴影;也可以根据需要改为其他背景和阴影颜色。

.swith-indicate-label span{
    position: relative;
    display: block;
    width: calc(var(--width)*1px);
    height: calc(var(--height)*1px);
    border-radius: calc(var(--height)*1px);
    background: #222;
    box-shadow: inset 0 2px 15px rgba(0, 0, 0, .2),
                inset 0 2px 2px rgba(0, 0, 0, .2),
                inset 0 -2px 2px rgba(0, 0, 0, .2);
}

设置按钮开关.indicator,相对轮廓label的绝对位置,按钮为圆形;背景色简单的渐变;设置属性变化的过渡transition时间为0.5s;适当缩放将按钮放在轮廓内。

.swith-indicate-label .indicator{
    position: absolute;
    left: 0;
    top: 0;
    width: calc(var(--height)*1px); 
    height: calc(var(--height)*1px);
    border-radius: 50%;
    background: linear-gradient(to bottom, #555,#222);
    box-shadow: 0 2px 5px rgba(0, 0, 0, .6),
                inset 0 1px 2px rgba(255, 255, 255, .1);
    transition: .5s;
    transform: scale(.9);
}

也可以修改为其他背景色

background: rgba(255, 255, 255, .5);

添加点击checked选中/切换开关的效果,left移动按钮到轮廓label的最右边:

.swith-indicate-label input:checked ~ .indicator{
    left: calc((var(--width) - var(--height))*1px);
}

点击后左右切换开关

添加按钮中间的开关指示灯效果:居中的小圆点;背景色以及向外模糊的多层阴影。

.swith-indicate-label input ~ .indicator::before{
    content: '';
    position: absolute;
    top:50%;
    left:50%;
    transform: translate(-50%,-50%);
    width: 5px;
    height: 5px;
    border-radius: 50%;
    transition: .5s;
    background: #f00;
    box-shadow: 0 0 2px #f00,
                0 0 5px #f00,
                0 0 10px #f00,
                0 0 15px #f00,
                0 0 20px #f00,
                0 0 25px #f00,
                0 0 30px #f00,
                0 0 40px #f00;
}

添加选中/开关开启时的指示灯样式:修改背景色和向外模糊的多层阴影的颜色。

.swith-indicate-label input:checked ~ .indicator::before{
    background: #0f0;
    box-shadow: 0 0 2px #0f0,
                0 0 5px #0f0,
                0 0 10px #0f0,
                0 0 15px #0f0,
                0 0 20px #0f0,
                0 0 25px #0f0,
                0 0 30px #0f0,
                0 0 40px #0f0;
}

扩展

还可以修改外层轮廓span的样式,使切换效果更加多变:

.swith-indicate-label input:checked ~ span{
    box-shadow: 2px 2px 5px rgba(0, 255, 0, .5),
                -2px -2px 5px rgba(0, 255, 0, .5),
                2px -2px 5px rgba(0, 255, 0, .5),
                -2px 2px 5px rgba(0, 255, 0, .5);
}

.swith-indicate-label input:checked ~ span{
    background-color: rgba(0, 255, 0, .5);
}

CSS变量(CSS 自定义属性)

CSS变量介绍

css中通过变量名前添加两横线--声明变量;

body {
  --foo: #7F583F;
  --bar: #F7EFD2;
}

CSS变量和标准的属性一样,只是没有默认含义。

各种css值都可以放入css变量中:

:root{
  --main-color: #4d4e53;
  --main-bg: rgb(255, 255, 255);
  --logo-border-color: rebeccapurple;

  --header-height: 68px;
  --content-padding: 10px 20px;

  --base-line-height: 1.428571429;
  --transition-duration: .35s;
  --external-link: "external link";
  --margin-top: calc(2vh + 20px);
}

CSS变量的读取和简单计算

上面的示例可以看到,var()函数用于读取变量。var(--width)

由于--height变量是数字,要转为像素,需要读取后执行calc计算为像素值:

width: calc(var(--height)*1px);

var()第二个参数用来表示变量不存在时的默认值。

width: calc(var(--height,40)*1px);

第一个参数后面的所有部分属于第二个参数,比如:

var(--font-stack, "Roboto", "Helvetica");
var(--pad, 10px 15px 20px);

字符串变量可以直接与其他字符串拼接。

--bar: 'hello';
--foo: var(--bar)' world';

如果变量是数值,要想应用到css的单位px、em、%中,需要使用calc()计算函数。

width: calc(var(--height)*1px);
.foo {
  --gap: 20;
  margin-top: calc(var(--gap) * 1px);
}

变量值带有单位,是不能写成字符串的。

/* 无效 */
.foo {
  --foo: '20px';
  font-size: var(--foo);
}

/* 有效 */
.foo {
  --foo: 20px;
  font-size: var(--foo);
}

CSS变量的作用域

同一个 CSS 变量,可以在多个选择器内声明。

CSS变量的作用域是其声明时所在的元素或选择器有效的范围内。优先使用内层变量。

全局的变量通常放在根元素:root里面,确保任何选择器都可以读取它们。

:root 这个 CSS 伪类匹配文档树的根元素。对于 HTML 来说, :root 表示 <html> 元素,除了优先级更高之外,与html选择器相同。

参考

相关文章
|
JavaScript 前端开发
jQuery和CSS3滑动展开菜单按钮插件
这是一款jQuery和CSS3滑动展开菜单按钮插件。该滑动展开菜单按钮在用户点击主菜单按钮之后,子菜单以滑动的方式依次展开
248 21
|
存储 移动开发 前端开发
高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容
本文深入探讨了高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容,旨在提升开发效率、网站性能和用户体验。
394 5
|
前端开发 JavaScript
如何在 JavaScript 中访问和修改 CSS 变量?
【10月更文挑战第28天】通过以上方法,可以在JavaScript中灵活地访问和修改CSS变量,从而实现根据用户交互、页面状态等动态地改变页面样式,为网页添加更多的交互性和动态效果。在实际应用中,可以根据具体的需求和场景选择合适的方法来操作CSS变量。
597 12
|
前端开发 JavaScript
如何在 CSS 变量中使用函数?
【10月更文挑战第28天】虽然CSS变量本身不能像传统编程语言中的函数那样直接进行复杂的运算和逻辑处理,但通过CSS预处理器、`calc()` 函数以及与JavaScript的结合,可以在很大程度上实现类似函数的功能,提高CSS样式的灵活性和可维护性,满足各种不同的页面设计和交互需求。
253 12
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
235 11
|
前端开发 开发者 容器
CSS 变量的作用域是什么?
【10月更文挑战第28天】理解CSS变量的作用域规则对于有效地使用CSS变量来组织和管理页面样式非常重要。通过合理地利用全局作用域和局部作用域,以及掌握变量的覆盖和继承规则,可以创建更具可维护性、灵活性和可扩展性的CSS样式表,实现各种复杂的页面设计和样式需求。
|
前端开发 JavaScript UED
|
前端开发 JavaScript UED
如何使用 JavaScript 动态修改 CSS 变量的值?
【10月更文挑战第28天】使用JavaScript动态修改CSS变量的值可以为页面带来更丰富的交互效果和动态样式变化,根据不同的应用场景和需求,可以选择合适的方法来实现CSS变量的动态修改,从而提高页面的灵活性和用户体验。
|
前端开发
背景滑动,动感加倍:CSS动画对角线效果全解析!
背景滑动,动感加倍:CSS动画对角线效果全解析!
|
前端开发
Vue3基础(十ba)___在css中使用props或者计算属性的变量,来实现动态样式
本文介绍了如何在Vue3中通过CSS变量和props或计算属性来实现动态样式。
517 0

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    358
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    279
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    245
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    169
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    368
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    513
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    369
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    168
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    351
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    319