瀏覽代碼

初次提交

chente 4 年之前
當前提交
94abf14ffe
共有 61 個文件被更改,包括 19377 次插入0 次删除
  1. 7 0
      assets/bootstrap/css/bootstrap.min.css
  2. 7 0
      assets/bootstrap/js/bootstrap.min.js
  3. 3671 0
      assets/fontawesome/css/all.css
  4. 二進制
      assets/fontawesome/css/webfonts/fa-brands-400.eot
  5. 1148 0
      assets/fontawesome/css/webfonts/fa-brands-400.svg
  6. 二進制
      assets/fontawesome/css/webfonts/fa-brands-400.ttf
  7. 二進制
      assets/fontawesome/css/webfonts/fa-brands-400.woff
  8. 二進制
      assets/fontawesome/css/webfonts/fa-brands-400.woff2
  9. 二進制
      assets/fontawesome/css/webfonts/fa-regular-400.eot
  10. 467 0
      assets/fontawesome/css/webfonts/fa-regular-400.svg
  11. 二進制
      assets/fontawesome/css/webfonts/fa-regular-400.ttf
  12. 二進制
      assets/fontawesome/css/webfonts/fa-regular-400.woff
  13. 二進制
      assets/fontawesome/css/webfonts/fa-regular-400.woff2
  14. 二進制
      assets/fontawesome/css/webfonts/fa-solid-900.eot
  15. 2312 0
      assets/fontawesome/css/webfonts/fa-solid-900.svg
  16. 二進制
      assets/fontawesome/css/webfonts/fa-solid-900.ttf
  17. 二進制
      assets/fontawesome/css/webfonts/fa-solid-900.woff
  18. 二進制
      assets/fontawesome/css/webfonts/fa-solid-900.woff2
  19. 二進制
      assets/fontawesome/webfonts/fa-brands-400.eot
  20. 1148 0
      assets/fontawesome/webfonts/fa-brands-400.svg
  21. 二進制
      assets/fontawesome/webfonts/fa-brands-400.ttf
  22. 二進制
      assets/fontawesome/webfonts/fa-brands-400.woff
  23. 二進制
      assets/fontawesome/webfonts/fa-brands-400.woff2
  24. 二進制
      assets/fontawesome/webfonts/fa-regular-400.eot
  25. 467 0
      assets/fontawesome/webfonts/fa-regular-400.svg
  26. 二進制
      assets/fontawesome/webfonts/fa-regular-400.ttf
  27. 二進制
      assets/fontawesome/webfonts/fa-regular-400.woff
  28. 二進制
      assets/fontawesome/webfonts/fa-regular-400.woff2
  29. 二進制
      assets/fontawesome/webfonts/fa-solid-900.eot
  30. 2312 0
      assets/fontawesome/webfonts/fa-solid-900.svg
  31. 二進制
      assets/fontawesome/webfonts/fa-solid-900.ttf
  32. 二進制
      assets/fontawesome/webfonts/fa-solid-900.woff
  33. 二進制
      assets/fontawesome/webfonts/fa-solid-900.woff2
  34. 200 0
      assets/lity/lity.css
  35. 638 0
      assets/lity/lity.js
  36. 6 0
      assets/owlcarousel/dist/assets/owl.carousel.min.css
  37. 6 0
      assets/owlcarousel/dist/assets/owl.theme.default.min.css
  38. 二進制
      assets/owlcarousel/dist/assets/owl.video.play.png
  39. 7 0
      assets/owlcarousel/dist/owl.carousel.min.js
  40. 4463 0
      css/all.css
  41. 621 0
      css/style.css
  42. 二進制
      css/videobg.png
  43. 二進制
      images/bg_01.png
  44. 二進制
      images/bg_02.jpg
  45. 二進制
      images/favicon.ico
  46. 二進制
      images/home-desk.png
  47. 二進制
      images/laohuicon.png
  48. 二進制
      images/line.png
  49. 二進制
      images/logo.png
  50. 二進制
      images/softview/1.png
  51. 二進制
      images/softview/2.png
  52. 二進制
      images/softview/3.png
  53. 1 0
      images/undraw_browse.svg
  54. 1 0
      images/undraw_gift.svg
  55. 1 0
      images/undraw_work.svg
  56. 555 0
      index.html
  57. 130 0
      js/app.js
  58. 912 0
      js/jqBootstrapValidation.js
  59. 4 0
      js/jquery.min.js
  60. 288 0
      js/jquery.sticky.js
  61. 5 0
      js/popper.min.js

文件差異過大導致無法顯示
+ 7 - 0
assets/bootstrap/css/bootstrap.min.css


文件差異過大導致無法顯示
+ 7 - 0
assets/bootstrap/js/bootstrap.min.js


文件差異過大導致無法顯示
+ 3671 - 0
assets/fontawesome/css/all.css


二進制
assets/fontawesome/css/webfonts/fa-brands-400.eot


文件差異過大導致無法顯示
+ 1148 - 0
assets/fontawesome/css/webfonts/fa-brands-400.svg


二進制
assets/fontawesome/css/webfonts/fa-brands-400.ttf


二進制
assets/fontawesome/css/webfonts/fa-brands-400.woff


二進制
assets/fontawesome/css/webfonts/fa-brands-400.woff2


二進制
assets/fontawesome/css/webfonts/fa-regular-400.eot


文件差異過大導致無法顯示
+ 467 - 0
assets/fontawesome/css/webfonts/fa-regular-400.svg


二進制
assets/fontawesome/css/webfonts/fa-regular-400.ttf


二進制
assets/fontawesome/css/webfonts/fa-regular-400.woff


二進制
assets/fontawesome/css/webfonts/fa-regular-400.woff2


二進制
assets/fontawesome/css/webfonts/fa-solid-900.eot


文件差異過大導致無法顯示
+ 2312 - 0
assets/fontawesome/css/webfonts/fa-solid-900.svg


二進制
assets/fontawesome/css/webfonts/fa-solid-900.ttf


二進制
assets/fontawesome/css/webfonts/fa-solid-900.woff


二進制
assets/fontawesome/css/webfonts/fa-solid-900.woff2


二進制
assets/fontawesome/webfonts/fa-brands-400.eot


文件差異過大導致無法顯示
+ 1148 - 0
assets/fontawesome/webfonts/fa-brands-400.svg


二進制
assets/fontawesome/webfonts/fa-brands-400.ttf


二進制
assets/fontawesome/webfonts/fa-brands-400.woff


二進制
assets/fontawesome/webfonts/fa-brands-400.woff2


二進制
assets/fontawesome/webfonts/fa-regular-400.eot


文件差異過大導致無法顯示
+ 467 - 0
assets/fontawesome/webfonts/fa-regular-400.svg


二進制
assets/fontawesome/webfonts/fa-regular-400.ttf


二進制
assets/fontawesome/webfonts/fa-regular-400.woff


二進制
assets/fontawesome/webfonts/fa-regular-400.woff2


二進制
assets/fontawesome/webfonts/fa-solid-900.eot


文件差異過大導致無法顯示
+ 2312 - 0
assets/fontawesome/webfonts/fa-solid-900.svg


二進制
assets/fontawesome/webfonts/fa-solid-900.ttf


二進制
assets/fontawesome/webfonts/fa-solid-900.woff


二進制
assets/fontawesome/webfonts/fa-solid-900.woff2


+ 200 - 0
assets/lity/lity.css

