聊聊如何实现自定义滑块组件?

开发 开发工具
整个滑块组通过绝对定位的方式将其定位在web页面的右上角,取消ul列表的默认列表样式,每个滑块的名称、滑块、值居中对齐,只需要简单几个css样式就可以达到这个效果。

下面的动画展现了通过两个代表x、y轴的滑块来实现图形的平移效果动画,本文介绍怎么来实现这样的滑块。

滑块html结构

示例通过ul列表结构组织,每个li元素的内容表示一个滑块,每个滑块包含名称、滑块和值三部分内容,其中滑块使用input元素即可实现,只需要将type设置为range即可。

<div id="toolbox"><ul><li><!--滑块名称--><div>x</div><!--滑块--><input class="xin-widget-slider" type="range" min="0" max="1740" value="870"><!--滑块表示的值--><div class="xin-widget-value">399</div></li><li><div>y</div><input class="xin-widget-slider" type="range" min="0" max="860" value="430"><div class="xin-widget-value">312</div></li></ul>
</div>
  • 1.
  • 2.

滑块CSS样式

整个滑块组通过绝对定位的方式将其定位在web页面的右上角,取消ul列表的默认列表样式,每个滑块的名称、滑块、值居中对齐,只需要简单几个css样式就可以达到这个效果。

/*将toolbox容器绝对定位到web页面右上角*/
#toolbox {
    position: absolute;
    top: 0;
    right: 0;
    margin: 1rem 2rem;
    opacity: 0.6;
}
/*不显示ul任何列表样式*/
#toolbox ul {
    list-style-type: none;
}
/*居中对齐滑块名称、滑块、值*/
#toolbox ul li {
    display: flex;
    align-items: center;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

TypeScript代码实现滑块组件封装

接下来,还需要通过js代码添加滑块监听处理方法,实时更新滑块的值,并提供回调入口供应用使用该滑块。这里通过TypeScript来实现,代码如下:

export class xinUI {

    // 创建滑块组件
    setupSlider(parent_selector: string, options: any) {
        var parent = document.querySelector(parent_selector);

        // 从options中提取滑块的名称、最小、最大值、当前值等,不存在的则取默认值
        var name = options.name;
        var min = options.min || 0;
        var max = options.max || 1;
        var callback = options.callback;
        var value = options.value || 0;
        // 创建一组滑块
        var elm_li = document.createElement("li");
        elm_li.innerHTML = `
            <div>${name}</div>
            <input class="xin-widget-slider" type="range" min="${min}" max="${max}" value="${value}">
            <div class="xin-widget-value">${value}</div>`;
        parent.appendChild(elm_li);
        var elm_slider = elm_li.querySelector(".xin-widget-slider");
        var elm_value = elm_li.querySelector(".xin-widget-value");
        // 更新显示滑块的值
        updateValue();
        // 添加input、change事件,实时改变滑块的值并回调options指定的方法
        elm_slider.addEventListener("input", handleChange);
        elm_slider.addEventListener("change", handleChange);

        function updateValue() {
            elm_value.textContent = value;
        }

        function handleChange(event) {
            value = event.target.value;
            updateValue();
            // 供用户回调
            callback(event, {value: value});
        }
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

滑块组件示例

下面的示例在web页面的右上角创建两个滑块代表x、y坐标,滑动滑块将在控制台打印滑块的值。
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./src/css/layout.css">
    <title>滑块组件使用示例</title>
</head>
<body>
    <div id="toolbox">
        <ul>
        </ul>
    </div><!-- slider-ui.js为上面滑块组件代码编译为js后的代码,这里不再列出 -->
    <script type="module" src="./build/slider-ui.js"></script>
    <script type="module" src="./build/main.js"></script>
</body>
</html>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

main.ts

import { xinUI } from "./slider-ui.js";

function main() {
    
    var translation = [10, 30];
    // 创建x、y平移滑块
    var myUI = new xinUI();
    myUI.setupSlider("#toolbox ul", {name: "x", max: 100, value: translation[0], callback: updatePosition(0)});
    myUI.setupSlider("#toolbox ul", {name: "y", max: 100, value: translation[1], callback: updatePosition(1)});
    
    function updatePosition(index) {
        return function(event, ui) {
            translation[index] = parseInt(ui.value);
            //以下为应用处理的代码,这里仅打印其信息以示例console.log(translation[index]);
        }
    }
}
main();

export {};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
责任编辑:武晓燕 来源: 今日头条
相关推荐

2022-07-15 16:45:35

slider滑块组件鸿蒙

2022-03-01 16:09:06

OpenHarmon鸿蒙单选组件

2022-12-07 08:56:27

SpringMVC核心组件

2024-06-03 10:00:51

Vue 3语法插槽

2009-09-07 22:00:15

LINQ自定义

2022-04-24 15:17:56

鸿蒙操作系统

2024-08-09 09:02:56

2009-09-03 13:34:03

.NET自定义控件

2021-11-01 10:21:36

鸿蒙HarmonyOS应用

2020-04-15 15:35:29

vue.jsCSS开发

2013-01-10 09:36:19

NagiosNagios插件

2022-09-07 15:57:41

KubernetesCRD

2022-07-06 20:24:08

ArkUI计时组件

2009-06-25 14:53:35

自定义UI组件JSF框架

2021-09-15 10:19:15

鸿蒙HarmonyOS应用

2022-06-30 14:02:07

鸿蒙开发消息弹窗组件

2009-06-24 15:13:36

自定义JSF组件

2023-02-20 15:20:43

启动页组件鸿蒙

2009-11-25 14:36:39

PHP函数usort(

2021-05-29 16:12:00

通信协议设备
点赞
收藏

51CTO技术栈公众号