0

asp.net4.0Webアプリケーションで標準のasp.netメニューを使用しています。明確にするために、これは標準のWebアプリケーションであり、使用可能なMVCアプリケーションのバージョンではありません。

これが私が抱えている問題です。

とても簡単な設定です。メニューのさまざまな状態、:link、:visited、:hover、:activeをCSSで確認しています。

ご想像のとおり、これらの状態の間には目に見える違いがあります。さらに、現在のページのリンクを強調表示するjavascriptを実行しています。これは、もう1つのかなり正常なアクティビティです。これまでのところ、不思議なことや曖昧なことは何もありません。

問題は、人々がメニューをクリックし始めるときに起こります。あなたがホームページにいるとしましょう。最初のメニュー項目が強調表示されます。ここで、ユーザーだけが思いつくことができる理由が何であれ、メニュー項目の1つをクリックしてドラッグするとします。遠くにある必要はありません。1〜2ミリにすることができます。予想される動作は、ドラッグによってクリックが無効になり、ページが元の位置に留まり、クリックでドラッグされたmenuitemが元の状態に戻ることです。

実際に発生するのは、ドラッグによってクリックが無効になり、ページがそのまま残り、クリックでドラッグされたメニュー項目が:activeスタイルを保持しているように見えるか、:activeスタイルが存在しない場合は:hoverスタイルを保持しているようです。

レプリケーション:

ただし、これはAsp.Netメニューのバグである可能性があります。

プロジェクトの外部で問題を再現するために、VS2010のテンプレートを使用して標準のAsp.NETWebアプリケーションプロジェクトを作成しました。

Site.cssの1行を変更しました。具体的には、div.menu ul li a:activeの:activeスタイルをcolor:redに変更しました。

次に、アプリケーションを起動し、[ホーム]メニュー項目をクリックして、数ミリメートルドラッグしました。

案の定、マウスボタンを離すと、メニュー項目が:activeスタイルのままになりました。

テスト

私はもともとIE8で問題を発見しましたが、それはIE9とFirefox/Auroraにまだあります。

ただし、ChromeとSafariは、ほとんどの場合、メニュー項目を意図した状態に戻します。それらは両方とも、要素のエッジの周りに光沢のある効果を残します。Operaではテストしていません。

....利益?

私はこれに対する解決策を探してネットを探しましたが、それを見つけることができません。実際、問題への参照を見つけるのは非常に困難です。私が最も近いのは、IE7のバグに似たものについて言及しているSitepointの参照ページの1つでした。

http://reference.sitepoint.com/css/pseudoclass-hover

誰かアイデアはありますか?

コード

Site.Masterのコードは次のとおりです-犯人を保護するためにメニュー項目の名前を変更しました:

<div class="topnav">
    <asp:menu id="topnav" runat="server" orientation="Horizontal" renderingmode="List" skiplinktext="" maximumdynamicdisplaylevels="1" viewstatemode="Enabled" >
        <items>
            <asp:menuitem navigateurl="~/Default.aspx" text="Home" value="home"></asp:menuitem>
            <asp:menuitem navigateurl="~/Overview.aspx" text="Overview" value="overview"></asp:menuitem>
            <asp:menuitem navigateurl="~/Benefits.aspx" text="Benefits" value="benefits"></asp:menuitem>
            <asp:menuitem navigateurl="~/Hardware.aspx" text="Hardware" value="hardware"></asp:menuitem>
            <asp:menuitem navigateurl="~/SDK.aspx" text="Develop" value="SDK"></asp:menuitem>
        </items>
    </asp:menu>
</div>

その間、このメニューに適用されるCSSも投稿します。

.right .topnavcont
{
    width: 767px;
    background-color: #dddddd !important;
    height: 22px;
}

.topnav #topnav li
{
    float: left;
}

.topnav
{
    background-color: #ddd;      
    line-height: 22px;
    float: right;
    margin-right: 11px;
    background: url(../img/shadow.gif) repeat-y top right;
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
    font-weight: bold;
    color: #777;
    text-align: center;
}

.topnav li
{
    width: 109px;
}

.topnav a:link, .topnav a:visited
{
    color: #777;
    display: block;
    background-image: url(../img/bg_n-s.gif);
    background-repeat: repeat-x;
    text-decoration: none;
    visibility: visible;
}

.topnav  a:hover
{
    color: #fff !important;
    background-image: url(../img/bg_h-s.gif);
    display: block;
    visibility: visible;
}

.topnav a:active
{
    background-image: url(../img/bg_a-s.gif);
    display: block;
    color: #fff;
    visibility: visible;
}

.topnav .current
{
    color: #fff !important;
    background-image: url(../img/bg_h-s.gif) !important;
}

最後になりましたが、このメニューを支援するためにページで実行しているjavascriptです。

$(function ()
{
    var pathname = (window.location.pathname.match(/[^\/]+$/)[0]);
    $('.topnav ul li a').each(function ()
    {
        if ($(this).attr('href') == pathname)
        {
            $(this).addClass('current');
        }
    });
});
4

1 に答える 1

0

髪を引き裂いてかご細工のキャリアを考えた後、私はこれに対する半分焼きたての解決策を思いついたと思います。

その秘密は、Asp.NetMenuコントロールがcss疑似クラスを適切に処理できないことにあります。

上記のコードでは、問題が発生した場所であるa:active疑似クラスを定義したことがわかります。

Asp.Netでは、疑似クラスを使用する必要はありません。設計時にWebコントロールで公開されているプロパティを使用する必要があります。したがって、古い:link:visited:hover:active疑似クラスに固執する代わりに、プロパティを設定することになっていますstaticselectedstyle-cssclass

少し冗長で直感に反しているように見えますが、必ずしも悪いことではありません。

ただし、覚えておくべきことは、要素をターゲットとする:active疑似クラスがstaticselectedstyle-cssclassコードの前にないことを確認することです。これは、何らかの理由で、ブラウザーが各クラスから断片を取得するだけで、その間にすべてが間違っているように見えるためです。

だから今、topnavの私のcssは次のようになります:

.topnav
{
    background-color: #ddd;
    /*margin-top: 1px;*/
    line-height: 22px;
    float: right;
    margin-right: 11px;
    background: url(../img/shadow.gif) repeat-y top right;


    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
    font-weight: bold;
    color: #777;
    text-align: center;
}

.topnav #topnav li
{
    float: left;
}

.right .topnavcont
{
    width: 767px;
    background-color: #dddddd !important;
    height: 22px;
}

.topnav li
{
    width: 109px;
}

.topnav a:link, .topnav a:visited
{
    color: #777;
    display: block;
    background-image: url(../img/bg_n-s.gif);
    background-repeat: repeat-x;
    text-decoration: none;
    visibility: visible;
}

.topnav  a:hover 
{
    color: #fff !important;
    background-image: url(../img/bg_h-s.gif);
    display: block;
    visibility: visible;
}

topnav .staticmenuitemselected
{
    color: #777;
    display: block;
    background-image: url(../img/bg_n-s.gif);
    background-repeat: repeat-x;
    text-decoration: none;
    visibility: visible;
}

ただし、:active疑似クラスの実験はまだ完全には終了していません。メニューのボタンをクリックするだけで、派手なクリック感のあるものを実行するときに、暖かくファジーな輝きを与えることができるからです。

読んでくれてありがとう/これが誰かを助けることを願っています。

于 2012-04-05T08:16:09.370 に答える