精华内容
下载资源
问答
  • 移动端组件库其他

    2019-05-05 22:59:48
    Framework7 Full Featured Framework For Building iOS, Android & Desktop Apps ...FrozenUI 专注于移动web的UI框架,基于腾讯手机QQ规范 ...MUI-最接近原生APP体验的高性能前端框架 http://dev.d...
    
    
    
    展开全文
  • 介绍cube-ui是一个基于Vue.js实现的移动端组件库,它是由滴滴内部组件库精简提炼出来的,追求接近原生的体验!特性质量可靠由滴滴内部组件库精简提炼而来,经历了业务一年多的考验,并且每个组件都有充分单元测试,...

    介绍

    cube-ui是一个基于Vue.js实现的移动端组件库,它是由滴滴内部组件库精简提炼出来的,追求接近原生的体验!


    4a96957d55c1f6bb1a0b7f404e3d6e68.png

    特性

    • 质量可靠

    由滴滴内部组件库精简提炼而来,经历了业务一年多的考验,并且每个组件都有充分单元测试,为后续集成提供保障。

    • 体验极致

    以迅速响应、动画流畅、接近原生为目标,在交互体验方面追求极致。

    • 标准规范

    遵循统一的设计交互标准,高度还原设计效果;接口标准化,统一规范使用方式,开发更加简单高效。

    • 扩展性强

    支持按需引入和后编译,轻量灵活;扩展性强,可以方便地基于现有组件实现二次开发。


    a525fadeb1bee540ec282152a64428cc.png

    Github

    此组件库在Github上star数达6k+,还是非常受人欢迎的,至今仍在积极维护

    https://github.com/didi/cube-ui/

    快速上手

    官方文档提供了新手教程项目,感兴趣的可以去看看

    • 脚手架

    如果你正在使用新版本的 Vue CLI vue-cli@3,那么推荐你直接使用 vue-cli-plugin-cube-ui 插件。在你初始化完项目后直接执行 vue add cube-ui 即可

    如果你打算用在一个新项目中使用 cube-ui,可以通过官方提供的一套基于 vue-cli 实现的脚手架模板去初始化 cube-ui 项目的配置和基础代码,这样你就可以忽略安装步骤,直接看使用部分。

    • 安装

    此安装部分只针对于 vue-cli < 3 的情况

     npm install cube-ui --save

    cube-ui 搭配 webpack 2+ 支持后编译和普通编译 2 种构建方式(默认使用后编译),使用前都需要修改应用的依赖和配置。

    其中有一些配置就不在此浪费篇幅,大家直接去官网文档查看

    • 引入

    全部或者按需引入

    import Vue from 'vue'import Cube from 'cube-ui'Vue.use(Cube)

    import { /* eslint-disable no-unused-vars */ Style, Button} from 'cube-ui

    国际化

    cube-ui 默认是用的中文语言包,并且已经注册了。cube-ui 内部也内置了对应的英文语言包,但是你需要如下的逻辑来注册语言包,同时切换至对应的语言。

    import Vue from 'vue' import { Locale } from 'cube-ui' import enUSMessages from 'cube-ui/src/locale/lang/en-US' Vue.use(Locale) // 切换至英语,并且缓存当前语言包 Locale.use('en-US', enUSMessages)

    组件预览

    • 按钮,提供了各种类型、样子、状态以及图标。

    b1fb38d5c76fa49add7029ae451745f4.png

    • Loading

    7b69a17621870acb1fdd3fa0245ffdc4.png

    • Tips

    416dfd6e959251b556f7c4e578978765.png

    • Toolbar

    142dd762be324a001f6532ffcc247003.png

    • TabBar

    7a8eeb426a426cbcaf0eb4e6d839cdc8.png

    • 表单类

    5e5500306529bfbb4c0aa01e4011d7c7.png

    84f0e3fb1882a56749999cf64867fbd7.png

    74bfa510b1c5a7fc7b41252ac9c6491f.png

    6a25b84e0b098c9a8b0c8ed941bd7f19.png

    7939ce9a42a94ad51b729f02332b5f5b.png

    2aa5a5a179e35232b66277f6ac26af08.png

    • 弹出层

    cb45be44c5123813ec8763c6fd1f3d4b.png

    91d20aadc13df584bb8e942161c45e4b.png

    fda503914fdeb21382cf947add47a391.png

    44f581094d5d82643be2acd90b91c760.png

    e074b12aac0b47f5e63c16376d6ba7c1.png

    512264c3fc9b3aa016da0ed00aff2e30.png

    8b02263666d89b5e8cbd1e76ece7db98.png

    c5b8689b2b282510cd15ebc9e31a18fa.png

    da274e68a435dd801c42b5007d700f3e.png

    • 滚动

    6add8eda7856ecc2e9d6ace339bb6889.png

    052cc25b1f72e799a1d805acb2415d36.png

    92b0d792de5099aaad1846f4750df884.png

    d5e84073b9a38935f11640e1803690f1.png

    e5bf6c934966862c72262f881f0e3e89.png

    5f263ff5570086f49a1deae66efad3ea.png

    以上是cube-ui的部分组件预览,可以看出是非常丰富的,基本满足项目的日常开发,其接近原生的追求值得推荐

    总结

    目前的现状是各类框架组件的共同打造的前端生态,但是日常使用最多的还是那些积极维护以及使用人数多的组件,cube-ui作为滴滴内部组件的提炼,其质量还是相当高的,甚至你还可以用它开发出另一个打车App,赶紧去尝试下吧!

    展开全文
  • cube-ui 是由滴滴开源的基于 Vue.js 实现的移动端组件库。 功能特性 质量可靠 由滴滴内部组件库精简提炼而来,经历了业务一年多的考验,并且每个组件都有充分单元测试,为后续集成提供保障。 体验极致 ...

    cube-ui 详细介绍

    cube-ui 是由滴滴开源的基于 Vue.js 实现的移动端组件库。

    功能特性

    • 质量可靠

      由滴滴内部组件库精简提炼而来,经历了业务一年多的考验,并且每个组件都有充分单元测试,为后续集成提供保障。

    • 体验极致

      以迅速响应、动画流畅、接近原生为目标,在交互体验方面追求极致。

    • 标准规范

      遵循统一的设计交互标准,高度还原设计效果;接口标准化,统一规范使用方式,开发更加简单高效。

    • 扩展性强

      支持按需引入和后编译,轻量灵活;扩展性强,可以方便地基于现有组件实现二次开发。

    安装

    npm install cube-ui --save

    使用

    import Vue from 'vue'
    import Cube from 'cube-ui'
    
    Vue.use(Cube)

    按需使用

    import Vue from 'vue'
    import {
      /* eslint-disable no-unused-vars */
      Style,
      Button,
      ActionSheet
    } from 'cube-ui'
    
    Vue.use(Button)
    Vue.use(ActionSheet)
    展开全文
  • 会出现这种情况, 则说明, 用户在滑动组件区域滑动手指的时候, 滑动的范围仍然是在滑动组件的区域里(因为使用了事件委托, e.target是触摸点). 即e.target是外层.wrap的子节点. 所以能正常的触发后面的滑动效果. ...

    iSlider的整体思路是,不考虑边界的情况下,我们实际滑动的时候,其实只有三张图片会出现在我们的视角里,所以首先将滑动的内容外层dom拷贝,然后将这个dom的内容置空:

    doc.innerHTML=""
    复制代码

    然后将当前包含有滑动内容的_prev, _current, _next三个dom节点插入外层dom:this.wrap。滑动到下一张,则之前的_prev被删除,下一张dom被添加进this.wrap;滑动到上一张,则之前的_next被删除,上一张dom被添加进this.wrap。

    /* iSlider构造函数里面其实已经写好this.opts
     * 用户在new这个构造函数的时候,如果传入opts参数
     * 则使用for in 遍历用户传参
     * 然后覆盖掉默认的opts
    **/
    //实例化构造函数
    new iSlider({
        //some configurations...
    })
    
    //构造函数内部
    //关于HTML5 storage的详细介绍,点击。。。
    function iSlider(opts){
        this.opts = {
            //some configurations...
        };
        /* 这里的this.SS其实是引用了sessionStoratge
         * 为什么要使用sessionStorage呢?
         * 假设用户点击列表的详情button
         * 进入详情页面后,退回滑动列表
         * 用户其实是想回到刚刚的滑动位置
         * 而当前的窗口(浏览器)未关闭
         * sessionStorage还保存着
         * 所以用session是最理想的选择
        **/
        this.SS = false;
        //ios使用私密模式,会报错
        try {
            this.SS = sessionStorage;
            this.['spt'] = 1;
        } catch(e){
            this.SS = 0;
        }
        //初始化
        this.init();
    }
    复制代码

    iSlider构造函数的原型对象,定义了init在内的大部分方法:

    //iSlider的原型对象被覆写了
    //我觉得这里其实应该将constructor重新指回iSlider
    iSlider.prototype = {
        //这里介绍几个属性:
        _sesiionKey: location.host + location.pathname,
        _tpl: [],
        _prev: null,
        _current: null,
        _next: null,
        //_sesiionKey, _tpl参数在init中被赋值
        init: function(){
        /* _sesiionKey: location.host + location.pathname
         * 用location作为ID,更有辨识度
        **/
          this._sesiionKey = btoa(encodeURIComponent(this._sessionKey+this.wrap.id+this.wrap.className));
          var lastLocateIndex = parseInt(this.SS[this._sessionKey]);
          //index代表当前图片, 是当前图片的索引值
          /* this.index = ...这句话很重要
           * 假设详情页有一个“回到列表”的button
           * 点击button, 页面被刷新一遍
           * init被重新执行, this.index被重新赋值
           * this.SS[_sessionKey]会在init和prev, next函数中被赋值
          **/
          if(this.SS){
              this.index = (this.opts.lastLocate && lastLocateIndex>=0) ? lastLocateIndex : 0;
          }else {
              //...
          }
          //querySelector查找".wrap"
          //然后this.wrap查找到wrap的dom节点
          //拷贝一份dom给this._tpl,避免对dom直接操作
          this._tpl = this.wrap.cloneNode(true);
          //将外层wrap dom里面的滑动内容返回给_tpl
          this._tpl = this.opts.item ? this._tpl.querySelectorAll(this.opts.item) : this._tpl.children;
          
          //...
          if(this.opts.fullScr){
              //如果是全屏
              //这里添加css样式
              //html,body{...}
          }
          //...
          
          //初始化DOM
          this._setHTML();
          
          //事件委托的方式,绑定事件
          this._bindEvt();
        },
        
    }
    复制代码

    这几个值,是在this._setHTML()中赋值

        _prev: null,    // 上一个节点
        _current: null, // 当前节点
        _next: null,    // 下一个节点
    复制代码

    this._setHTML主要是初始化页面滑动区域的dom节点,这里用到了createDocumentFragment 即dom碎片的方式,优化了性能

    iSlider.prototype = {
        //...
        _setHTML: function(){
            //对页面的滑动区域置空
            this.wrap.innerHTML = ""
            //创建DOM 碎片
            var initDOM = document.createDocumentFragment();
            
            //下面对上述三个属性赋值
            if(this.index > 0){
            //如果index>0,则表示当前节点包含了至少两个
                this._prev = this._tpl[this.index-1].cloneNode(true);
                //前移clientWidth//clientHeight大小
                this._prev.style.cssText += this._getTransform('-'+this.scrollDist+'px'); 
                initDom.appendChild(this._prev);
            }else{
                /* 重新置为null
                 * 主要是为了后面滑动事件时判断
                 * if(this._prev){
                     表示当前页面的上一张存在,
                     则可以往前滑动
                 }else{...}
                **/
                this._prev = null
            }
            this._current =this._tpl[this.index].cloneNode(true);
    
            this._current.style.cssText+=this._getTransform(0);
            
            initDom.appendChild(this._current);
            
            //同理,对_next节点赋值
            if (this.index<this.length-1) {
                this._next=this._tpl[this.index+1].cloneNode(true);
                this._next.style.cssText+=this._getTransform(this.scrollDist+'px');
                initDom.appendChild(this._next)
            }else {
                this._next=null;
            }
    
            this.wrap.appendChild(initDom);
        }
    }
    复制代码

    然后是this._bindEvt函数,该函数将事件绑定到父节点上。即当前页面是全屏滑动的时候,事件绑定在dom上,否则绑定到this.wrap外层dom上。

    /* 这里的"data-stop"属性
     * 我理解为作者的业务代码
     * 即如果target设置了data-stop属性
     * 并且该属性值为"true",就不用阻止默认行为
    **/
    if (this.opts.fullScr || this.opts.preventMove) {
                handlrElm.addEventListener('touchmove', function (e) {
                    e.target.getAttribute('data-stop') !== "true" && e.preventDefault(); 
                }, false);
            }
    复制代码

    _pageInit()函数主要是为每一个滑动dom添加"play"的class, 以及动画回调。

    之后是三个滑动事件, 分别是_touchstart, _touchmove, _touchend.

    _touchstart: 这里有几个变量需要梳理, lockSlide: 标记变量. 如果lockSlide为true, 则表示当前不允许滑动, 即退出之后的_touchmove, 这里有个疑问: 每次_touchstart都会将该变量置为false _touchmove里面的以下判断, 应该是没有必要的?

    _touchmove: function(){
        /*............................*/
        if(e.touches.length !== 1 || this.lockSlide){ 
           return;
        }
    }
    
    复制代码
    _touchstart: function(){
        this._touchstartX = e.touches[0].pageX;
        this._touchstartY = e.touched[0].pageY;
        //初始化触摸位置
        this.touchInitPos = this.opts.isVertical ? e.touches[0].pageY:e.touches[0].pageX;
        //为了避免卡帧的情况出现
        //我们需要清除动画效果
        //判断_next, _prev是否存在
        //存在的话, duration置为0
        //this._current.style.cssText = ...
        if(this._next){
            //
        }
        if(this._prev){
            //
        }
    }
    复制代码

    _touchmove事件。下面这段代码比较有意思 do-while循环, 循环条件是 parent不为null , 且parent不是外层dom .wrap。结束循环的其中一种可能是: parent为this.wrap。会出现这种情况, 则说明, 用户在滑动组件区域滑动手指的时候, 滑动的范围仍然是在滑动组件的区域里(因为使用了事件委托, e.target是触摸点). 即e.target是外层.wrap的子节点. 所以能正常的触发后面的滑动效果.

    还有一种情况. 就是parent为null的时候, 循环终止. 也就是说此时遍历到了document(document.parentNode值为null), 紧接的if判断, 终止touchmove事件. 这种情况只有一种可能, 就是手指滑到了this.wrap的外面.

    _touchmove: function(){
        var parent = e.target;
        do{
            parent = parent.parentNode;
        }while(parent && parent != this.wrap)
        
        if(!parent && e.target != this.wrap){
            return ;
        }
    复制代码

    滑动的时候,需要判断手指滑动方向, 是否与页面滑动方向一致. gx, gy分别代表一个三角形的x, y边. 根据几何知识, 垂直三角形的底边. 哪边长,则边所对应的角大. gx>gy, 则手指滑动方向往x轴倾斜, 即判定手指为横向滑动.

    _touchmove: function(){    
        /*********分割线*************/
        var gx=Math.abs(e.touches[0].pageX - this._touchstartX);
        var gy=Math.abs(e.touches[0].pageY - this._touchstartY);
        if (gx>gy && this.opts.isVertical) { 
            //页面是垂直滑动
            //当前手指在做水平滑动
            this.lockSlide=true;
            return ;
        }else if(gx<gy && !this.opts.isVertical){ 
            //页面是水平滑动
            //当前手指在做垂直滑动
            this.lockSlide=true;
            return ;
        }
    }
    复制代码

    接下来, 就主要是计算偏移量, 如果this.totalDist<0, 那么就露出(不是滑到)下一张, 反之上一张. 这里用到了tranlante3d的属性(启用GPU加速的话).

    接着再详细讲一下_loading函数: 由于图片的大小不一样, 导致加载成功所耗费的时间也不一样, 这里的思想是, 不管后面的图片加载得怎么样, 首先需要保证首张(首屏)图片加载成功, 所以当this.src===imgurl[0]的时候, 清除回调(置为null, 同时也释放了部分内存)

    for (var i=0; i<imgurls.length; i++) {
            imgs[i]=new Image();
            imgs[i].src=imgurls[i];
            imgs[i].onload=imgs[i].onerror=imgs[i].onabort=function (e) {
                loaded++;
                if (this.src === imgurls[0] && e.type === 'load') {
                    clearTimeout(fallback)
                    }
                    checkloaded();
                    this.onload=this.onerror=this.onabort=null;
                }
    }
    复制代码

    [0] iSlider源码

    转载于:https://juejin.im/post/5aa2ccb751882555784d8fae

    展开全文
  • 说实话,最近已经快一年没有接触过原生开发了,随着接触开发微信小程序,接触 Vue 等,也越来越喜欢这种 JS 前端开发,感觉特别好玩。不管是 Vue ,还是 React ,还是微信小程序开发,其实都是大同小异,开发方式也...
  • 最小巧的移动端弹窗组件,toast、alert、confirm,使用原生js,不依赖任何类库,不需要引入任何css文件,只有一个js文件
  • 功能组件创建、位置存放; .vue文件代码 <template> <div class="topHeader"> <div class="headerContent"> <!-- <i class="el-icon-arrow-left"></i> --> <span @cli...
  • 样式的 UI 组件框架,主要用于快速构建移动端单页应用,也就是用我们熟悉的 html+css,javascript 来开发App。 虽然名字和 ionic 有点相似,但 vonic 和 ionic 是两个完全独立的项目,只是在 vonic 样式方面以 ...
  • popup最小巧的移动端弹窗组件,toast、alert、confirm,使用原生js,不依赖任何类库,不需要引入任何css文件,只有一个js文件组件设计为单例模式,在一个打开状态,再次打开另一个,会自动关闭上一个1. toastlet ...
  • 移动端横向picker组件

    2019-01-05 17:41:30
    使用vue开发移动端横向滚动的picker组件,不依赖任何框架和库,使用原生JS编写,组件代码约300行,代码难度一般。
  • vue移动端日历组件封装

    千次阅读 2019-05-21 16:35:45
    最近项目需求,需要做一个移动端的日历,类似于安卓原生日历。晚上找了很多成熟的插件都不是想要。偶然的机会发现某篇博客上有人写的有类似的,于是拿过来稍加改造,终于可以用了。在这里非常感谢这位博主,省去我很...
  • 平常开始都是使用组件库进行开发,里面的轮播图都是组件库封装好的,今天我们就来自己实现一个轮播图。 体验一下原生开发,操作 dom 带来的快落吧 <!DOCTYPE html> <html lang="en"> <head> &...
  • Luck-mobile 使用原生js实现不依赖任何 js 类库,压缩后的 js 代码不到 2kb,是一个高度可定制的、免费并且开源的移动端弹层组件,任何企业或个人都可以免费使用。 由来 luck是一直活泼可爱的小狗,被主人施加...
  • 演示地址:http://www.coderlife.com (请在移动端查看,PC端查看请打开移动端调试模式)前言看了挺多...原理模版中使用了Vue提供的封装组件 transition,配合CSS类名在 enter/leave 的六种不同的状态过渡中切换。对...
  • 类似微信样式的移动端组件库2、Mint UI(mob):饿了么前端团队开发的移动端组件库3、Vant(mob):有赞团队开发的移动端组件库4、cube-ui(mob):滴滴团队开发的移动端组件库5、MUI(mob):最接近原生APP体验的高性能前端...
  • 项目简介 ... 本项目采用原生JS和Canvas实现移动端手势密码组件,支持手势密码设置和验证。 先加星后看,年薪百万!欢迎大家关注我的github,互相学习~~ demo演示地址:http://tangzhirong....
  • xy-ui是一套使用原生Web Components规范开发的跨框架UI组件库。 更新 1.10.1 offlineedCallback可移动文档事件监听 1.10.0 新增数据列表组件 重新独立xy-option xy-checkbox , xy-raido键盘触发事件优化 特性 跨...
  • Vue.js项目中封装轮播图组件前言一、了解原生js移动端的事件 前言 今天我在vue.js项目实战开发过程中遇到了实现轮播图效果的问题,因为不想因为一个轮播图而引用整个jquery,而且我还发现自己根本就不清楚移动端的...
  • 原生js实现移动端选择器插件 仓库地址 在线预览(记得将浏览器切换到手机模式) 预览 准备 首先在页面中引入css,js文件 每次需要弹出该组件时通过new一个实例来生成,代码如下: var data = { 1:{ 2:[3,4] } } var ...
  • 移动端的下拉组件

    千次阅读 2019-07-31 17:44:00
    原生实现的思路 https://segmentfault.com/a/1190000014525404 vue 版的插件 https://github.com/mescroll/mescroll 转载于:https://www.cnblogs.com/alww/p/11277984.html
  • Vue移动端,仿原生搜索页面

    千次阅读 2018-09-14 16:30:29
    很多移动UI 都有搜索框,但都是简单的输入框,今天分享一个仿原生搜索页面,像原生移动端一样搜索效果的页面,效果如下: 使用方法,首先install 组件 npm install vue-search-bar –save 引入组件 在main....
  • 原生js实现移动端选择器插件 前言 插件功能只满足我司业务需求,如果希望有更多功能的,可在下方留言,我尽量扩展!如果你有需要或者喜欢的话,可以给我github来个star ? 仓库地址在线预览(记得将浏览器切换到手机...
  • 特点:简单易用,轻量快捷,为移动端服务的前端框架 主页:http://frozenui.github.io/ Github:https://github.com/frozenui/frozenui Demo:http://frozenui.github.io/frozenui/demo/index.html WeUI 特点:...
  • 在工作中由于项目需要要写一个轮播图,本想使用组件直接调用实现快速开发,但是一想到自己经常使用组件但是让自己手写的话确实一点都不会。 一个不会手写组件的前端程序员不是一个好程序员!于是打算自己手写一个。 ...
  • 移动端UI库

    2019-07-16 20:07:29
    1、Vux(mob):类似微信样式的移动端组件库 2、Mint UI(mob):饿了么前端团队开发的移动端组件库 3、Vant(mob):有赞团队开发的移动端组件库 4、cube-ui(mob):滴滴团队开发的移动端组件库 5、MUI(mob):最接近原生...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 342
精华内容 136
关键字:

原生移动端组件