基于sui 卡尺组件

calliphers.js

define(function(){
    var callipers = {};

    var spaceWidth = 7; // 间隔
    var height = 50; // 默认高度

    var callipersHtml = "<div class=‘swiper-container‘>                 "+
                        "  <div class=‘swiper-wrapper‘>             "+
                        "     <div class=‘swiper-slide‘>           "+
                        "        <div class=‘callipers-content‘></div>"+
                        "     </div>                                   "+
                        "  </div>                                       "+
                        "</div>                                          "+
                        "<canvas></canvas>                               ";

    // 获取数字长度
    function getNumberLength(number){
        var str = ""+number;
        return str.length;
    }

    function createImage(container,width,height,minValue,maxValue){
        var containerWidth = $(container).width();

        var c=$(container).find("canvas")[0];
        var ctx=c.getContext("2d");

        var multiplyingPower=2;

        c.width=width*multiplyingPower;
        c.height=height*multiplyingPower;

        ctx.strokeStyle="#36384d";
        ctx.lineWidth=1*multiplyingPower;
        // 绘制底部线条
        ctx.beginPath();
        ctx.moveTo(containerWidth/2*multiplyingPower,height*multiplyingPower);
        ctx.lineTo(width*multiplyingPower-containerWidth/2*multiplyingPower,height*multiplyingPower);
        ctx.stroke();

        // 绘制
        for(var i=minValue;i<=maxValue;i++){
            var newIndex = spaceWidth*(i-minValue)+containerWidth/2;
            ctx.moveTo(newIndex*multiplyingPower,50*multiplyingPower);
            if(i==minValue){
                ctx.fillStyle="#959AB9";
                ctx.font="24px Arial ";
                ctx.fillText(i,(newIndex-3)*multiplyingPower,28*multiplyingPower);
                ctx.lineTo(newIndex*multiplyingPower,35*multiplyingPower);
            }else if(i%10==0){// 绘制长线
                ctx.font="24px Arial";
                ctx.fillText(i,(newIndex-6*(getNumberLength(i)-1))*multiplyingPower,28*multiplyingPower);
                ctx.lineTo(newIndex*multiplyingPower,35*multiplyingPower);
            }else{//绘制短线
                ctx.lineTo(newIndex*multiplyingPower,43*multiplyingPower);
            }
            ctx.stroke();
        }
        var imageDataUrl = c.toDataURL();
        $(container).find("canvas").remove(); // 删除canvas
        return imageDataUrl;
    }

    function resetSwiperTransition(swiper){
        var translate = swiper.getWrapperTranslate();
        var offset = translate%spaceWidth;
        offset = offset*-1;
        if(offset>spaceWidth/2){
            translate = (parseInt(translate/spaceWidth)-1)*spaceWidth;
        }else{
            translate = (parseInt(translate/spaceWidth))*spaceWidth;
        }
        swiper.setWrapperTranslate(translate);

        var offsetValue = translate/spaceWidth*-1;
        return offsetValue;
    }

    function render(container,settings){
        settings = settings||{};

        var minValue = settings.min||0;
        var maxValue = settings.max||200;
        var progressCallback = settings.progressCallback||function(){};
        var transitionEndCallback = settings.transitionEndCallback||function(){};
        var initValue = settings.initValue||parseInt((maxValue-minValue)/2+minValue);

        var containerWidth= $(container).width();
        var width = spaceWidth*(maxValue-minValue)+containerWidth;

        $(container).html(callipersHtml);
        container.attr("data-min",minValue);
        container.attr("data-max",maxValue);
        var dataURL = createImage(container,width,height,minValue,maxValue);

        $(container).find(".callipers-content").css({
            "background-image":"url("+ dataURL+")",
            "width":width+"px"
        });
        setTimeout(function(){

            $(container).find(".swiper-container").swiper({
                runCallbacksOnInit:false,
                freeModeMomentumRatio:0.2,
                touchRatio:0.5,
                slidesPerView: "auto",
                resistanceRatio: 0,
                freeMode: true,
                onInit:function(swiper){
                    var value = resetSwiperTransition(swiper)+minValue;
                    var offset = (initValue-minValue)*spaceWidth*-1;
                    swiper.setWrapperTranslate(offset);
                    container.attr("data-value",initValue);
                    swiper.updateProgress();
                    container.addClass("initialized");
                },
                onTouchEnd:function(swiper){
                    var value = resetSwiperTransition(swiper)+minValue;
                    transitionEndCallback(value);
                    container.attr("data-value",value);
                },
                onTransitionEnd:function(swiper){
                    var value = resetSwiperTransition(swiper)+minValue;
                    transitionEndCallback(value);
                    container.attr("data-value",value);
                },
                onProgress:function(swiper,progress){
                    var value = parseInt(swiper.getWrapperTranslate()/spaceWidth)*-1+minValue;
                    progressCallback(value);
                    container.attr("data-value",value);
                }
            });
        },100);
        // init swiper

    }

    // 初始化 标尺
    function init(settings){

        var container = settings.container;
        $(container).each(function(){
            render($(this),settings);
        });

    }

    callipers.init = init;

    return callipers;
});

calliphers.css

