自定义el-slider 滑块的样式

最近用到了element组件中的滑块,翻看了官网和网上一些案例,感觉和我要的样式都不太一样,下面记录一下我用到的两种自定义滑块。

效果图

第一种自定义画过的间断点样式

起始样式

滑动的样式

第二种自定义拖动滑块的样式

起始样式

滑动的样式

自定义画过的间断点样式的实现

javascript 复制代码
<template>
   <div class="d-flex align-items-start">
        <div class="search-item-label" style="line-height: 38px;">公网带宽</div>
        <div class="d-flex align-items-center">
          <el-slider
                class="ml-1 mr-4"
                :class="{'activeSlider0' : state.netBrandWidth > 0,'activeSlider1' : state.netBrandWidth > 50, 'activeSlider2' : state.netBrandWidth > 100, 'activeSlider3' : state.netBrandWidth > 150, 'activeSlider4' : state.netBrandWidth > 200}" // 滑动到不同位置时添加不同的classname,来定义滑动过后的样式
                v-model="state.netBrandWidth"
                :min="0"
                :max="200"
                :marks="netBrandWidthMarks"  // 标记
                :format-tooltip="netBrandWidthFormatterTooltip" // 滑动快hover时上方显示文字
                style="width: 416px">
          </el-slider>
     </div>
   </div>
</template>
<script setup>
import { reactive, ref } from 'vue'
const state = reactive({
  netBrandWidth: 1
})
const netBrandWidthMarks = ref({ // 标记
  0: '0M',
  50: '50M',
  100: '100M',
  150: '150M',
  200: '200M'
})
// 公网带宽
const netBrandWidthFormatterTooltip = (value) => { // 滑动快hover时上方显示文字
  return value > 0 ? `${ value }Mbps` : '无公网'
}
</script>
<style scoped lang="scss">
.el-slider__runway{ // 滑块的进度条颜色
  background-color: #F2F3F7;
}
.el-slider__stop { // 进度条上间断点的样式
  width: 10px;
  height: 10px;
  top: -2px;
  background: #FFFFFF;
  border: 1px dotted #4C66CE;
  box-sizing: border-box;
}

.el-slider__button { // 拖动的滑块的样式
  width: 16px;
  height: 16px;
  background-color: #FFFFFF;
  box-shadow: 0px 0px 4px 0px rgba(64,83,159,0.73);
  border: 3px solid #4C66CE;
}
.el-slider__marks-text{ // 底部标记的样式
  font-size: 12px;
  color: #999999;
}
.activeSlider0 .el-slider__runway{ // 滑动到不同位置时添加不同的classname,来定义滑动过后的样式
  .el-slider__stop:first-child{ // 间断点样式
    background-color: #4C66CE;
  }
}
.activeSlider1 .el-slider__runway{
  .el-slider__stop:first-child,.el-slider__stop:nth-child(2){
    background-color: #4C66CE;
  }
}
.activeSlider2 .el-slider__runway{
  .el-slider__stop:first-child,.el-slider__stop:nth-child(2),.el-slider__stop:nth-child(3){
    background-color: #4C66CE;
  }
}
.activeSlider3 .el-slider__runway{
  .el-slider__stop:first-child,.el-slider__stop:nth-child(2),.el-slider__stop:nth-child(3),.el-slider__stop:nth-child(4){
    background-color: #4C66CE;
  }
}
.activeSlider4 .el-slider__runway{
  .el-slider__stop:first-child,.el-slider__stop:nth-child(2),.el-slider__stop:nth-child(3),.el-slider__stop:nth-child(4),.el-slider__stop:nth-child(5){
    background-color: #4C66CE;
  }
}
</style>

自定义拖动滑块样式的实现

javascript 复制代码
<template>
   <div class="d-flex align-items-start">
        <div class="search-item-label" style="line-height: 38px;">公网带宽</div>
        <div class="d-flex align-items-center">
          <el-slider
                class="ml-1 mr-4"
                v-model="state.netBrandWidth"
                :min="0"
                :max="200"
                :marks="netBrandWidthMarks"  // 标记
                :format-tooltip="netBrandWidthFormatterTooltip" // 滑动快hover时上方显示文字
                style="width: 416px">
          </el-slider>
     </div>
   </div>
</template>
<script setup>
import { reactive, ref } from 'vue'
const state = reactive({
  netBrandWidth: 1
})
const netBrandWidthMarks = ref({ // 标记
  0: '0M',
  50: '50M',
  100: '100M',
  150: '150M',
  200: '200M'
})
// 公网带宽
const netBrandWidthFormatterTooltip = (value) => { // 滑动快hover时上方显示文字
  return value > 0 ? `${ value }Mbps` : '无公网'
}
</script>
<style scoped lang="scss">
.el-slider__stop { // 进度条上间断点的样式
  border: 1px solid var(--el-color-primary);
  box-sizing: border-box;
}

.el-slider__button { // 拖动的滑块的样式
  width: 16px;
  height: 22px;
  border: 1px solid var(--el-color-primary);
  border-radius: 1px;
  position: relative;
  left: 4px;
}

.el-slider__button:before { 
  content: '';
  display: block;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 3px;
  height: 6px;
  background: transparent;
  box-shadow: -3px 0 0 -1px var(--el-color-primary), 3px 0 0 -1px var(--el-color-primary);
}

.el-slider__button:after {
  content: '';
  display: block;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 1px;
  height: 7px;
  background: var(--el-color-primary);
  z-index: 999;
}
</style>
相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A5 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄5 天前
JavaScript 隐式全局变量解析
javascript
honkun65 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19915 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net