// Kapsulointiesimerkki // 25.3.2015 added example relation to real protocols // 15.3.2016 poistetaan H1 myös kytkimessä // 29.3.2016 pienennetty kerrosten välejä että näkyy paremmin pienellä näytöllä + real protocols examplea muokataan myös silloin kuin headereitä poistetaan // 10.1.2018 Kavennettu, jotta mahtuisi 768 pikseliä leveeseen TIM-sivuun // TODO: siisti koodia, jos jaksat, vois yksinkertaistaa var alas = 50; var testattava = ""; var leveys = 0; var kerros = 'H5'; var tila = 0; var orig = '| GET / HTTP/1.1 jne. |'; var protot = ['|TCP portit 80 jne|', '|IP osoiteet ja otsikot |', '|MAC osoitteet|', '|Muunnos fyysiseksi signaaliksi|']; var nextHeader = { 'H5': 0, 'H4': 1, 'H3': 2, 'H2': 3 }; $(document).ready(function() { $('.sanoma').click(function() { if (kerros != 'H5') { kliku(this); } else { $('.' + this.className).animate({ top: 30 + alas }); leveys += $(this).width(); kapsuloi($(this), kerros); } }); }); function kapsuloi(element, h) { var kerrokset = ["k", "v", "l", "f"]; var headerit = ['H4', 'H3', 'H2', 'H1']; var index = nextHeader[h]; //$("#result").html(protot[index] + $("#result").html()); //$("#result").html(orig + protot.slice(0, index+1).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, index + 1).join("")); n(); }) // create header createDiv(headerit[index], 'sanoma', kerrokset[index] + headerit[index]); $('#' + kerrokset[index] + headerit[index]).animate({ left: 85 + leveys // Mihin kohtaan suhteessa sanomaan tulee headerit }); leveys += $('#' + kerrokset[index] + headerit[index]).width(); kerros = headerit[index]; // update what layer we are on } function createDiv(text, luokka, id) { d = document.createElement('div'); var paljon = { 'H4': 50, 'H3': 100, 'H2': 150, 'H1': 200 }; var vari = { 'H4': '#F2FFCC', 'H3': '#22FF00', 'H2': '#00FFFF', 'H1': '#FF00FF' }; $(d).addClass(luokka) .html(text) .attr('id', id) .css({ top: 30 + paljon[text] + 'px', 'background-color': vari[text] }) .appendTo($("body")) .click(function() { kliku(this); }) .hide() .delay(300) .slideToggle(300); } function tesi(element, vas, alas, kuka) { $('.' + element.className).each(function() { //$('#testi').html(vas); $(this).animate({ left: vas, top: alas }); }); $(kuka).fadeToggle(300); } function kliku(element) { var paljon = { 'H4': 80, 'H3': 130, 'H2': 180, 'H1': 230 }; if (kerros != 'H1') { $('.' + element.className).animate({ top: alas + paljon[kerros] }); kapsuloi($(element), kerros); } else { var hederit = ["#fH1", "#lH2", "#vH3", "#kH4"]; switch (tila) { case 0: // poistetaan H1 kytkimessä tesi(element, "+=70", "+=0", "#fH1"); tila = 1; //$("#result").html(orig + protot.slice(0, 3).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 3).join("")); n(); }) break; case 1: // link layer tesi(element, "+=0", "-=50", ""); tila = 2; break; case 2: tesi(element, "+=155", "+=0", ""); tila = 3; break; case 3: tesi(element, "+=0", "+=50", "#fH1"); //$("#result").html(orig + protot.slice(0, 4).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 4).join("")); n(); }) tila = 4; break; case 4: tesi(element, "+=70", "+=0", "#fH1"); //$("#result").html(orig + protot.slice(0, 3).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 3).join("")); n(); }) tila = 5; break; case 5: tesi(element, "+=0", "-=50", "#lH2"); //$("#result").html(orig + protot.slice(0, 2).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 2).join("")); n(); }) tila = 6; break; // ei poisteta H3 headeriä reitittimessä case 6: tesi(element, "+=0", "-=50", ""); tila = 7; break; case 7: tesi(element, "+=150", "+=0", ""); tila = 8; break; case 8: tesi(element, "+=0", "+=50", "#lH2"); //$("#result").html(orig + protot.slice(0, 3).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 3).join("")); n(); }) tila = 9; break; case 9: tesi(element, "+=0", "+=50", "#fH1"); //$("#result").html(orig + protot.slice(0, 4).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 4).join("")); n(); }) tila = 10; break; case 10: tesi(element, "+=105", "+=0", "#fH1"); //$("#result").html(orig + protot.slice(0, 3).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 3).join("")); n(); }) tila = 11; break; case 11: tesi(element, "+=0", "-=50", "#lH2"); //$("#result").html(orig + protot.slice(0, 2).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 2).join("")); n(); }) tila = 12; break; case 12: tesi(element, "+=0", "-=50", "#vH3"); //$("#result").html(orig + protot.slice(0, 1).join("")); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig + protot.slice(0, 1).join("")); n(); }) tila = 13; break; case 13: tesi(element, "+=0", "-=50", "#kH4"); //$("#result").html(orig); $("#result") .delay(1000) .queue(function(n) { $(this).html(orig); n(); }) tila = 14; break; case 14: tesi(element, "+=0", "-=50", "#sH5"); tila = 15; break; default: alert('end'); break; } } }
<div class="teksti" id="a">Lähettäjä</div> <div class="teksti" id="b">Kytkin</div> <div class="teksti" id="c">Reititin</div> <div class="teksti" id="d">Vastaanottaja</div> <div class="layers" id="item1">Sovellus</div> <div class="layers" id="item2">Kuljetus</div> <div class="layers" id="item3">Verkko</div> <div class="layers" id="item4">Linkki</div> <div class="layers" id="item5">Fyysinen</div> <div class="sanoma" id="ss">Sanoma</div> <div class="layers2" id="item6">Linkki</div> <div class="layers2" id="item7">Fyysinen</div> <div class="layers3" id="item8">Verkko</div> <div class="layers3" id="item9">Linkki</div> <div class="layers3" id="item10">Fyysinen</div> <div class="layers4" id="item11">Sovellus</div> <div class="layers4" id="item12">Kuljetus</div> <div class="layers4" id="item13">Verkko</div> <div class="layers4" id="item14">Linkki</div> <div class="layers4" id="item15">Fyysinen</div> <div class="res"> <p id="result">| GET / HTTP/1.1 jne. |</p> </div>
div { background-color: #9999CC; border: 1px solid black; border-radius: 5px; text-align: center; font-size: 1em; position: relative; top: 30px; left: 10px; margin-bottom: 50px; } .teksti { background-color: #FFFFFF; position: absolute; top: 0px; width: 75px; font-size: 0.9em; } .layers, .layers2, .layers3, .layers4 { position: absolute; width: 75px; } .layers, #a { left: 5px; } .layers2, #b { left: 235px; } .layers3, #c { left: 455px; } .layers4, #d { left: 685px; } #item5, #item7, #item10, #item15 { top: 230px; } #item4, #item6, #item9, #item14 { top: 180px; } #item3, #item8, #item13 { top: 130px; } #item2, #item12 { top: 80px; } #item1, #item11 { top: 30px; } .sanoma { position: absolute; width: fit-content; left: 85px; top: 30px; background-color: #2299CC; } .k, .v, .l, .f { position: absolute; width: fit-content; left: 110px; background-color: #F2FFCC; top: 105px; } .res { top: 300px; width: 740px; }