CSS——js 动态改变原生 radio、switch 的选中样式

news/2024/11/26 7:15:50/

导航

  • 1. radio
    • 1-1. 业务场景:
    • 1-2. 效果:
    • 1-3. 问题点:
    • 1-4. 解决方案:
    • 1-5. 代码:
      • 1-5-1. HTML
      • 1-5-2. JS
      • 1-5-3. html 内容排版的 css
      • 1-5-4. 实现 radio 效果的 css
  • 2. switch
    • 2-1. 业务场景:
    • 2-2. 效果:
    • 2-3. 问题点:
    • 2-4. 解决方案:
    • 2-5. 代码:
      • 2-5-1. HTML
      • 2-5-2. JS
      • 2-5-3. html 内容排版的 css
      • 2-5-4. 实现 switch 效果的 css
  • 3. 公共文件
    • 3-1. 基础 css

本文代码齐全,可直接复制各版块代码,略作修改即可生成 demo。

1. radio

1-1. 业务场景:

  • 当某用户满足条件 A 时,方式一 与 方式二 可任意选择,即点击哪个高亮哪个。
  • 当不满足条件 A 时,只可选择方式一,当选择方式二时,弹出提示,且选中的情况不发生变化。

1-2. 效果:

在这里插入图片描述

1-3. 问题点:

当直接使用 input 的 checked 属性时,直接点击 input 控件,被点击的就高亮了,且该控件的高亮不受 checked 控制,即使将该 input 的值设置为空,被点击控件的高亮并不消失。

1-4. 解决方案:

不使用 input 的 checked 属性,直接使用 class,通过 js 改变 class 达到 radio 的动态高亮效果。

1-5. 代码:

1-5-1. HTML

<div class="fm-radio-item"><label class="item-label require">签约方式</label><div class="radio-group"><span (click)="changeRadio(1)"><inputtype="radio"id="contractMode1"[(ngModal)]="shopForm.contractMode"[class]="shopForm.contractMode === 1? 'radio-component-checked': 'radio-component'"/><labelfor="contractMode1"class="radio-label"(click)="forbidden($event)">方式一</label></span><span (click)="changeRadio(2)"><inputtype="radio"id="contractMode2"[(ngModal)]="shopForm.contractMode"[class]="shopForm.contractMode === 2? 'radio-component-checked': 'radio-component'"/><label for="contractMode2" (click)="forbidden($event)">方式二</label></span></div>
</div>

1-5-2. JS

changeRadio = (value: number) => {if (value === 2) {alert('条件不满足,方式二不可选');return;}this.shopForm[type] = value;
};
// 不阻止的话会触发2次
forbidden = (e: Event) => {e.preventDefault();
};

1-5-3. html 内容排版的 css

@import "./base";
@import "./radio-component-checked";$label-width: 160px;.fm-radio-item {padding: 20px;display: flex;align-items: center;position: relative;.item-label {display: inline-block;width: $label-width;line-height: 64px;font-size: $f-s-default;&.require {@include requiredAfter();}}.radio-group {flex: 1;width: 100%;padding: 11px 0;line-height: 40px;font-size: $f-s-default-max;.radio-label {margin-right: 40px;}}
}

1-5-4. 实现 radio 效果的 css

