A Simple UI Library for ZX

Overview

Moye

文档 与 demo

支持状态

disabled/readonly/valid/invalid/success/failure...各种状态切换手动操作?NO!

moye支持状态切换,我们新增了以下方法,让你不再感到状态困扰!

  • addState()
  • removeState()
  • hasState()

支持皮肤

现在,我们可以不同的控件实例添加皮肤了!同一页面下的多个控件实例也可以有不同的表现形式,为复杂页面使用moye提供了可能性!

支持插件

控件功能太少又不能直接改moye

moye开始支持插件plugin,激活控件潜能!快来写个插件支持一下!

控件功能太多体积太大?

moye通过`插件机制,逐步将控件的附加功能拆解成插件。抛弃用不上的,要你想要的,

全面基于jquery

由于百度大搜索页面中全面应用jquery,其他的各个产品线也在迁移到jquery,我们决定也使用jquery作为基础库。这可以减少moye整体代码量,也可以提供更好的易用性

jquery为我们提供了大量的基础方法,原有的moye/lib库中大量的基础函数被移除或者由jquery完成实现。

更丰富的DEMO与API文档

我们花了大量精力重构了moye的demo。所有控件都有详细的代码示例和说明文档。

get started

Comments
  • 关于组件规范的几个想法,大家看下

    关于组件规范的几个想法,大家看下

    组件类

    1. 建议给出一个具体的指导风格,比如使用Control.extend()扩展原型。

    2. 接口规范。

      一方面可以统一api,另一方面,可以更好在业务层面做控制。目前想到的一个必须实现的接口。 @jinzhubaofu @chriswong 看看呢,缺少这个规范,感觉对贡献者有点疑问。

      prototype.dispose()  释放资源
      

    版本控制

    根据之前沟通,使用上可以分为最新版,带版本号两种方式。版本号和release的三位号码一致。如:

    require('ui/tabs');   //最新版
    require('ui_0.6.8/tabs');  //带版本号
    

    其中moye组件最新版前缀为'ui', 带版本号前缀格式为'ui_版本号'

    求拍。

    opened by jpssff 29
  • 控件领养登记

    控件领养登记

    目前moye有以下控件, 欢迎大家前来领养:

    ~~按钮 Button~~ ~~日历控件 Calendar ~~ ~~输入框 TextBox~~ ~~城市选择 City~~ ~~分页控件 Pager~~ ~~单选/复选 Raido / Checkbox~~ ~~浮层提示 Tip + 浮动提示 FloatTip~~ ~~下拉选项 Select~~ ~~图片延迟加载 Lazy~~ ~~选 项 卡 Tabs~~ ~~对 话 框 Dialog~~ ~~星号评级 Rating~~ ~~图片轮播 Slider~~


    补充一些

    图片上传 PicUploader 滚 动 条 ScrollBar 农历控件 Lunar 回到顶部 BackTop 表单 Form 标签 Tag

    呃, 如果无人领养, 控件就要被移除了呢~

    opened by jinzhubaofu 14
  • RoadMap讨论

    RoadMap讨论

    整理以下需求供大家讨论。优先级不分先后。

    近期需求

    (1) 新控件 - 表单、数据校验

    由于中间页项目中有大量的表单需求,moye需要给予支持。

    主要功能可能包含:

    1. 数据字段校验
    2. 提交事件处理

    针对这两项功能,我们需要完成以下工作:

    1. 设计InputControl基类(接口)
    2. 整理目前已有的输入类型控件进行一次重构,使其继承InputControl基类(或实现InputControl接口)
    3. 补充一些输入控件,例如Text, TextArea;

    具体的设计/实现问题另开issue讨论。

    (2) 通用 - 控件状态与皮肤

    控件状态

    常用的控件状态有禁用 只读,因此我们计划为Control添加以下方法来支持

    • addState(state) 自动添加样式state-${state}
    • removeState(state) 自动移除样式state-${state}

    控件皮肤

    目前moye控件只能通过覆盖less预定义变量重新生成样式,来生成自定义样式。这种方式会造成样式冗余。我们通过配置字段skin来添加自定义皮肤。

    options: {
        skin: [ 'custom-skin-1', 'custom-skin-2' ]
    }
    

    如果按上边示例添加skin参数,控件自动获得样式skin-${skin}

    (3) 通用 - 控件插件

    由于moye自身定位是 的小清新控件库,我们不能像esui一样集成大量功能到控件中。因此,考虑是否可以控件功能细化,以插件形式提供。例如:

    var placeHolder = require('moye/text-placeholder');
    var passwordStrength = require('moye/text-password-strength');
    var text = new Text({
        onChange: function () { ... }
    });
    text.use(placeHolder( ... )).use(passwordStrength( ... ));
    

    以上代码可以提供一个输入框控件,带有placeholder兼容功能以及密码强度验证功能

    var validate = require('moye/validate');
    var form = new Form({
        onSubmit: function () { ... }
    });
    
    form.use(validate({ ... }));
    

    以上代码可以提供一个表单,带有校验功能

    插件化既可以保持控件本身功能精简,又利用于扩展功能。

    (4) 通用 - jQuery化

    由于大搜索卡片全面使用jQuery,因此我们的lib绝大部分的功能都是冗余的。因此,我们需要开发一个基于jQuery的moye版本。

    (5) lib.observable的事件对象规范化

    现在observable对象在fire事件时,传入的事件对象不支持这些方法或对象:

    • preventDefault() 阻止默认行为
    • isPeventDefault() 是否已经阻止了默认行为
    • stopImmediatePropagation() 立即阻止后续监听者的回调
    • stopPropagation() 停止事件冒泡
    • target对象

    这些方法或对象在构建复杂逻辑时是必要的,特别是preventDefault()

    中远期需求

    中间页控件规范化

    在中间页项目使用标准样式、标准交互的控件

    可以与中间页栅格化一同进行

    控件库

    对于中间页项目,我们推荐大家使用统一、标准的控件。当然,在某些情况下我们的标准库不能满足需求。我们希望可以形成一套机制,在满足基于统一接口的条件下,收录多种多样的控件。

    欢迎大家讨论,有遗漏的问题欢迎大家补充

    opened by jinzhubaofu 9
  • 关于组件接口名称和文件合并

    关于组件接口名称和文件合并

    • 建议原型上的私有方法名称都以_开头,并补充在规范上,提醒开发者不要调用下划线开头的私有方法;或者,提供一个interface方法,指定哪些方法可以公开:
    Control.extends(一堆方法).interface(['fn1', 'fn2', ...])  //fn1,fn2都在前面extends参数的对象中,但只有这些方法真正扩展到原型上了。
    
    • libControl能否合并?仅仅因为可以在使用中减少一个请求 :)

    大家看下呢?

    opened by jpssff 9
  • 【Slider】组件实现及单测问题

    【Slider】组件实现及单测问题

    1. 注释与实现不一致,如下配置项描述可以删除 @property options.prefix选项不存在 @property {HTMLElement=} options.stage 控件动画容器, @property {HTMLElement=} options.prevElement prev按钮的容器, @property {HTMLElement=} options.nextElement next按钮的容器, @property {HTMLElement=} options.indexElement 轮播索引按钮的容器,会将第一级子元素设为索引元素 @property {Function=} options.onChange 当播放索引改变时的事件
    2. var index = target.getAttribute('data-index') 为啥ie7下会取出数字了?按规范来,都是字符串,用ie7模式下看也都是字符串。。
    3. less 样式问题 transition按规范来必须指定属性,不能为all 此外值写错了: all 0.3s 0 linear 应为 all 0.3s linear 0 (0可以省略,默认值)
    4. capacity 去掉,通过stage容器判断其children数量获取
    5. stage容器通过 data-stage 来获取,而不是通过class: ui-slider-stage 即HTML模板,通过 data-stage 属性标识 stage 容器,而不是通过组件自动生成的 ui-slider-stage 样式
    6. 把Slider 的 privates 定义方法提取出来放在prototype下,私用方法通过annotation标注
    7. 删掉 Slider 的 refresh 方法,组件repaint/render/setXX方法可以替代,这个方法没感觉有存在的必要性,此外可以保持组件 API 一致性
    8. Slider 自动轮播模式,自动强制 circle 设为 true,而不受外部传入的 circle 值影响
    9. SliderAnim 的 lineer 改成 linear
    10. SliderAnim 的 isBusy 实现逻辑有问题 this.timer !== 0; 改成 !!this.timer;
    11. SliderAnim 访问 Slider 的 count 属性 改成 capacity
    12. 修复测试用例无法通过问题及新增测试用例
    opened by wuhy 6
  • 关于自动引入ui css

    关于自动引入ui css

    我希望moye在使用时,尽量对开发者透明,自动引入css,即在require某个ui时,将整个css文件也放到页面上(所有ui的style已经合并到一个css文件)。

    从引入时机来说,Control被require时,将css加到页面比较合适,但在Control中做这个事情似乎又不雅观,大家觉得如何实现比较好呢?

    opened by jpssff 6
  • 单选/复选 Raido / Checkbox需求汇总

    单选/复选 Raido / Checkbox需求汇总

    Radio: 百度汽车:http://car.baidu.com/ image 百度健康: http://jiankang.baidu.com/Drug/index image 百度教育:http://jiaoyu.baidu.com/query/juhe?categoryID=010202 image Checkbox: 百度财富:http://caifu.baidu.com/fund?tn=NONE&zt=self&fr=-&qid=1422594395030340 image

    opened by xhong0 3
  • .extend 创建类中的 parent 问题

    .extend 创建类中的 parent 问题

    opened by mescoda 2
  • Smarty预渲染功能

    Smarty预渲染功能

    为什么需要预渲染模板?

    moye广泛使用在中间页和卡片系统中,这两类页面对于性能要求非常高。在这种情况下,需要在尽可能早的时间点上提供用户正确和稳定的视觉展现。而使用js脚本来完成首屏元素的生成/渲染是不可取的。

    因此,我们希望在组件的DOM是直接由smarty模板渲染完成的。我们通过实现一系列smarty函数来提供一种快捷实用的构建首屏控件dom。这样做有几个好处:

    1. 性能更好
    2. moye控件在页面中经常被重复使用多次,依照Don’t Repeat Yourself原则,我们应当把这些代码抽象出来,以减少重复代码,降低维护成本。
    3. moye控件内部结构复杂,手动编写其dom结构对于使用者而言是非常痛苦的。难以记忆的同时,使用者对于控件的内部dom结构的过度关注也违背了开闭原则。对于一个控件来讲,应当支持对它的扩展,而不是去修改它。

    如何使用预渲染模板

    首先,需要在smarty模板中引入我们提供的函数库,例如

    {%include file="path/to/moye/tpl/Button.tpl"%}
    

    其次,生成一个控件配置参数。例如从某个配置文件中读取:

    
    // ui.json.tpl
    
    {
      "btn": {
        "id": "btn",
        "type": "Button",
        "text": "test"
      }
    }
    
    // index.tpl
    {%include file="path/to/moye/tpl/Button"%}
    {%include file="./ui.json.tpl" assign="ui"%}
    {%$ui = $ui|json_decode:true%}
    

    由于我们的参数配置文件也是一个smarty模板,所以我们可以在这个文件中尽情使用smarty的各项功能。

    例如:

    {
      "btn": {
        "id": "btn",
        "type": "Button",
        "text": {%if $a > 100%}"test"{%else%}hello, world{%/if%}
      }
    }
    

    最后,通过下边这条语句就可以得到Buttondom结构了:

    {%call Button data=$ui.btn%}
    

    渲染的结果:

    <button type="button" class="ui-button" data-ui-id="btn">test</button>
    

    如何开发控件的smarty预渲染函数

    原则上,我们只生成首屏可视元素,以及必要的属性。首屏不可见的元素(如浮层)可以交由javascript来完成渲染

    我们提供了一个base.tpl的基础函数库,提供了一些基础的方法,例如:

    1. getPartClassName()等同于control.helper.getPartClassName()
    2. getStateClassName()等同于control.helper.getStateClassName()

    小伙伴可以使用这两个函数来辅助构建自己的控件模板。

    示例:Button模板函数

    {%function name=Button%}{%strip%}
    <button type="{%if isset($data.mode)%}{%$data.mode|escape:html%}{%else%}button{%/if%}"
        class="{%getPartClassName data=$data%}"
        {%if isset($data.id)%}data-ui-id="{%$data.id%}"{%/if%}
        {%if isset($data.disabled) and $data.disabled%}disabled="disabled"{%/if%}>
        {%$data.text|escape:none%}
    </button>
    {%/strip%}{%/function%}
    

    PS: 目前我们采用的提供模板函数的方式来实现。在编写过程中,操作数据是比较复杂的。同时,如果想要实现与javascript同等复杂逻辑的dom结构,也是比较痛苦的事情 。所幸,强大的smarty也提供了插件机制,我们也可以通过编写smarty插件的方式来实现上述的功能。感兴趣的同学可以调研一下。

    opened by jinzhubaofu 2
  • Moye2.0 RoadMap讨论

    Moye2.0 RoadMap讨论

    整理了一下本次2.0版本需要完成的功能:

    1. 基于jQuery的重构
    2. 支持皮肤、状态
    3. 支持插件
    4. 拆分lib库
    5. 新的控件生命周期机制
    6. 新的demo站点
    7. 新的全局api: moye.create() / moye.get() / moye.init()
    8. 新的控件:Form / Tag等等
    9. 与ecomui相一致的api设计
    10. 新的less编写模式,提供大量的预置变量,以提供灵活的样式自定义调整
    11. smarty预渲染模板

    在之前一段时间里我们已经完成了其中的绝大部分开发工作,接下来我们的几个迭代将要继续完成的工作:

    1. 完成smarty预渲染模板的开发 预计时间:0309 ~ 0322
    2. 完成单测的编写 预计时间:0323 ~ 0405
    3. 完成基于jsdoc3的api文档编写与生成 预计时间:0406 ~ 0419
    4. 视觉设计标准化 预计时间:0406 ~ 0419

    大家看是否OK,如有遗漏请大家补充。

    opened by jinzhubaofu 2
  • TextBox控件需求汇总

    TextBox控件需求汇总

    1. 表单元素, 拥有属性name

    2. 状态: 正常 / 聚焦(:focus) / 禁用(disabled) / 只读(readonly)

      image

      image

    3. 校验功能

      1. 按配置进行校验
      2. 控件状态 校验成功(valid) / 校验失败(invalid) / 校验中(validating)

      image

    4. placeholder兼容

    5. 自动提示

      image

    6. 多行文本输入

    opened by jinzhubaofu 2
  • 轮播图slider以opacity方式切换的bug

    轮播图slider以opacity方式切换的bug

    轮播图在opacity动画切换模式下,存在两个bug: 1、首屏展示的最后一张图片(应该为第一张) 原因:绝对定位图片叠加,默认最后一张在最顶层

    2、IE8-轮播不好使,脚本错误 原因:https://github.com/ecomfe/moye/blob/master/src/ui/SliderAnim.js#L513, lib.type方法有兼容性问题。

    opened by lizhaoxia 0
  • [Popup] Popup的显示目标位置变化时不能自动重新定位

    [Popup] Popup的显示目标位置变化时不能自动重新定位

    如何复现:

    1. 假设,target在正常文档流,相对于body的offsetTop是500px,此时Popup已经显示出来
    2. 接下来,把target之前的内容清空,这时target的offsetTop就会变成0
    3. 这时候Popup还停留在原地

    这个问题的原因在于Popup的main元素直接挂载在body上。目前使用了Popup的组件都有这个问题。

    我想到了两个办法

    1. 把popup挂载到组件的main元素内部。这个方案伤筋动骨,动作太大。
    2. 给body模拟一个offsetHeightChange的事件,性能上可能有问题

    大家看看有什么好办法 @wuhy @michaelliu90316

    opened by jinzhubaofu 3
  • 支持ps上线使用

    支持ps上线使用

    主要修改点:

    1. ecl-ui前缀改到Gruntfile中定义,同时修改了js、less、test代码
    2. grunt中添加了用于www上线的两个任务:编译和测试,单测模板中使用线上的jQuery和esl,尽量和ps环境一致。
    3. 将单个组件的css、js合并打包,这样模板开发时就不用关心css的引入问题了,同时也做到了按需引入,不浪费带宽;
    4. 将lib、config(这个新增用于变量定义)和Control三个模块在grunt任务中打包到一起了。

    grunt test-online 试试先,文档后续补上。

    opened by jpssff 3
Releases(0.7.5)
Owner
Baidu EFE team
Baidu EFE team
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
Simple Library implemented using HTML, CSS and JavaScript. This is a simple implementation of JavaScript Modules of ES6.

Awesome-books A single page project with the porpuse of storing books' titles and authors. Built With CSS, HTML & Javascript. How to run in your local

Saadat Ali 7 Feb 21, 2022
A simple library to view large images up close using simple mouse interaction, and the full screen.

Intense Images A stand alone javascript library for viewing images on the full, full screen. Using the touch/mouse position for panning. Here's a demo

Tim Holman 2.6k Dec 31, 2022
Simple format that serves it's one and only purpose and that's creating simple task list everywhere where you can write plain text

SWTF (Simple Worklog Task Format) Simple format that serves it's one and only purpose and that's creating simple task list everywhere where you can wr

null 4 Apr 4, 2022
A simple react project that contain a single page application (SPA) And a simple caculator to make some calculation and there is a section you can see some Math quotes. Ⓜ💯

A simple react project that contain a single page application (SPA) And a simple caculator to make some calculation and there is a section you can see some Math quotes. Ⓜ??

Reem janina 7 May 31, 2022
In this project, I built a simple HTML list of To-Do tasks. This simple web page was built using Webpack, creating everything from a JavaScript index file that imported all the modules and assets

To Do List In this project, I built a simple HTML list of To-Do tasks. This simple web page was built using Webpack, creating everything from a JavaSc

Andrés Felipe Arroyave Naranjo 10 Mar 31, 2022
In this project, we built a simple HTML list of To Do tasks. This simple web page was created using webpack and served by a webpack dev server.

To do list In this project, we built a simple HTML list of To Do tasks. This simple web page was created using webpack and served by a webpack dev ser

Jesús Vázquez 8 Dec 21, 2022
In this project, I build a simple HTML list of To Do tasks. This simple web page will be built using webpack and served by a webpack dev server.

To Do list with Webpack In this project, I build a simple HTML list of To Do tasks. This simple web page will be built using webpack and served by a w

Sidney Kaguli 8 Aug 23, 2022
In this project, I built a simple HTML list of To Do tasks. The list is styled according to the specifications listed later in this lesson. This simple web page is built using webpack and served by a webpack dev server.

Awesome books:JavaScript Using Modules In this project, I built a simple HTML list of To Do tasks. The list is styled according to the specifications

 Hassan Momanyi 10 Nov 25, 2022
This is a simple Image popup Jquery plugin. With a very simple configuration, you can show a popup on your webpage. By the way, this plugin works after page load.

Jquery-SingleImagePopup This is a simple Image popup Jquery plugin. With a very simple configuration, you can show a popup on your webpage. By the way

Rajan Karmaker 1 Aug 22, 2022
A Simple Node.js Naive Bayes Library.

Idnaive Idnaive is A Simple Node.js Naive Bayes Library. ✅ Multilanguage Stemming (Indonesia + English) ✅ Out String Filter ✅ Punctuation Filter ✅ Fix

FNC 23 Oct 13, 2022
Favicon.js - A simple javascript library to change the page favicon.

favicon.js A simple javascript library to change the page favicon. How to use To use favicon.js, include it in your head element: <head> <script src

null 0 Dec 26, 2021
Ping.js is a small and simple Javascript library for the browser to "ping" response times to web servers in Javascript

Ping.js Ping.js is a small and simple Javascript library for the browser to "ping" response times to web servers in Javascript! This is useful for whe

Alfred Gutierrez 353 Dec 27, 2022
A simple but powerful tweening / animation library for Javascript. Part of the CreateJS suite of libraries.

TweenJS TweenJS is a simple tweening library for use in Javascript. It was developed to integrate well with the EaselJS library, but is not dependent

CreateJS 3.5k Jan 3, 2023
A Simple UI Library for ZX

Moye 文档 与 demo 支持状态 disabled/readonly/valid/invalid/success/failure...各种状态切换手动操作?NO! moye支持状态切换,我们新增了以下方法,让你不再感到状态困扰! addState() removeState() hasStat

Baidu EFE team 75 Dec 6, 2022
Pure and simple virtual DOM library

Maquette Maquette is a Javascript utility which makes it easy to synchronize the DOM tree in the browser with your data. It uses a technique called 'V

AFAS Software 736 Jan 4, 2023
A form management library for SolidJS that is very lightweight and simple!

solform A form management library for SolidJS that is very lightweight and simple! Why solform Very easy, fast, lightweight and powerful! It has built

Okan YILDIRIM 16 Nov 15, 2022
A dead simple JWT-based authentication library for Next.js framework.

nexauth A dead simple JWT-based authentication library for Next.js framework. Getting Started Visit https://betagouv.github.io/nexauth/#/install to ge

beta.gouv.fr 12 Aug 2, 2022
A simple, no-hassle library for efficiently querying Your Enrollment Services.

@vanderbilt/yes-api A simple, no-hassle library for efficiently querying Your Enrollment Services. Created by Dylan Hanson (jovialis) NOTE: THIS MODUL

Dylan Hanson 2 Jan 25, 2022