0

私は上司がデザインしたクライアント向けのウェブサイトの構築に取り組んでいます。初期の段階で、ナビゲーションは jQuery TreeView メニュー ( http://www.dynamicdrive.com/dynamicindex1/treeview/index.htm )に基づくことが決定されました。

当初、上司は TreeView ナビゲーションの外観と機能を気に入っていました。しかし、ナビゲーションを取り付けて組み立てた後、彼らは考えを変えました。現在、彼らはブランチの外観だけを望んでいますが、ドロップダウン メニューの基本機能を備えています。

私は jQuery の専門家ではないので、コードを編集するのは非常に困難です。しかし、1 つの例外を除いて、自分のやりたいことを実行できるようになりました。マウスアウトでサブメニューを非表示にしたいのですが、マウスを別の要素に移動するまでそこに残ります。私が持っているフレームワークでこれを行う方法はありますか、それともゼロから再構築してすべて CSS ベースにする必要がありますか?

別のオプションは、別のリンクに移動するまで、各メイン ナビゲーション リンクのホバー状態をアクティブにしておくことです。この時点で、接続ブランチとして機能する背景画像はマウスアウトで消えますが、サブメニューは消えません。

基本的に、サブメニューボックスが表示されたときにメインメニュー項目の背景画像を表示/非表示にしたいだけです。

テストサイトはこちら: http://tinyurl.com/7novfmc

これが私のCSSです:

#navigation a {
color:#666;
text-decoration:none;
}
#navigation a:hover {
color:#C93;
text-decoration:none;
}
.navlink a:hover {
color:#C93;
text-decoration:none;
background-image:url(../images/treeview-horizontal-line.png);
background-repeat:no-repeat;
background-position:right;
padding-right:17px;
}
.treeview, .treeview ul {
padding: 0;
margin: 0;
list-style: none;
}
.treeview ul {
background-color: #FFF;
margin-top: 4px;
}
.treeview .hitarea {
/*background: url(../images/treeview-default.gif) -64px -25px no-repeat;*/
height: 16px;
width: 16px;
margin-left: -16px;
float: left;
cursor: pointer;
}
/* fix for IE6 */
* html .hitarea {
display: inline;
float:none;
}
.treeview li {
margin: 0;
padding: 12px 0pt 16px 16px;
text-transform: lowercase;
font-size: .75em;
}
.treeview a.selected {
background-color: #eee;
}
#treecontrol {
margin: 1em 0;
display: none;
}
.treeview .hover {
color: #C93;
cursor: pointer;
}
.treeview li ul li {
background: url(../images/treeview-orange-line1.png) 0 10px no-repeat;
font-size: 1em;
margin-top:-24px;
}
.treeview li.collapsable, .treeview li.expandable {
background-position: 0 -176px;
}
.treeview .expandable-hitarea {
background-position: -80px -3px;
}
.treeview li.last {
background-position: 0 -1766px
}
.treeview li.lastCollapsable, .treeview li.lastExpandable {
}
.treeview li.lastCollapsable {
background-position: 0 -111px
}
.treeview li.lastExpandable {
background-position: -32px -67px
}
.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea {
background-position: 0;
}
.treeview-famfamfam li {
background-image: url(../images/treeview-famfamfam-line.gif);
}
.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable {
background-image: url(../images/treeview-famfamfam.gif);
}
.filetree li {
padding: 3px 0 2px 16px;
}
.filetree span.folder, .filetree span.file {
padding: 1px 0 1px 16px;
display: block;
}
.filetree span.folder {
background: url(../images/folder.gif) 0 0 no-repeat;
}
.filetree li.expandable span.folder {
background: url(../images/folder-closed.gif) 0 0 no-repeat;
}
.filetree span.file {
background: url(../images/file.gif) 0 0 no-repeat;
}

