11

実装したいボディシステム機能があります。ユーザーが体の部分にカーソルを合わせると、その特定の体の部分に関する情報が強調表示されて表示されます。私はCSSを思い通りにコーディングしましたが、ボディ部分がクリックされたとき、またはマウスがホバー状態を離れたときに情報を保持するためのJavaScriptについては何も知りません。

私はフォーラムを検索し、同様の問題を見つけ、他の人の JavaScript ソリューションから自分でこれを理解しようと何時間も費やしました - 私は助けを求める必要がある時点にいます.

これは、希望する効果で作成したフラッシュ プロトタイプです。

http://inwavemedia.com/temp/proto/Main.html

私が今持っているものを見てみたい場合は、ライブ HTML を次に示します。

http://inwavemedia.com/temp/excretory.html

これが私のコードです:

<style type="text/css">
#bodysystem-excretory {
 width: 618px;
 height: 504px;
 background: url(excretory.png) no-repeat;
 margin: 10px auto; padding: 0;
 position: relative;
 border: 1px solid #999;
}
#bodysystem-excretory li {
    margin: 0;
    padding: 0;
    list-style: none;
    display: block;
    position: absolute;
}

#bodysystem-excretory a {
    display: block;
/*  text-indent: -9999px;*/
    text-decoration: none;
}

#esoph {
    left: 85px;
    top: 41px;
    width: 46px;
    height: 94px;
    z-index: 10;
}

#lungs {
    left: 76px;
    top: 84px;
    width: 84px;
    height: 68px;
    z-index: 20;
}

#bladder {
    left: 87px;
    top: 148px;
    width: 64px;
    height: 104px;
    z-index: 30;
}

#esoph a {
    height: 94px;
}

#lungs a {
    height: 67px;
}

#bladder a {
    height: 104px;
}


#esoph a:hover {
    background-image: url(excretory.png);
    background-repeat: no-repeat;
    background-position: -25px -561px;
}

#lungs a:hover {
    background-image: url(excretory.png);
    background-repeat: no-repeat;
    background-position: -105px -523px;
}

#bladder a:hover {
    background-image: url(excretory.png);
    background-repeat: no-repeat;
    background-position: -114px -618px;
}

.info span{ 
    display: none

}

.info{
    position:relative;
    z-index:1124;
    color:#000;
}

.info:hover{
    z-index:1125;

}

.info:hover span{
    display:block;
    position:absolute;
    top:-30px;
    left:155px;
    width:370px;
    color:#000;
    background-color:#FFFFFF;
}
</style>

</head>

<body>
<ul id="bodysystem-excretory">
  <li id="esoph">
    <a href="#" class="info"><span id="esoph-info"><h3>Esophagus</h3><p>This is esophagus information. This is esophagus information. This is esophagus information. This is esophagus information. This is esophagus information. This is esophagus information. This is esophagus information. </p></span></a>
  </li>
<li id="lungs"><a href="#" class="info"><span id="lungs-info"><h3>Lungs</h3></span></a></li>
<li id="bladder"><a href="#" class="info"><span id="bladder-info"><h3>Bladder</h3></span></a></li>
</ul>
4

5 に答える 5

1

以下は、実行する必要がある必要な変更です。

<head>
    <title>Untitled Page</title>
    <style type="text/css">
        #bodysystem-excretory
        {
            width: 618px;
            height: 504px;
            background: url(excretory.png) no-repeat;
            margin: 10px auto;
            padding: 0;
            position: relative;
            border: 1px solid #999;
        }
        #bodysystem-excretory li
        {
            margin: 0;
            padding: 0;
            list-style: none;
            display: block;
            position: absolute;
        }

        #bodysystem-excretory a
        {
            display: block; /*  text-indent: -9999px;*/
            text-decoration: none;
        }

        #esoph
        {
            left: 85px;
            top: 41px;
            width: 46px;
            height: 94px;
            z-index: 10;
        }

        #lungs
        {
            left: 76px;
            top: 84px;
            width: 84px;
            height: 68px;
            z-index: 20;
        }

        #bladder
        {
            left: 87px;
            top: 148px;
            width: 64px;
            height: 104px;
            z-index: 30;
        }

        #esoph a
        {
            height: 94px;
        }

        #lungs a
        {
            height: 67px;
        }

        #bladder a
        {
            height: 104px;
        }


        #esoph a:hover
        {
            background-image: url(excretory.png);
            background-repeat: no-repeat;
            background-position: -25px -561px;
        }

        #lungs a:hover
        {
            background-image: url(excretory.png);
            background-repeat: no-repeat;
            background-position: -105px -523px;
        }

        #bladder a:hover
        {
            background-image: url(excretory.png);
            background-repeat: no-repeat;
            background-position: -114px -618px;
        }

        .info span
        {
            display: none;
        }

        .info
        {
            position: relative;
            z-index: 1000;
            color: #000;
        }

        #bodysystem-excretory li[selected='true'] .info
        {
            z-index:1200;
        }

        #bodysystem-excretory li[selected='true'] .info span
        {
            display: block;
            position: absolute;
            top: -30px;
            left: 155px;
            width: 370px;
            color: #000;
            background-color: #FFFFFF;
        }

        .info:hover
        {
            z-index: 1125;
        }

        .info:hover span
        {
            display: block;
            position: absolute;
            top: -30px;
            left: 155px;
            width: 370px;
            color: #000;
            background-color: #FFFFFF;
        }
    </style>
    <script type="text/javascript">
        function SelectOrgan(obj)
        {
            var parentObj = obj.parentNode;
            var organs = document.getElementById("bodysystem-excretory").getElementsByTagName("li");

            for (var i = 0, len = organs.length; i < len; i++)
            {
                organs[i].setAttribute("selected", "false");
            }

            parentObj.setAttribute("selected", "true");
        }
    </script>
