0

私たちが従うようなドロップダウンメニューに従って作成する必要があります。

ここに画像の説明を入力してください

suppageでは、スライドが開いている必要があります。

たとえば、[サービス2]をクリックすると、[サービス2]ページでスライドが開きます。サービス2は選択されたメニューになります。

コードを添付しました。

サブページで、サブメニューが開く必要があります。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<link rel="stylesheet" type="text/css" href="droplinetabs.css" />

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

<script src="droplinemenu.js" type="text/javascript"></script>

<script type="text/javascript">

droplinemenu.buildmenu("droplinetabs1")

</script>
</head>

<body>
<div id="droplinetabs1" class="droplinetabs">
<ul>
<li><a href="#"><span>Home</span></a></li>
<li><a href="#"><span>About</span></a>
  <ul>
  <li><a href="#">About 1</a></li>
  <li><a href="#">About 2</a></li>
  <li><a href="#">About 3</a></li>
  <li><a href="#">About 4</a></li>
  </ul>
</li>
<li><a href="#"><span>Services</span></a>
  <ul>
  <li><a href="#">Services 1</a></li>
  <li><a href="#">Services 2</a></li>
  <li><a href="#">Services 3</a></li>
  <li><a href="#">Services 4</a></li>
  <li><a href="#">Services 5</a></li>
  </ul>
</li>
<li><a href="#"><span>Gallery</span></a></li>
</ul>
</div>
</body>
</html>

CSSファイル

.droplinetabs{
    overflow: hidden;
    border-bottom: 1px solid gray; /*underline across bottom of main tabs*/
}

.droplinetabs ul{
    font: bold 11px Verdana, sans-serif;
    margin: 0;
    padding: 0;
    width: 100%;
    list-style: none;
}

.droplinetabs li{
    display: inline;
    margin: 0 2px 0 0;
    padding: 0;
    text-transform: uppercase;
}


.droplinetabs a{
    float: left;
    color: white;
    background: #c76023 url(leftedge.gif) no-repeat left top; /*default background color of tabs, left corner image*/
    margin: 0 4px 0 0;
    padding: 0 0 4px 3px;
    text-decoration: none;
    letter-spacing: 1px;
}

.droplinetabs a:link, .droplinetabs a::visited, .droplinetabs a:active{
    color: white;
}

.droplinetabs a span{
    float: left;
    display: block;
    background: transparent url(rightedge.gif) no-repeat right top; /*right corner image*/
    padding: 7px 9px 3px 6px;
    cursor: pointer;
}

.droplinetabs a span{
    float: none;
}


.droplinetabs a:hover{
    background-color: #b05016; /*background color of tabs onMouseover*/
    color: white;
}

.droplinetabs a:hover span{
    background-color: transparent;
}

/* Sub level menus*/
.droplinetabs ul li ul{
    position: absolute;
    z-index: 100;
    left: 0;
    top: 0;
    background: #c76023; /*sub menu background color */
    visibility: hidden;
}

/* Sub level menu links style */
.droplinetabs ul li ul li a{
    font: normal 13px Verdana;
    padding: 6px;
    padding-right: 8px;
    margin: 0;
    background: #c76023; /*sub menu background color */
}

.droplinetabs ul li ul li a span{
    background: #c76023; /*sub menu background color */
}

.droplinetabs ul li ul li a:hover{ /*sub menu links' background color onMouseover. Add rounded edges in capable browsers */
    background: #714421;
    -webkit-border-radius: 5px;  
    -moz-border-radius: 5px; 
    -khtml-border-radius: 5px;  
    border-radius: 5px;
}

JQUERYファイル

var droplinemenu={

arrowimage: {classname: 'downarrowclass', src: 'down.gif', leftpadding: 5}, //customize down arrow image
animateduration: {over: 200, out: 100}, //duration of slide in/ out animation, in milliseconds

buildmenu:function(menuid){
    jQuery(document).ready(function($){
        var $mainmenu=$("#"+menuid+">ul")
        var $headers=$mainmenu.find("ul").parent()
        $headers.each(function(i){
            var $curobj=$(this)
            var $subul=$(this).find('ul:eq(0)')
            this._dimensions={h:$curobj.find('a:eq(0)').outerHeight()}
            this.istopheader=$curobj.parents("ul").length==1? true : false
            if (!this.istopheader)
                $subul.css({left:0, top:this._dimensions.h})
            var $innerheader=$curobj.children('a').eq(0)
            $innerheader=($innerheader.children().eq(0).is('span'))? $innerheader.children().eq(0) : $innerheader //if header contains inner SPAN, use that
            $innerheader.append(
                '<img src="'+ droplinemenu.arrowimage.src
                +'" class="' + droplinemenu.arrowimage.classname
                + '" style="border:0; padding-left: '+droplinemenu.arrowimage.leftpadding+'px" />'
            )

            $curobj.hover(
                function(e){
                    var $targetul=$(this).children("ul:eq(0)")
                    if ($targetul.queue().length<=1) //if 1 or less queued animations
                        if (this.istopheader)
                            $targetul.css({left: $mainmenu.position().left, top: $mainmenu.position().top+this._dimensions.h})
                        if (document.all && !window.XMLHttpRequest) //detect IE6 or less, fix issue with overflow
                            $mainmenu.find('ul').css({overflow: (this.istopheader)? 'hidden' : 'visible'})
                        $targetul.dequeue().slideDown(droplinemenu.animateduration.over)
                },
                function(e){
                    var $targetul=$(this).children("ul:eq(0)")
                    $targetul.dequeue().slideUp(droplinemenu.animateduration.out)
                }
            ) //end hover
        }) //end $headers.each()
        $mainmenu.find("ul").css({display:'none', visibility:'visible', width:$mainmenu.width()})
    }) //end document.ready
}
}
4