これが私のHTMLです(インラインCSSを使用):

            <div id="HEADER_NAVIGATION">
            <div id="MAIN_NAVIGATION">
              <ul id="navigation">
                <li style="margin-left:60px;"><span class="navlink"><a href="about.html">About</a></span>
                    <ul style="margin-left:40px;margin-top:-32px;position:fixed;">
                        <li>Our Approach</li>
                        <li>Experience</li>
                        <li>Global Reach</li>
                    </ul>
                </li>
                <li style="margin-left:75px;"><a href="principals.html">Principals</a></li>
                <li style="margin-left:90px;"><span class="navlink"><a href="offerings.html">Offerings</a></span>
                    <ul style="margin-left:60px;margin-top:-34px;position:fixed;">
                        <li>Performance Improvement</li>
                        <li>Organizational Transformation</li>
                        <li>Solutions Architecture</li>
                        <li>Risk Management</li>
                    </ul>
                </li>
                <li style="margin-left:75px;"><span><a href="testimonials.html">Testimonials</a></span>
                    <ul style="margin-left:70px;margin-top:-3px;position:fixed;">
                        <!--<li>Case Studies</li>-->
                    </ul>
                </li>
                <li style="margin-left:60px;"><span class="navlink"><a href="resources.html">Resources</a></span>
                    <ul style="margin-left:65px;margin-top:-13px;position:fixed;">
                        <li>Strategic Alliances</li>
                        <li>Publications</li>
                    </ul>
                </li>
            </ul>
            </div>
            <div id="MAIN_HEADER_IMAGE"></div>
        </div>

そして、ここに私のjqueryがあります:

$(document).ready(function(){

// first example
$("#navigation").treeview({
    collapsed: true,
    unique: true,
    persist: "location"
});
});

;(function($) {

$.extend($.fn, {
    swapClass: function(c1, c2) {
        var c1Elements = this.filter('.' + c1);
        this.filter('.' + c2).removeClass(c2).addClass(c1);
        c1Elements.removeClass(c1).addClass(c2);
        return this;
    },
    replaceClass: function(c1, c2) {
        return this.filter('.' + c1).removeClass(c1).addClass(c2).end();
    },
    hoverClass: function(className) {
        className = className || "hover";
        return this.hover(function() {
            $(this).addClass(className);
        }, function() {
            $(this).removeClass(className);
        });
    },
    heightToggle: function(animated, callback) {
        animated ?
            this.animate({ height: "toggle" }, animated, callback) :
            this.each(function(){
                jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "show" ](); // default here is "show" : "hide"
                if(callback)
                    callback.apply(this, arguments);
            });
    },
    heightHide: function(animated, callback) {
        if (animated) {
            this.animate({ height: "hide" }, animated, callback);
        } else {
            this.hide();
            if (callback)
                this.each(callback);                
        }
    },
    prepareBranches: function(settings) {
        if (!settings.prerendered) {
            // mark last tree items
            this.filter(":last-child:not(ul)").addClass(CLASSES.last);
            // collapse whole tree, or only those marked as closed, anyway except those marked as open
            this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide();
        }
        // return all items with sublists
        return this.filter(":has(>ul)");
    },
    applyClasses: function(settings, toggler) {
        this.filter(":has(>ul):not(:has(>a))").find(">span").hover(function(event) {
            toggler.apply($(this).next());
        }).add( $("a", this) ).hoverClass();

        if (!settings.prerendered) {
            // handle closed ones first
            this.filter(":has(>ul:hidden)")
                    .addClass(CLASSES.expandable)
                    .replaceClass(CLASSES.last, CLASSES.lastExpandable);

            // handle open ones
            this.not(":has(>ul:hidden)")
                    .addClass(CLASSES.collapsable)
                    .replaceClass(CLASSES.last, CLASSES.lastCollapsable);

            // create hitarea
            this.prepend("<div class=\"" + CLASSES.hitarea + "\"/>").find("div." + CLASSES.hitarea).each(function() {
                var classes = "";
                $.each($(this).parent().attr("class").split(" "), function() {
                    classes += this + "-hitarea ";
                });
                $(this).addClass( classes );
            });
        }

        // apply event to hitarea
        this.find("div." + CLASSES.hitarea).mouseout( toggler );
    },
    treeview: function(settings) {

        settings = $.extend({
            cookieId: "treeview"
        }, settings);

        if (settings.add) {
            return this.trigger("add", [settings.add]);
        }

        if ( settings.toggle ) {
            var callback = settings.toggle;
            settings.toggle = function() {
                return callback.apply($(this).parent()[0], arguments);
            };
        }

        // factory for treecontroller
        function treeController(tree, control) {
            // factory for click handlers
            function handler(filter) {
                return function() {
                    // reuse toggle event handler, applying the elements to toggle
                    // start searching for all hitareas
                    toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() {
                        // for plain toggle, no filter is provided, otherwise we need to check the parent element
                        return filter ? $(this).parent("." + filter).length : true;
                    }) );
                    return false;
                };
            }
            // click on first element to collapse tree
            $("a:eq(0)", control).click( handler(CLASSES.collapsable) );
            // click on second to expand tree
            $("a:eq(1)", control).click( handler(CLASSES.expandable) );
            // click on third to toggle tree
            $("a:eq(2)", control).click( handler() ); 
        }

        // handle toggle event
        function toggler() {
            $(this)
                .parent()
                // swap classes for hitarea
                .find(">.hitarea")
                    .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
                    .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
                .end()
                // swap classes for parent li
                .swapClass( CLASSES.collapsable, CLASSES.expandable )
                .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
                // find child lists
                .find( ">ul" )
                // toggle them
                .heightToggle( settings.animated, settings.toggle );
            if ( settings.unique ) {
                $(this).parent()
                    .siblings()
                    // swap classes for hitarea
                    .find(">.hitarea")
                        .replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
                        .replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
                    .end()
                    .replaceClass( CLASSES.collapsable, CLASSES.expandable )
                    .replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
                    .find( ">ul" )
                    .heightHide( settings.animated, settings.toggle );
            }
        }

        function serialize() {
            function binary(arg) {
                return arg ? 1 : 0;
            }
            var data = [];
            branches.each(function(i, e) {
                data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0;
            });
            $.cookie(settings.cookieId, data.join("") );
        }

        function deserialize() {
            var stored = $.cookie(settings.cookieId);
            if ( stored ) {
                var data = stored.split("");
                branches.each(function(i, e) {
                    $(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ]();
                });
            }
        }

        // add treeview class to activate styles
        this.addClass("treeview");

        // prepare branches and find all tree items with child lists
        var branches = this.find("li").prepareBranches(settings);

        switch(settings.persist) {
        case "cookie":
            var toggleCallback = settings.toggle;
            settings.toggle = function() {
                serialize();
                if (toggleCallback) {
                    toggleCallback.apply(this, arguments);
                }
            };
            deserialize();
            break;
        case "location":
            var current = this.find("a").filter(function() { return this.href.toLowerCase() == location.href.toLowerCase(); });
            if ( current.length ) {
                current.addClass("selected").parents("ul, li").add( current.next() ).show();
            }
            break;
        }

        branches.applyClasses(settings, toggler);

        // if control option is set, create the treecontroller and show it
        if ( settings.control ) {
            treeController(this, settings.control);
            $(settings.control).show();
        }

        return this.bind("add", function(event, branches) {
            $(branches).prev()
                .removeClass(CLASSES.last)
                .removeClass(CLASSES.lastCollapsable)
                .removeClass(CLASSES.lastExpandable)
            .find(">.hitarea")
                .removeClass(CLASSES.lastCollapsableHitarea)
                .removeClass(CLASSES.lastExpandableHitarea);
            $(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings, toggler);
        });
    }
});