@@ -0,0 +1,200 @@
+/*! Lity - v2.4.0 - 2019-08-10
+* http://sorgalla.com/lity/
+* Copyright (c) 2015-2019 Jan Sorgalla; Licensed MIT */
+.lity {
+  z-index: 9990;
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  white-space: nowrap;
+  background: #0b0b0b;
+  background: rgba(0, 0, 0, 0.9);
+  outline: none !important;
+  opacity: 0;
+  -webkit-transition: opacity 0.3s ease;
+  -o-transition: opacity 0.3s ease;
+  transition: opacity 0.3s ease;
+}
+.lity.lity-opened {
+  opacity: 1;
+}
+.lity.lity-closed {
+  opacity: 0;
+}
+.lity * {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+.lity-wrap {
+  z-index: 9990;
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  text-align: center;
+  outline: none !important;
+}
+.lity-wrap:before {
+  content: '';
+  display: inline-block;
+  height: 100%;
+  vertical-align: middle;
+  margin-right: -0.25em;
+}
+.lity-loader {
+  z-index: 9991;
+  color: #fff;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8em;
+  width: 100%;
+  text-align: center;
+  font-size: 14px;
+  font-family: Arial, Helvetica, sans-serif;
+  opacity: 0;
+  -webkit-transition: opacity 0.3s ease;
+  -o-transition: opacity 0.3s ease;
+  transition: opacity 0.3s ease;
+}
+.lity-loading .lity-loader {
+  opacity: 1;
+}
+.lity-container {
+  z-index: 9992;
+  position: relative;
+  text-align: left;
+  vertical-align: middle;
+  display: inline-block;
+  white-space: normal;
+  max-width: 100%;
+  max-height: 100%;
+  outline: none !important;
+}
+.lity-content {
+  z-index: 9993;
+  width: 100%;
+  -webkit-transform: scale(1);
+      -ms-transform: scale(1);
+       -o-transform: scale(1);
+          transform: scale(1);
+  -webkit-transition: -webkit-transform 0.3s ease;
+  transition: -webkit-transform 0.3s ease;
+  -o-transition: -o-transform 0.3s ease;
+  transition: transform 0.3s ease;
+  transition: transform 0.3s ease, -webkit-transform 0.3s ease, -o-transform 0.3s ease;
+}
+.lity-loading .lity-content,
+.lity-closed .lity-content {
+  -webkit-transform: scale(0.8);
+      -ms-transform: scale(0.8);
+       -o-transform: scale(0.8);
+          transform: scale(0.8);
+}
+.lity-content:after {
+  content: '';
+  position: absolute;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  display: block;
+  right: 0;
+  width: auto;
+  height: auto;
+  z-index: -1;
+  -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
+          box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
+}
+.lity-close {
+  z-index: 9994;
+  width: 35px;
+  height: 35px;
+  position: fixed;
+  right: 0;
+  top: 0;
+  -webkit-appearance: none;
+  cursor: pointer;
+  text-decoration: none;
+  text-align: center;
+  padding: 0;
+  color: #fff;
+  font-style: normal;
+  font-size: 35px;
+  font-family: Arial, Baskerville, monospace;
+  line-height: 35px;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+  border: 0;
+  background: none;
+  outline: none;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.lity-close::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+.lity-close:hover,
+.lity-close:focus,
+.lity-close:active,
+.lity-close:visited {
+  text-decoration: none;
+  text-align: center;
+  padding: 0;
+  color: #fff;
+  font-style: normal;
+  font-size: 35px;
+  font-family: Arial, Baskerville, monospace;
+  line-height: 35px;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+  border: 0;
+  background: none;
+  outline: none;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.lity-close:active {
+  top: 1px;
+}
+/* Image */
+.lity-image img {
+  max-width: 100%;
+  display: block;
+  line-height: 0;
+  border: 0;
+}
+/* iFrame */
+.lity-iframe .lity-container,
+.lity-youtube .lity-container,
+.lity-vimeo .lity-container,
+.lity-facebookvideo .lity-container,
+.lity-googlemaps .lity-container {
+  width: 100%;
+  max-width: 964px;
+}
+.lity-iframe-container {
+  width: 100%;
+  height: 0;
+  padding-top: 56.25%;
+  overflow: auto;
+  pointer-events: auto;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
+  -webkit-overflow-scrolling: touch;
+}
+.lity-iframe-container iframe {
+  position: absolute;
+  display: block;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
+          box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
+  background: #000;
+}
+.lity-hide {
+  display: none;
+}

+ 638 - 0
assets/lity/lity.js

@@ -0,0 +1,638 @@
+/*! Lity - v2.4.0 - 2019-08-10
+* http://sorgalla.com/lity/
+* Copyright (c) 2015-2019 Jan Sorgalla; Licensed MIT */
+(function(window, factory) {
+    if (typeof define === 'function' && define.amd) {
+        define(['jquery'], function($) {
+            return factory(window, $);
+        });
+    } else if (typeof module === 'object' && typeof module.exports === 'object') {
+        module.exports = factory(window, require('jquery'));
+    } else {
+        window.lity = factory(window, window.jQuery || window.Zepto);
+    }
+}(typeof window !== "undefined" ? window : this, function(window, $) {
+    'use strict';
+
+    var document = window.document;
+
+    var _win = $(window);
+    var _deferred = $.Deferred;
+    var _html = $('html');
+    var _instances = [];
+
+    var _attrAriaHidden = 'aria-hidden';
+    var _dataAriaHidden = 'lity-' + _attrAriaHidden;
+
+    var _focusableElementsSelector = 'a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),iframe,object,embed,[contenteditable],[tabindex]:not([tabindex^="-"])';
+
+    var _defaultOptions = {
+        esc: true,
+        handler: null,
+        handlers: {
+            image: imageHandler,
+            inline: inlineHandler,
+            youtube: youtubeHandler,
+            vimeo: vimeoHandler,
+            googlemaps: googlemapsHandler,
+            facebookvideo: facebookvideoHandler,
+            iframe: iframeHandler
+        },
+        template: '<div class="lity" role="dialog" aria-label="Dialog Window (Press escape to close)" tabindex="-1"><div class="lity-wrap" data-lity-close role="document"><div class="lity-loader" aria-hidden="true">Loading...</div><div class="lity-container"><div class="lity-content"></div><button class="lity-close" type="button" aria-label="Close (Press escape to close)" data-lity-close>&times;</button></div></div></div>'
+    };
+
+    var _imageRegexp = /(^data:image\/)|(\.(png|jpe?g|gif|svg|webp|bmp|ico|tiff?)(\?\S*)?$)/i;
+    var _youtubeRegex = /(youtube(-nocookie)?\.com|youtu\.be)\/(watch\?v=|v\/|u\/|embed\/?)?([\w-]{11})(.*)?/i;
+    var _vimeoRegex =  /(vimeo(pro)?.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/;
+    var _googlemapsRegex = /((maps|www)\.)?google\.([^\/\?]+)\/?((maps\/?)?\?)(.*)/i;
+    var _facebookvideoRegex = /(facebook\.com)\/([a-z0-9_-]*)\/videos\/([0-9]*)(.*)?$/i;
+
+    var _transitionEndEvent = (function() {
+        var el = document.createElement('div');
+
+        var transEndEventNames = {
+            WebkitTransition: 'webkitTransitionEnd',
+            MozTransition: 'transitionend',
+            OTransition: 'oTransitionEnd otransitionend',
+            transition: 'transitionend'
+        };
+
+        for (var name in transEndEventNames) {
+            if (el.style[name] !== undefined) {
+                return transEndEventNames[name];
+            }
+        }
+
+        return false;
+    })();
+
+    function transitionEnd(element) {
+        var deferred = _deferred();
+
+        if (!_transitionEndEvent || !element.length) {
+            deferred.resolve();
+        } else {
+            element.one(_transitionEndEvent, deferred.resolve);
+            setTimeout(deferred.resolve, 500);
+        }
+
+        return deferred.promise();
+    }
+
+    function settings(currSettings, key, value) {
+        if (arguments.length === 1) {
+            return $.extend({}, currSettings);
+        }
+
+        if (typeof key === 'string') {
+            if (typeof value === 'undefined') {
+                return typeof currSettings[key] === 'undefined'
+                    ? null
+                    : currSettings[key];
+            }
+
+            currSettings[key] = value;
+        } else {
+            $.extend(currSettings, key);
+        }
+
+        return this;
+    }
+
+    function parseQueryParams(params) {
+        var pairs = decodeURI(params.split('#')[0]).split('&');
+        var obj = {}, p;
+
+        for (var i = 0, n = pairs.length; i < n; i++) {
+            if (!pairs[i]) {
+                continue;
+            }
+
+            p = pairs[i].split('=');
+            obj[p[0]] = p[1];
+        }
+
+        return obj;
+    }
+
+    function appendQueryParams(url, params) {
+        return url + (url.indexOf('?') > -1 ? '&' : '?') + $.param(params);
+    }
+
+    function transferHash(originalUrl, newUrl) {
+        var pos = originalUrl.indexOf('#');
+
+        if (-1 === pos) {
+            return newUrl;
+        }
+
+        if (pos > 0) {
+            originalUrl = originalUrl.substr(pos);
+        }
+
+        return newUrl + originalUrl;
+    }
+
+    function error(msg) {
+        return $('<span class="lity-error"/>').append(msg);
+    }
+
+    function imageHandler(target, instance) {
+        var desc = (instance.opener() && instance.opener().data('lity-desc')) || 'Image with no description';
+        var img = $('<img src="' + target + '" alt="' + desc + '"/>');
+        var deferred = _deferred();
+        var failed = function() {
+            deferred.reject(error('Failed loading image'));
+        };
+
+        img
+            .on('load', function() {
+                if (this.naturalWidth === 0) {
+                    return failed();
+                }
+
+                deferred.resolve(img);
+            })
+            .on('error', failed)
+        ;
+
+        return deferred.promise();
+    }
+
+    imageHandler.test = function(target) {
+        return _imageRegexp.test(target);
+    };
+
+    function inlineHandler(target, instance) {
+        var el, placeholder, hasHideClass;
+
+        try {
+            el = $(target);
+        } catch (e) {
+            return false;
+        }
+
+        if (!el.length) {
+            return false;
+        }
+
+        placeholder = $('<i style="display:none !important"/>');
+        hasHideClass = el.hasClass('lity-hide');
+
+        instance
+            .element()
+            .one('lity:remove', function() {
+                placeholder
+                    .before(el)
+                    .remove()
+                ;
+
+                if (hasHideClass && !el.closest('.lity-content').length) {
+                    el.addClass('lity-hide');
+                }
+            })
+        ;
+
+        return el
+            .removeClass('lity-hide')
+            .after(placeholder)
+        ;
+    }
+
+    function youtubeHandler(target) {
+        var matches = _youtubeRegex.exec(target);
+
+        if (!matches) {
+            return false;
+        }
+
+        return iframeHandler(
+            transferHash(
+                target,
+                appendQueryParams(
+                    'https://www.youtube' + (matches[2] || '') + '.com/embed/' + matches[4],
+                    $.extend(
+                        {
+                            autoplay: 1
+                        },
+                        parseQueryParams(matches[5] || '')
+                    )
+                )
+            )
+        );
+    }
+
+    function vimeoHandler(target) {
+        var matches = _vimeoRegex.exec(target);
+
+        if (!matches) {
+            return false;
+        }
+
+        return iframeHandler(
+            transferHash(
+                target,
+                appendQueryParams(
+                    'https://player.vimeo.com/video/' + matches[3],
+                    $.extend(
+                        {
+                            autoplay: 1
+                        },
+                        parseQueryParams(matches[4] || '')
+                    )
+                )
+            )
+        );
+    }
+
+    function facebookvideoHandler(target) {
+        var matches = _facebookvideoRegex.exec(target);
+
+        if (!matches) {
+            return false;
+        }
+
+        if (0 !== target.indexOf('http')) {
+            target = 'https:' + target;
+        }
+
+        return iframeHandler(
+            transferHash(
+                target,
+                appendQueryParams(
+                    'https://www.facebook.com/plugins/video.php?href=' + target,
+                    $.extend(
+                        {
+                            autoplay: 1
+                        },
+                        parseQueryParams(matches[4] || '')
+                    )
+                )
+            )
+        );
+    }
+
+    function googlemapsHandler(target) {
+        var matches = _googlemapsRegex.exec(target);
+
+        if (!matches) {
+            return false;
+        }
+
+        return iframeHandler(
+            transferHash(
+                target,
+                appendQueryParams(
+                    'https://www.google.' + matches[3] + '/maps?' + matches[6],
+                    {
+                        output: matches[6].indexOf('layer=c') > 0 ? 'svembed' : 'embed'
+                    }
+                )
+            )
+        );
+    }
+
+    function iframeHandler(target) {
+        return '<div class="lity-iframe-container"><iframe frameborder="0" allowfullscreen allow="autoplay; fullscreen" src="' + target + '"/></div>';
+    }
+
+    function winHeight() {
+        return document.documentElement.clientHeight
+            ? document.documentElement.clientHeight
+            : Math.round(_win.height());
+    }
+
+    function keydown(e) {
+        var current = currentInstance();
+
+        if (!current) {
+            return;
+        }
+
+        // ESC key
+        if (e.keyCode === 27 && !!current.options('esc')) {
+            current.close();
+        }
+
+        // TAB key
+        if (e.keyCode === 9) {
+            handleTabKey(e, current);
+        }
+    }
+
+    function handleTabKey(e, instance) {
+        var focusableElements = instance.element().find(_focusableElementsSelector);
+        var focusedIndex = focusableElements.index(document.activeElement);
+
+        if (e.shiftKey && focusedIndex <= 0) {
+            focusableElements.get(focusableElements.length - 1).focus();
+            e.preventDefault();
+        } else if (!e.shiftKey && focusedIndex === focusableElements.length - 1) {
+            focusableElements.get(0).focus();
+            e.preventDefault();
+        }
+    }
+
+    function resize() {
+        $.each(_instances, function(i, instance) {
+            instance.resize();
+        });
+    }
+
+    function registerInstance(instanceToRegister) {
+        if (1 === _instances.unshift(instanceToRegister)) {
+            _html.addClass('lity-active');
+
+            _win
+                .on({
+                    resize: resize,
+                    keydown: keydown
+                })
+            ;
+        }
+
+        $('body > *').not(instanceToRegister.element())
+            .addClass('lity-hidden')
+            .each(function() {
+                var el = $(this);
+
+                if (undefined !== el.data(_dataAriaHidden)) {
+                    return;
+                }
+
+                el.data(_dataAriaHidden, el.attr(_attrAriaHidden) || null);
+            })
+            .attr(_attrAriaHidden, 'true')
+        ;
+    }
+
+    function removeInstance(instanceToRemove) {
+        var show;
+
+        instanceToRemove
+            .element()
+            .attr(_attrAriaHidden, 'true')
+        ;
+
+        if (1 === _instances.length) {
+            _html.removeClass('lity-active');
+
+            _win
+                .off({
+                    resize: resize,
+                    keydown: keydown
+                })
+            ;
+        }
+
+        _instances = $.grep(_instances, function(instance) {
+            return instanceToRemove !== instance;
+        });
+
+        if (!!_instances.length) {
+            show = _instances[0].element();
+        } else {
+            show = $('.lity-hidden');
+        }
+
+        show
+            .removeClass('lity-hidden')
+            .each(function() {
+                var el = $(this), oldAttr = el.data(_dataAriaHidden);
+
+                if (!oldAttr) {
+                    el.removeAttr(_attrAriaHidden);
+                } else {
+                    el.attr(_attrAriaHidden, oldAttr);
+                }
+
+                el.removeData(_dataAriaHidden);
+            })
+        ;
+    }
+
+    function currentInstance() {
+        if (0 === _instances.length) {
+            return null;
+        }
+
+        return _instances[0];
+    }
+
+    function factory(target, instance, handlers, preferredHandler) {
+        var handler = 'inline', content;
+
+        var currentHandlers = $.extend({}, handlers);
+
+        if (preferredHandler && currentHandlers[preferredHandler]) {
+            content = currentHandlers[preferredHandler](target, instance);
+            handler = preferredHandler;
+        } else {
+            // Run inline and iframe handlers after all other handlers
+            $.each(['inline', 'iframe'], function(i, name) {
+                delete currentHandlers[name];
+
+                currentHandlers[name] = handlers[name];
+            });
+
+            $.each(currentHandlers, function(name, currentHandler) {
+                // Handler might be "removed" by setting callback to null
+                if (!currentHandler) {
+                    return true;
+                }
+
+                if (
+                    currentHandler.test &&
+                    !currentHandler.test(target, instance)
+                ) {
+                    return true;
+                }
+
+                content = currentHandler(target, instance);
+
+                if (false !== content) {
+                    handler = name;
+                    return false;
+                }
+            });
+        }
+
+        return {handler: handler, content: content || ''};
+    }
+
+    function Lity(target, options, opener, activeElement) {
+        var self = this;
+        var result;
+        var isReady = false;
+        var isClosed = false;
+        var element;
+        var content;
+
+        options = $.extend(
+            {},
+            _defaultOptions,
+            options
+        );
+
+        element = $(options.template);
+
+        // -- API --
+
+        self.element = function() {
+            return element;
+        };
+
+        self.opener = function() {
+            return opener;
+        };
+
+        self.options  = $.proxy(settings, self, options);
+        self.handlers = $.proxy(settings, self, options.handlers);
+
+        self.resize = function() {
+            if (!isReady || isClosed) {
+                return;
+            }
+
+            content
+                .css('max-height', winHeight() + 'px')
+                .trigger('lity:resize', [self])
+            ;
+        };
+
+        self.close = function() {
+            if (!isReady || isClosed) {
+                return;
+            }
+
+            isClosed = true;
+
+            removeInstance(self);
+
+            var deferred = _deferred();
+
+            // We return focus only if the current focus is inside this instance
+            if (
+                activeElement &&
+                (
+                    document.activeElement === element[0] ||
+                    $.contains(element[0], document.activeElement)
+                )
+            ) {
+                try {
+                    activeElement.focus();
+                } catch (e) {
+                    // Ignore exceptions, eg. for SVG elements which can't be
+                    // focused in IE11
+                }
+            }
+
+            content.trigger('lity:close', [self]);
+
+            element
+                .removeClass('lity-opened')
+                .addClass('lity-closed')
+            ;
+
+            transitionEnd(content.add(element))
+                .always(function() {
+                    content.trigger('lity:remove', [self]);
+                    element.remove();
+                    element = undefined;
+                    deferred.resolve();
+                })
+            ;
+
+            return deferred.promise();
+        };
+
+        // -- Initialization --
+
+        result = factory(target, self, options.handlers, options.handler);
+
+        element
+            .attr(_attrAriaHidden, 'false')
+            .addClass('lity-loading lity-opened lity-' + result.handler)
+            .appendTo('body')
+            .focus()
+            .on('click', '[data-lity-close]', function(e) {
+                if ($(e.target).is('[data-lity-close]')) {
+                    self.close();
+                }
+            })
+            .trigger('lity:open', [self])
+        ;
+
+        registerInstance(self);
+
+        $.when(result.content)
+            .always(ready)
+        ;
+
+        function ready(result) {
+            content = $(result)
+                .css('max-height', winHeight() + 'px')
+            ;
+
+            element
+                .find('.lity-loader')
+                .each(function() {
+                    var loader = $(this);
+
+                    transitionEnd(loader)
+                        .always(function() {
+                            loader.remove();
+                        })
+                    ;
+                })
+            ;
+
+            element
+                .removeClass('lity-loading')
+                .find('.lity-content')
+                .empty()
+                .append(content)
+            ;
+
+            isReady = true;
+
+            content
+                .trigger('lity:ready', [self])
+            ;
+        }
+    }
+
+    function lity(target, options, opener) {
+        if (!target.preventDefault) {
+            opener = $(opener);
+        } else {
+            target.preventDefault();
+            opener = $(this);
+            target = opener.data('lity-target') || opener.attr('href') || opener.attr('src');
+        }
+
+        var instance = new Lity(
+            target,
+            $.extend(
+                {},
+                opener.data('lity-options') || opener.data('lity'),
+                options
+            ),
+            opener,
+            document.activeElement
+        );
+
+        if (!target.preventDefault) {
+            return instance;
+        }
+    }
+
+    lity.version  = '2.4.0';
+    lity.options  = $.proxy(settings, lity, _defaultOptions);
+    lity.handlers = $.proxy(settings, lity, _defaultOptions.handlers);
+    lity.current  = currentInstance;
+
+    $(document).on('click.lity', '[data-lity]', lity);
+
+    return lity;
+}));

文件差異過大導致無法顯示
+ 6 - 0
assets/owlcarousel/dist/assets/owl.carousel.min.css


文件差異過大導致無法顯示
+ 6 - 0
assets/owlcarousel/dist/assets/owl.theme.default.min.css


二進制
assets/owlcarousel/dist/assets/owl.video.play.png


文件差異過大導致無法顯示
+ 7 - 0
assets/owlcarousel/dist/owl.carousel.min.js


文件差異過大導致無法顯示
+ 4463 - 0
css/all.css


+ 621 - 0
css/style.css

@@ -0,0 +1,621 @@
+/***** Google fonts import ************/
+@import url("https://fonts.googleapis.com/css?family=Gothic+A1:300,400,500,600,700,900");
+/*------------------------------------------------------------------
+[Layout]
+* body
++ Global styles
++ Header / .header
++ hero / benner
++ Start Call Action
++ What people say
++ price
++ Our Team
++ newsletter
++ Form
++ Footer / #footer
++ Responsive
+/*
+============================================
+Global styles
+============================================
+*/
+/*
+01 -  Global styles
+*/
+html,
+body {
+height: 100%;
+}
+body {
+font-family: Helvetica Neue,Hiragino Sans GB,stheiti,Microsoft Yahei,微软雅黑,tahoma,sans-serif;
+background: #fff;
+font-weight: 400;
+font-size: 15px;
+line-height: 1.8;
+-webkit-text-size-adjust: 100%;
+-moz-osx-font-smoothing: grayscale;
+-webkit-font-smoothing: antialiased;
+color: #333;
+}
+a,
+button {
+-moz-transition: all 0.3s;
+-o-transition: all 0.3s;
+-webkit-transition: all 0.3s;
+transition: all 0.3s;
+text-decoration: none;
+}
+a,
+a:hover,
+a:focus,
+button:hover,
+button:focus {
+outline: 0 !important;
+text-decoration: none;
+}
+.font-weight-900{
+font-weight: 900;
+}
+.f-50{
+font-size: 50px;
+}
+.btn {
+border-radius: 0px;
+text-transform: uppercase;
+padding: 12px 30px;
+}
+.section {
+padding: 100px 0px;
+position: relative;
+}
+.pb-70 {
+padding-bottom: 70px;
+}
+.pb-50 {
+padding-bottom: 50px;
+}
+.mb-100{
+margin-bottom: 100px;
+}
+.mb-50{
+margin-bottom: 50px;
+}
+.mb-30{
+margin-bottom: 30px;
+}
+.mt-30{
+margin-top: 30px;
+}
+.space-40 {
+height: 40px;
+width: 100%
+}
+.space-50 {
+height: 50px;
+width: 100%
+}
+.text-primary {
+color: #627aec !important;
+}
+.btn-primary {
+color: #fff;
+background-color: #627aec;
+border-color: #627aec;
+}
+.btn-dark:hover {
+color: #fff;
+background-color: #627aec;
+border-color: #627aec;
+}
+.btn.btn-round{ border-radius: 50px; }
+.bg-dark {
+background-color: #22232f !important;
+}
+.btn-outline-primary {
+color: #627aec;
+border-color: #627aec;
+}
+.bg-section {
+background-color: #f5f5f5;
+}
+.srction_title p {
+color: #000000;
+font-size: 18px;
+}
+.btn-danger{
+  background: #ff6501;
+  border-color: #ff6501;
+}
+.btn-danger:hover{
+  background-color: #d95e0e;
+  border-color: #d95e0e;
+}
+/*02 Header*/
+div#header-sticky-wrapper {
+position: absolute;
+width: 100%;
+left: 0px;
+top: 0px;
+z-index: 999;
+}
+.navbar{
+padding: 0px 15px;
+}
+.is-sticky header {
+background-color: #22232f;
+}
+.bg-light.navbar-transparent {
+background-color: transparent !important;
+}
+.navbar-light .navbar-nav .active>.nav-link, .navbar-light .navbar-nav .nav-link.active, .navbar-light .navbar-nav .nav-link.show, .navbar-light .navbar-nav .show>.nav-link {
+color: #627aec;
+}
+.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {
+color: rgb(98, 122, 236);
+}
+.navbar-light .navbar-nav .nav-link {
+color: #fff;
+padding: 0 20px;
+text-transform: uppercase;
+}
+header .navbar-nav  > li > a:not(.btn){ position: relative; line-height: 75px; }
+header .navbar-nav  > li >  a:not(.btn):before {
+content: "";
+position: absolute;
+right: 0;
+bottom: 0;
+width: 0px;
+height: 2px;
+background-color: #627aec;
+transition: 0.3s;
+}
+header .navbar-nav  > li >  a:not(.btn):hover:before,header .navbar-nav  > li > a.active:not(.btn-round ):before {
+width: 100%;
+left: 0;
+right: auto;
+}
+.navbar-light .navbar-toggler {
+color: rgba(0,0,0,.5);
+border-color: rgba(0,0,0,.1);
+background-color: #fff;
+}
+
+
+/*hero*/
+
+
+.hero.section {
+padding-top: 200px;
+max-height: 880px; min-height: 880px;
+margin-bottom: 100px;
+}
+.home-desk {
+margin-bottom: -200px;
+}
+/*Box card*/
+.bos.bg-bos { padding: 30px 30px; }
+.bos h2{
+font-weight: 450;
+color: #000000; margin-bottom: 20px;
+}
+.bos.bg-bos img {
+height:207px;
+margin: 0 auto;
+display: block;
+text-align: center;
+margin-bottom:20px;
+}
+.bos .media h3 {
+margin-bottom: 10px;
+}
+/*Box card*/
+.bg-box {
+background-color: #f5f5f5;
+}
+.box.bg-box { padding: 30px 30px; }
+.box h3{
+font-size: 24px;
+font-weight: bold;
+color: #000000; margin-bottom: 20px;
+}
+.box.bg-box .icon {
+font-size: 36px;
+width: 80px;
+height: 80px;
+margin: 0 auto;
+border: 1px solid;
+display: block;
+line-height: 80px;
+margin-bottom: 20px;
+border-radius: 100%;
+text-align: center;
+}
+.box .media h3 {
+margin-bottom: 10px;
+}
+.box.bg-box:hover{
+background-color: #627aec;
+}
+.box.bg-box:hover .icon{
+background-color: #fff;
+color: #fff;
+}
+.box.bg-box:hover h3,.box.bg-box:hover p{
+color: #fff;
+}
+/*-- ==== Start Call Action  ==== */
+.call_action .icon {
+width: 120px;
+height: 120px;
+background-color: #fff;
+border-radius: 100%;
+line-height: 125px;
+font-size: 40px;
+text-align: center;
+color: #627aec;
+margin: 0 auto 40px;
+}
+/*What people say*/
+span.blockquote_icon {
+position: absolute;
+right: 0;
+font-size: 150px;
+display: block;
+bottom: 84px;
+line-height: 0;
+color: #f0f0f0;
+transform: rotate(-180deg);
+pointer-events: none;
+}
+.what_say_sldier .media {
+position: relative;
+}
+.owl-dots .owl-dot {
+width: 10px;
+height: 10px;
+background: #ddd;
+border-radius: 100%;
+margin: 0 5px;
+}
+.owl-dots {
+display: flex;
+justify-content: center; margin-top: 30px;
+}
+.owl-dots .owl-dot.active {
+background-color: #000;
+}
+/*price*/
+section.section.pricing {
+position: relative;
+}
+section.section.pricing .bg_box {
+position: absolute;
+width: 100%;
+height: 450px;
+top: 0;
+background-repeat: no-repeat;
+background-size: cover;
+}
+section.section.pricing .container {
+position: relative;
+z-index: 10;
+}
+.card.price_box {
+box-shadow: 2.5px 4.33px 20px rgba(0,0,0,0.2);
+background-color: transparent;
+text-align: center;
+padding: 30px;
+}
+.card.price_box h2 {
+font-size: 15px;
+line-height: 40px;
+font-weight: 700;
+}
+.card.price_box h3 {
+font-size: 48px;
+line-height: 40px;
+font-weight: 900;
+text-align: center;
+}
+.card.price_box h3 sub{
+font-size: 24px; bottom: 0px; margin: 0 5px;
+}
+.card.price_box ul li{
+font-size: 16px;
+line-height: 45px;
+color: #939499;
+font-weight: 400;
+text-align: center;
+}
+.card.price_box.active {
+border: 2px solid rgba(255,255,255,0.04);
+}
+.pricing_slider .item {
+padding: 20px;
+}
+/*Our Team */
+.team_img {
+width: 255px;
+height: 256px;
+border-radius: 128px;
+background-color: #ffffff;
+border: 6px solid #a9aaae;
+text-align: center;
+padding: 30px; margin: 0 auto;
+}
+.team_img img{
+border-radius: 100%;
+}
+.social li a {
+background-color: transparent;
+border-radius: 100%;
+color: #828282; border:1px solid #828282;
+float: left;
+font-size: 14px;
+height: 36px;
+line-height: 36px;
+margin: 0;
+padding: 0;
+text-align: center;
+width: 36px;
+position: relative;
+}
+.social li a:hover {
+background-color: #627aec;
+color: #fff; border:1px solid #627aec;
+}
+.team-box:hover .team_img{  border: 6px solid #627aec;  }
+/*newsletter*/
+.newsletter_input input.form-control {
+height: 60px;
+border-radius: 60px;
+}
+.newsletter_input {
+position: relative;
+}
+.newsletter_input .btn {
+position: absolute;
+right: 12px;
+top: 7px;
+min-width: 140px;
+}
+.newsletter_input .btn i{
+margin-left: 5px;
+}
+/*Form*/
+.form-control {
+border: 1px solid #ebebeb;
+width: 100%;
+max-width: 100%;
+color: #989ca2;
+background: 0 0;
+min-height: 60px;
+padding: 10px 15px;
+box-shadow: none;
+outline: none;
+}
+.form-control:focus{
+box-shadow: none;
+outline: none;
+}
+/*Footer*/
+.footer_menu a {
+font-weight: 300;
+padding: 0 15px;
+border-right: 1px solid #757575; color: #000; text-transform: uppercase; }
+.footer_menu a:hover{
+color: #627aec;
+}
+.footer_menu ul li {
+display: inline-block; }
+.footer_menu ul li:last-child a {
+border-right: none; }
+.footer_copywrite_area {
+display: block;
+padding: 30px 0 100px 0; }
+.footer_social_area {
+margin-bottom: 30px; }
+.footer_social_area a {
+border-radius: 50%;
+height: 40px;
+text-align: center;
+width: 40px; color: #000;
+display: inline-block;
+background-color: #ffffff;
+line-height: 40px;
+box-shadow: none;
+margin: 0 5px; }
+.footer_social_area a i {
+line-height: 36px; }
+.footer_social_area a:hover, .footer_social_area a:focus {
+color: #ffffff;    background-color: #627aec;
+border-color: #627aec; }
+.footer_bottom_area {
+display: block;
+position: relative;
+text-align: center; }
+.footer_bottom_area .item {
+margin-bottom: 50px; }
+.footer_bottom p {
+margin: 0;
+font-size: 14px; }
+.contact_location h3 {
+font-size: 26px;
+font-weight: 900;
+padding-bottom: 10px;
+}
+.contact_location p {
+line-height: 40px;
+font-size: 20px;
+color: #677294;
+}
+.contact_location ul{
+margin-bottom: 0px;
+}
+.contact_location .location_info li {
+font-size: 20px;
+color: #677294;
+margin-bottom: 15px;
+}
+.contact_location .location_info li:last-child{
+margin-bottom: 0px;
+}
+.contact_location .location_info li a{
+font-size: 20px;
+color: #677294;
+
+}
+.contact_location a:hover,.contact_location .location_info li a:hover{
+color: #627aec;
+}
+.contact_location .location_info li i {
+margin-right: 15px; color: #627aec;
+}
+p.help-block ul {
+font-size: 13px;
+margin: 0px;
+padding: 0px;
+list-style: none;
+}
+p.help-block {
+margin: 0px;
+position: absolute;
+left: 0;
+}
+.form-group {
+position: relative;
+margin-bottom: 23px;
+}
+/*Responsive */
+@media(max-width: 991px){
+header#header{
+padding: 15px 0px;
+}
+.f-50 {
+font-size: 36px;
+}
+.lead {
+font-size: 1rem;}
+.home-desk,.hero.section {
+margin-bottom: 0;
+}
+.box.bg-box .icon {
+font-size: 20px;
+width: 50px;
+height: 50px;
+line-height: 50px;
+
+}
+.h1, h1 {
+font-size: 1.7rem;
+}
+.box.bg-box {
+padding: 30px 15px;
+}
+.box h3 {
+font-size: 20px;}
+.call_action .icon {
+width: 70px;
+height: 70px;
+
+border-radius: 100%;
+line-height: 70px;
+
+}
+.srction_title p {
+color: #000000;
+font-size: 14px;
+}
+.card.price_box h3 {
+font-size: 32px;}
+section.section.pricing .bg_box {
+position: absolute;
+width: 100%;
+height: 490px;}
+.team_img {
+width: 206px;
+height: 206px;
+border-radius: 128px;
+border-width: 4px;
+padding: 10px;
+margin: 0 auto;
+}
+header .navbar-nav > li > a:not(.btn) {
+    position: relative;
+    line-height: 45px;
+}
+.btn {
+  
+    padding: 12px 20px;
+    
+}
+}
+@media(max-width: 640px){
+.f-50 {
+font-size:30px;
+}
+}
+
+
+
+/*loader*/
+
+.loader_pre{
+    position: fixed;width: 100%;left: 0px; height: 100%; top: 0; background-color: #000; z-index: 100000;
+}
+#loader {
+  position: absolute;
+  left: 50%;
+  margin-left: -50px;
+  top: 50%;
+  margin-top: -50px;
+  border: 20px #ddd double;
+  border-top: 20px double #627aec;
+  border-radius: 100%;
+  box-shadow: 0px 0px 5px inset #ccc;
+  width: 100px;
+  height: 100px;
+  animation: spin 2s linear infinite;
+}
+
+@keyframes spin {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(360deg);
+  }
+}
+.video-bg {
+  background: url(videobg.png) no-repeat center center;
+  height: 180px;
+  width:255px;
+}
+.video-bg a{
+  display: block;
+  height:120px;
+}
+.video-bg a h3{
+  color: #fff ;
+  padding-top:40px;
+  font-weight: 400
+}
+.video-bg a h3{
+  color:#ccc;
+}
+.video-bg a h3 i{
+  transition: All 0.4s ease-in-out;
+            -webkit-transition: All 0.4s ease-in-out;
+            -moz-transition: All 0.4s ease-in-out;
+            -o-transition: All 0.4s ease-in-out;
+}
+.video-bg a:hover h3 i{
+            transform: rotate(360deg);
+            -webkit-transform: rotate(360deg);
+            -moz-transform: rotate(360deg);
+            -o-transform: rotate(360deg);
+            -ms-transform: rotate(360deg);
+}
+.video-bg a:hover{
+  color:#fff;
+}

二進制
css/videobg.png


二進制
images/bg_01.png


二進制
images/bg_02.jpg


二進制
images/favicon.ico


二進制
images/home-desk.png


二進制
images/laohuicon.png


二進制
images/line.png


二進制
images/logo.png


二進制
images/softview/1.png


二進制
images/softview/2.png


二進制
images/softview/3.png


文件差異過大導致無法顯示
+ 1 - 0
images/undraw_browse.svg


文件差異過大導致無法顯示
+ 1 - 0
images/undraw_gift.svg


文件差異過大導致無法顯示
+ 1 - 0
images/undraw_work.svg


+ 555 - 0
index.html

@@ -0,0 +1,555 @@
+<!doctype html>
+<html lang="en">
+   <head>
+      <!-- Required meta tags -->
+      <meta charset="utf-8">
+      <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+      <!-- Bootstrap CSS -->
+      <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
+      <link rel="stylesheet" href="assets/fontawesome/css/all.css">
+      <link rel="stylesheet" href="css/style.css">
+      <title>大司空云计价 - 远程办公,用免费正版市政计价软件</title>
+      <link rel="shortcut icon" href="css/favicon.ico" />
+   </head>
+   <body>
+
+      <header id="header">
+         <nav class="navbar navbar-expand-lg navbar-light bg-light  navbar-transparent">
+            <div class="container">
+               <a class="navbar-brand" href="#home"><img src="images/logo.png" alt="" class="img-fluid"></a>
+               <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarLexar" aria-controls="navbarLexar" aria-expanded="false" aria-label="Toggle navigation">
+               <span class="navbar-toggler-icon"></span>
+               </button>
+               <div class="collapse navbar-collapse" id="navbarLexar">
+               <ul class="navbar-nav ml-auto">
+                     <li class="nav-item active">
+                        <a class="btn btn-danger my-3" href="/login">登录软件</a>
+                     </li>
+                  </ul>
+               </div>
+            </div>
+         </nav>
+      </header>
+      <!--banner-->
+      <div class="hero bg-dark section " style="background-image: url(images/bg_01.png);" id="home">
+         <div class="container text-center">
+            <h1 class="text-white mb-4 f-50 ">市政建筑计价免费版,永久免费</h1>
+            <p class="lead text-white mb-5">跨平台,打开浏览器即可使用,全新在线计价体验。
+            <div class="btn_hero">
+               <a href="https://smartcost.com.cn/contact2" target="_blank" class="btn btn-primary mr-2">联系客服</a>
+               <a href="#video" class="btn btn-secondary"><i class="fas fa-play-circle"></i> 视频教程</a>
+            </div>
+            <div class="home-desk mt-5">
+               <div class="container pt-5">
+                  <img src="images/home-desk.png" alt="" class="img-fluid mx-auto  d-block">
+               </div>
+            </div>
+         </div>
+      </div>
+      <!--简介-->
+      <section class="section">
+         <div class="container">
+            <div class="row">
+               <div class="col-md-10 offset-md-1">
+                  <div class="srction_title text-center">
+                     <img src="images/line.png" alt="" class="img-fluid mx-auto my-3 d-block">
+                  </div>
+               </div>
+            </div>
+            <div class="row">
+               <div class="col-12 col-md-6 col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos bg-bos text-center">
+                     <!-- Icon -->
+                     <div class="text-primary">
+                        <img src="images/undraw_gift.svg">
+                     </div>
+                     <!-- Heading -->
+                     <h2>
+                     正版永久免费
+                     </h2>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-6 col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos bg-bos text-center">
+                     <!-- Icon -->
+                     <div class="text-primary">
+                        <img src="images/undraw_browse.svg">
+                     </div>
+                     <!-- Heading -->
+                     <h2>
+                     真云版免安装
+                     </h2>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-6 col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos bg-bos text-center">
+                     <!-- Icon -->
+                     <div class="text-primary">
+                        <img src="images/undraw_work.svg">
+                     </div>
+                     <!-- Heading -->
+                     <h2>
+                     高效协同工作
+                     </h2>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+         </div>
+      </section>
+      <!--大司空-->
+      <section class="section bg-section py-5">
+         <div class="container">
+            <p class="text-center mb-0 lead">大司空,是中国古代官名,掌土木、营建之事</p>
+            <h2 class="h1 font-weight-900 mb-0 text-center">古人云,伯禹为<span class="text-primary">司空</span>,可成美尧之功</h2>
+         </div>
+      </section>
+      <!-- 详细简介 -->
+      <section class="section ">
+         <div class="container">
+            <div class="row align-items-center mb-100">
+               <div class="col-lg-8 mt-30">
+                  <img src="images/softview/1.png" alt="" class="img-fluid d-block mx-auto" style="border:1px solid #ccc">
+               </div>
+               <div class="col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos text-left mb-30">
+                     <div class="media align-items-lg-center">
+                        <div class="media-body pl-4">
+                           <!-- Heading -->
+                           <h3 class="mb-5">
+                           真云版、免安装
+                           </h3>
+                           <!-- Text -->
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>数据实时存粗在云端
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>支持苹果macOS系统
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>随时随地轻松做预算
+                           </p>
+                        </div>
+                     </div>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+            <div class="row align-items-center mb-100">
+               <div class="col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos text-left mb-30">
+                     <div class="media align-items-lg-center">
+                        <div class="media-body pl-4">
+                           <!-- Heading -->
+                           <h3 class="mb-5">
+                           正版软件,永久免费
+                           </h3>
+                           <!-- Text -->
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>各省费用定额完全免费
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>与Excel完美兼容
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>满足电子招投标数据流转
+                           </p>
+                        </div>
+                     </div>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-lg-8 mt-30">
+                  <img src="images/softview/2.png" alt="" class="img-fluid d-block mx-auto" style="border:1px solid #ccc">
+               </div>
+            </div>
+            <div class="row align-items-center">
+               <div class="col-lg-8 mt-30">
+                  <img src="images/softview/3.png" alt="" class="img-fluid d-block mx-auto" style="border:1px solid #ccc">
+               </div>
+               <div class="col-lg-4 mt-30">
+                  <!-- Box -->
+                  <div class="bos text-left mb-30">
+                     <div class="media align-items-lg-center">
+                        <div class="media-body pl-4">
+                           <!-- Heading -->
+                           <h3 class="mb-5">
+                           高效在线协作
+                           </h3>
+                           <!-- Text -->
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>一键分享,告别反复传输文件
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>多人在线编辑。协作更高效
+                           </p>
+                           <p class="mb-5 lead">
+                              <i class="fas fa-circle mr-2 text-primary"></i>可实时控制协作权限
+                           </p>
+                        </div>
+                     </div>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+         </div>
+      </section>
+      <!--产品-->
+      <section class="section">
+         <div class="container">
+            <div class="row mb-30">
+               <div class="col-md-10 offset-md-1">
+                  <div class="srction_title text-center">
+                     <h2 class="h1 font-weight-900 mb-0">专业分类</h2>
+                     <img src="images/line.png" alt="" class="img-fluid mx-auto my-3 d-block">
+                  </div>
+               </div>
+            </div>
+            <div class="row">
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-archway"></i>
+                     </div>
+                     <h3>
+                     市政
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-building"></i>
+                     </div>
+                     <h3>
+                     房建
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-equals"></i>
+                     </div>
+                     <h3>
+                     轨道
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-compress"></i>
+                     </div>
+                     <h3>
+                     综合管廊
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-tree"></i>
+                     </div>
+                     <h3>
+                     园林绿化
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fab fa-houzz"></i>
+                     </div>
+                     <h3>
+                     装配式建筑
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fas fa-screwdriver"></i>
+                     </div>
+                     <h3>
+                     通用安装
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center">
+                     <div class="icon text-primary">
+                        <i class="fab fa-codepen"></i>
+                     </div>
+                     <h3>
+                     构筑物
+                     </h3>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+         </div>
+      </section>
+      <!--视频-->
+      <section class="section" id="video">
+         <div class="container">
+            <div class="row mb-30">
+               <div class="col-md-10 offset-md-1">
+                  <div class="srction_title text-center">
+                     <h2 class="h1 font-weight-900 mb-0">视频展示</h2>
+                     <img src="images/line.png" alt="" class="img-fluid mx-auto my-3 d-block">
+                  </div>
+               </div>
+            </div>
+            <div class="row">
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center video-bg">
+                     <a href="#video-tiaojia" data-toggle="modal" data-target="#video-tiaojia" >
+                        <h3 class="mb-0">
+                           <i class="fas fa-play-circle"></i> 调价
+                        </h3>
+                     </a>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center video-bg">
+                     <a href="#video-gydjwj" data-toggle="modal" data-target="#video-gydjwj">
+                        <h3 class="mb-0">
+                           <i class="fas fa-play-circle"></i> 共用单价文件
+                        </h3>
+                     </a>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center video-bg">
+                     <a href="#video-qdjl" data-toggle="modal" data-target="#video-qdjl">
+                        <h3 class="mb-0">
+                           <i class="fas fa-play-circle"></i> 清单精灵
+                        </h3>
+                     </a>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center video-bg">
+                     <a href="#video-czdw" data-toggle="modal" data-target="#video-czdw">
+                        <h3 class="mb-0">
+                           <i class="fas fa-play-circle"></i> 查找定位
+                        </h3>
+                     </a>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center video-bg">
+                     <a href="#video-fxxz" data-toggle="modal" data-target="#video-fxxz">
+                        <h3 class="mb-0">
+                           <i class="fas fa-play-circle"></i> 分享协作
+                        </h3>
+                     </a>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center video-bg">
+                     <a href="#video-mbkl" data-toggle="modal" data-target="#video-mbkl">
+                        <h3 class="mb-0">
+                           <i class="fas fa-play-circle"></i> 模板克隆
+                        </h3>
+                     </a>
+                  </div>
+                  <!--End Box -->
+               </div>
+               <div class="col-12 col-md-4 col-lg-3 mt-30">
+                  <!-- Box -->
+                  <div class="box bg-box text-center video-bg">
+                     <a href="#video-fzzk" data-toggle="modal" data-target="#video-fzzk">
+                        <h3 class="mb-0">
+                           <i class="fas fa-play-circle"></i> 复制整块
+                        </h3>
+                     </a>
+                  </div>
+                  <!--End Box -->
+               </div>
+            </div>
+         </div>
+      </section>
+      <!--底部-->
+      <footer class="footer_area bg-light">
+         <div class="footer_bottom_area section pb-0">
+            <div class="container">
+               <div class="row">
+                  <div class="col-6">
+                     <h3><img src="images/laohuicon.png" class="mr-3">加班少一点,胜算多一点</h3>
+                  </div>
+                  <div class="col-6">
+                     <div class="footer_menu">
+                        <ul class="list-unstyled">
+                           <li>
+                              <a  href="https://smartcost.com.cn" target="_blank">首页</a>
+                           </li>
+                           <li>
+                              <a  href="https://smartcost.com.cn/product/24" target="_blank">产品下载</a>
+                           </li>
+                           <li>
+                              <a  href="http://ol.smartcost.com.cn" target="_blank">纵横造价网络版</a>
+                           </li>
+                           <li>
+                              <a  href="https://smartcost.com.cn/train" target="_blank">纵横专业培训</a>
+                           </li>
+                           <li>
+                              <a  href="https://smartcost.com.cn/contact2" target="_blank">联系我们</a>
+                           </li>
+                        </ul>
+                     </div>
+                  </div>
+               </div>
+            </div>
+         </div>
+         <div class="footer_copywrite_area">
+            <div class="container">
+               <div class="row">
+                  <div class="col-12">
+                     <div class="footer_bottom text-center">
+                        Copyright@珠海纵横创新软件有限公司 all rights reserved <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备14032472号</a>
+                     </div>
+                     <div></div>
+                  </div>
+               </div>
+            </div>
+         </div>
+      </footer>
+     <!--视频 调价-->
+     <div class="modal fade" id="video-tiaojia">
+         <div class="modal-dialog modal-xl" role="document">
+             <div class="modal-content">
+                 <div class="modal-header">
+                     <h5 class="modal-title">调价</h5>
+                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                 </div>
+                 <div class="modal-body">
+                   <video width="100%" height="558" controls="controls">
+  <source src="http://d1.video.smartcost.com.cn/video/play/2020/调价.mp4" type="video/mp4">
+</video>
+                 </div>
+             </div>
+         </div>
+     </div>
+     <!--视频 共用单价文件-->
+     <div class="modal fade" id="video-gydjwj">
+         <div class="modal-dialog modal-xl" role="document">
+             <div class="modal-content">
+                 <div class="modal-header">
+                     <h5 class="modal-title">共用单价文件</h5>
+                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                 </div>
+                 <div class="modal-body">
+                   <video width="100%" height="558" controls="controls">
+  <source src="http://d1.video.smartcost.com.cn/video/play/2020/共用单价文件.mp4" type="video/mp4">
+</video>
+                 </div>
+             </div>
+         </div>
+     </div>
+    <!--视频 清单精灵-->
+     <div class="modal fade" id="video-qdjl">
+         <div class="modal-dialog modal-xl" role="document">
+             <div class="modal-content">
+                 <div class="modal-header">
+                     <h5 class="modal-title">清单精灵</h5>
+                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                 </div>
+                 <div class="modal-body">
+                   <video width="100%" height="558" controls="controls">
+  <source src="http://d1.video.smartcost.com.cn/video/play/2020/清单精灵.mp4" type="video/mp4">
+</video>
+                 </div>
+             </div>
+         </div>
+     </div>
+    <!--视频 分享协作-->
+     <div class="modal fade" id="video-fxxz">
+         <div class="modal-dialog modal-xl" role="document">
+             <div class="modal-content">
+                 <div class="modal-header">
+                     <h5 class="modal-title">分享协作</h5>
+                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                 </div>
+                 <div class="modal-body">
+                   <video width="100%" height="558" controls="controls">
+  <source src="http://d1.video.smartcost.com.cn/video/play/2020/分享协作.mp4" type="video/mp4">
+</video>
+                 </div>
+             </div>
+         </div>
+     </div>
+    <!--视频 模板克隆-->
+     <div class="modal fade" id="video-mbkl">
+         <div class="modal-dialog modal-xl" role="document">
+             <div class="modal-content">
+                 <div class="modal-header">
+                     <h5 class="modal-title">模板克隆</h5>
+                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                 </div>
+                 <div class="modal-body">
+                   <video width="100%" height="558" controls="controls">
+  <source src="http://d1.video.smartcost.com.cn/video/play/2020/模板克隆.mp4" type="video/mp4">
+</video>
+                 </div>
+             </div>
+         </div>
+     </div>
+    <!--视频 复制整块-->
+     <div class="modal fade" id="video-fzzk">
+         <div class="modal-dialog modal-xl" role="document">
+             <div class="modal-content">
+                 <div class="modal-header">
+                     <h5 class="modal-title">复制整块</h5>
+                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                 </div>
+                 <div class="modal-body">
+                   <video width="100%" height="558" controls="controls">
+  <source src="http://d1.video.smartcost.com.cn/video/play/2020/复制整块.mp4" type="video/mp4">
+</video>
+                 </div>
+             </div>
+         </div>
+     </div>
+
+      <!-- jQuery first, then Popper.js, then Bootstrap JS -->
+      <script src="js/jquery.min.js"></script>
+      <script src="js/popper.min.js"></script>
+      <script src="assets/bootstrap/js/bootstrap.min.js"></script>
+      <script src="js/jquery.sticky.js"></script>
+   </body>
+</html>

+ 130 - 0
js/app.js

@@ -0,0 +1,130 @@
+/* 
+lexar
+Author - bootstrapdevelop
+Project Version - v1.0
+ */
+(function ($) {
+    "use strict";
+    /**sticky*/
+  $("#header").sticky({topSpacing:0}); 
+    //auto close navbar-collapse on click a
+    $('.nav-item>[data-scroll]').on('click', function () {
+        $('.navbar-toggler:visible').click();
+    });
+
+
+// owl-carousel
+
+$(".what_say_sldier").owlCarousel({
+    loop:true,
+    margin:30,
+    nav:false,
+    dots:true,
+    responsive:{
+        0:{
+            items:1
+        },
+        600:{
+            items:2
+        },
+        1000:{
+            items:3
+        }
+    }
+});
+
+$(".pricing_slider").owlCarousel({
+    loop:true,
+    margin:0,
+    nav:false,
+    dots:true,
+    responsive:{
+        0:{
+            items:1
+        },
+        600:{
+            items:2
+        },
+        1000:{
+            items:3
+        }
+    }
+});  
+
+$(".team_slider").owlCarousel({
+    loop:true,
+    margin:10,
+    nav:false,
+    dots:true,
+    responsive:{
+        0:{
+            items:1
+        },
+        600:{
+            items:2
+        },
+        1000:{
+            items:3
+        },
+        1200:{
+            items:4
+        }
+    }
+});
+
+     // Select all links with hashes
+/* 
+lexar - Software HTML5 Landing Page
+Author - nilssatasiya
+Project Version - v1.0
+ */
+
+(function ($) {
+    "use strict";
+
+
+//auto close navbar-collapse on click a
+    $('.nav-item').on('click', function () {
+        $('.navbar-toggler:visible').click();
+    });
+
+
+
+$('a[href*="#"]')
+    // Remove links that don't actually link to anything
+    .not('[href="#"]')
+    .not('[href="#0"]')
+    .click(function(event) {
+        // On-page links
+        if (
+            location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') &&
+            location.hostname == this.hostname
+        ) {
+            // Figure out element to scroll to
+            var target = $(this.hash);
+            target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
+            // Does a scroll target exist?
+            if (target.length) {
+                // Only prevent default if animation is actually gonna happen
+                event.preventDefault();
+                $('html, body').animate({
+                    scrollTop: target.offset().top 
+                }, 1000, function() {
+                    // Callback after animation
+                   
+                });
+            }
+        }
+    });
+
+})(jQuery);
+
+
+$(document).ready(function(){
+  $('[data-toggle="tooltip"]').tooltip();
+});
+
+
+$(".loader_pre").fadeTo(1,1).fadeOut(1);
+
+})(jQuery);

+ 912 - 0
js/jqBootstrapValidation.js

@@ -0,0 +1,912 @@
+/* jqBootstrapValidation
+ * A plugin for automating validation on Twitter Bootstrap formatted forms.
+ *
+ * v1.3.6
+ *
+ * License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file
+ *
+ * http://ReactiveRaven.github.com/jqBootstrapValidation/
+ */
+
+(function( $ ){
+
+	var createdElements = [];
+
+	var defaults = {
+		options: {
+			prependExistingHelpBlock: false,
+			sniffHtml: true, // sniff for 'required', 'maxlength', etc
+			preventSubmit: true, // stop the form submit event from firing if validation fails
+			submitError: false, // function called if there is an error when trying to submit
+			submitSuccess: false, // function called just before a successful submit event is sent to the server
+            semanticallyStrict: false, // set to true to tidy up generated HTML output
+			autoAdd: {
+				helpBlocks: true
+			},
+            filter: function () {
+                // return $(this).is(":visible"); // only validate elements you can see
+                return true; // validate everything
+            }
+		},
+    methods: {
+      init : function( options ) {
+
+        var settings = $.extend(true, {}, defaults);
+
+        settings.options = $.extend(true, settings.options, options);
+
+        var $siblingElements = this;
+
+        var uniqueForms = $.unique(
+          $siblingElements.map( function () {
+            return $(this).parents("form")[0];
+          }).toArray()
+        );
+
+        $(uniqueForms).bind("submit", function (e) {
+          var $form = $(this);
+          var warningsFound = 0;
+          var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter);
+          $inputs.trigger("submit.validation").trigger("validationLostFocus.validation");
+
+          $inputs.each(function (i, el) {
+            var $this = $(el),
+              $controlGroup = $this.parents(".control-group").first();
+            if (
+              $controlGroup.hasClass("warning")
+            ) {
+              $controlGroup.removeClass("warning").addClass("error");
+              warningsFound++;
+            }
+          });
+
+          $inputs.trigger("validationLostFocus.validation");
+
+          if (warningsFound) {
+            if (settings.options.preventSubmit) {
+              e.preventDefault();
+            }
+            $form.addClass("error");
+            if ($.isFunction(settings.options.submitError)) {
+              settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true));
+            }
+          } else {
+            $form.removeClass("error");
+            if ($.isFunction(settings.options.submitSuccess)) {
+              settings.options.submitSuccess($form, e);
+            }
+          }
+        });
+
+        return this.each(function(){
+
+          // Get references to everything we're interested in
+          var $this = $(this),
+            $controlGroup = $this.parents(".control-group").first(),
+            $helpBlock = $controlGroup.find(".help-block").first(),
+            $form = $this.parents("form").first(),
+            validatorNames = [];
+
+          // create message container if not exists
+          if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {
+              $helpBlock = $('<div class="help-block" />');
+              $controlGroup.find('.controls').append($helpBlock);
+							createdElements.push($helpBlock[0]);
+          }
+
+          // =============================================================
+          //                                     SNIFF HTML FOR VALIDATORS
+          // =============================================================
+
+          // *snort sniff snuffle*
+
+          if (settings.options.sniffHtml) {
+            var message = "";
+            // ---------------------------------------------------------
+            //                                                   PATTERN
+            // ---------------------------------------------------------
+            if ($this.attr("pattern") !== undefined) {
+              message = "Not in the expected format<!-- data-validation-pattern-message to override -->";
+              if ($this.data("validationPatternMessage")) {
+                message = $this.data("validationPatternMessage");
+              }
+              $this.data("validationPatternMessage", message);
+              $this.data("validationPatternRegex", $this.attr("pattern"));
+            }
+            // ---------------------------------------------------------
+            //                                                       MAX
+            // ---------------------------------------------------------
+            if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) {
+              var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax"));
+              message = "Too high: Maximum of '" + max + "'<!-- data-validation-max-message to override -->";
+              if ($this.data("validationMaxMessage")) {
+                message = $this.data("validationMaxMessage");
+              }
+              $this.data("validationMaxMessage", message);
+              $this.data("validationMaxMax", max);
+            }
+            // ---------------------------------------------------------
+            //                                                       MIN
+            // ---------------------------------------------------------
+            if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) {
+              var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin"));
+              message = "Too low: Minimum of '" + min + "'<!-- data-validation-min-message to override -->";
+              if ($this.data("validationMinMessage")) {
+                message = $this.data("validationMinMessage");
+              }
+              $this.data("validationMinMessage", message);
+              $this.data("validationMinMin", min);
+            }
+            // ---------------------------------------------------------
+            //                                                 MAXLENGTH
+            // ---------------------------------------------------------
+            if ($this.attr("maxlength") !== undefined) {
+              message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters<!-- data-validation-maxlength-message to override -->";
+              if ($this.data("validationMaxlengthMessage")) {
+                message = $this.data("validationMaxlengthMessage");
+              }
+              $this.data("validationMaxlengthMessage", message);
+              $this.data("validationMaxlengthMaxlength", $this.attr("maxlength"));
+            }
+            // ---------------------------------------------------------
+            //                                                 MINLENGTH
+            // ---------------------------------------------------------
+            if ($this.attr("minlength") !== undefined) {
+              message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters<!-- data-validation-minlength-message to override -->";
+              if ($this.data("validationMinlengthMessage")) {
+                message = $this.data("validationMinlengthMessage");
+              }
+              $this.data("validationMinlengthMessage", message);
+              $this.data("validationMinlengthMinlength", $this.attr("minlength"));
+            }
+            // ---------------------------------------------------------
+            //                                                  REQUIRED
+            // ---------------------------------------------------------
+            if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) {
+              message = settings.builtInValidators.required.message;
+              if ($this.data("validationRequiredMessage")) {
+                message = $this.data("validationRequiredMessage");
+              }
+              $this.data("validationRequiredMessage", message);
+            }
+            // ---------------------------------------------------------
+            //                                                    NUMBER
+            // ---------------------------------------------------------
+            if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") {
+              message = settings.builtInValidators.number.message;
+              if ($this.data("validationNumberMessage")) {
+                message = $this.data("validationNumberMessage");
+              }
+              $this.data("validationNumberMessage", message);
+            }
+            // ---------------------------------------------------------
+            //                                                     EMAIL
+            // ---------------------------------------------------------
+            if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") {
+              message = "Not a valid email address<!-- data-validator-validemail-message to override -->";
+              if ($this.data("validationValidemailMessage")) {
+                message = $this.data("validationValidemailMessage");
+              } else if ($this.data("validationEmailMessage")) {
+                message = $this.data("validationEmailMessage");
+              }
+              $this.data("validationValidemailMessage", message);
+            }
+            // ---------------------------------------------------------
+            //                                                MINCHECKED
+            // ---------------------------------------------------------
+            if ($this.attr("minchecked") !== undefined) {
+              message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required<!-- data-validation-minchecked-message to override -->";
+              if ($this.data("validationMincheckedMessage")) {
+                message = $this.data("validationMincheckedMessage");
+              }
+              $this.data("validationMincheckedMessage", message);
+              $this.data("validationMincheckedMinchecked", $this.attr("minchecked"));
+            }
+            // ---------------------------------------------------------
+            //                                                MAXCHECKED
+            // ---------------------------------------------------------
+            if ($this.attr("maxchecked") !== undefined) {
+              message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required<!-- data-validation-maxchecked-message to override -->";
+              if ($this.data("validationMaxcheckedMessage")) {
+                message = $this.data("validationMaxcheckedMessage");
+              }
+              $this.data("validationMaxcheckedMessage", message);
+              $this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked"));
+            }
+          }
+
+          // =============================================================
+          //                                       COLLECT VALIDATOR NAMES
+          // =============================================================
+
+          // Get named validators
+          if ($this.data("validation") !== undefined) {
+            validatorNames = $this.data("validation").split(",");
+          }
+
+          // Get extra ones defined on the element's data attributes
+          $.each($this.data(), function (i, el) {
+            var parts = i.replace(/([A-Z])/g, ",$1").split(",");
+            if (parts[0] === "validation" && parts[1]) {
+              validatorNames.push(parts[1]);
+            }
+          });
+
+          // =============================================================
+          //                                     NORMALISE VALIDATOR NAMES
+          // =============================================================
+
+          var validatorNamesToInspect = validatorNames;
+          var newValidatorNamesToInspect = [];
+
+          do // repeatedly expand 'shortcut' validators into their real validators
+          {
+            // Uppercase only the first letter of each name
+            $.each(validatorNames, function (i, el) {
+              validatorNames[i] = formatValidatorName(el);
+            });
+
+            // Remove duplicate validator names
+            validatorNames = $.unique(validatorNames);
+
+            // Pull out the new validator names from each shortcut
+            newValidatorNamesToInspect = [];
+            $.each(validatorNamesToInspect, function(i, el) {
+              if ($this.data("validation" + el + "Shortcut") !== undefined) {
+                // Are these custom validators?
+                // Pull them out!
+                $.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) {
+                  newValidatorNamesToInspect.push(el2);
+                });
+              } else if (settings.builtInValidators[el.toLowerCase()]) {
+                // Is this a recognised built-in?
+                // Pull it out!
+                var validator = settings.builtInValidators[el.toLowerCase()];
+                if (validator.type.toLowerCase() === "shortcut") {
+                  $.each(validator.shortcut.split(","), function (i, el) {
+                    el = formatValidatorName(el);
+                    newValidatorNamesToInspect.push(el);
+                    validatorNames.push(el);
+                  });
+                }
+              }
+            });
+
+            validatorNamesToInspect = newValidatorNamesToInspect;
+
+          } while (validatorNamesToInspect.length > 0)
+
+          // =============================================================
+          //                                       SET UP VALIDATOR ARRAYS
+          // =============================================================
+
+          var validators = {};
+
+          $.each(validatorNames, function (i, el) {
+            // Set up the 'override' message
+            var message = $this.data("validation" + el + "Message");
+            var hasOverrideMessage = (message !== undefined);
+            var foundValidator = false;
+            message =
+              (
+                message
+                  ? message
+                  : "'" + el + "' validation failed <!-- Add attribute 'data-validation-" + el.toLowerCase() + "-message' to input to change this message -->"
+              )
+            ;
+
+            $.each(
+              settings.validatorTypes,
+              function (validatorType, validatorTemplate) {
+                if (validators[validatorType] === undefined) {
+                  validators[validatorType] = [];
+                }
+                if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {
+                  validators[validatorType].push(
+                    $.extend(
+                      true,
+                      {
+                        name: formatValidatorName(validatorTemplate.name),
+                        message: message
+                      },
+                      validatorTemplate.init($this, el)
+                    )
+                  );
+                  foundValidator = true;
+                }
+              }
+            );
+
+            if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {
+
+              var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);
+              if (hasOverrideMessage) {
+                validator.message = message;
+              }
+              var validatorType = validator.type.toLowerCase();
+
+              if (validatorType === "shortcut") {
+                foundValidator = true;
+              } else {
+                $.each(
+                  settings.validatorTypes,
+                  function (validatorTemplateType, validatorTemplate) {
+                    if (validators[validatorTemplateType] === undefined) {
+                      validators[validatorTemplateType] = [];
+                    }
+                    if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {
+                      $this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);
+                      validators[validatorType].push(
+                        $.extend(
+                          validator,
+                          validatorTemplate.init($this, el)
+                        )
+                      );
+                      foundValidator = true;
+                    }
+                  }
+                );
+              }
+            }
+
+            if (! foundValidator) {
+              $.error("Cannot find validation info for '" + el + "'");
+            }
+          });
+
+          // =============================================================
+          //                                         STORE FALLBACK VALUES
+          // =============================================================
+
+          $helpBlock.data(
+            "original-contents",
+            (
+              $helpBlock.data("original-contents")
+                ? $helpBlock.data("original-contents")
+                : $helpBlock.html()
+            )
+          );
+
+          $helpBlock.data(
+            "original-role",
+            (
+              $helpBlock.data("original-role")
+                ? $helpBlock.data("original-role")
+                : $helpBlock.attr("role")
+            )
+          );
+
+          $controlGroup.data(
+            "original-classes",
+            (
+              $controlGroup.data("original-clases")
+                ? $controlGroup.data("original-classes")
+                : $controlGroup.attr("class")
+            )
+          );
+
+          $this.data(
+            "original-aria-invalid",
+            (
+              $this.data("original-aria-invalid")
+                ? $this.data("original-aria-invalid")
+                : $this.attr("aria-invalid")
+            )
+          );
+
+          // =============================================================
+          //                                                    VALIDATION
+          // =============================================================
+
+          $this.bind(
+            "validation.validation",
+            function (event, params) {
+
+              var value = getValue($this);
+
+              // Get a list of the errors to apply
+              var errorsFound = [];
+
+              $.each(validators, function (validatorType, validatorTypeArray) {
+                if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {
+                  $.each(validatorTypeArray, function (i, validator) {
+                    if (settings.validatorTypes[validatorType].validate($this, value, validator)) {
+                      errorsFound.push(validator.message);
+                    }
+                  });
+                }
+              });
+
+              return errorsFound;
+            }
+          );
+
+          $this.bind(
+            "getValidators.validation",
+            function () {
+              return validators;
+            }
+          );
+
+          // =============================================================
+          //                                             WATCH FOR CHANGES
+          // =============================================================
+          $this.bind(
+            "submit.validation",
+            function () {
+              return $this.triggerHandler("change.validation", {submitting: true});
+            }
+          );
+          $this.bind(
+            [
+              "keyup",
+              "focus",
+              "blur",
+              "click",
+              "keydown",
+              "keypress",
+              "change"
+            ].join(".validation ") + ".validation",
+            function (e, params) {
+
+              var value = getValue($this);
+
+              var errorsFound = [];
+
+              $controlGroup.find("input,textarea,select").each(function (i, el) {
+                var oldCount = errorsFound.length;
+                $.each($(el).triggerHandler("validation.validation", params), function (j, message) {
+                  errorsFound.push(message);
+                });
+                if (errorsFound.length > oldCount) {
+                  $(el).attr("aria-invalid", "true");
+                } else {
+                  var original = $this.data("original-aria-invalid");
+                  $(el).attr("aria-invalid", (original !== undefined ? original : false));
+                }
+              });
+
+              $form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation");
+
+              errorsFound = $.unique(errorsFound.sort());
+
+              // Were there any errors?
+              if (errorsFound.length) {
+                // Better flag it up as a warning.
+                $controlGroup.removeClass("success error").addClass("warning");
+
+                // How many errors did we find?
+                if (settings.options.semanticallyStrict && errorsFound.length === 1) {
+                  // Only one? Being strict? Just output it.
+                  $helpBlock.html(errorsFound[0] + 
+                    ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
+                } else {
+                  // Multiple? Being sloppy? Glue them together into an UL.
+                  $helpBlock.html("<ul role=\"alert\"><li>" + errorsFound.join("</li><li>") + "</li></ul>" +
+                    ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
+                }
+              } else {
+                $controlGroup.removeClass("warning error success");
+                if (value.length > 0) {
+                  $controlGroup.addClass("success");
+                }
+                $helpBlock.html($helpBlock.data("original-contents"));
+              }
+
+              if (e.type === "blur") {
+                $controlGroup.removeClass("success");
+              }
+            }
+          );
+          $this.bind("validationLostFocus.validation", function () {
+            $controlGroup.removeClass("success");
+          });
+        });
+      },
+      destroy : function( ) {
+
+        return this.each(
+          function() {
+
+            var
+              $this = $(this),
+              $controlGroup = $this.parents(".control-group").first(),
+              $helpBlock = $controlGroup.find(".help-block").first();
+
+            // remove our events
+            $this.unbind('.validation'); // events are namespaced.
+            // reset help text
+            $helpBlock.html($helpBlock.data("original-contents"));
+            // reset classes
+            $controlGroup.attr("class", $controlGroup.data("original-classes"));
+            // reset aria
+            $this.attr("aria-invalid", $this.data("original-aria-invalid"));
+            // reset role
+            $helpBlock.attr("role", $this.data("original-role"));
+						// remove all elements we created
+						if (createdElements.indexOf($helpBlock[0]) > -1) {
+							$helpBlock.remove();
+						}
+
+          }
+        );
+
+      },
+      collectErrors : function(includeEmpty) {
+
+        var errorMessages = {};
+        this.each(function (i, el) {
+          var $el = $(el);
+          var name = $el.attr("name");
+          var errors = $el.triggerHandler("validation.validation", {includeEmpty: true});
+          errorMessages[name] = $.extend(true, errors, errorMessages[name]);
+        });
+
+        $.each(errorMessages, function (i, el) {
+          if (el.length === 0) {
+            delete errorMessages[i];
+          }
+        });
+
+        return errorMessages;
+
+      },
+      hasErrors: function() {
+
+        var errorMessages = [];
+
+        this.each(function (i, el) {
+          errorMessages = errorMessages.concat(
+            $(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : []
+          );
+        });
+
+        return (errorMessages.length > 0);
+      },
+      override : function (newDefaults) {
+        defaults = $.extend(true, defaults, newDefaults);
+      }
+    },
+		validatorTypes: {
+      callback: {
+        name: "callback",
+        init: function ($this, name) {
+          return {
+            validatorName: name,
+            callback: $this.data("validation" + name + "Callback"),
+            lastValue: $this.val(),
+            lastValid: true,
+            lastFinished: true
+          };
+        },
+        validate: function ($this, value, validator) {
+          if (validator.lastValue === value && validator.lastFinished) {
+            return !validator.lastValid;
+          }
+
+          if (validator.lastFinished === true)
+          {
+            validator.lastValue = value;
+            validator.lastValid = true;
+            validator.lastFinished = false;
+
+            var rrjqbvValidator = validator;
+            var rrjqbvThis = $this;
+            executeFunctionByName(
+              validator.callback,
+              window,
+              $this,
+              value,
+              function (data) {
+                if (rrjqbvValidator.lastValue === data.value) {
+                  rrjqbvValidator.lastValid = data.valid;
+                  if (data.message) {
+                    rrjqbvValidator.message = data.message;
+                  }
+                  rrjqbvValidator.lastFinished = true;
+                  rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message);
+                  // Timeout is set to avoid problems with the events being considered 'already fired'
+                  setTimeout(function () {
+                    rrjqbvThis.trigger("change.validation");
+                  }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
+                }
+              }
+            );
+          }
+
+          return false;
+
+        }
+      },
+      ajax: {
+        name: "ajax",
+        init: function ($this, name) {
+          return {
+            validatorName: name,
+            url: $this.data("validation" + name + "Ajax"),
+            lastValue: $this.val(),
+            lastValid: true,
+            lastFinished: true
+          };
+        },
+        validate: function ($this, value, validator) {
+          if (""+validator.lastValue === ""+value && validator.lastFinished === true) {
+            return validator.lastValid === false;
+          }
+
+          if (validator.lastFinished === true)
+          {
+            validator.lastValue = value;
+            validator.lastValid = true;
+            validator.lastFinished = false;
+            $.ajax({
+              url: validator.url,
+              data: "value=" + value + "&field=" + $this.attr("name"),
+              dataType: "json",
+              success: function (data) {
+                if (""+validator.lastValue === ""+data.value) {
+                  validator.lastValid = !!(data.valid);
+                  if (data.message) {
+                    validator.message = data.message;
+                  }
+                  validator.lastFinished = true;
+                  $this.data("validation" + validator.validatorName + "Message", validator.message);
+                  // Timeout is set to avoid problems with the events being considered 'already fired'
+                  setTimeout(function () {
+                    $this.trigger("change.validation");
+                  }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
+                }
+              },
+              failure: function () {
+                validator.lastValid = true;
+                validator.message = "ajax call failed";
+                validator.lastFinished = true;
+                $this.data("validation" + validator.validatorName + "Message", validator.message);
+                // Timeout is set to avoid problems with the events being considered 'already fired'
+                setTimeout(function () {
+                  $this.trigger("change.validation");
+                }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
+              }
+            });
+          }
+
+          return false;
+
+        }
+      },
+			regex: {
+				name: "regex",
+				init: function ($this, name) {
+					return {regex: regexFromString($this.data("validation" + name + "Regex"))};
+				},
+				validate: function ($this, value, validator) {
+					return (!validator.regex.test(value) && ! validator.negative)
+						|| (validator.regex.test(value) && validator.negative);
+				}
+			},
+			required: {
+				name: "required",
+				init: function ($this, name) {
+					return {};
+				},
+				validate: function ($this, value, validator) {
+					return !!(value.length === 0  && ! validator.negative)
+						|| !!(value.length > 0 && validator.negative);
+				},
+        blockSubmit: true
+			},
+			match: {
+				name: "match",
+				init: function ($this, name) {
+					var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first();
+					element.bind("validation.validation", function () {
+						$this.trigger("change.validation", {submitting: true});
+					});
+					return {"element": element};
+				},
+				validate: function ($this, value, validator) {
+					return (value !== validator.element.val() && ! validator.negative)
+						|| (value === validator.element.val() && validator.negative);
+				},
+        blockSubmit: true
+			},
+			max: {
+				name: "max",
+				init: function ($this, name) {
+					return {max: $this.data("validation" + name + "Max")};
+				},
+				validate: function ($this, value, validator) {
+					return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative)
+						|| (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);
+				}
+			},
+			min: {
+				name: "min",
+				init: function ($this, name) {
+					return {min: $this.data("validation" + name + "Min")};
+				},
+				validate: function ($this, value, validator) {
+					return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative)
+						|| (parseFloat(value) >= parseFloat(validator.min) && validator.negative);
+				}
+			},
+			maxlength: {
+				name: "maxlength",
+				init: function ($this, name) {
+					return {maxlength: $this.data("validation" + name + "Maxlength")};
+				},
+				validate: function ($this, value, validator) {
+					return ((value.length > validator.maxlength) && ! validator.negative)
+						|| ((value.length <= validator.maxlength) && validator.negative);
+				}
+			},
+			minlength: {
+				name: "minlength",
+				init: function ($this, name) {
+					return {minlength: $this.data("validation" + name + "Minlength")};
+				},
+				validate: function ($this, value, validator) {
+					return ((value.length < validator.minlength) && ! validator.negative)
+						|| ((value.length >= validator.minlength) && validator.negative);
+				}
+			},
+			maxchecked: {
+				name: "maxchecked",
+				init: function ($this, name) {
+					var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
+					elements.bind("click.validation", function () {
+						$this.trigger("change.validation", {includeEmpty: true});
+					});
+					return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements};
+				},
+				validate: function ($this, value, validator) {
+					return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative)
+						|| (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative);
+				},
+        blockSubmit: true
+			},
+			minchecked: {
+				name: "minchecked",
+				init: function ($this, name) {
+					var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
+					elements.bind("click.validation", function () {
+						$this.trigger("change.validation", {includeEmpty: true});
+					});
+					return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements};
+				},
+				validate: function ($this, value, validator) {
+					return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative)
+						|| (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative);
+				},
+        blockSubmit: true
+			}
+		},
+		builtInValidators: {
+			email: {
+				name: "Email",
+				type: "shortcut",
+				shortcut: "validemail"
+			},
+			validemail: {
+				name: "Validemail",
+				type: "regex",
+				regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}",
+				message: "Not a valid email address<!-- data-validator-validemail-message to override -->"
+			},
+			passwordagain: {
+				name: "Passwordagain",
+				type: "match",
+				match: "password",
+				message: "Does not match the given password<!-- data-validator-paswordagain-message to override -->"
+			},
+			positive: {
+				name: "Positive",
+				type: "shortcut",
+				shortcut: "number,positivenumber"
+			},
+			negative: {
+				name: "Negative",
+				type: "shortcut",
+				shortcut: "number,negativenumber"
+			},
+			number: {
+				name: "Number",
+				type: "regex",
+				regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?",
+				message: "Must be a number<!-- data-validator-number-message to override -->"
+			},
+			integer: {
+				name: "Integer",
+				type: "regex",
+				regex: "[+-]?\\\d+",
+				message: "No decimal places allowed<!-- data-validator-integer-message to override -->"
+			},
+			positivenumber: {
+				name: "Positivenumber",
+				type: "min",
+				min: 0,
+				message: "Must be a positive number<!-- data-validator-positivenumber-message to override -->"
+			},
+			negativenumber: {
+				name: "Negativenumber",
+				type: "max",
+				max: 0,
+				message: "Must be a negative number<!-- data-validator-negativenumber-message to override -->"
+			},
+			required: {
+				name: "Required",
+				type: "required",
+				message: "This is required<!-- data-validator-required-message to override -->"
+			},
+			checkone: {
+				name: "Checkone",
+				type: "minchecked",
+				minchecked: 1,
+				message: "Check at least one option<!-- data-validation-checkone-message to override -->"
+			}
+		}
+	};
+
+	var formatValidatorName = function (name) {
+		return name
+			.toLowerCase()
+			.replace(
+				/(^|\s)([a-z])/g ,
+				function(m,p1,p2) {
+					return p1+p2.toUpperCase();
+				}
+			)
+		;
+	};
+
+	var getValue = function ($this) {
+		// Extract the value we're talking about
+		var value = $this.val();
+		var type = $this.attr("type");
+		if (type === "checkbox") {
+			value = ($this.is(":checked") ? value : "");
+		}
+		if (type === "radio") {
+			value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : "");
+		}
+		return value;
+	};
+
+  function regexFromString(inputstring) {
+		return new RegExp("^" + inputstring + "$");
+	}
+
+  /**
+   * Thanks to Jason Bunting via StackOverflow.com
+   *
+   * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910
+   * Short link: http://tinyurl.com/executeFunctionByName
+  **/
+  function executeFunctionByName(functionName, context /*, args*/) {
+    var args = Array.prototype.slice.call(arguments).splice(2);
+    var namespaces = functionName.split(".");
+    var func = namespaces.pop();
+    for(var i = 0; i < namespaces.length; i++) {
+      context = context[namespaces[i]];
+    }
+    return context[func].apply(this, args);
+  }
+
+	$.fn.jqBootstrapValidation = function( method ) {
+
+		if ( defaults.methods[method] ) {
+			return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
+		} else if ( typeof method === 'object' || ! method ) {
+			return defaults.methods.init.apply( this, arguments );
+		} else {
+		$.error( 'Method ' +  method + ' does not exist on jQuery.jqBootstrapValidation' );
+			return null;
+		}
+
+	};
+
+  $.jqBootstrapValidation = function (options) {
+    $(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments);
+  };
+
+})( jQuery );

