カテゴリー: Web

  • CSS3を使ったドロップダウンメニュー

    CSS3のborder-radius, box-shadow, text-shadowを使って角丸+ドロップシャドー付きのドロップダウンメニューを作るテクニックをエントリーしてみます。

    こちらにデモページを用意しましたので、まずはご覧になっていただければと思います。

    ドロップダウンメニューの作り方

    作り方はまず、ボディー内に以下のコードを書き込みます。
    [html]
    <ul id="nav" class="clearfix">
    <li class="current"><a href="#">HOME</a></li>
    <li><a href="#">メニュー 1</a>
    <ul>
    <li><a href="#">メニュー 1-1</a></li>
    <li><a href="#">メニュー 1-2</a></li>
    <li><a href="#">メニュー 1-3</a></li>
    <li><a href="#">メニュー 1-4</a></li>
    <li><a href="#">メニュー 1-5</a></li>
    </ul>
    </li>
    <li><a href="#">メニュー 2</a>
    <ul>
    <li><a href="#">メニュー 2-1 →</a>
    <ul>
    <li><a href="#">メニュー 2-1-1</a></li>
    <li><a href="#">メニュー 2-1-2</a></li>
    <li><a href="#">メニュー 2-1-3</a></li>
    <li><a href="#">メニュー 2-1-4</a></li>
    </ul>
    </li>
    <li><a href="#">メニュー 2-2</a></li>
    <li><a href="#">メニュー 2-3 →</a>
    <ul>
    <li><a href="#">メニュー 2-3-1</a></li>
    </ul>
    </li>
    </ul>
    </li>
    <li><a href="#">メニュー 3</a>
    <ul>
    <li><a href="#">メニュー 3-1 →</a>
    <ul>
    <li><a href="#">メニュー 3-1-1</a></li>
    <li><a href="#">メニュー 3-1-2 →</a>
    <ul>
    <li><a href="#">メニュー 3-1-2-1</a>
    <li><a href="#">メニュー 3-1-2-2</a>
    <li><a href="#">メニュー 3-1-2-3</a>
    </ul>
    </li>
    <li><a href="#">メニュー 3-1-3</a></li>
    <li><a href="#">メニュー 3-1-4</a></li>
    </ul>
    </li>
    <li><a href="#">メニュー 3-2 →</a>
    <ul>
    <li><a href="#">メニュー 3-2-1</a></li>
    <li><a href="#">メニュー 3-2-2</a></li>
    <li><a href="#">メニュー 3-2-3</a></li>
    </ul>
    </li>
    </ul>
    </li>
    <li><a href="#">メニュー 4</a></li>
    <li><a href="#">メニュー 5</a></li>
    </ul>
    [/html]

    次に、CSSをヘッダ内に書き込むか、外部ファイルにして読み込みます。
    CSSは以下のようになっています。

    [css]
    body {
    font-size: 62.5%; /* Resets 1em to 10px */
    font-family: Verdana, Geneva, sans-serif;
    background: #EEE;
    width: 800px;
    margin: 0 auto;
    color: #666;
    }
    p {
    text-align: center;
    }
    a {
    color: #333;
    }
    #nav {
    margin: 120px 0;
    padding: 8px 5px 0;
    background: #808080;
    line-height: 100%;

    /* メニューの外枠の角丸 */
    border-radius: 2em;
    -webkit-border-radius: 2em;
    -moz-border-radius: 2em;

    /* メニューの外枠のドロップシャドウ */
    box-shadow: 0 3px 3px rgba(0,0,0,0.5);
    -webkit-box-shadow: 0 3px 3px rgba(0,0,0,0.5);
    -moz-box-shadow: 0 3px 3px rgba(0,0,0,0.5);
    }
    #nav li {
    margin: 0 5px;
    padding: 0 0 8px;
    float: left;
    position: relative;
    list-style: none;
    }

    /* メニューのリンク設定 */
    #nav a {
    font-weight: bold;
    color: #EEE;
    text-decoration: none;
    display: block;
    padding: 8px 20px;
    margin: 0;

    /* メニュー枠の角丸 */
    border-radius: 1.6em;
    -webkit-border-radius: 1.6em;
    -moz-border-radius: 1.6em;

    text-shadow: 0 1px 1px rgba(0,0,0,0.5);
    }
    #nav a:hover {
    background: #000;
    color: #fff;
    }

    /* メニューのマウスオーバーの設定 */
    #nav .current a,
    #nav li:hover > a {
    background: #EEE;
    color: #444;

    /* メニュー枠のドロップシャドウ */
    box-shadow: 0 1px 1px rgba(0,0,0,0.5);
    -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.5);
    -moz-box-shadow: 0 1px 1px rgba(0,0,0,0.5);

    /* メニューテキストのドロップシャドウ */
    text-shadow: 0 1px 0 rgba(255,255,255, 1);
    }

    /* ドロップダウンメニューの設定 */
    #nav li:hover > ul {
    display: block;
    }

    /* ドロップダウンメニューのマウスオーバーの設定 */
    #nav ul li:hover a,
    #nav li:hover li a {
    background: none;
    border: none;
    color: #666;

    /* ドロップダウンメニュー内ドロップシャドウ非表示 */
    box-shadow: none;
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    }
    #nav ul a:hover {
    background: #67F !important;
    color: #fff !important;

    /* ドロップダウンメニューマウスオーバー時の角丸非表示 */
    border-radius: 0;
    -webkit-border-radius: 0;
    -moz-border-radius: 0;

    /* ドロップダウンメニューマウスオーバー時のドロップシャドウ */
    text-shadow: 0 1px 1px rgba(0,0,0,0.5);
    }

    /* ドロップダウンメニュー第1リストの設定 */
    #nav ul {
    display: none;

    margin: 0;
    padding: 0;
    width: 180px;
    position: absolute;
    top: 34px;
    left: 0;
    background: #F2F2F2;
    border: solid 1px #AAA;

    /* 第1リストの角丸 */
    border-radius: 10px;
    -webkit-border-radius: 10px;
    -moz-border-radius: 10px;

    /* 第1リストのドロップシャドウ */
    box-shadow: 0 1px 3px rgba(0,0,0, .3);
    -webkit-box-shadow: 0 1px 3px rgba(0,0,0, .3);
    -moz-box-shadow: 0 1px 3px rgba(0,0,0, .3);
    }
    #nav ul li {
    float: none;
    margin: 0;
    padding: 0;
    }

    #nav ul a {
    font-weight: normal;
    text-shadow: 0 1px 0 #fff;
    }

    /* ドロップダウンメニュー第2リスト以降の設定 */
    #nav ul ul {
    left: 179px;
    top: -1px;
    }

    /* ドロップダウンメニュー最上段リストの角丸 */
    #nav ul li:first-child > a {
    border-top-left-radius: 9px;
    -webkit-border-top-left-radius: 9px;
    -moz-border-radius-topleft: 9px;

    border-top-right-radius: 9px;
    -webkit-border-top-right-radius: 9px;
    -moz-border-radius-topright: 9px;
    }
    /* ドロップダウンメニュー最下段リストの角丸 */
    #nav ul li:last-child > a {
    border-bottom-left-radius: 9px;
    -webkit-border-bottom-left-radius: 9px;
    -moz-border-radius-bottomleft: 9px;

    border-bottom-right-radius: 9px;
    -webkit-border-bottom-right-radius: 9px;
    -moz-border-radius-bottomright: 9px;
    }

    /* clearfix */
    .clearfix:after {
    content: ".";
    display: block;
    clear: both;
    visibility: hidden;
    line-height: 0;
    height: 0;
    }
    .clearfix {
    display: inline-table;
    }
    * html .clearfix {
    height: 1px;
    }
    .clearfix {
    display: block;
    }
    [/css]

    Firefox, Safari, Chromeでは角丸+ドロップシャドウ付きのドロップダウンメニューになると思います。

    なお、Opera, IE8では角丸やドロップシャドウなどの効果は表現されないのですが、ドロップダウンメニューはなっています。
    IE6ではドロップダウンメニューにすらならないですね…

  • WordPressにプラグインなしでパンくずリストを表示させる方法

    サイト訪問者がサイト内での現在位置を直感的に把握するのに便利なパンくずリスト。
    ユーザビリティ・アクセシビリティの向上という点においてパンくずリストを表示させることはスタンダードな要素になります。
    Wordpress の場合、『Breadcrumb NavXT』というプラグインを使って表示させることが可能ですが、今回はプラグインを使わずに表示させる方法です。

    Example:

    Demo » Parent Category I » Child Category II » A Post With Everything in it

    パンくずリストの表示方法

    下記のコードを使用中のテーマ内のfunctions.phpに書き加えます。

    [php]
    <?php
    function get_breadcrumbs(){
    global $wp_query;

    if ( !is_home() ){

    // Start the UL
    echo ‘<ul>’;
    // Add the Home link
    echo ‘<li><a href="’. get_settings(‘home’) .’">’. get_bloginfo(‘name’) .'</a></li>’;

    if ( is_category() )
    {
    $catTitle = single_cat_title( "", false );
    $cat = get_cat_ID( $catTitle );
    echo "<li> &raquo; ". get_category_parents( $cat, TRUE, " &raquo; " ) ."</li>";
    }
    elseif ( is_archive() && !is_category() )
    {
    echo "<li> &raquo; Archives</li>";
    }
    elseif ( is_search() ) {

    echo "<li> &raquo; Search Results</li>";
    }
    elseif ( is_404() )
    {
    echo "<li> &raquo; 404 Not Found</li>";
    }
    elseif ( is_single() )
    {
    $category = get_the_category();
    $category_id = get_cat_ID( $category[0]->cat_name );

    echo ‘<li> &raquo; ‘. get_category_parents( $category_id, TRUE, " &raquo; " );
    echo the_title(”,”, FALSE) ."</li>";
    }
    elseif ( is_page() )
    {
    $post = $wp_query->get_queried_object();

    if ( $post->post_parent == 0 ){

    echo "<li> &raquo; ".the_title(”,”, FALSE)."</li>";

    } else {
    $title = the_title(”,”, FALSE);
    $ancestors = array_reverse( get_post_ancestors( $post->ID ) );
    array_push($ancestors, $post->ID);

    foreach ( $ancestors as $ancestor ){
    if( $ancestor != end($ancestors) ){
    echo ‘<li> &raquo; <a href="’. get_permalink($ancestor) .’">’. strip_tags( apply_filters( ‘single_post_title’, get_the_title( $ancestor ) ) ) .'</a></li>’;
    } else {
    echo ‘<li> &raquo; ‘. strip_tags( apply_filters( ‘single_post_title’, get_the_title( $ancestor ) ) ) .'</li>’;
    }
    }
    }
    }

    // End the UL
    echo "</ul>";
    }
    }
    ?>
    [/php]

    下記のコードをパンくずリストを表示させたいテンプレートに書いて呼び出します。

    [php]
    <?php get_breadcrumbs(); ?>
    [/php]

    CSSでのスタイリングもしてありますので、デザインのカスタマイズも出来ます。

    [css]
    ul.breadcrumbs {
    list-style: none;
    padding: 0;
    margin: 0;
    font-size:12px;
    }
    ul.breadcrumbs li {
    float: left;
    margin: 0 5px 0 0;
    padding: 0;
    }
    [/css]