1 に答える 1

2

私はあなたのコードを見ました。非常に多くのスタイリングが JavaScript に直接ハードコーディングされているため、少しぎこちないと言わざるを得ません。理想的には、多くのスタイリングを分離し、代わりにクラスを使用することをお勧めします。ドロップダウン メニューの絶対配置は実際には必要なく、ソリューションが少し複雑になります。

ドロップダウンの 1 つを自動的に表示する場合は、たとえば、その UL に on クラスを追加できます。あなたがサービスページにいるとしましょう。メニューは、サービス オプションを表示する代わりに次のようになります。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<link rel="stylesheet" type="text/css" href="droplinetabs.css" />

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

<script src="droplinemenu.js" type="text/javascript"></script>

<script type="text/javascript">

droplinemenu.buildmenu("droplinetabs1")

</script>
</head>

<body>
<div id="droplinetabs1" class="droplinetabs">
<ul>
<li><a href="#"><span>Home</span></a></li>
<li><a href="#"><span>About</span></a>
  <ul>
  <li><a href="#">About 1</a></li>
  <li><a href="#">About 2</a></li>
  <li><a href="#">About 3</a></li>
  <li><a href="#">About 4</a></li>
  </ul>
</li>
<li><a href="#"><span>Services</span></a>
  <ul class="on">
  <li><a href="#">Services 1</a></li>
  <li><a href="#">Services 2</a></li>
  <li><a href="#">Services 3</a></li>
  <li><a href="#">Services 4</a></li>
  <li><a href="#">Services 5</a></li>
  </ul>
</li>
<li><a href="#"><span>Gallery</span></a></li>
</ul>
</div>
</body>
</html>

次に、すべての非表示が発生した後、JS で UL をループして、クラスが「オン」であるかどうかを確認すると、すぐにアニメーション化されます。

したがって、 $mainmenu.find("ul").... の後に次の部分を追加します

    var droplinemenu={

arrowimage: {classname: 'downarrowclass', src: 'down.gif', leftpadding: 5}, //customize down arrow image
animateduration: {over: 200, out: 100}, //duration of slide in/ out animation, in milliseconds

buildmenu:function(menuid){
    jQuery(document).ready(function($){
        var $mainmenu=$("#"+menuid+">ul")
        var $headers=$mainmenu.find("ul").parent()
        $headers.each(function(i){
            var $curobj=$(this)
            var $subul=$(this).find('ul:eq(0)')
            this._dimensions={h:$curobj.find('a:eq(0)').outerHeight()}
            this.istopheader=$curobj.parents("ul").length==1? true : false
            if (!this.istopheader)
                $subul.css({left:0, top:this._dimensions.h})
            var $innerheader=$curobj.children('a').eq(0)
            $innerheader=($innerheader.children().eq(0).is('span'))? $innerheader.children().eq(0) : $innerheader //if header contains inner SPAN, use that
            $innerheader.append(
                '<img src="'+ droplinemenu.arrowimage.src
                +'" class="' + droplinemenu.arrowimage.classname
                + '" style="border:0; padding-left: '+droplinemenu.arrowimage.leftpadding+'px" />'
            )

            $curobj.hover(
                function(e){
                    var $targetul=$(this).children("ul:eq(0)")
                    if ($targetul.queue().length<=1) //if 1 or less queued animations
                        if (this.istopheader){
                            $targetul.css({left: $mainmenu.position().left, top: $mainmenu.position().top+this._dimensions.h})
                        }
                        if (document.all && !window.XMLHttpRequest) //detect IE6 or less, fix issue with overflow
                            $mainmenu.find('ul').css({overflow: (this.istopheader)? 'hidden' : 'visible'})
                        $targetul.dequeue().slideDown(droplinemenu.animateduration.over)
                },
                function(e){
                    var $targetul=$(this).children("ul:eq(0)")
                    $targetul.dequeue().slideUp(droplinemenu.animateduration.out)
                }
            ) //end hover
        }) //end $headers.each()

        $mainmenu.find("ul").css({display:'none', visibility:'visible', width:$mainmenu.width()})
        $($mainmenu.find("ul")).each(function(index) {
            if($(this).hasClass('on')){
                $(this).css({left:$mainmenu.position().left,top:$mainmenu.position().top+$(this).height()})
                $(this).slideDown(droplinemenu.animateduration.over)
            }
        });
    }) //end document.ready
}
}

そのULのクラスで単に「display:block」を実行できるはずなので、理想的なソリューションではありませんが、アコーディオンJSで非常に多くのスタイル計算が行われているため、これは簡単には実行できません。この「ハック」はうまくいくはずですが、うまくいくことを願っています。

もっと洗練された jQuery アコーディオン ソリューションをお勧めします。ウェブ上には見るべきものがたくさんあります。使用している jQuery バージョンの比較的古い例を見ているようです。

于 2012-06-14T11:42:05.513 に答える