honeySwitch提供了類似手機switch開關的效果風格,它不僅適用於PC端,也適用於移動端。
index.html
<!DOCTYPE html>
<html lang="zh_cn">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
<title>Honey Switch</title>
<script src="https://cdn.staticfile.org/jquery/3.6.1/jquery.min.js"></script>
<link rel="stylesheet" href="./honeySwitch.css">
<script src="./honeySwitch.js"></script>
<style>
</style>
<script>
$(function(){
// 監聽swich切換事件
switchEvent("#switch",
function(){
$('#status').text('開');
},function(){
$('#status').text('關');
}
);
// 從伺服器獲取狀態
// 在伺服器返回status
var status = 2;
if(status == 1){
// 1開
honeySwitch.showOn("#switch");
$('#status').text('開');
}else{
// 2關
honeySwitch.showOff("#switch");
$('#status').text('關');
}
});
</script>
</head>
<body>
<!-- switch -->
<span class="switch-on" themeColor="#39f" id="switch" style="zoom:1;"></span>
<!-- 狀態 -->
<h1 id="status"></h1>
</body>
</html>
honeySwitch.css
[class|=switch] {
position: relative;
display: inline-block;
width: 50px;
height: 30px;
border-radius: 16px;
line-height: 32px;
-webkit-tap-highlight-color:rgba(255,255,255,0);
}
.switch-on {
border: 1px solid white;
box-shadow: white 0px 0px 0px 16px inset;
transition: border 0.4s, box-shadow 0.2s, background-color 1.2s;
background-color: white;
cursor: pointer;
}
.slider {
position: absolute;
display: inline-block;
width: 30px;
height: 30px;
background: white;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
border-radius: 50%;
left: 0;
top: 0;
}
.switch-on .slider {
left: 20px;
transition: background-color 0.4s, left 0.2s;
}
.switch-off {
border: 1px solid #dfdfdf;
transition: border 0.4s, box-shadow 0.4s;
background-color: rgb(255, 255, 255);
box-shadow: rgb(223, 223, 223) 0px 0px 0px 0px inset;
background-color: rgb(255, 255, 255);
cursor: pointer;
}
.switch-off .slider {
left: 0;
transition: background-color 0.4s, left 0.2s;
}
.switch-on.switch-disabled{
opacity:.5;
cursor:auto;
}
.switch-off.switch-disabled{
background-color:#F0F0F0 !important;
cursor:auto;
}
honeySwitch.js
var honeySwitch = {};
honeySwitch.themeColor = "rgb(100, 189, 99)";
honeySwitch.init = function() {
var s = "<span class='slider'></span>";
$("[class^=switch]").append(s);
$("[class^=switch]").click(function() {
if ($(this).hasClass("switch-disabled")) {
return;
}
if ($(this).hasClass("switch-on")) {
$(this).removeClass("switch-on").addClass("switch-off");
$(".switch-off").css({
'border-color' : '#dfdfdf',
'box-shadow' : 'rgb(223, 223, 223) 0px 0px 0px 0px inset',
'background-color' : 'rgb(255, 255, 255)'
});
} else {
$(this).removeClass("switch-off").addClass("switch-on");
if (honeySwitch.themeColor) {
var c = honeySwitch.themeColor;
$(this).css({
'border-color' : c,
'box-shadow' : c + ' 0px 0px 0px 16px inset',
'background-color' : c
});
}
if ($(this).attr('themeColor')) {
var c2 = $(this).attr('themeColor');
$(this).css({
'border-color' : c2,
'box-shadow' : c2 + ' 0px 0px 0px 16px inset',
'background-color' : c2
});
}
}
});
window.switchEvent = function(ele, on, off) {
$(ele).click(function() {
if ($(this).hasClass("switch-disabled")) {
return;
}
if ($(this).hasClass('switch-on')) {
if ( typeof on == 'function') {
on();
}
} else {
if ( typeof off == 'function') {
off();
}
}
});
}
if (this.themeColor) {
var c = this.themeColor;
$(".switch-on").css({
'border-color' : c,
'box-shadow' : c + ' 0px 0px 0px 16px inset',
'background-color' : c
});
$(".switch-off").css({
'border-color' : '#dfdfdf',
'box-shadow' : 'rgb(223, 223, 223) 0px 0px 0px 0px inset',
'background-color' : 'rgb(255, 255, 255)'
});
}
if ($('[themeColor]').length > 0) {
$('[themeColor]').each(function() {
var c = $(this).attr('themeColor') || honeySwitch.themeColor;
if ($(this).hasClass("switch-on")) {
$(this).css({
'border-color' : c,
'box-shadow' : c + ' 0px 0px 0px 16px inset',
'background-color' : c
});
} else {
$(".switch-off").css({
'border-color' : '#dfdfdf',
'box-shadow' : 'rgb(223, 223, 223) 0px 0px 0px 0px inset',
'background-color' : 'rgb(255, 255, 255)'
});
}
});
}
};
honeySwitch.showOn = function(ele) {
$(ele).removeClass("switch-off").addClass("switch-on");
if(honeySwitch.themeColor){
var c = honeySwitch.themeColor;
$(ele).css({
'border-color' : c,
'box-shadow' : c + ' 0px 0px 0px 16px inset',
'background-color' : c
});
}
if ($(ele).attr('themeColor')) {
var c2 = $(ele).attr('themeColor');
$(ele).css({
'border-color' : c2,
'box-shadow' : c2 + ' 0px 0px 0px 16px inset',
'background-color' : c2
});
}
}
honeySwitch.showOff = function(ele) {
$(ele).removeClass("switch-on").addClass("switch-off");
$(".switch-off").css({
'border-color' : '#dfdfdf',
'box-shadow' : 'rgb(223, 223, 223) 0px 0px 0px 0px inset',
'background-color' : 'rgb(255, 255, 255)'
});
}
$(function() {
honeySwitch.init();
});
使用
1、swich主體switch-on
代表開啟,如需設定預設關閉,可設定為 switch-off
,themeColor
是主題色,zoom
可設定swich的大小,調整 zoom
的值即可調整大小。
<span class="switch-on" themeColor="#39f" id="switch" style="zoom:1;"></span>
class新增 switch-disabled
可設定為禁用。
<span class="switch-on switch-disabled" themeColor="#39f" id="switch" style="zoom:1;"></span>
2、swich監聽
透過 switchEvent
事件監聽switch的切換狀態。
$(function(){
switchEvent("#switch",
function(){
$('#status').text('開');
},function(){
$('#status').text('關');
}
);
}
3、設定狀態
透過 honeySwitch.showOn("#switch")
和 honeySwitch.showOff("#switch")
來設定開關。