// classes used by the plugin
// need to be styled via external stylesheet, see first example
var CLASSES = $.fn.treeview.classes = {
    open: "open",
    closed: "closed",
    expandable: "expandable",
    expandableHitarea: "expandable-hitarea",
    lastExpandableHitarea: "lastExpandable-hitarea",
    collapsable: "collapsable",
    collapsableHitarea: "collapsable-hitarea",
    lastCollapsableHitarea: "lastCollapsable-hitarea",
    lastCollapsable: "lastCollapsable",
    lastExpandable: "lastExpandable",
    last: "last",
    hitarea: "hitarea"
};

// provide backwards compability
$.fn.Treeview = $.fn.treeview;

})(jQuery);

ご協力いただきありがとうございます!

4

1 に答える 1

0

必要なことを行うために、そのツリー ビュー プラグインは必要ありません。

cssに追加

#navigation ul { display: none; }
#navigation li.hover ul { display: block; }

jqueryをに変更

$(document).ready(function(){
    $('#navigation>li').hover(
        function() { $(this).addClass('hover'); },
        function() { $(this).removeClass('hover'); }
    );
});

結果http://jsfiddle.net/J3Khk/

また、プレーンな css を使用して、javascript をすべて一緒に捨てることもできます。

#navigation ul { display: none; }
#navigation li:hover ul { display: block; }

結果http://jsfiddle.net/cBf3c/

編集:ツリービューの行だけにプラグインを使用している場合は、css でもこれを行うことができます。背景画像を使用できます。または、十分に賢い場合は、絶対に配置された<hr />'sを使用しておそらくそれを行うことができます

于 2012-05-01T16:34:55.600 に答える