小程序开关组件

前提是vant组件库不太好改,干脆就手写了一个

javascript 复制代码
<template>
    <view class="switch-container" @click="toggleOrder">
        <view :class="['switch-text', 'left-text', { 'left-textChoose': isReverseOrder }]"
            >{{ leftText }}</view
        >
        <view class="switch-slider" :style="sliderStyle"></view>
        <view :class="['switch-text', 'right-text', { 'right-textChoose': !isReverseOrder }]"
            >{{ rightText }}</view
        >
    </view>
</template>

<script setup>
import { ref, computed } from 'vue';

const props = defineProps({
    leftText: {
        type: String,
        default: ''
    },
    rightText: {
        type: String,
        default: ''
    }
});
const isReverseOrder = ref(true);
const emit = defineEmits(['getValue']);
// 计算滑块的位置
const sliderStyle = computed(() => {
    // 滑块完全在左侧时偏移量为0%,完全在右侧时偏移量为100%
    return {
        transform: `translateX(${isReverseOrder.value ? '100%' : '0%'})`
    };
});

// 切换开关状态
function toggleOrder() {
    isReverseOrder.value = !isReverseOrder.value;
    console.log(isReverseOrder.value);
    emit('getValue', isReverseOrder.value);
}
</script>

<style scoped>
.switch-container {
    border: 2px solid #eeeeee;
    display: flex;
    align-items: center;
    width: 72px; 
    height: 28px; 
    background-color: #eeeeee; 
    border-radius: 20px; 
    overflow: hidden;
    position: relative; // 滑块绝对定位
}

.switch-text {
    flex: 1; //使文本元素占据剩余空间的一半
    display: flex;
    justify-content: center; 
    align-items: center;
    user-select: none; 
    position: relative; //为了可能的z-index调整
    z-index: 2; // 确保文本在滑块之上
}

.left-text {
    font-family: PingFangSC-Medium;
    font-weight: 500;
    font-size: 10px;
    color: #25292f;
}
.left-textChoose {
    font-family: PingFang SC;
    font-weight: 400;
    font-size: 10px;
    color: #25292f;
}

.right-text {
    font-family: PingFangSC-Medium;
    font-weight: 500;
    font-size: 10px;
    color: #25292f;
}
.right-textChoose {
    font-family: PingFang SC;
    font-weight: 400;
    font-size: 10px;
    color: #25292f;
}
.switch-slider {
    width: 50%; // 滑块宽度为容器宽度的一半
    height: 24px;
    background-color: #fff; 
    transition: transform 0.3s ease-in-out; // 过渡效果 
    border-radius: 20px; 
    position: absolute; // 绝对定位以覆盖整个容器 
    left: 0; //初始位置
    top: 0;
    bottom: 0;
    z-index: 1; // 确保滑块在文本之下
}
</style>

效果如图

相关推荐
小咕聊编程4 小时前
【含文档+PPT+源码】基于微信小程序农家乐美食餐厅预约推广系统
微信小程序·小程序·美食
计算机-秋大田13 小时前
基于微信小程序的电子竞技信息交流平台设计与实现(LW+源码+讲解)
spring boot·后端·微信小程序·小程序·课程设计
计算机徐师兄17 小时前
Java基于SSM框架的互助学习平台小程序【附源码、文档】
小程序·互助学习·互助学习平台小程序·java互助学习微信小程序·互助学习微信小程序·互助学习平台微信小程序
西农小陈19 小时前
Python-基于PyQt5,wordcloud,pillow,numpy,os,sys的智能词云生成器
开发语言·python·小程序·pycharm·numpy·pyqt·pillow
说私域21 小时前
开源AI智能名片2+1链动模式S2B2C商城小程序:重塑私域流量运营格局
人工智能·小程序·流量运营
Colinnian1 天前
微信小程序中在一个大边框里给每个小边框均匀分配空间
微信小程序·小程序·notepad++
说私域2 天前
今日头条公域流量引流新径:开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序融合之道
人工智能·小程序
曾经的三心草2 天前
小程序-基础加强
小程序·基础加强
说私域2 天前
智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力
人工智能·小程序·自动驾驶
说私域2 天前
开源2+1链动模式AI智能名片S2B2C商城小程序:利用用户争强好胜心理促进分享行为的策略研究
人工智能·小程序·开源