.callipers{position:relative;opacity:0;}
.callipers.initialized{
    opacity:1;
}
.callipers canvas{display:none;}
.callipers:before{
    content:"";
    position:absolute;
    left:0;
    bottom:0;
    right:0;
    width:1px;
    height:47px;
    background-color:#b540a8;
    margin:auto;
    z-index: 99;
}
.callipers .callipers-content{
    height:50px;
    background:no-repeat center center;
    background-size:contain;
}
.callipers .swiper-container{padding:0;}
.callipers .swiper-container .swiper-wrapper{height:auto;}
.callipers .swiper-container .swiper-slide{width:auto;height:auto;}

test.html

<div class="page-group">
   <div class="page" id="register-base-height">
      <div class="content">
         <div class="callipers "></div>
      </div><!-- content -->
   </div><!-- page -->
</div><!-- page-group -->

test.js

define(["callipers"], function(callipers) {
	$(document).on("pageInit", "#test", function(e, pageId, $page) {
		callipers.init({
			container:$page.find(".callipers"),
			min:20,
			max:220,
			initValue:90,
			progressCallback:function(value){
				console.log("value");
			},
			transitionEndCallback:function(value){
				console.log("value");
			}
		});

	});

	$.init();
});

时间: 2024-10-16 17:36:19

基于sui 卡尺组件的相关文章

基于CMS的组件复用实践

作者 个推高级前端开发工程师沈创目前前端项目大多基于Vue.React.Angular等框架来实现,这一类框架都有一个明显的特点:基于模块化以及组件化思维.所以,开发者在使用上述框架时,实际上是在写一个一个的组件,并且组件与组件之间呈嵌套的形式.当一个项目中多次出现同一功能时,他们会选择将其提取出来,并且放到components文件夹中,以达到复用的目的,但是这些复用都是基于同一项目的,所以,当写另一个项目时,又要开始写一些重复的代码. 个推拥有多条业务线,在进行前端项目时总会遇到重复写代码的困

基于Lumisoft.NET组件的POP3邮件接收和删除操作

Lumisoft.NET组件是一个非常强大的邮件发送.邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的.之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需要,需要利用该组件来接收邮件,邮件通过POP3协议进行接收到本地,故对该组件进行了全面的了解和使用.本文主要是在此背景上,介绍该组件的POP3协议处理类的使用.Lumisoft.NET组件2013年作者有做了一定的更新,修复了一些问题,本文是基于该组件的最新版本进行开发使用. 1.POP3登录及头部

基于ABP模块组件与依赖注入组件的项目插件开发

注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://www.cnblogs.com/mienreal/p/4550500.html 正文: 我最近在设计一个项目,而这个项目的一些业务功能,需要以插件的方式提供给这个项目,从而降低耦合性,主项目不会对具体业务功能产生依赖. 在以前,最简单粗暴的方式,就是扫描主程序目录下的所有dll或指定目录下的dll,然

基于fis3的组件可视化道路

首先说明一下,即使不熟悉fis3,阅读文本应该也会有所收获. 本文以fis-parser-imweb-tplv2插件为模板插件,目的不在于使用哪个模板,而是组件可视化的实现思路,不必担心. 先说说模板插件 首先说明一下,我们的项目使用的fis3自带的mod.js做模块化开发. fis-parser-imweb-tplv2插件是同事在imweb待着的时候写的.模板使用和jsp写法一致,文件类型为tpl类型 <div class="tips"> <em> <i

基于注解的组件扫描

1.什么是组件扫描 指定一个包路径,Spring会自动扫描该包及其子包所有组件类,当发现组件类定义前有特别的注解标记时,就将该组件纳入Spring容器.等价于原有XML配置中的<bean>定义功能. 组件扫描可以替代大量XML配置的<bean>定义 2.指定扫描类路径 使用组件扫描,首先需要在XML配置中指定扫描类路径 <context:componet-scan base-package="org.example"/> 上面配置,容器实例化时会自动

基于HTML5树组件延迟加载技术实现

HT for Web的HTML5树组件有延迟加载的功能,这个功能对于那些需要从服务器读取具有层级依赖关系数据时非常有用,需要获取数据的时候再向服务器发起请求,这样可减轻服务器压力,同时也减少了浏览器的等待时间,让页面的加载更加流畅,增强用户体验. http://www.hightopo.com/guide/readme.html 进入正题,今天用来做演示的Demo是,客户端请求服务器读取系统文件目录结构,通过HT for Web的HTML5树组件显示系统文件目录结构. 首先,我们先来设计下服务器

基于jquery的组件库

github地址:https://github.com/pomelott/jquery-plug-in 组件库(componentGallery) 使用方法 1.引入css文件(建议复制粘贴至项目css文件中) 2.引入pomelo.js文件(需要引入jquery) 3.创建相应的对象,并传入参数. 导航滚动(slideNav)参数说明 var test=new slideNav({ aBtn:".slideBtn", 触发器,传入类选择器 aTarget:".slideTa

基于 react-navigation 父子组件的跳转链接

在父组件中引入子组件,这个时候通常直接使用 onPress 的跳转就会不起作用 正确的处理方法是,在组件中封装一个点击事件,然后在父组件中执行跳转的函数 正常的跳转方法是: import React from 'react'; import { StyleSheet, Text, View, Image, TouchableOpacity, ScrollView, } from 'react-native'; // navigator import { StackNavigator } from

SUI分页组件和avalon搞定ajax无刷新分页

<div ms-controller="main"> <h2 class="pagination-centered">{{ title }}</h2> <form method="get" action="" class="sui-form" style="margin-bottom:5px;"> 重量:<input class=&q