评论

分享一个自定义的switch组件,带文字状态的开关。

自定义的switch组件,带文字状态的开关。

文字内容、组件大小可以自定义修改。

https://developers.weixin.qq.com/s/W5xmJZmo7XNK

<mp-switch bindchange="change" trueText="打开" falseText="关闭"></mp-switch>
最后一次编辑于  01-05  
点赞 1
收藏
评论

1 个评论

  • 再见,电脑崽
    再见,电脑崽
    01-05
    <!--components/mp-switch/mp-switch.wxml-->
    <view class="mp-switch" style="--mp-switch-width: {{width}}px;--mp-switch-height: {{height}}px;--mp-switch-text: '{{checked?trueText:falseText}}';">
        <view class="wx-switch-input {{checked?'wx-switch-input-checked':''}}" bind:tap="onChange"></view>
    </view>
    


    // components/mp-switch/mp-switch.js
    Component({
        properties: {
            trueText: {
                type: String,
                value: '开'
            },
            falseText: {
                type: String,
                value: '关'
            },
            checked: {
                type: Boolean,
                value: false
            },
            width: {
                type: Number,
                value: 72
            },
            height: {
                type: Number,
                value: 32
            }
        },
        methods: {
            onChange() {
                this.setData({
                    checked: !this.data.checked
                }, () => {
                    this.triggerEvent('change', {
                        value: this.data.checked
                    })
                })
            }
        }
    })
    


    /* components/mp-switch/mp-switch.wxss */
    .mp-switch .wx-switch-input {
        -webkit-appearance: none;
        appearance: none;
        position: relative;
        width: var(--mp-switch-width);
        height: var(--mp-switch-height);
        border: 1px solid #DFDFDF;
        outline: 0;
        border-radius: calc(var(--mp-switch-height) / 2);
        box-sizing: border-box;
        background-color: #e5e5e5;
        transition: background-color 0.1s, border 0.1s;
    }
    
    
    .mp-switch .wx-switch-input::before {
        content: var(--mp-switch-text);
        position: absolute;
        top: 0;
        left: 0;
        width: calc(var(--mp-switch-width) - 2px);
        height: calc(var(--mp-switch-height) - 2px);
        line-height: calc(var(--mp-switch-height) - 2px);
        font-size: calc(var(--mp-switch-height) / 2.2);
        padding-left: calc(var(--mp-switch-height));
        padding-right: 6px;
        box-sizing: border-box;
        overflow: hidden;
        color: #999;
        text-align: center;
        background-color: transparent;
    }
    
    
    .mp-switch .wx-switch-input::after {
        content: " ";
        position: absolute;
        top: 0;
        left: 0;
        width: calc(var(--mp-switch-height) - 2px);
        height: calc(var(--mp-switch-height) - 2px);
        border-radius: 50%;
        background-color: #FFFFFF;
        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
        transition: -webkit-transform 0.3s;
        transition: transform 0.3s;
    }
    
    
    .mp-switch .wx-switch-input.wx-switch-input-checked {
        border-color: #07C160;
        background-color: #07C160;
    }
    
    
    .mp-switch .wx-switch-input.wx-switch-input-checked::before {
        color: #fff;
        padding-right: calc(var(--mp-switch-height));
        padding-left: 6px;
    }
    
    
    .mp-switch .wx-switch-input.wx-switch-input-checked::after {
        -webkit-transform: translateX(calc(var(--mp-switch-width) - var(--mp-switch-height)));
        transform: translateX(calc(var(--mp-switch-width) - var(--mp-switch-height)));
    }
    


    01-05
    赞同 1
    回复 2
登录 后发表内容