</head>
<body>
    <ul id="bodysystem-excretory">
        <li id="esoph" selected="false"><a href="#" class="info" onclick="SelectOrgan(this)"><span id="esoph-info">
            <h3>
                Esophagus</h3>
            <p>
                This is esophagus information. This is esophagus information. This is esophagus
                information. This is esophagus information. This is esophagus information. This
                is esophagus information. This is esophagus information.
            </p>
        </span></a></li>
        <li id="lungs" selected="false"><a href="#" class="info" onclick="SelectOrgan(this)"><span id="lungs-info">
            <h3>
                Lungs</h3>
        </span></a></li>
        <li id="bladder" selected="false"><a href="#" class="info" onclick="SelectOrgan(this)"><span id="bladder-info">
            <h3>
                Bladder</h3>
        </span></a></li>
    </ul>
</body>
</html>

各臓器には、空間内の異なる位置を持つ絶対位置が割り当てられていることに注意してください。それらをすべて同じ左、上、幅、および高さで同じに保つと、必要なものが達成されます。

于 2012-12-01T09:39:57.763 に答える
1

前の回答のどちらも、あなたが探していたものとはまったく違うと思います。これは私の提案です。CSS が変更され、末尾に JavaScript が追加されていることに注意してください。

<html>
<head><style type="text/css">
#bodysystem-excretory {
     width: 618px; height: 504px;
     background: url("excretory.png") no-repeat;
     margin: 10px auto; padding: 0;
     position: relative;
     border: 1px solid #999;
}
#bodysystem-excretory li {
    margin: 0; padding: 0;
    list-style: none;
    display: block;
    position: absolute;
}
#bodysystem-excretory a {
    display: block;
    /*  text-indent: -9999px;*/
    text-decoration: none;
}
#esoph {
    left: 85px; top: 41px;
    width: 46px; height: 94px;
    z-index: 10;
}
#lungs {
    left: 76px; top: 84px;
    width: 84px; height: 68px;
    z-index: 20;
}
#bladder {
    left: 87px; top: 148px;
    width: 64px; height: 104px;
    z-index: 30;
}
#esoph a {
    height: 94px;
}
#lungs a {
    height: 67px;
}
#bladder a {
    height: 104px;
}
#esoph:hover, #esoph.selected {
    background-image: url("excretory.png") no-repeat -25px -561px;
}
#lungs:hover, #lungs.selected {
    background-image: url("excretory.png") no-repeat -105px -523px;
}
#bladder:hover, #bladder.selected {
    background-image: url("excretory.png") no-repeat -114px -618px;
}
.info span{ 
    display: none
}
.info{
    position:relative;
    z-index:1124;
    color:#000;
}
.selected .info{
    z-index:1125;
}
.selected .info span {
    display:block; position:absolute;
    top:-30px; left:155px;
    width:370px;
    color:#000; background-color:#FFFFFF;
}​&lt;/style></head>
<body>
<ul id="bodysystem-excretory">
<li id="esoph">
<a href="#" class="info">
<span id="esoph-info"><h3>Esophagus</h3>
<p>
This is esophagus information. This is esophagus information. 
This is esophagus information. This is esophagus information.
This is esophagus information. This is esophagus information.
This is esophagus information. </p></span></a>
</li>
<li id="lungs"><a href="#" class="info">
<span id="lungs-info"><h3>Lungs</h3></span></a>        
</li>
<li id="bladder"><a href="#" class="info">
<span id="bladder-info"><h3>Bladder</h3>
</span></a></li>
</ul>​&lt;script type="text/javascript">
// Get the <li> elements as a list called 'parts'
var parts = 
    document.getElementById('bodysystem-excretory').getElementsByTagName('li');
function getClickFunction(part) {
    return function() {
// This is the function that will be called when one of the <li>s is clicked
        if (part.className == 'selected') {    // if the body part is already selected
            part.className = '';               // ... then deselect it
        }
        else {                                 // otherwise,
            // first deselect all of the body parts
            for (var i = 0; i < parts.length; i++) {
                parts[i].className = '';
            }
            // then select the one that's been clicked
            part.className = 'selected';
        }
    }
}
// Now, attach this function to all of the <li> elements representing body parts      
for (var i = 0; i < parts.length; i++) {
    parts[i].onclick = getClickFunction(parts[i]);
}​
</script></body></html>
于 2012-12-01T18:08:09.857 に答える
0

