style: radio

feat-css-var
tangjinzhou 2022-03-05 17:12:54 +08:00
parent c9188ec276
commit 788ee2f64a
4 changed files with 24 additions and 11 deletions

View File

@ -16,7 +16,6 @@ export const radioProps = {
name: PropTypes.string, name: PropTypes.string,
id: PropTypes.string, id: PropTypes.string,
autofocus: PropTypes.looseBool, autofocus: PropTypes.looseBool,
type: PropTypes.string.def('radio'),
onChange: PropTypes.func, onChange: PropTypes.func,
onFocus: PropTypes.func, onFocus: PropTypes.func,
onBlur: PropTypes.func, onBlur: PropTypes.func,
@ -92,7 +91,7 @@ export default defineComponent({
return ( return (
<label class={wrapperClassString} onClick={onClick}> <label class={wrapperClassString} onClick={onClick}>
<VcCheckbox {...rProps} ref={vcCheckbox} /> <VcCheckbox {...rProps} type="radio" ref={vcCheckbox} />
{slots.default && <span>{slots.default()}</span>} {slots.default && <span>{slots.default()}</span>}
</label> </label>
); );

View File

@ -28,12 +28,14 @@
.reset-component(); .reset-component();
position: relative; position: relative;
display: inline-flex; display: inline-flex;
align-items: center; align-items: baseline;
margin-right: @radio-wrapper-margin-right; margin-right: @radio-wrapper-margin-right;
cursor: pointer; cursor: pointer;
&-disabled { &-disabled {
cursor: not-allowed; cursor: not-allowed;
} }
&::after { &::after {
display: inline-block; display: inline-block;
width: 0; width: 0;
@ -83,15 +85,17 @@
&-inner { &-inner {
&::after { &::after {
position: absolute; position: absolute;
top: ((@radio-size - @radio-dot-size) / 2) - @radio-border-width; top: 50%;
left: ((@radio-size - @radio-dot-size) / 2) - @radio-border-width; left: 50%;
display: block; display: block;
width: @radio-dot-size; width: @radio-size;
height: @radio-dot-size; height: @radio-size;
margin-top: -(@radio-size / 2);
margin-left: -(@radio-size / 2);
background-color: @radio-dot-color; background-color: @radio-dot-color;
border-top: 0; border-top: 0;
border-left: 0; border-left: 0;
border-radius: @radio-dot-size; border-radius: @radio-size;
transform: scale(0); transform: scale(0);
opacity: 0; opacity: 0;
transition: all @radio-duration @ease-in-out-circ; transition: all @radio-duration @ease-in-out-circ;
@ -128,8 +132,9 @@
.@{radio-prefix-cls}-checked { .@{radio-prefix-cls}-checked {
.@{radio-inner-prefix-cls} { .@{radio-inner-prefix-cls} {
border-color: @radio-dot-color; border-color: @radio-dot-color;
&::after { &::after {
transform: scale(1); transform: scale((unit(@radio-dot-size) / unit(@radio-size)));
opacity: 1; opacity: 1;
transition: all @radio-duration @ease-in-out-circ; transition: all @radio-duration @ease-in-out-circ;
} }
@ -143,6 +148,7 @@
background-color: @input-disabled-bg; background-color: @input-disabled-bg;
border-color: @border-color-base !important; border-color: @border-color-base !important;
cursor: not-allowed; cursor: not-allowed;
&::after { &::after {
background-color: @radio-dot-disabled-color; background-color: @radio-dot-disabled-color;
} }
@ -270,6 +276,7 @@ span.@{radio-prefix-cls} + * {
&:hover { &:hover {
color: @radio-button-hover-color; color: @radio-button-hover-color;
border-color: @radio-button-hover-color; border-color: @radio-button-hover-color;
&::before { &::before {
background-color: @radio-button-hover-color; background-color: @radio-button-hover-color;
} }
@ -278,6 +285,7 @@ span.@{radio-prefix-cls} + * {
&:active { &:active {
color: @radio-button-active-color; color: @radio-button-active-color;
border-color: @radio-button-active-color; border-color: @radio-button-active-color;
&::before { &::before {
background-color: @radio-button-active-color; background-color: @radio-button-active-color;
} }
@ -292,16 +300,19 @@ span.@{radio-prefix-cls} + * {
color: @radio-solid-checked-color; color: @radio-solid-checked-color;
background: @radio-dot-color; background: @radio-dot-color;
border-color: @radio-dot-color; border-color: @radio-dot-color;
&:hover { &:hover {
color: @radio-solid-checked-color; color: @radio-solid-checked-color;
background: @radio-button-hover-color; background: @radio-button-hover-color;
border-color: @radio-button-hover-color; border-color: @radio-button-hover-color;
} }
&:active { &:active {
color: @radio-solid-checked-color; color: @radio-solid-checked-color;
background: @radio-button-active-color; background: @radio-button-active-color;
border-color: @radio-button-active-color; border-color: @radio-button-active-color;
} }
&:focus-within { &:focus-within {
box-shadow: @radio-button-focus-shadow; box-shadow: @radio-button-focus-shadow;
} }
@ -319,6 +330,7 @@ span.@{radio-prefix-cls} + * {
background-color: @input-disabled-bg; background-color: @input-disabled-bg;
border-color: @border-color-base; border-color: @border-color-base;
} }
&:first-child { &:first-child {
border-left-color: @border-color-base; border-left-color: @border-color-base;
} }
@ -337,6 +349,7 @@ span.@{radio-prefix-cls} + * {
transform: scale(1); transform: scale(1);
opacity: 0.5; opacity: 0.5;
} }
100% { 100% {
transform: scale(1.6); transform: scale(1.6);
opacity: 0; opacity: 0;

View File

@ -166,6 +166,7 @@
// Disabled states // Disabled states
@disabled-color: fade(#000, 25%); @disabled-color: fade(#000, 25%);
@disabled-bg: @background-color-base; @disabled-bg: @background-color-base;
@disabled-active-bg: tint(@black, 90%);
@disabled-color-dark: fade(#fff, 35%); @disabled-color-dark: fade(#fff, 35%);
// Shadow // Shadow
@ -270,7 +271,7 @@
// Radio // Radio
@radio-size: 16px; @radio-size: 16px;
@radio-top: 0px; @radio-top: 0.2em;
@radio-border-width: 1px; @radio-border-width: 1px;
@radio-dot-size: @radio-size - 8px; @radio-dot-size: @radio-size - 8px;
@radio-dot-color: @primary-color; @radio-dot-color: @primary-color;
@ -283,7 +284,7 @@
@radio-button-color: @btn-default-color; @radio-button-color: @btn-default-color;
@radio-button-hover-color: @primary-5; @radio-button-hover-color: @primary-5;
@radio-button-active-color: @primary-7; @radio-button-active-color: @primary-7;
@radio-disabled-button-checked-bg: tint(@black, 90%); @radio-disabled-button-checked-bg: @disabled-active-bg;
@radio-disabled-button-checked-color: @disabled-color; @radio-disabled-button-checked-color: @disabled-color;
@radio-wrapper-margin-right: 8px; @radio-wrapper-margin-right: 8px;