【前端】使用jQuery封装一套UI组件 - 级联选择器组件

简介: 本篇文章来讲解下级联选择器组件级联选择器,在实际项目中也是比较常用的组件,比如:省市区三级关联,上下级联动等最后面会附上全部代码
作者:小5聊基础
简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑
编程原则:Write Less Do More

GI2F.gif

【级联选择器特点】

1)级联选择器,可以多层展开

2)当没有子集时,则不显示展开下级箭头

3)当有子集时,则有显示展开下级的向右箭头

4)没有限制的情况下,可以无限展开

5)json格式可以定义为

{
    text:'一级文本',
    value:'值,也可以是ID唯一值',
    children:[
        {
            text:'二级文本',
            value:'ID值',
            children:[]
        }
    ]
}

【级联选择器布局设计】

1)先设置一个父级div,宽度设定为200px,高度和行高为35px,同时设定文本超过宽度隐藏,并设置决定定位,占一个空间位置,同时也是为了给子元素一个相对定位参考

2)再设置一个箭头向下的默认图标,这里通过css样式的方式设置一个箭头图标,有个小技巧,就是设置一个div高宽度为0,但是边框有值得情况,只显示其中一个方向得边框就可以出现箭头,其他三个边框设定为透明即可,如下

image.png

<div style="margin-left:100px;display:inline-block;width:0;height:0;border-top: 30px solid #aaa;border-right: 30px solid #ccc;border-bottom: 30px solid #999;border-left: 30px solid #555;">

</div>

<div style="margin-left:100px;display:inline-block;width:0;height:0;border-top: 30px solid #aaa;border-right: 30px solid transparent;border-bottom: 30px solid transparent;border-left: 30px solid transparent;">

</div>

3)接着设置一个关键弹窗div,宽度设定为200px,最小高度为150px,最大高度为300px

4)然后就是选项div,设置内边距以及选项hover样式,同时在左右边设置一个小箭头

image.png

.ci-arrow {
    position: absolute;
    top: 10px;
    right: 10px;
    border: 2px solid #999;
    width: 8px;
    height: 8px;
    border-left: none;
    border-bottom: none;
    transform: rotate( 45deg);
}

5)同时在弹出div外再嵌套一个父级div设置阴影,大概原型就出来了

image.png

6)滚动条样式设置

image.png

/* 设置滚动条的样式 */
::-webkit-scrollbar {
    width: 6px;
}
/* 滚动竖线 */
::-webkit-scrollbar-track {
    border-radius: 6px;
}
/* 滚动条滑块 */
::-webkit-scrollbar-thumb {
    border-radius: 6px;
    background: rgba(0,0,0,0.1);
}
    ::-webkit-scrollbar-thumb:window-inactive {
        background: rgba(255,0,0,0.4);
    }

【级联选择器交互】

1)定义一个json数组值,用于遍历动态生成下拉选项值

2)先绑定文本框得点击事件,点击后先动态生成一级选项,并弹出显示,同时箭头也变为向上。切换可以用一个flag来做判断,隐藏和显示

3)循环添加选项逻辑<br/>
如果有子集,那么选项添加一个向右的箭头<br/>
完成选项循环后,给选型绑定一个点击事件<br/>
如果选项有子集,那么就再次调用循环选项方法,动态生成,以此类推<br/>
特别是多层嵌套,必须给每个选项添加一个index下标,格式:index|index|...

image.png

【全局代码】

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>cascader级联选择器组件</title>
    <style>
        body, html {
            margin: 0;
            padding: 0;
            font-size: 100%;
        }
    </style>