文件差異過大導致無法顯示
+ 4 - 0
js/jquery.min.js


+ 288 - 0
js/jquery.sticky.js

@@ -0,0 +1,288 @@
+// Sticky Plugin v1.0.4 for jQuery
+// =============
+// Author: Anthony Garand
+// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk)
+// Improvements by Leonardo C. Daronco (daronco)
+// Created: 02/14/2011
+// Date: 07/20/2015
+// Website: http://stickyjs.com/
+// Description: Makes an element on the page stick on the screen as you scroll
+//              It will only set the 'top' and 'position' of your element, you
+//              might need to adjust the width in some cases.
+
+(function (factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(['jquery'], factory);
+    } else if (typeof module === 'object' && module.exports) {
+        // Node/CommonJS
+        module.exports = factory(require('jquery'));
+    } else {
+        // Browser globals
+        factory(jQuery);
+    }
+}(function ($) {
+    var slice = Array.prototype.slice; // save ref to original slice()
+    var splice = Array.prototype.splice; // save ref to original slice()
+
+  var defaults = {
+      topSpacing: 0,
+      bottomSpacing: 0,
+      className: 'is-sticky',
+      wrapperClassName: 'sticky-wrapper',
+      center: false,
+      getWidthFrom: '',
+      widthFromWrapper: true, // works only when .getWidthFrom is empty
+      responsiveWidth: false,
+      zIndex: 'inherit'
+    },
+    $window = $(window),
+    $document = $(document),
+    sticked = [],
+    windowHeight = $window.height(),
+    scroller = function() {
+      var scrollTop = $window.scrollTop(),
+        documentHeight = $document.height(),
+        dwh = documentHeight - windowHeight,
+        extra = (scrollTop > dwh) ? dwh - scrollTop : 0;
+
+      for (var i = 0, l = sticked.length; i < l; i++) {
+        var s = sticked[i],
+          elementTop = s.stickyWrapper.offset().top,
+          etse = elementTop - s.topSpacing - extra;
+
+        //update height in case of dynamic content
+        s.stickyWrapper.css('height', s.stickyElement.outerHeight());
+
+        if (scrollTop <= etse) {
+          if (s.currentTop !== null) {
+            s.stickyElement
+              .css({
+                'width': '',
+                'position': '',
+                'top': '',
+                'z-index': ''
+              });
+            s.stickyElement.parent().removeClass(s.className);
+            s.stickyElement.trigger('sticky-end', [s]);
+            s.currentTop = null;
+          }
+        }
+        else {
+          var newTop = documentHeight - s.stickyElement.outerHeight()
+            - s.topSpacing - s.bottomSpacing - scrollTop - extra;
+          if (newTop < 0) {
+            newTop = newTop + s.topSpacing;
+          } else {
+            newTop = s.topSpacing;
+          }
+          if (s.currentTop !== newTop) {
+            var newWidth;
+            if (s.getWidthFrom) {
+                padding =  s.stickyElement.innerWidth() - s.stickyElement.width();
+                newWidth = $(s.getWidthFrom).width() - padding || null;
+            } else if (s.widthFromWrapper) {
+                newWidth = s.stickyWrapper.width();
+            }
+            if (newWidth == null) {
+                newWidth = s.stickyElement.width();
+            }
+            s.stickyElement
+              .css('width', newWidth)
+              .css('position', 'fixed')
+              .css('top', newTop)
+              .css('z-index', s.zIndex);
+
+            s.stickyElement.parent().addClass(s.className);
+
+            if (s.currentTop === null) {
+              s.stickyElement.trigger('sticky-start', [s]);
+            } else {
+              // sticky is started but it have to be repositioned
+              s.stickyElement.trigger('sticky-update', [s]);
+            }
+
+            if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) {
+              // just reached bottom || just started to stick but bottom is already reached
+              s.stickyElement.trigger('sticky-bottom-reached', [s]);
+            } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) {
+              // sticky is started && sticked at topSpacing && overflowing from top just finished
+              s.stickyElement.trigger('sticky-bottom-unreached', [s]);
+            }
+
+            s.currentTop = newTop;
+          }
+
+          // Check if sticky has reached end of container and stop sticking
+          var stickyWrapperContainer = s.stickyWrapper.parent();
+          var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing);
+
+          if( unstick ) {
+            s.stickyElement
+              .css('position', 'absolute')
+              .css('top', '')
+              .css('bottom', 0)
+              .css('z-index', '');
+          } else {
+            s.stickyElement
+              .css('position', 'fixed')
+              .css('top', newTop)
+              .css('bottom', '')
+              .css('z-index', s.zIndex);
+          }
+        }
+      }
+    },
+    resizer = function() {
+      windowHeight = $window.height();
+
+      for (var i = 0, l = sticked.length; i < l; i++) {
+        var s = sticked[i];
+        var newWidth = null;
+        if (s.getWidthFrom) {
+            if (s.responsiveWidth) {
+                newWidth = $(s.getWidthFrom).width();
+            }
+        } else if(s.widthFromWrapper) {
+            newWidth = s.stickyWrapper.width();
+        }
+        if (newWidth != null) {
+            s.stickyElement.css('width', newWidth);
+        }
+      }
+    },
+    methods = {
+      init: function(options) {
+        return this.each(function() {
+          var o = $.extend({}, defaults, options);
+          var stickyElement = $(this);
+
+          var stickyId = stickyElement.attr('id');
+          var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName;
+          var wrapper = $('<div></div>')
+            .attr('id', wrapperId)
+            .addClass(o.wrapperClassName);
+
+          stickyElement.wrapAll(function() {
+            if ($(this).parent("#" + wrapperId).length == 0) {
+                    return wrapper;
+            }
+});
+
+          var stickyWrapper = stickyElement.parent();
+
+          if (o.center) {
+            stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"});
+          }
+
+          if (stickyElement.css("float") === "right") {
+            stickyElement.css({"float":"none"}).parent().css({"float":"right"});
+          }
+
+          o.stickyElement = stickyElement;
+          o.stickyWrapper = stickyWrapper;
+          o.currentTop    = null;
+
+          sticked.push(o);
+
+          methods.setWrapperHeight(this);
+          methods.setupChangeListeners(this);
+        });
+      },
+
+      setWrapperHeight: function(stickyElement) {
+        var element = $(stickyElement);
+        var stickyWrapper = element.parent();
+        if (stickyWrapper) {
+          stickyWrapper.css('height', element.outerHeight());
+        }
+      },
+
+      setupChangeListeners: function(stickyElement) {
+        if (window.MutationObserver) {
+          var mutationObserver = new window.MutationObserver(function(mutations) {
+            if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
+              methods.setWrapperHeight(stickyElement);
+            }
+          });
+          mutationObserver.observe(stickyElement, {subtree: true, childList: true});
+        } else {
+          if (window.addEventListener) {
+            stickyElement.addEventListener('DOMNodeInserted', function() {
+              methods.setWrapperHeight(stickyElement);
+            }, false);
+            stickyElement.addEventListener('DOMNodeRemoved', function() {
+              methods.setWrapperHeight(stickyElement);
+            }, false);
+          } else if (window.attachEvent) {
+            stickyElement.attachEvent('onDOMNodeInserted', function() {
+              methods.setWrapperHeight(stickyElement);
+            });
+            stickyElement.attachEvent('onDOMNodeRemoved', function() {
+              methods.setWrapperHeight(stickyElement);
+            });
+          }
+        }
+      },
+      update: scroller,
+      unstick: function(options) {
+        return this.each(function() {
+          var that = this;
+          var unstickyElement = $(that);
+
+          var removeIdx = -1;
+          var i = sticked.length;
+          while (i-- > 0) {
+            if (sticked[i].stickyElement.get(0) === that) {
+                splice.call(sticked,i,1);
+                removeIdx = i;
+            }
+          }
+          if(removeIdx !== -1) {
+            unstickyElement.unwrap();
+            unstickyElement
+              .css({
+                'width': '',
+                'position': '',
+                'top': '',
+                'float': '',
+                'z-index': ''
+              })
+            ;
+          }
+        });
+      }
+    };
+
+  // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
+  if (window.addEventListener) {
+    window.addEventListener('scroll', scroller, false);
+    window.addEventListener('resize', resizer, false);
+  } else if (window.attachEvent) {
+    window.attachEvent('onscroll', scroller);
+    window.attachEvent('onresize', resizer);
+  }
+
+  $.fn.sticky = function(method) {
+    if (methods[method]) {
+      return methods[method].apply(this, slice.call(arguments, 1));
+    } else if (typeof method === 'object' || !method ) {
+      return methods.init.apply( this, arguments );
+    } else {
+      $.error('Method ' + method + ' does not exist on jQuery.sticky');
+    }
+  };
+
+  $.fn.unstick = function(method) {
+    if (methods[method]) {
+      return methods[method].apply(this, slice.call(arguments, 1));
+    } else if (typeof method === 'object' || !method ) {
+      return methods.unstick.apply( this, arguments );
+    } else {
+      $.error('Method ' + method + ' does not exist on jQuery.sticky');
+    }
+  };
+  $(function() {
+    setTimeout(scroller, 0);
+  });
+}));

文件差異過大導致無法顯示
+ 5 - 0
js/popper.min.js