/* radio-component-checked.css */
@import "./base";
.radio-component {width: 32px;height: 32px;position: relative;top: -4px;margin-right: 10px;-webkit-appearance: none;appearance: none;box-sizing: border-box;padding: 0;/* 按钮 */&::before {content: "";width: 32px;height: 32px;border: 1px solid #7d7d7d;display: inline-block;border-radius: 50%;vertical-align: middle;}
}.radio-component-checked {width: 32px;height: 32px;position: relative;top: -4px;margin-right: 10px;-webkit-appearance: none;appearance: none;box-sizing: border-box;padding: 0;/* 按钮 */&::before {content: "";width: 32px;height: 32px;border: 2px solid $color-primary;display: inline-block;border-radius: 50%;vertical-align: middle;}&::after {content: "";width: 18px;height: 18px;background-color: $color-primary;border-radius: 50%;text-align: center;display: block;position: absolute;top: 13px;left: 7px;vertical-align: middle;}
}

2. switch

2-1. 业务场景:

切换营业状态,在『开』状态时高亮。

2-2. 效果:

在这里插入图片描述
在这里插入图片描述

2-3. 问题点:

原生 input 没有 switch 属性。Switch 组件只在第三方组件中存在,如:elementUI、antd 等。

2-4. 解决方案:

使用原生开发,css 需改 input=checkbox 的基本样式为滑动按钮,js 动态改变 class 属性做到高亮的变化效果。

2-5. 代码:

2-5-1. HTML

<div class="fm-item"><label class="item-label require">营业状态</label><div class="btn-group-con"><div class="radio-group"><inputtype="checkbox"(change)="changeStatus('shopStatus')"[ngClass]="!!timeForm.shopStatus? 'switch-component-checked': 'switch-component'"/><span class="tip">{{timeForm.shopStatus ? "营业中" : "打烊中"}}</span></div></div>
</div>

2-5-2. JS

changeStatus = (type: string) => {this.timeForm[type] = this.timeForm[type] === 1 ? 0 : 1;
};

2-5-3. html 内容排版的 css

.fm-item {display: flex;align-items: center;position: relative;padding: 15px 30px;background-color: $bg-color-main;border-radius: 10px;.item-label {display: inline-block;width: $fm-item-label-width;line-height: 64px;font-size: $f-s-default;&.require {@include requiredAfter();}}.radio-group {flex: 1;width: 100%;padding: 11px 0;line-height: 40px;font-size: $f-s-default-max;.tip {font-size: $f-s-default-min;color: $text-color-lightGray;margin-left: 20px;}}
}

2-5-4. 实现 switch 效果的 css

/* switch-component-checked */
@import "./base";
.switch-component {width: 80px;height: 40px;position: relative;top: 10px;background-color: $text-color-lightGray;border-radius: 30px;border: none;outline: none;-webkit-appearance: none;transition: all 0.2s ease;/* 按钮 */&::after {content: "";position: absolute;top: 0;left: 1px;width: 50%;height: 100%;background-color: $bg-color-main;border-radius: 50%;transition: all 0.2s ease;}
}.switch-component-checked {width: 80px;height: 40px;position: relative;top: 10px;background-color: $color-primary;border-radius: 30px;border: none;outline: none;-webkit-appearance: none;transition: all 0.2s ease;/* 按钮 */&::after {content: "";position: absolute;top: 0;left: 49%;width: 50%;height: 100%;background-color: $bg-color-main;border-radius: 50%;transition: all 0.2s ease;}
}

3. 公共文件

3-1. 基础 css

// 基础类型颜色
$color-primary: #1890ff;
$color-success: #52c41a;
$color-warning: #faad14;
$color-danger: #ff4d4f;
$color-purple: rgb(117, 117, 255);// 文字颜色
$text-color-placeholder: #cccccc;
$text-color-lightGray: #999999;
$text-color-gray: #666666;
$text-color-darkGray: #333333;
$text-color-default: rgba(0, 0, 0, 0.85);
$text-color-white: #ffffff;// 字体大小
$f-s-default-max: 32px;
$f-s-default-big: 30px;
$f-s-default: 28px;
$f-s-default-small: 26px;
$f-s-default-min: 24px;// 行高
$l-h-default-max: 38px;
$l-h-default-big: 36px;
$l-h-default: 34px;
$l-h-default-small: 32px;
$l-h-default-min: 30px;// 背景色
$bg-color-default: rgb(240, 240, 245);
$bg-color-main: rgb(255, 255, 255);// border 线
$border-lightGray: 1px solid #cccccc;
/*** 文字后的星号(必填标识)*/
@mixin requiredAfter($left: 10px) {&::after {content: "*";color: $color-danger;position: relative;left: $left;}
}

http://www.ppmy.cn/news/49065.html

相关文章

netty使用异常,nio使用DirectBuffer导致内存溢出

文章目录 报错信息解决总结 报错信息 业务场景&#xff1a;雷达作为客户端&#xff0c;平台作为服务端&#xff0c;采用TCP/IP协议的socket连接&#xff0c;数据包采用字节的二进制数据传输平台部署某市&#xff0c;接入了四五十个路口和相应的雷达&#xff0c;在运行一周左右…

如何创建高效的Prompt和ChatGPT等大语言模型AI对话

大语言模型&#xff0c;如OpenAI的GPT-4&#xff0c;是一种基于深度学习技术的自然语言处理工具&#xff0c;它可以理解自然语言并为用户提供有价值的回答。然而&#xff0c;要从大语言模型中获得高质量的回答&#xff0c;你需要学会如何高效地提问。本文将从原理出发&#xff…

医院体检PEIS系统源码

一、医院体检系统概述 1. 医院体检系统概述 目前&#xff0c;大多数的体检还停留在手工操作上&#xff0c;如单位体检时手工书写体检人员信息、医生手工书写体检结果、检验报告打印后进行手工粘贴等&#xff0c;这样造成极大的工作量&#xff0c;效率低下&#xff0c;而且极易…

新能源汽车和数字化转型

工业时代的代表产品是交通运输设备&#xff0c;核心桂冠是发动机。信息时代的代表产品是智能手机&#xff0c;核心桂冠是芯片。 汽车是个很有代表性产品&#xff0c;因为它既属于复杂高精密金属机械设备&#xff0c;又属于大规模使用的大件消费品。所以这100年来&#xff0c;汽…

MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别

文章目录 MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别InnoDB存储引擎特点操作示例创建InnoDB表修改表引擎为InnoDB MyISAM存储引擎特点操作示例创建MyISAM表修改表引擎为MyISAM MEMORY存储引擎特点操作示例创建MEMORY表修改表引擎为MEMORY 总结 MySQL存储引擎InnoDB、M…

ubuntu22.04普通用户配置cuda

ubuntu22.04普通用户配置cuda 1. 问题描述2. 解决方法2.1 查看安装cuda版本2.2 修改普通用户自己的环境变量2.3 重新执行初始化文档2.4 查看nvcc版本&#xff0c;测试是否成功 1. 问题描述 在ubuntu22.04服务器上使用root用户安装了cuda&#xff0c;普通用户登录时仍然没办法直…

USB TO SPI / USB TO I2C 软件概要 6--- 专业版调试器

所需设备&#xff1a; 内附链接 软件概述&#xff1a; SPI类: USB TO SPI 1.0-Slave SPI从机软件&#xff0c;适合单步调试&#xff0c;支持SPI工作模式0、1、2、3&#xff0c;自动跟随主机通讯速率&#xff0c;自动接收数据&#xff1b; USB TO SPI 1.0-Slave_ (Excel…

ubuntu-18.0.04 鸿蒙HarmonyOS系统源码(HOSP)下载

最近小编在研究鸿蒙开发&#xff0c;想要研究下鸿蒙源码&#xff0c;这里记录下源码下载中遇到的问题及解决&#xff0c;也为HarmonyOS的生态的建设提供下帮助&#xff0c;希望能帮到需要的人。 前置步骤&#xff1a;如果你之前下载过AOSP源码&#xff0c;那这里下载鸿蒙源码应…