</head>
<body>

    <style type="text/css">
        .cascader-box {
            position: relative;
            font-size: 15px;
            color: #555;
        }

        .cascader-text-div {
            width: 178px;
            height: 35px;
            line-height: 35px;
            border: 1px solid #c0c4cc;
            padding: 0 10px;
            cursor: pointer;
        }

        .cascader-arrow-down {
            width: 0;
            height: 0;
            border-top: 8px solid #aaa;
            border-left: 8px solid transparent;
            border-right: 8px solid transparent;
            float: right;
            margin-top: 15px;
        }

        .cascader-arrow-up {
            width: 0;
            height: 0;
            border-bottom: 8px solid #aaa;
            border-left: 8px solid transparent;
            border-right: 8px solid transparent;
            float: right;
            margin-top: 15px;
        }

        .cascader-area {
            width: 200px;
            height: 172px;
            box-shadow: 0 0 13px #ccc;
            position: absolute;
            left: 0px;
            top: 40px;
        }

        .cascader-div {
            position: absolute;
            top: 0px;
            left: 0px;
            width: 198px;
            border: 1px solid #c0c4cc;
            background: #fff;
            min-height: 150px;
            z-index: 10;
            height: 100%;
            overflow: auto;
        }

        .cascader-item {
            padding: 0 10px;
            height: 35px;
            line-height: 35px;
            cursor: pointer;
            position: relative;
        }

            .cascader-item:hover {
                background: #e3e3e3;
            }

        .cascader-item-action {
            background: #e3e3e3 !important;
        }

        .ci-arrow {
            position: absolute;
            top: 10px;
            right: 10px;
            border: 2px solid #999;
            width: 8px;
            height: 8px;
            border-left: none;
            border-bottom: none;
            transform: rotate( 45deg);
        }

        .cascader-scrollbar {
            scrollbar-face-color: #fcfcfc;
            scrollbar-highlight-color: #6c6c90;
            scrollbar-shadow-color: #fcfcfc;
            scrollbar-3dlight-color: #fcfcfc;
            scrollbar-arrow-color: #240024;
            scrollbar-track-color: #fcfcfc;
            scrollbar-darkshadow-color: #48486c;
            scrollbar-base-color: #fcfcfc
        }

        /* 设置滚动条的样式 */
        ::-webkit-scrollbar {
            width: 6px;
        }
        /* 滚动竖线 */
        ::-webkit-scrollbar-track {
            border-radius: 6px;
        }
        /* 滚动条滑块 */
        ::-webkit-scrollbar-thumb {
            border-radius: 6px;
            background: rgba(0,0,0,0.1);
        }
            ::-webkit-scrollbar-thumb:window-inactive {
                background: rgba(255,0,0,0.4);
            }
    </style>
    <div style="width:600px;height:500px;background:#fff;padding:10px;margin:0 auto;margin-top:30px;border-radius:10px;box-shadow:0 0 13px #ccc;">
        
        <div class="cascader-box" style="margin-top:200px;">
            <div id="cascader2" class="cascader-text-div">
                <span>请选择所属值</span>
                <div class="cascader-arrow-down"></div>
            </div>

            <div class="cascader-area" style="display:none;"></div>
        </div>
    </div>



</body>
</html>

<!--交互js-->
<script src="https://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
    $(function () {

        var jsonArr = [
            {
                text: '一级文本',
                value: '1',
                children: [
                    {
                        text: '二级文本1',
                        value: '1',
                        children: []
                    },
                    {
                        text: '二级文本2',
                        value: '2',
                        children: [
                            {
                                text: '三级文本1',
                                value: '1',
                                children: []
                            },
                            {
                                text: '三级文本2',
                                value: '2',
                                children: []
                            },
                        ]
                    },
                    {
                        text: '二级文本3',
                        value: '3',
                        children: []
                    }
                ]
            },
            {
                text: '一级文本2',
                value: '2',
                children: []
            },
            {
                text: '一级文本3',
                value: '3',
                children: [
                    {
                        text: '二级文本1',
                        value: '1',
                        children: []
                    },
                    {
                        text: '二级文本2',
                        value: '2',
                        children: []
                    }
                ]
            },
            {
                text: '一级文本4',
                value: '4',
                children: []
            },
            {
                text: '一级文本5',
                value: '5',
                children: []
            },
            {
                text: '一级文本6',
                value: '6',
                children: []
            },
            {
                text: '一级文本7',
                value: '7',
                children: []
            }
        ];

        function loadData(level, index) {

            var dom = $('<div></div>');
            dom.addClass("cascader-div cascader-scrollbar");

            if (level == 2) {
                dom.css({ "left": (200 - 1), "zIndex": 10 - level });
            }
            else if (level == 3) {
                dom.css({ "left": (400 - level - 1), "zIndex": 10 - level });
            }

            var json = jsonArr;
            if (level == 2 && index != undefined) {
                json = jsonArr[index].children;
            }
            else if (level == 3 && index != undefined) {
                var ids = index.split('|');
                json = jsonArr[ids[0]].children[ids[1]].children;
            }

            for (var i = 0; i < json.length; i++) {
                var data = json[i];
                var option = $('<div><span></span></div>');
                option.addClass("cascader-item");
                option.attr('data-value', data.value);
                option.attr('data-level', level);
                if (level == 1) {
                    option.attr('data-index', i);
                }
                else {
                    option.attr('data-index', index + "|" + i);
                }
                option.attr('data-length', data.children.length);

                $("span", option).eq(0).html(data.text);

                if (data.children.length > 0) {
                    option.append('<span class="ci-arrow"></span>');
                }

                dom.append(option);
            }

            $(".cascader-area").append(dom);
        }

        $("#cascader2").click(function () {

            var flag = $(this).attr('data-flag');
            if (flag == undefined || flag == "close") {
                flag = "open";
                $(".cascader-area").show();
                $(".cascader-arrow-down").removeClass("cascader-arrow-down").addClass("cascader-arrow-up");
            }
            else {
                flag = "close";
                $(".cascader-area").hide();
                $(".cascader-arrow-up").removeClass("cascader-arrow-up").addClass("cascader-arrow-down");
            }
            $(this).attr('data-flag', flag);

            loadData(1);
        });

        function itemEvent() {
            $(document).on("click", ".cascader-item", function () {
                var level = parseInt($(this).attr('data-level'));
                var index = $(this).attr('data-index');
                var length = parseInt($(this).attr('data-length'));

                var parent = $(this).parent();
                $(".cascader-item", parent).removeClass('cascader-item-action');
                $(this).addClass('cascader-item-action');

                $(".cascader-div").eq(level).remove();
                if (parseInt(length) > 0) {
                    var next_level = level + 1;
                    loadData(next_level, index);

                    $(".cascader-area").css({ "width": next_level * 200 - next_level });
                }
                else {

                    $(".cascader-area").css({ "width": level * 200 - level });
                }
            });
        }
        itemEvent();

    })
