Wykład przeznaczony jest dla studentów II roku I stopnia Informatyki na WPPT. Odbywa się w czwartki w godz. 18:55 - 20:30 w sali 1.31/C-13. Na stronie tej znajdziesz informacje o zasadach zaliczenia, realizowanym materiale, literaturze oraz listę zadań.
Będziecie mieli do zrealizowania trzy projekty. Oceniana będzie jakość kodów (html, css, skrypty) oraz poprawność graficzna i typograficzna przedstawionych stron. Ocena końcowa będzie obliczana za pomocą wzoru $$ \frac{2 \cdot x_1 +3 \cdot x_2 + 4 \cdot x_3 }{9}~, $$ gdzie $x_1, x_2, x_3$ są ocenami z kolejnych projektów.
Spróbuj, w dowolny sposób, zbudować taką mniej więcej stronę - wizytówkę (kod html i css mają się zawierać w jednym pliku):
i przepuść ją przez walidatory HTML oraz CSS (linki są na górze tej strony). Tak długo modyfikuj stronę aż wyeliminujesz wszystkie błędy i ostrzeżenia
Spróbuj możliwie krytycznie ocenić stronę z tego obrazka - są na niej dwa ewidentne błędy kompozycyjne i jeden mniej ewidentny.
Do realizacji zadań związanych z budowanymi stronami WWW na razie nie stosujemy żadnych narzędzi ani bibliotek czy też frameworków (czyli - bez bootstrapa, bez jQuery itp). Korzystamy tylko z Notepad++ lub z Sublime Text.
suma
, która oblicza sumę dwóch liczbsuma
, którą możesz zastosować do dowolnej liczby argumentów, np. suma(2,3,22,14)
(poczytaj o parametrze arguments
funkcji).el
posłuż się funkcją el.offsetHeight
,
a do ustawienia wysokości może się posłużyć konstrukcją
el.style.height = h + "px";
, gdzie h
jest wyliczoną wysokością w pixelach.
body
można oczytywać i zapisywać za pomocą document.body.style.fontSize
parseInt()
""||16
oraz 24||16
(uwaga: 16px to domyślny rozmiar fontu większości przeglądarek).<?php require_once(__DIR__."/PHP/MyPage.php"); $P = new myPage("Jan Kowalski: edukacja"); $P->SetDescription("Główna strona witryny Jana " . "Kowalskiego poświęconej przygodom edukacyjnym."); echo $P->Begin(); ?> <header id="main-header"> .... </header>a koniec mniej więcej tak
<?php echo $P->End();?>
<frame>
zawierającym jeden element typu textarea
, z dwoma przyciskami button
. Po naciścięciu pierwszego przycisku okno ma wyliczyć liczbę liter we wprowadzonym tekście do textarea
zaś drugi ma służyć do oczyszczenia textarea
oraz starych wyliczeń.
& | & |
< | < |
> | > |
" | " |
' | ' |
/ | / |
html { box-sizing: border-box;} *, *:before, *:after { box-sizing: inherit;} .row:after{ content: ""; clear: both; display: table;} .col{ float: left; width: 50%;}Napisz kod w języku PHP, który wygeneruje grid złożony $n$ wierszy oraz $2^k$ kolumnami z losowymi kolorami tła. Kolumny mają być generowanie rekurencyjnie. Tam ma, mniej wiecej wyglądać wygenerowany wiersz dla $k=2$:
<div class="row"> <div class="col"> <div class="row"> <div class="col" style="background: #3a2b3d"> </div> <div class="col" style="background: #b4d273"> </div> </div> </div> <div class="col"> <div class="row"> <div class="col" style="background: #665d32"> </div> <div class="col" style="background: #076da3"> </div> </div> </div> </div>Przetestuj zachowanie przeglądarek dla $n=20$ i $k=1,\ldots,9$. Możesz posłużyć się następującym kodem do wygenerowania losowych kolorów:
$rand = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; function RandomColor(){ global $rand; return '#'.$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)].$rand[rand(0,15)]; }
$topmenu-bg : #33b5e5; #topmenu{ background: lighten($topmenu-bg, 20%); color: #222; ul { list-style: none; li { display: block; &.active { color: #12d232; } a { color: 10ea30; &:hover{ color: #ce1211; } } } } }Przenalizuj wynik, pomyśl o uproszczeniu struktury css, popraw scss i ponownie skompiluj.
%light-element{ background: lighten($topmenu-bg, 20%); color : #333; padding: .5em 1em; } .jasny-element{ @extend %light-element; border : 1px solid red; } table.jasny-element{ @extend %light-element; td { padding: 0.25em; } }Przenalizuj wynik.
@mixin setBgColPad($bg, $col, $pad){ background: $bg; color : $col; padding : (0.5)*$pad $pad; } .myDarkElement{ @include setBgColPad(#222, #eee, 1em); font-size: 2em; p { padding: 1em; } } .myLightElement{ @include setBgColPad(#eee, #222, 1.5em); border: solid 2px red; header { color : #000; } }
chrome://flags/#allow-insecure-localhost
.
imie = "Jola"; var osoba = { imie : "Anna", hello : function(){console.log(this.imie)} } osoba.hello(); function wywolaj(f) {f()} wywolaj(osoba.hello);Uwaga: jeśli testujesz ten kod w środowisku Node, to pierwsza linijkę zmień na
global.imie="Jola";
mathjax
dodaj do opisów wykładów teoretycznych przenajmniej po jednym z najważniejszych wzorów które poznałeś na wykładzie<!DOCTYPE html> <html lang="pl"> <head> <meta charset="utf-8"> <title>Tytul strony</title> <meta name="description" content="..."> <meta name="author" content="..."> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> </head> <body> </body> </html>
* { box-sizing: border-box;}
body{ background-color:#000; } #container{ width:100%; max-width:940px; margin:1em auto 0em auto; background-color:#fff; padding:0 0.5em; }
html
(od roku 2013).row:after { content: ""; clear: both; display: table; } [class*='col-'] { float: left; padding: 0 0.5em; width: 100%; margin-bottom:0.5em; } @media screen and (min-width: 640px) { .row+.row { margin-top: 0.5em; } .col-1-2 { width: 49.5%; margin-right:1%; } .col-2-2 { width: 100%; } [class*='col-']:last-of-type { margin-right:0; } }
<div class="row"> <div class="col-1-2"> <h2>Kolumna 1a</h2> </div> <div class="col-1-2"> <h2>Kolumna 2a</h2> </div> </div> <!-- row -->
Uwaga: nie przejmujcie się, jeśli wszystkiego nie chwyciliście. Na następnym wykładzie omówimy raz jeszcze zamieszczone kody - tym razem dokładniej i spóbujemy zapoznać się ze wszystkimi detalami (linijka po linijce) i omówimy sobie dokładniej o co chodzi z css.
col-k-n
: width:
$k\cdot \Delta + (k-1)\cdot\delta$;node.js
i zacznij korzystać z REPL. Podłącz node.js do swojego edytora tekstów.
let
<!DOCTYPE html> <html lang="pl"> <head> <meta charset="utf-8"> <title>PHP intro</title> <link rel="stylesheet" href="css/intro.css"> </head> <body> <div id="container"> <?php $autor = "Jacek Cichoń"; echo "<h1>Jestem stroną wygenerowaną przez PHP</h1>\n"; echo "<p>Tę piękną stronę zbudował {$autor}.</p>\n"; ?> </div> </body> </html>A to jest wyniki: PHPIntro01.php.
<!DOCTYPE html> <html lang="pl"> <head> <meta charset="utf-8"> <title>PHP intro</title> <link rel="stylesheet" href="css/intro.css"> </head> <body> <div id="container"> <?php function myDiv($txt, $class){ $s = "<div class=\"wider {$class}\">\n"; $s.= " " . $txt; $s.= "\n</div>\n"; return $s; } function myCard($title, $info, $img=""){ $title = trim($title); $img = trim($img); $s = "<div class=\"card-info\">\n"; if ($title !==""){ $s.= " <header>{$title}</header>\n"; } if ($img !== ""){ $s.= " <img src=\"img/{$img}\">\n"; } $s.= " <p>{$info}</p>\n"; $s.= "</div>\n"; return $s; } ?> <?php $autor = "Jacek Cichoń"; echo "<h1>Jestem stroną wygenerowaną przez PHP</h1>\n"; echo "<p> Tę piękną stronę zbudował {$autor}.</p>\n"; echo myDiv("To jest niebieski div","blue"); echo myDiv("To jest czerwony div","red"); echo myDiv("To jest zielony div","green"); echo "<div class='row'>\n"; echo myCard( "Wakacje 2016", "Piękna i dosyć trudno dostępna laguna Balos na Krecie. Najłatwiej jest tam dostać się łodzią.", "gr01.jpg"); echo myCard( "Wakacje 2016", "Drugie zdjęcie z laguny Balos", "gr02.jpg"); echo "</div>\n"; ?> </div> </body> </html>A to jest wyniki: PHPIntro02.php.
<?php class MyPage { private $Title = ""; public function __construct($Title = "") { $this->Title = $Title; } public function Begin(){ $s = "<!DOCTYPE html>\n"; $s.= "<html lang='pl'>\n"; $s.= "<head>\n"; $s.= "<meta charset='utf-8'>\n"; $s.= "<title>" . $this->Title . "</title>\n"; $s.= "<meta name='author' content='Jacek Cichoń'>\n"; $s.= "<meta name='viewport' content = 'width=device-width, initial-scale=1.0'/>\n"; $s.= "<link rel='stylesheet' href='css/reset.css'>\n"; $s.= "<link rel='stylesheet' href='css/grid.css'>\n"; $s.= "<link rel='stylesheet' href='css/mystyle.css'>\n"; $s.= "<script src='js/application.js'></script>\n"; $s.= "</head>\n"; $s.= "<body>\n"; $s.= "<div id='container'>\n"; return $s; } public function End(){ $s = "</div>\n"; $s.= "</body>\n"; $s.= "</html>"; return $s; } } ?>
<?php
$MAIN_MENU_TMPL =<<<EOT
<ul id="mainmenu">
{{M1}}
{{M2}}
<li>Dydaktyka
<ul>
{{M3.1}}
{{M3.2}}
{{M3.3}}
</ul>
</li>
<li>Badania
<ul>
{{M4.1}}
{{M4.2}}
{{M4.3}}
</ul>
</li>
</ul>
EOT;
$MAIN_MENU_ITEMS = [
"M1" => ["Strona głowna","index.php"],
"M2" => ["Kadra", "kadra.php"],
"M3.1" => ["Osoby", "listaosob.php"],
"M3.2" => ["Konsultacje", "konsultacje.php"],
"M3.3" => ["Dyplomowe", "pracedyplomowe.php"],
"M4.1" => ["Seminaria", "seminaria.php"],
"M4.2" => ["Publikacje", "publikacje.php"],
"M4.3" => ["Projekty", "projekty.php"]
];
$MAIN_MENU_LI_1 = '<li class="active">{{T}}</li>';
$MAIN_MENU_LI_2 = '<li><a href="{{H}}">{{T}}</a></li>';
/**
*
* @param string $active identyfikator elementu menu który nie jest linkiem
* @return string
*/
function generujMenu2($active) {
global $MAIN_MENU_TMPL, $MAIN_MENU_ITEMS, $MAIN_MENU_LI_1, $MAIN_MENU_LI_2;
$s = $MAIN_MENU_TMPL;
foreach ($MAIN_MENU_ITEMS as $key => $array) {
$mkey = "{{" . $key . "}}";
$item = ($key === $active)? $MAIN_MENU_LI_1 : $MAIN_MENU_LI_2;
$item = (string)str_replace(["{{T}}","{{H}}"], $array, $item);
$s = (string)str_replace($mkey, $item, $s);
}
return $s;
}
?>
var gulp = require('gulp');
var sass = require('gulp-sass');
gulp.task('hello', function() {
console.log('>>>>>>>>>>>');
console.log('Hello Jacek');
console.log('<<<<<<<<<<<');
});
var sassOptions = {
errLogToConsole: true,
outputStyle: 'expanded',
precision: 8
};
var sassOptionsCompressed = {
errLogToConsole: true,
outputStyle: 'compressed',
precision: 8
};
gulp.task('callsass', function(){
return gulp.src('scss/HomePage.scss')
.pipe(sass(sassOptions))
.on('error', sass.logError)
.pipe(gulp.dest('css'));
});
gulp.task('obserwuj',function() {
gulp.watch('scss/*.scss', ['callsass'])
.on('change', function(event) {
console.log('File ' + event.path + ' was ' + event.type);}
);
});
refresh();
startRefresh();
i stopRefresh();
this
w javascript.session_start();
: to musi być użyte przed wygenerowaniem dowolnego tekstu (np. poleeniem echo ..)header("location: PLIK");
: przed tym też nic nie powinno być wygenerowanePromise.all
) oraz sekwencyjne wywołanie obietnic (promise.then(promise).then(promise) ...
) function podstawPodElem (elem)
i zobacz co oznacza w jej kodzie słowo kluczowe this
; wyjaśnij co się tutaj dzieje (czyli dlaczego this
wskazuje obiekt img
); podstawPodElem (elem)
jest polecenie window.scrollTo(0,0)?ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);do wyświetlania potencjalnych błędów.
var i =1; console.log((i++)+ " one"); setTimeout(function (){console.log( (i++) + " TWO"); }, 0); console.log((i++) + " three"); console.log((i++) + " four"); console.log((i++) + " five");Wewnętrzny stos, API i kolejka (przeanalizuj uważnie kod z tej strony i zinterpetuj jego działanie).
font-size
jednostek vw: Bad.html: wyobraź sobie, że masz kłopoty ze wzrokiem i spróbuj zwiększyć rozmiar czcionek na tamtej stronie.https://cs.pwr.edu.pl/apiKadra.php
oraz https://cs.pwr.edu.pl/apiKadra.php?NICK=MGE
i następnie spróbuj samodzielnie się dobrać do tego serwisu.
Aplication
i odczytaj plik manifest.json.
Spróbuj na swoim telefonie otworzyć tę stronę i przypnij ją do ekranu startowego.
Na następnym, ostatnim, wykładzie przekształcimy tę aplikację na Progresive Web Application.
A na razie zainstaluj sobie wtyczkę Lighhouse oraz Web Server for Chrome (200 OK).