zoukankan      html  css  js  c++  java
  • 设置一周每天所占的百分比特效,可拖,可填,可回车

    母婴

    设置一周每天所占的百分比特效,可拖,可填,可回车。这是第三版,把代码封装成jquery一个插件,新增回车改变修改功能和默认值功能。另,重写了算法,计算百分比和宽度更合理。

    效果如下:

    %

    周一

    %

    周二

    %

    周三

    %

    周四

    %

    周五
     

    %

    周六

    %

    周日

    该死nbsp;的,上传到博客完后,我的空td里都加个nbsp;,使线条变粗,看本地测试截图,多苗条啊

    效果预览 http://myaccp.com/js/table.html

    代码分享

    <script type="text/javascript">
            /**
            * setWeek  with 逐月 2013-7-12 zhuyuelee@163.com
            *
            */
    
            jQuery.fn.setWeek = function(options) {
                var table = $(this);
    
                options = jQuery.extend({
                    defaultValue: [22, 24, 12, 10, 15, 9, 8]
                },
                options);
    
                var rate = (table.width() - 30 * 7 - 2 * parseInt(table.css("border-width")) - 6 * parseInt(table.find(".boundary").width())) / 100; //百分一所点像素数
                table.find("td[class!=boundary]").each(function(i) {
                    var td = $(this);
                    td.children("p").children("label").text(options.defaultValue[i]);
                    td.children("p").children(":hidden").val(options.defaultValue[i]);
    
                    td.width(rate * options.defaultValue[i] + 30);
                });
    
                // 鼠标拖动改大小...
                table.find(".boundary").mousedown(function(ex) {
                    var curBoun = $(this);
                    table.find(".focus").removeClass("focus"); //移除其它
                    curBoun.addClass("focus");
                    var prev = $(".focus").prev();
                    var next = $(".focus").next();
                    var pw = prev.width();
                    var nw = next.width();
                    //计算两部分总和
                    var totalP = parseFloat(prev.children("p").children(":hidden").val()) + parseFloat(next.children("p").children(":hidden").val())
                    table.mousemove(function(e) {
                        var prevNewWidth = pw + e.pageX - ex.pageX;
                        var nextNewWidth = nw - e.pageX + ex.pageX;
                        if (prevNewWidth < 30 || nextNewWidth < 30) {//最少宽度为30
                            return;
                        }
                        prev.width(prevNewWidth);
                        next.width(nextNewWidth);
                        var pr = ((prevNewWidth - 30) / rate).toFixed(1);
    
                        //确保最小为0,最大不超过原来值的总和
                        if (pr > totalP) {
                            pr = totalP;
                        } else if (pr < 0) {
                            pr = 0;
                        }
                        if (nextNewWidth <= 30) {
                            pr = totalP;
                        }
                        prev.children("p").children("label").text(pr);
                        prev.children("p").children(":hidden").val(pr);
    
                        next.children("p").children("label").text((totalP - pr).toFixed(1));
                        next.children("p").children(":hidden").val((totalP - pr).toFixed(1));
    
                    });
                    table.mouseup(function(e) {
                        table.off();
                        table.find(".focus").removeClass("focus"); //移除其它
    
                    });
                });
                var loseFous = function(label) {
                    var newVal = parseFloat(label.children(":input").val()).toFixed(1); //新值
                    if (newVal >= 0 && newVal <= 100) {
                        var chageTd = label.parent().parent();
    
                        label.html(label.children(":input").val()); //input还原为百分比
                        var oldVal = parseFloat(label.prev(":hidden").val()); //原值
                        var nextTd;
                        if (chageTd.next().size() > 0) {
                            nextTd = chageTd.next().next();
                        } else {
                            nextTd = $("#tab_week td").first();
                        }
                        chageTd.children("p").children(":hidden").val(newVal);
                        var nextVal = parseFloat(nextTd.children("p").children(":hidden").val());
                        if (newVal < oldVal) {//值改小
                            chageTd.css("width", "auto");
                            nextTd.width(nextTd.width() + parseInt((oldVal - newVal) * rate));
                            nextTd.children("p").children(":hidden").val(nextVal + oldVal - newVal);
                            nextTd.children("p").children("label").html(nextVal + oldVal - newVal);
                            if (chageTd.width() < 30) {
                                chageTd.width(30);
                            } else {
                                chageTd.width(chageTd.width());
                            }
                        } else if (newVal > oldVal) {//值变大
                            var addVal = newVal - oldVal;
                            chageTd.css("width", "auto");
                            for (var i = 1; i <= 6; i++) {
                                if (nextVal > 0) {
                                    if (addVal >= nextVal) {
                                        nextTd.width(30);
                                        nextTd.children("p").children(":hidden").val("0");
                                        nextTd.children("p").children("label").html("0");
                                        addVal = addVal - nextVal;
                                    } else {
                                        nextTd.width(parseInt(nextVal - addVal) * rate);
                                        if (nextTd.width() < 30) {
                                            nextTd.width(30);
                                        }
                                        nextTd.children("p").children(":hidden").val(nextVal - addVal);
                                        nextTd.children("p").children("label").html(nextVal - addVal);
                                        break;
                                    }
                                }
                                if (nextTd.next().size() > 0) {
                                    nextTd = nextTd.next().next();
                                } else {
                                    nextTd = $("#tab_week td").first();
                                }
                                nextVal = parseFloat(nextTd.children("p").children(":hidden").val());
                            }
                            if (chageTd.width() < 30) {
                                chageTd.width(30);
                            } else {
                                chageTd.width(chageTd.width());
                            }
                        }
                    } else {
                        label.html(label.prev(":input").val());
                    }
                };
                //鼠标经过填写具体的值
                table.find("label").hover(//排除周日
                      function() {
                          $(this).html("<input type='text'  style='24px;' value='" + $.trim($(this).html()) + "' />");
                          $(this).children(":input").select();
                          $(this).children(":input").keydown(function(event) {
                              if (event.keyCode == 13) {
                                  loseFous($(this).parent("label"));
                                  $(this).off();
                                  return false;
                              }
                          });
                      },
                      function() {
                          loseFous($(this));
                      }
                    );
    
            };
        </script>

    代码写了两遍,第一遍的代码比较冗杂,就舍弃了,这是第二次写的代码,代码量只有第一次的三分之二,运行效果也够健壮,就拿出来给大家分享了。测试时间有限,如有bug,还请留言指出。

    如今代码是第三遍代码

    下面是html代码

    <table cellpadding="0" cellspacing="0" id="tab_week">
                <tr>
                    <td>
                        <p>
                            <input type="hidden" name="hid_mon" value="14" />
                            <label>
                                0</label>%</p>
                        周一
                    </td>
                    <td class="boundary"><hr />
                    </td>
                    <td>
                        <p>
                            <input type="hidden" name="hid_tues" value="14" />
                            <label>
                                0</label>%</p>
                        周二
                    </td>
                    <td class="boundary"><hr />
                    </td>
                    <td>
                        <p>
                            <input type="hidden" name="hid_wed" value="14" />
                            <label>
                                0</label>%</p>
                        周三
                    </td>
                    <td class="boundary"><hr />
                    </td>
                    <td>
                        <p>
                            <input type="hidden" name="hid_thur" value="14" />
                            <label>
                                0</label>%</p>
                        周四
                    </td>
                    <td class="boundary"><hr />
                    </td>
                    <td>
                        <p>
                            <input type="hidden" name="hid_fri" value="14" />
                            <label>
                                0</label>%</p>
                        周五
                    </td>
                    <td class="boundary">
                    </td>
                    <td>
                        <p>
                            <input type="hidden" name="hid_sat" value="15" />
                            <label>
                                0</label>%</p>
                        周六
                    </td>
                    <td class="boundary"><hr />
                    </td>
                    <td>
                        <p>
                            <input type="hidden" name="hid_sun" value="15" />
                            <label>
                                0</label>%</p>
                        周日
                    </td>
                </tr>
            </table>
    

      

    CSS代码

    <style type="text/css">
            *
            {
                font-size: 12px;
            }
            table
            {
                border: solid 2px #000000;
                 720px;
                height: 120px;
                
            }
            td
            {
                overflow: hidden;
                text-align: center;
            }
            td p
            {
                padding: 0px;
                margin: 0px;
            }
            td.boundary
            {
                background:#7f7f7f; border:none; 2px; height:100%;cursor: e-resize;
            }
             td.boundary hr{ background:#7f7f7f; border:none; 2px; height:100%;cursor: e-resize;}
            td.focus
            {
                background: #FF6600;
            }
            td.focus hr
            {
                background: #FF6600;
            }
        </style>
    

      代码调用方法,在代码分享下面的,如测试出bug,还望指出,谢谢

  • 相关阅读:
    时间复杂度和空间复杂度的故事
    Go -- 并发编程的两种限速方法
    Go -- type 和断言 interface{}转换
    Go -- 实现二叉搜索树
    Go语言程序的状态监控
    Go -- 中开启gctrace
    Go --- GC优化经验
    Mysql 性能优化20个原则(4)
    Mysql 性能优化20个原则(3)
    查看 activex 组件的方法
  • 原文地址:https://www.cnblogs.com/zhuyue/p/3184430.html
Copyright © 2011-2022 走看看