[HTML+CSS+Vue] 自定义单选按钮效果:点击不同按钮切换(switch)不同选项,同一按钮在2个状态之间切换(toggle)

11 篇文章 0 订阅
10 篇文章 0 订阅

刚刚搞定一个排序组件:三个按钮对应三个不同的排序方式,单选切换,同时在当前排序方式下,再点击当前按钮切换正序和倒序,小箭头图标示意。
因为radio单选框的默认样式太丑了,bootstrap给的custom也不理想,干脆就从样式到功能全部自定义,感谢vue让一切如此简单~
(这里只写了样式,当然不只是实现样式,还要利用vue实现排序功能啦)

• 效果示例:

在这里插入图片描述

• HTML代码:

<!-- 此例中小箭头图标的使用引入fontawesome -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css">
<!-- 引入Vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
<div id="app">
    <div class="sortBtn">
        <!-- v-bind动态绑定.active样式,v-on绑定click事件,传入对应的参数,点击则应用.active样式到该按钮 -->
        <button :class="{active: sortOrder == 1}" @click.passive="sortSwitch(1)">按A方式排序 
            <!-- 分离的上下箭头方便控制,但内联元素上下布局比较麻烦,所以我用两个左右箭头图标包裹在span中用CSS旋转,效果一样 -->
            <span>
                <!-- v-bind动态绑定.rev样式,跟随.active应用,利用!取反达到切换效果,每个按钮的倒序属性需要单独设置 -->
                <i class="fas fa-caret-left" :class="{rev: !revA}"></i>
                <i class="fas fa-caret-right" :class="{rev: revA}"></i>
            </span>
        </button>
        <button :class="{active: sortOrder == 2}" @click.passive="sortSwitch(2)">按B方式排序 <span><i class="fas fa-caret-left" :class="{rev: !revB}"></i><i class="fas fa-caret-right" :class="{rev: revB}"></i></span></button>
        <button :class="{active: sortOrder == 3}" @click.passive="sortSwitch(3)">按C方式排序 <span><i class="fas fa-caret-left" :class="{rev: !revC}"></i><i class="fas fa-caret-right" :class="{rev: revC}"></i></span></button>
    </div>
</div>

• CSS代码:

/* 消除button默认的获得焦点时及激活时的轮廓和阴影 */
button:focus,
button:active:focus,
button.active:focus,
button.focus,
button:active.focus,
button.active.focus {
    outline: none;
    box-shadow: none;
}
/* 自定义按钮未选中时的样式 */
.sortBtn button {
    margin: .3rem;
    padding-bottom: .1rem;  /* 下面图标产生了.1rem的间距,这里补上好让文字居中 */
    color: #4F94CD;
    text-align: center;
    background-color: transparent;
    border: .1rem solid #4F94CD;
    border-radius: .3rem;
}
/* 箭头图标整体旋转 */
.sortBtn button span {
    display: inline-block;  /* 必须将span转化为行内块元素 */
    transform: rotate(90deg);  /* 顺时针旋转90°即可 */
    -ms-transform: rotate(90deg);  /* IE9兼容 */
    -webkit-transform: rotate(90deg);  /* Safari、Chrome兼容 */
}
/* 两个箭头隔开一点 */
.sortBtn button i {
    margin-left: .1rem;  /* 旋转后是y轴方向的样子,但设置还是要在初始的x轴方向 */
}
/* 按钮被选中后的样式 */
.sortBtn .active {
    color: white;
    background-color: #4F94CD;
    border-color: #4F94CD;
}
/* 未选中的箭头变灰(一定要写在.active后,才能跟随变化) */
.sortBtn .active .rev {
    color: #A9A9A9;
}

• JS代码:

// 创建根实例
new Vue({
    el: '#app',
    data: {
        sortOrder: 1,  // 预设按A方式排序,即默认第一个按钮已选中
        revA: false,  // 预设状态下,A的倒序属性初始值为false
        revB: true,  // 其他的初始值为true,点击动作会使之false
        revC: true,
    },
    methods: {
        // 定义切换属性值的方法,关键参数n
        sortSwitch (n) {
            this.sortOrder = n;  // this指向当前根实例
            // 将三种排序方式分情况讨论,内部切换正倒序
            if (n == 2) {
                var rb = this.revB;
                rb = !rb;
                this.revB = rb;  // 取反再赋值
                this.revA = true;  // 复位其他按钮
                this.revC = true;
            } else if (n == 3) {
                var rc = this.revC;
                rc = !rc;
                this.revC = rc;
                this.revA = true;
                this.revB = true;
            } else {
                var ra = this.revA;
                ra = !ra;
                this.revA = ra;
                this.revB = true;
                this.revC = true;
            }
        }
    }
})

以上。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值