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

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

借助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);

关于阴影溢出

box-shadow会撑出原始box的宽高范围,如果父级加入了溢出隐藏overflow: hidden,将会导致阴影隐藏。

CSS box-shadow阴影示例参考 - Beautiful CSS box-shadow examples

参考

相关文章
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
伪类:伪类这个叫法源自于它们跟类相似,但实际上并没有类会附加到标记中的标签上。 伪类分为两种(以及新增的伪类选择器): UI伪类:会在HTML元素处于某种状态时(例如:鼠标指针位于连接上),为该元素应用CSS样式。 :hover 结构化伪类:会在标记中存在某种结构上的关系时 例如: 某元素是一组元素中的第一个或最后一个,为该元素应用CSS样式。 :not和:target(CSS3新增的两个特殊的伪类选择器)
1387 2
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
transition过渡属性 早期在Web中要实现动画效果,都是依赖于JavaScript或Flash来完成。 但在CSS3中新增加了一个新的模块transition,它可以通过一些简单的CSS事件来触发元素的外观变化, 让效果显得更加细腻。简单点说,就是通过鼠标经过、获得焦点,被点击或对元素任何改变中触发, 并平滑地以动画效果改变CSS的属性值。 在CSS中创建简单的过渡效果可以从以下几个步骤来实现: 在默认样式中声明元素的初始状态样式; 声明过渡元素最终状态样式,比如悬浮状态; 在默认样式中通过添加
578 1
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
transform变形 css3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的 功能。 CSS3的变形功能可以对HTML组件执行位移、旋转、缩放、倾斜4种几何变换,这样的变换可以控制HTML组件 呈现出丰富的外观。 借助于位移、旋转、缩放、倾斜这4种几何变换,CSS3提供了transition动画。 transition动画比较简单,只要指定HTML组件的哪些CSS属性需要使用动画效果来执行变化,并指定动画时间,就可保证动画播放。 比transitio
583 1
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
355 1
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
671 0
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
盒模型 盒模型: 所谓盒模型,就是浏览器为页面中的每个HTML元素生成的矩形盒子。 这些盒子们都要按照可见板式模型在页面上排布。 可见的板式模型主要由三个属性控制:position 属性、display 属性和 float属性。 position属性控制页面上元素间的位置关系。 display属性控制元素是堆叠、并排或者不在页面上显示。 float属性提供控制的方法,以便于把元素组成成多栏布局。 盒模型讲解: 在默认的情况下,每个盒子的边框是不可见的,背景也是透明的。 所以我们 不能直接的看到页面中的盒
1678 1
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
position定位(核心) 我们讲盒模型的时候,提到了3个属性可以用来控制页面排版。 三大属性:position属性,display属性,float属性。 position 属性控制页面上元素间的位置关系。 display 属性控制页面元素是否显示或者是堆叠还是并排显示。 float 属性提供控制方法。 通过float这种控制方法,可以实现多栏布局,导航菜单等等。 position属性是干嘛用的?怎么用?有哪些属性值? position属性控制页面上元素间的位置关系,也就是排版。 怎么用?要知道怎么用
853 0
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
继承 我们的CSS中很多的属性也是可以继承的,其中相当一部分是跟文字的相关的,比如说颜色、字体、字号。 当然还有一部分是不能继承的。 例如边框、内外边距。 层叠 层叠是CSS的核心机制。 层叠的工作机制: 当元素的同一个样式属性有多种样式值的时候,CSS就是靠层叠机制来决定最终应用哪种样式。 层叠规则: 层叠规则一:找到应用给每个元素和属性的声明。 说明:浏览器在加载每个页面时,都会据此查找到每条CSS规则, 并标识出所有受到影响的HTML元素。
401 1
|
前端开发
纯CSS3彩色边线3D立体按钮制作教程
原文:纯CSS3彩色边线3D立体按钮制作教程 今天我们来分享一款利用纯CSS3实现的3D按钮,这款按钮的一个特点是有彩色的边线,这让整个按钮显得比较多姿多彩,没那么枯燥无趣。本文不仅可以让大家看到演示效果,而且我们把制作教程也分享出来,首先来看看效果图: 我们也可以在这里看到这些按钮的DEMO演示。
1292 0
|
前端开发
10个实用的 CSS3 按钮效果制作教程
  人们往往喜欢那些有更多互动元素的网站,因此现在很多设计师专注于他们的 CSS3 技能。这是因为 CSS3 技能可以帮助他们在很大的程度上实现所需的吸引力。这里分享的10个优秀的 CSS3 按钮效果制作教程,你可以学习这些技术并使用它们为您的作品创造更多的乐趣。
1151 0

热门文章

最新文章

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