相互に対応するリンクとコンテナに識別子の単純なセットを作成する必要があります。

JSFiddle: http: //jsfiddle.net/Y4Wtn

<style>
    .btn {font-weight:normal}
    .btn.active {font-weight:bold;}
    .pane {display:none;border:1px #ccc solid;padding:10px;}
    .pane.active {display:block;}
</style>
<script>
// insert jquery here
$(document).read(function(){

    $('.btn').click(function(){
        // grab the rel value of the the link that was clicked
        var thisRel = $(this).attr('rel');
        // remove active class from all .btn
        $('.btn').removeClass('active');
        // add active class to link that was clicked
        $(this).addClass('active');
        // remove all active classes from .pane
        $('.pane').removeClass('active');
        // add class active to pane with the same rel value clicked link
        $('.pane[rel="'+thisRel+'"]').addClass('active');         
    });

});
</script>
<ul>
    <li><a href="#1" class="btn active" rel="1">Item One</a></li>
    <li><a href="#2" class="btn" rel="2">Item Two</a></li>
    <li><a href="#3" class="btn" rel="3">Item Three</a></li>
</ul>

<div class="pane active" rel="1">Pane One</div>
<div class="pane" rel="2">Pane Two</div>
<div class="pane" rel="3">Pane Three</div>
于 2012-12-06T08:51:41.450 に答える
0

クリックしたものを見て、クリックするとスタイルを永久に変更するクリックイベントを追加できます。これにより、新しいパーツが永続的に「表示」されます。

あなたの HTML:

<li id="lungs" onclick="highlight(this.id)">
   <!--some stuff-->
</li>

そしてJavaScriptで(物事を簡単にするために、タグに入れました。これと<script>他のケースをヘッダーのどこかに追加するだけです):

 <script> 
   function highlight(id) {
       var part = document.getElementById(id);
       switch(id){
          case "lungs":
             part.style.backgroundImage="url(excretory.png)";
             part.style.backgroundRepeat="no-repeat";
             part.style.backgroundPosition="-105px 523px";
             break;
          //rinse repeat for all cases, don't forget the : after your case and to add break; at the end of each line
          default:
             //do nothing, or something, whatever
    }
 </script>

JavaScript の switch ステートメントの詳細については、こちらをご覧ください。

于 2012-12-01T08:59:53.663 に答える
0

[organ].png最もエレガントな方法は、臓器ごとに 2 つの背景画像を用意することだと思います[organ]_hover.png。次に、すべてのオルガンに同じクラスを適用して、すべてのオルガンに対して 1 つのホバー イベントを作成します (のように.organ)。

この時点で.css()、JQuery の機能を使用して、( を使用して取得した後$(this).attr("id")) 特定の臓器の背景を、それに接尾辞を追加する_hoverことで変更できます。

また、現在のオルガンの記録も保持する必要があるため、ユーザーが新しいオルガンにカーソルを合わせるたびに、前のオルガンの背景を に戻し[organ].png、新しいオルガンを現在のオルガンとして保存します。

情報としては、先ほど取得したオルガン名を使って作成しdisplay:block;、前のオルガン名をdisplay:none;

編集:これはコア機能を示すフィドルです

HTML:

   <div id="human_body">
            <div class="organ" id="lungs"></div>
            <div class="organ" id="liver"></div>
            <div class="organ" id="pancreas"></div>
            <div class="organ" id="heart"></div>
            <div class="organ" id="kidneys"></div>
        </div>        
        <div id="info">
            <div id="lungs_info">
                Lungs
            </div>
            <div id="pancreas_info">
                Pancreas
            </div>
            <div id="liver_info">
                Liver
            </div>
            <div id="heart_info">
                Heart
            </div>
            <div id="kidneys_info">
                Kidneys
            </div>
        </div>

CSS:

.organ {
width:40px;
    height:40px;
    margin:10px;
}

#lungs {
        background:url("http://www.fishweb.co.il/organs/lungs.png");
    }
    #heart {
        background:url("http://www.fishweb.co.il/organs/heart.png");
    }
    #pancreas {
        background:url("http://www.fishweb.co.il/organs/pancreas.png");
    }
    #kidneys {
        background:url("http://www.fishweb.co.il/organs/kidneys.png");
    }
    #liver {
        background:url("http://www.fishweb.co.il/organs/liver.png");
}

#info>div {
display:none;
}

JS (JQuery):

var current='';
$(".organ").mouseover(
 function(){
     if (current!='') {
         $("#" + current).css("background","url(http://www.fishweb.co.il/organs/" + current +".png)"); // remove the highlight from the prev organ
         $("#" + current + "_info").hide();
     }
     current = $(this).attr("id");
     $(this).css("background","url(http://www.fishweb.co.il/organs/" + current +"_hover.png)"); // highlight the current organ
     $("#" + current + "_info").show();
 }
    );​
于 2012-12-02T10:41:51.580 に答える