</script>
相关文章
|
11天前
|
缓存 搜索推荐 索引
「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用
在鸿蒙应用开发中,Image 组件用于加载和显示图片资源,并提供多种属性来控制图片的显示效果和适配方式。本篇将带你学习如何在鸿蒙应用中加载本地和远程图片、设置图片样式以及实现简单的图片轮播功能。
51 7
「Mac畅玩鸿蒙与硬件12」鸿蒙UI组件篇2 - Image组件的使用
|
3天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
JavaScript 前端开发
jQuery 选择器
jQuery 选择器
30 2
|
2月前
|
JavaScript 索引
jQuery 选择器
jQuery 选择器
40 5
|
14天前
|
自然语言处理 开发者
「Mac畅玩鸿蒙与硬件11」鸿蒙 UI 组件篇1 - Text 和 Button 组件详解
本篇将详细介绍鸿蒙应用开发中的 Text 和 Button 组件。通过本篇内容,你将学习如何使用 Text 组件显示文本、格式化文本样式,以及如何使用 Button 组件处理点击事件并自定义样式。掌握这些基本组件的用法将为后续的 UI 开发奠定基础。
41 4
「Mac畅玩鸿蒙与硬件11」鸿蒙 UI 组件篇1 - Text 和 Button 组件详解
|
2月前
|
前端开发
【前端web入门第四天】01 复合选择器与伪类选择器
本文档详细介绍了CSS中的复合选择器与伪类选择器。复合选择器包括后代选择器、子代选择器、并集选择器和交集选择器,能够更精确地定位和样式化元素。后代选择器用于选中某元素的所有后代,子代选择器仅选中直接子元素。并集选择器可为多个标签设置相同样式,而交集选择器则选中同时满足多个条件的元素。此外,还介绍了伪类选择器,如鼠标悬停效果和超链接的不同状态。
64 32
【前端web入门第四天】01 复合选择器与伪类选择器
|
25天前
|
JavaScript 前端开发
jQuery 选择器
jQuery 选择器用于操作 HTML 元素,支持基于 id、类、类型、属性等条件选择元素。它扩展了 CSS 选择器的功能,并使用 $() 符号。例如,$(&quot;p&quot;) 选取所有段落元素,而 $(&quot;button&quot;).click(function(){ $(&quot;p&quot;).hide(); }) 实现点击按钮后隐藏所有段落。
|
30天前
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
108 0
|
2月前
|
JavaScript 前端开发 CDN
jQuery学习记录--jQuery语法,选择器,事件及hide(),show(), toggle()
本文是关于jQuery的学习笔记,涵盖了jQuery的简介、语法、选择器、事件处理以及hide()、show()、toggle()等方法的使用。
jQuery学习记录--jQuery语法,选择器,事件及hide(),show(), toggle()
|
2月前
|
前端开发
前端基础(四)_CSS层叠样式表_什么是css_css样式的引入方式_样式表的优先级_样式选择器
本文详细介绍了CSS(层叠样式表)的基本概念、语法规则、引入方式、样式表的优先级和样式选择器。文章解释了CSS的作用,展示了如何在HTML中通过行内样式、内部样式和外部样式引入CSS,讨论了不同CSS选择器的优先级和如何确定最终的样式应用。此外,还强调了使用`!important`规则时的优先级高于行内样式。
83 1