From 768ec76bc64bf2a96581370e6c4d11c81dd23880 Mon Sep 17 00:00:00 2001 From: sqozz Date: Sun, 29 Nov 2015 21:15:20 +0100 Subject: [PATCH] initial commit --- Handout.odt | Bin 0 -> 18361 bytes Handout.pdf | Bin 0 -> 46501 bytes css/impress-demo.css | 703 ++++++++++++++++++++++++++++++++ css/vier-seiten-modell.css | 284 +++++++++++++ index.html | 267 +++++++++++++ js/impress.js | 800 +++++++++++++++++++++++++++++++++++++ js/vier-seiten-modell.js | 60 +++ 7 files changed, 2114 insertions(+) create mode 100644 Handout.odt create mode 100644 Handout.pdf create mode 100644 css/impress-demo.css create mode 100644 css/vier-seiten-modell.css create mode 100644 index.html create mode 100644 js/impress.js create mode 100644 js/vier-seiten-modell.js diff --git a/Handout.odt b/Handout.odt new file mode 100644 index 0000000000000000000000000000000000000000..2b6cc99106fdd6887f8cf85a070253354deea8a6 GIT binary patch literal 18361 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 DUSe9t literal 0 HcmV?d00001 diff --git a/Handout.pdf b/Handout.pdf new file mode 100644 index 0000000000000000000000000000000000000000..29407efab715bf9b5d9b3c9b34e998157a896535 GIT binary patch literal 46501 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 o8Us;KP{7C_Fc_FDRGwrQJv=SlJ@?HF0 styles with default font and nice gradient in the background. + And yes, there is a lot of repetition there because of -prefixes but we don't + want to leave anybody behind. +*/ +body { + font-family: 'PT Sans', sans-serif; + min-height: 740px; + + background: rgb(215, 215, 215); + background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190))); + background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); + background: -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); + background: -ms-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); + background: -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); + background: radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); +} + +/* + Now let's bring some text styles back ... +*/ +b, strong { font-weight: bold } +i, em { font-style: italic } + +/* + ... and give links a nice look. +*/ +a { + color: inherit; + text-decoration: none; + padding: 0 0.1em; + background: rgba(255,255,255,0.5); + text-shadow: -1px -1px 2px rgba(100,100,100,0.9); + border-radius: 0.2em; + + -webkit-transition: 0.5s; + -moz-transition: 0.5s; + -ms-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} + +a:hover, +a:focus { + background: rgba(255,255,255,1); + text-shadow: -1px -1px 2px rgba(100,100,100,0.5); +} + +/* + Because the main point behind the impress.js demo is to demo impress.js + we display a fallback message for users with browsers that don't support + all the features required by it. + + All of the content will be still fully accessible for them, but I want + them to know that they are missing something - that's what the demo is + about, isn't it? + + And then we hide the message, when support is detected in the browser. +*/ + +.fallback-message { + font-family: sans-serif; + line-height: 1.3; + + width: 780px; + padding: 10px 10px 0; + margin: 20px auto; + + border: 1px solid #E4C652; + border-radius: 10px; + background: #EEDC94; +} + +.fallback-message p { + margin-bottom: 10px; +} + +.impress-supported .fallback-message { + display: none; +} + +/* + Now let's style the presentation steps. + + We start with basics to make sure it displays correctly in everywhere ... +*/ + +.step { + position: relative; + width: 900px; + padding: 40px; + margin: 20px auto; + + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + + font-family: 'PT Serif', georgia, serif; + font-size: 48px; + line-height: 1.5; +} + +/* + ... and we enhance the styles for impress.js. + + Basically we remove the margin and make inactive steps a little bit transparent. +*/ +.impress-enabled .step { + margin: 0; + opacity: 0.3; + + -webkit-transition: opacity 1s; + -moz-transition: opacity 1s; + -ms-transition: opacity 1s; + -o-transition: opacity 1s; + transition: opacity 1s; +} + +.impress-enabled .step.active { opacity: 1 } + +/* + These 'slide' step styles were heavily inspired by HTML5 Slides: + http://html5slides.googlecode.com/svn/trunk/styles.css + + ;) + + They cover everything what you see on first three steps of the demo. +*/ +.slide { + display: block; + + width: 900px; + height: 700px; + padding: 40px 60px; + + background-color: white; + border: 1px solid rgba(0, 0, 0, .3); + border-radius: 10px; + box-shadow: 0 2px 6px rgba(0, 0, 0, .1); + + color: rgb(102, 102, 102); + text-shadow: 0 2px 2px rgba(0, 0, 0, .1); + + font-family: 'Open Sans', Arial, sans-serif; + font-size: 30px; + line-height: 36px; + letter-spacing: -1px; +} + +.slide q { + display: block; + font-size: 50px; + line-height: 72px; + + margin-top: 100px; +} + +.slide q strong { + white-space: nowrap; +} + +/* + And now we start to style each step separately. + + I agree that this may be not the most efficient, object-oriented and + scalable way of styling, but most of steps have quite a custom look + and typography tricks here and there, so they had to be styled separately. + + First is the title step with a big

(no room for padding) and some + 3D positioning along Z axis. +*/ + +#title { + padding: 0; +} + +#title .try { + font-size: 64px; + position: absolute; + top: -0.5em; + left: 1.5em; + + -webkit-transform: translateZ(20px); + -moz-transform: translateZ(20px); + -ms-transform: translateZ(20px); + -o-transform: translateZ(20px); + transform: translateZ(20px); +} + +#title h1 { + font-size: 190px; + + -webkit-transform: translateZ(50px); + -moz-transform: translateZ(50px); + -ms-transform: translateZ(50px); + -o-transform: translateZ(50px); + transform: translateZ(50px); +} + +#title .footnote { + font-size: 32px; +} + +/* + Second step is nothing special, just a text with a link, so it doesn't need + any special styling. + + Let's move to 'big thoughts' with centered text and custom font sizes. +*/ +#big { + width: 600px; + text-align: center; + font-size: 60px; + line-height: 1; +} + +#big b { + display: block; + font-size: 250px; + line-height: 250px; +} + +#big .thoughts { + font-size: 90px; + line-height: 150px; +} + +/* + 'Tiny ideas' just need some tiny styling. +*/ +#tiny { + width: 500px; + text-align: center; +} + +/* + This step has some animated text ... +*/ +#ing { width: 500px } + +/* + ... so we define display to `inline-block` to enable transforms and + transition duration to 0.5s ... +*/ +#ing b { + display: inline-block; + -webkit-transition: 0.5s; + -moz-transition: 0.5s; + -ms-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} + +/* + ... and we want 'positioning` word to move up a bit when the step gets + `present` class ... +*/ +#ing.present .positioning { + -webkit-transform: translateY(-10px); + -moz-transform: translateY(-10px); + -ms-transform: translateY(-10px); + -o-transform: translateY(-10px); + transform: translateY(-10px); +} + +/* + ... 'rotating' to rotate a quarter of a second later ... +*/ +#ing.present .rotating { + -webkit-transform: rotate(-10deg); + -moz-transform: rotate(-10deg); + -ms-transform: rotate(-10deg); + -o-transform: rotate(-10deg); + transform: rotate(-10deg); + + -webkit-transition-delay: 0.25s; + -moz-transition-delay: 0.25s; + -ms-transition-delay: 0.25s; + -o-transition-delay: 0.25s; + transition-delay: 0.25s; +} + +/* + ... and 'scaling' to scale down after another quarter of a second. +*/ +#ing.present .scaling { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -ms-transform: scale(0.7); + -o-transform: scale(0.7); + transform: scale(0.7); + + -webkit-transition-delay: 0.5s; + -moz-transition-delay: 0.5s; + -ms-transition-delay: 0.5s; + -o-transition-delay: 0.5s; + transition-delay: 0.5s; +} + +/* + The 'imagination' step is again some boring font-sizing. +*/ + +#imagination { + width: 600px; +} + +#imagination .imagination { + font-size: 78px; +} + +/* + There is nothing really special about 'use the source, Luke' step, too, + except maybe of the Yoda background. + + As you can see below I've 'hard-coded' it in data URL. + That's not the best way to serve images, but because that's just this one + I decided it will be OK to have it this way. + + Just make sure you don't blindly copy this approach. +*/ +#source { + width: 700px; + padding-bottom: 300px; + + /* Yoda Icon :: Pixel Art from Star Wars http://www.pixeljoint.com/pixelart/1423.htm */ + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARgAAAEYCAMAAACwUBm+AAAAAXNSR0IArs4c6QAAAKtQTFRFsAAAvbWSLUUrLEQqY1s8UYJMqJ1vNTEgOiIdIzYhjIFVLhsXZ6lgSEIsP2U8JhcCVzMsSXZEgXdOO145XJdWOl03LzAYMk4vSXNExr+hwcuxRTs1Qmk+RW9Am49eFRANQz4pUoNMQWc+OSMDTz0wLBsCNVMxa2NBOyUDUoNNSnlEWo9VRGxAVzYFl6tXCggHbLNmMUIcHhwTXkk5f3VNRT8wUT8xAAAACQocRBWFFwAAAAF0Uk5TAEDm2GYAAAPCSURBVHja7d3JctNAFIZRMwRCCGEmzPM8z/D+T8bu/ptbXXJFdij5fMt2Wuo+2UgqxVmtttq5WVotLzBgwIABAwYMGDCn0qVqbo69psPqVpWx+1XG5iaavF8wYMCAAQMGDBgwi4DJ6Y6qkxB1HNlcN3a92gbR5P2CAQMGDBgwYMCAWSxMlrU+UY5yu2l9okfV4bAxUVbf7TJnAwMGDBgwYMCAAbMLMHeqbGR82Zy+VR1Ht81nVca6R+UdTLaU24Ruzd3qM/e4yjnAgAEDBgwYMGDA7AJMd1l/3NRdVGcj3eX/2WEhCmDGxnM7yqygu8XIPjJj8iN/MGDAgAEDBgwYMAuDGb8q0RGlLCHLv1t9qDKWn3vdNHVuEI6HPaxO9Jo3GDBgwIABAwYMmIXBdC9ShGgMk+XnkXUeuGcsP/e1+lhNnZsL/G5Vs3OAAQMGDBgwYMCAWSxMR3SzOmraG5atdy9wZKzb+vg16qyqe2FltbnAgAEDBgwYMGDALAxmTJSuN3WA76rnVca6GTnemGN1WoEBAwYMGDBgwIBZGMxUomy4+xO899V4LAg5Xnc2MGDAgAEDBgwYMGA218Wq+2K1LDqvY9xZu8zN8fICdM6btYABAwYMGDBgwIABMzfH0+pGU5afze2tXebmeAfVz+p8BQYMGDBgwIABAwbMPBzZ+oWmfJrln1273FhkbHzee9WWbw7AgAEDBgwYMGDALAKm43hcdctKgblcPamOhuXnXlY5Xs6bsW4FGyQCAwYMGDBgwIABswiYMceZKgvMo+h8mrHLTdn676rj+FEFoTtHd8MwOxEYMGDAgAEDBgyYRcBM5UhXqiymW3R3c9ARhWO/OmjqfjVZy+xEYMCAAQMGDBgwYBYG073OnCV0RFNhMhaOa9WfKmOB6XjHMN1tQmaAAQMGDBgwYMCA2VWY7vXjz1U4croAzgPztwIDBgwYMGDAgAEDZhswh035NBw59Dww3RgYMGDAgAEDBgwYMJuD6f4tXT7NUqfCdBvZLkxXdgQGDBgwYMCAAQNmt2DGj8WzwAfV/w7T/aq7mxwwYMCAAQMGDBgwuwqTOo7uTwTngflSzQ3TdaJvAwEDBgwYMGDAgAED5gSvgbyo5oHZ4Pc+gwEDBgwYMGDAgAEzhOm+5G0qTGaAAQMGDBgwYMCAAXNaMOcnls3tNwWm+zRzp54NDBgwYMCAAQMGDJh5YNL36k1TLuGvVq+qnKMbS5n7tulT9asCAwYMGDBgwIABA2ZumKuztLnjgQEDBgwYMGDAgNl5mH/4/ltKA6vBNAAAAABJRU5ErkJggg==); + background-position: bottom right; + background-repeat: no-repeat; +} + +#source q { + font-size: 60px; +} + +/* + And the "it's in 3D" step again brings some 3D typography - just for fun. + + Because we want to position elements in 3D we set transform-style to + `preserve-3d` on the paragraph. + It is not needed by webkit browsers, but it is in Firefox. It's hard to say + which behaviour is correct as 3D transforms spec is not very clear about it. +*/ +#its-in-3d p { + -webkit-transform-style: preserve-3d; + -moz-transform-style: preserve-3d; /* Y U need this Firefox?! */ + -ms-transform-style: preserve-3d; + -o-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +/* + Below we position each word separately along Z axis and we want it to transition + to default position in 0.5s when the step gets `present` class. + + Quite a simple idea, but lot's of styles and prefixes. +*/ +#its-in-3d span, +#its-in-3d b { + display: inline-block; + -webkit-transform: translateZ(40px); + -moz-transform: translateZ(40px); + -ms-transform: translateZ(40px); + -o-transform: translateZ(40px); + transform: translateZ(40px); + + -webkit-transition: 0.5s; + -moz-transition: 0.5s; + -ms-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} + +#its-in-3d .have { + -webkit-transform: translateZ(-40px); + -moz-transform: translateZ(-40px); + -ms-transform: translateZ(-40px); + -o-transform: translateZ(-40px); + transform: translateZ(-40px); +} + +#its-in-3d .you { + -webkit-transform: translateZ(20px); + -moz-transform: translateZ(20px); + -ms-transform: translateZ(20px); + -o-transform: translateZ(20px); + transform: translateZ(20px); +} + +#its-in-3d .noticed { + -webkit-transform: translateZ(-40px); + -moz-transform: translateZ(-40px); + -ms-transform: translateZ(-40px); + -o-transform: translateZ(-40px); + transform: translateZ(-40px); +} + +#its-in-3d .its { + -webkit-transform: translateZ(60px); + -moz-transform: translateZ(60px); + -ms-transform: translateZ(60px); + -o-transform: translateZ(60px); + transform: translateZ(60px); +} + +#its-in-3d .in { + -webkit-transform: translateZ(-10px); + -moz-transform: translateZ(-10px); + -ms-transform: translateZ(-10px); + -o-transform: translateZ(-10px); + transform: translateZ(-10px); +} + +#its-in-3d .footnote { + font-size: 32px; + + -webkit-transform: translateZ(-10px); + -moz-transform: translateZ(-10px); + -ms-transform: translateZ(-10px); + -o-transform: translateZ(-10px); + transform: translateZ(-10px); +} + +#its-in-3d.present span, +#its-in-3d.present b { + -webkit-transform: translateZ(0px); + -moz-transform: translateZ(0px); + -ms-transform: translateZ(0px); + -o-transform: translateZ(0px); + transform: translateZ(0px); +} + +/* + The last step is an overview. + There is no content in it, so we make sure it's not visible because we want + to be able to click on other steps. + +*/ +#overview { display: none } + +/* + We also make other steps visible and give them a pointer cursor using the + `impress-on-` class. +*/ +.impress-on-overview .step { + opacity: 1; + cursor: pointer; +} + + +/* + Now, when we have all the steps styled let's give users a hint how to navigate + around the presentation. + + The best way to do this would be to use JavaScript, show a delayed hint for a + first time users, then hide it and store a status in cookie or localStorage... + + But I wanted to have some CSS fun and avoid additional scripting... + + Let me explain it first, so maybe the transition magic will be more readable + when you read the code. + + First of all I wanted the hint to appear only when user is idle for a while. + You can't detect the 'idle' state in CSS, but I delayed a appearing of the + hint by 5s using transition-delay. + + You also can't detect in CSS if the user is a first-time visitor, so I had to + make an assumption that I'll only show the hint on the first step. And when + the step is changed hide the hint, because I can assume that user already + knows how to navigate. + + To summarize it - hint is shown when the user is on the first step for longer + than 5 seconds. + + The other problem I had was caused by the fact that I wanted the hint to fade + in and out. It can be easily achieved by transitioning the opacity property. + But that also meant that the hint was always on the screen, even if totally + transparent. It covered part of the screen and you couldn't correctly clicked + through it. + Unfortunately you cannot transition between display `block` and `none` in pure + CSS, so I needed a way to not only fade out the hint but also move it out of + the screen. + + I solved this problem by positioning the hint below the bottom of the screen + with CSS transform and moving it up to show it. But I also didn't want this move + to be visible. I wanted the hint only to fade in and out visually, so I delayed + the fade in transition, so it starts when the hint is already in its correct + position on the screen. + + I know, it sounds complicated ... maybe it would be easier with the code? +*/ + +.hint { + /* + We hide the hint until presentation is started and from browsers not supporting + impress.js, as they will have a linear scrollable view ... + */ + display: none; + + /* + ... and give it some fixed position and nice styles. + */ + position: fixed; + left: 0; + right: 0; + bottom: 200px; + + background: rgba(0,0,0,0.5); + color: #EEE; + text-align: center; + + font-size: 50px; + padding: 20px; + + z-index: 100; + + /* + By default we don't want the hint to be visible, so we make it transparent ... + */ + opacity: 0; + + /* + ... and position it below the bottom of the screen (relative to it's fixed position) + */ + -webkit-transform: translateY(400px); + -moz-transform: translateY(400px); + -ms-transform: translateY(400px); + -o-transform: translateY(400px); + transform: translateY(400px); + + /* + Now let's imagine that the hint is visible and we want to fade it out and move out + of the screen. + + So we define the transition on the opacity property with 1s duration and another + transition on transform property delayed by 1s so it will happen after the fade out + on opacity finished. + + This way user will not see the hint moving down. + */ + -webkit-transition: opacity 1s, -webkit-transform 0.5s 1s; + -moz-transition: opacity 1s, -moz-transform 0.5s 1s; + -ms-transition: opacity 1s, -ms-transform 0.5s 1s; + -o-transition: opacity 1s, -o-transform 0.5s 1s; + transition: opacity 1s, transform 0.5s 1s; +} + +/* + Now we 'enable' the hint when presentation is initialized ... +*/ +.impress-enabled .hint { display: block } + +/* + ... and we will show it when the first step (with id 'bored') is active. +*/ +.impress-on-bored .hint { + /* + We remove the transparency and position the hint in its default fixed + position. + */ + opacity: 1; + + -webkit-transform: translateY(0px); + -moz-transform: translateY(0px); + -ms-transform: translateY(0px); + -o-transform: translateY(0px); + transform: translateY(0px); + + /* + Now for fade in transition we have the oposite situation from the one + above. + + First after 4.5s delay we animate the transform property to move the hint + into its correct position and after that we fade it in with opacity + transition. + */ + -webkit-transition: opacity 1s 5s, -webkit-transform 0.5s 4.5s; + -moz-transition: opacity 1s 5s, -moz-transform 0.5s 4.5s; + -ms-transition: opacity 1s 5s, -ms-transform 0.5s 4.5s; + -o-transition: opacity 1s 5s, -o-transform 0.5s 4.5s; + transition: opacity 1s 5s, transform 0.5s 4.5s; +} + +/* + And as the last thing there is a workaround for quite strange bug. + It happens a lot in Chrome. I don't remember if I've seen it in Firefox. + + Sometimes the element positioned in 3D (especially when it's moved back + along Z axis) is not clickable, because it falls 'behind' the + element. + + To prevent this, I decided to make non clickable by setting + pointer-events property to `none` value. + Value if this property is inherited, so to make everything else clickable + I bring it back on the #impress element. + + If you want to know more about `pointer-events` here are some docs: + https://developer.mozilla.org/en/CSS/pointer-events + + There is one very important thing to notice about this workaround - it makes + everything 'unclickable' except what's in #impress element. + + So use it wisely ... or don't use at all. +*/ +.impress-enabled { pointer-events: none } +.impress-enabled #impress { pointer-events: auto } + +/* + There is one funny thing I just realized. + + Thanks to this workaround above everything except #impress element is invisible + for click events. That means that the hint element is also not clickable. + So basically all of this transforms and delayed transitions trickery was probably + not needed at all... + + But it was fun to learn about it, wasn't it? +*/ + +/* + That's all I have for you in this file. + Thanks for reading. I hope you enjoyed it at least as much as I enjoyed writing it + for you. +*/ diff --git a/css/vier-seiten-modell.css b/css/vier-seiten-modell.css new file mode 100644 index 0000000..e4c932f --- /dev/null +++ b/css/vier-seiten-modell.css @@ -0,0 +1,284 @@ +/* CSS Reset */ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* Basic style like the background for the body */ +body { + font-family: 'PT Sans', sans-serif; + min-height: 740px; + + background: + radial-gradient(black 15%, transparent 16%) 0 0, + radial-gradient(black 15%, transparent 16%) 8px 8px, + radial-gradient(rgba(255,255,255,.1) 15%, transparent 20%) 0 1px, + radial-gradient(rgba(255,255,255,.1) 15%, transparent 20%) 8px 9px; + background-color:#282828; + background-size:16px 16px; + color: white; +} + +/* Give some elements back their style */ +b, strong { font-weight: bold } +i, em { font-style: italic } +ul li:before { + content: "» " +} + +/* Hide the fallback message if everything is supported */ +.impress-supported .fallback-message { + display: none; +} + +/* Styles for each step of the presentation */ +.step { + position: relative; + width: 900px; + padding: 40px; + margin: 20px auto; + box-sizing: border-box; + font-family: 'PT Serif', georgia, serif; + font-size: 45px; + line-height: 1.5; +} + +.step div { + max-width: calc(100% - 310px); + float: left; +} + +.impress-enabled .step { + margin: 0; +} + +.impress-enabled .step.active { +} + +.slide { + display: block; + + width: 900px; + height: 700px; + padding: 40px 60px; + + background-color: white; + border: 1px solid rgba(0, 0, 0, .3); + border-radius: 10px; + box-shadow: 0 2px 6px rgba(0, 0, 0, .1); + + color: rgb(102, 102, 102); + text-shadow: 0 2px 2px rgba(0, 0, 0, .1); + + font-family: 'Open Sans', Arial, sans-serif; + font-size: 30px; + line-height: 36px; + letter-spacing: -1px; +} + +.side .content { + display: flex; + align-items: center; + justify-content: center; + height: 300px; + width: 300px; + float: right; + border: 3px solid black; +} + + +#conflict:not(.active) { + /*display: none !important;*/ + opacity: 0; + transition: opacity 1s linear 2s; +} + + +.side.step div.text { + display: inline-block; +} + +.side.step ul { + display: inline-block; +} + +.side:not(.active) .text, .side.step:not(.active) ul { + opacity: 0; +} + +.side.active .text, .side.step ul { + opacity: 1; +} + +.side:not(.step) { + margin: 0 auto; + text-align: center; +} + +.side:not(.step) div { + display: block; + max-width: 300px; + max-height: 300px; +} + +#definition-1 { + font-size: 45px; +} + +#definition-2 ul { + margin-left: 20px; +} + +#factual-level-div { + background-color: rgb(58, 210, 205); +} + +#self-declaration-div { + background-color: #159C15; +} + +#appeal-div { + background-color: #8A0000; +} + +#relation-div { + background-color: #AAAA06; +} + +#lid-top { + position: absolute; + top: 0px; + left: 110px; + bottom: 0px; + width: 300px; + height: 300px; + background-color: black; + transform: translate(-50%, -50%) translate3d(150px, -150px, -150px) rotateX(90deg) rotateY(0deg) rotateZ(90deg) scale(1) +} + +#lid-bottom { + position: absolute; + top: 0px; + left: 110px; + bottom: 0px; + width: 300px; + height: 300px; + background-color: grey; + transform: translate(-50%, -50%) translate3d(150px, 150px, -150px) rotateX(90deg) rotateY(0deg) rotateZ(90deg) scale(1) +} + +#conflict { + font-size: 75px; +} + +#example { + min-width: 1200px; +} + +#intro { + font-size: 100px; + width: 1300px; + overflow: hidden; +} + +#intro h1 { + display: flex; + justify-content: center; + margin: -30px; +} + +#intro h4 { + font-size: 30px; + float: right; + transform: translateZ(1000px); +} + +#intro.step:not(.active):not(.bye) { + display: none; + opacity: 0; + transition: opacity 1s ease 500ms; +} + +.step.side-stage:not(.active):not(.side) { + display: none !important; +} + + +table { + font-size: 30px; +} + +table td:empty { + width: 20px; +} + +#meant, #understood { + min-width: 1000px; +} + +.table-center-wrapper { + display: flex; + justify-content: center; + margin-top: 0px; +} + +#example:not(.active) { + opacity: 0; + transition: opacity 0s linear 2s; +} + +#thanks:not(.active) { + display: none !important; +} + +#questions:not(.active) { + opacity: 0; +} + +#result:not(.active) { + opacity: 0; +} + +#thanks { + color: orange; +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..c5eeaa0 --- /dev/null +++ b/index.html @@ -0,0 +1,267 @@ + + + + + + + Das Vier-Seiten-Modell | Präsentation von Nick Singer + + + + + + + + + + + + +
+ +
+

Das Vier-Seiten-Modell

+

von Friedemann Schulz von Thun

+
+ +
+ Jede Aussage beinhaltet 4 Ebenen. +
+ +
+ Beeinflussung der Ebenen: +
    +
  • Unbewusst
  • +
  • Bewusst
  • +
+
+ +
+
    +
  • Aussprache
  • +
  • Gestik
  • +
  • Mimik
  • +
+
+ +
+
    +
  • Informationen
  • +
  • Fakten
  • +
+
+ Sachebene +
+
+ +
+
    +
  • Werte
  • +
  • Ansichten
  • +
  • Bedürfnisse
  • +
+
+ Selbst-
kundgabe
+
+
+ +
+
    +
  • Ratschlag
  • +
  • Wunsch
  • +
  • Anweisung
  • +
+
+ Appell +
+
+ +
+
    +
  • Wertschätzung
  • +
  • Demütigung
  • +
+
+ Beziehung +
+
+ +
+
+ +
+ = Konfliktpotential +
+ +
+ Beispiel: „Was ist das Grüne in der Soße?“ +
+ +
+ Was kann gemeint sein? + + + + + + + + + + + + + + + + + + + + + + +
SachebeneDa ist was Grünes.
SelbstkundgabeIch weiß nicht, was es ist.
BeziehungDu wirst es wissen.
AppellSag mir, was es ist!
+
+
+ +
+ Was kann verstanden werden? + + + + + + + + + + + + + + + + + + + + + + +
SachebeneDa ist was Grünes.
SelbstkundgabeMir schmeckt das nicht.
BeziehungDu bist eine miese Köchin!
AppellLass nächstes Mal das Grüne weg!
+
+
+ +
+ +
+ +
+ Fazit +
+ +
+ Fragen? +
+ +
+ Vielen Dank! +
+ +
+ + + + + + + + + + + + + + diff --git a/js/impress.js b/js/impress.js new file mode 100644 index 0000000..84659a2 --- /dev/null +++ b/js/impress.js @@ -0,0 +1,800 @@ +/** + * impress.js + * + * impress.js is a presentation tool based on the power of CSS3 transforms and transitions + * in modern browsers and inspired by the idea behind prezi.com. + * + * + * Copyright 2011-2012 Bartek Szopka (@bartaz) + * + * Released under the MIT and GPL Licenses. + * + * ------------------------------------------------ + * author: Bartek Szopka + * version: 0.5.3 + * url: http://bartaz.github.com/impress.js/ + * source: http://github.com/bartaz/impress.js/ + */ + +/*jshint bitwise:true, curly:true, eqeqeq:true, forin:true, latedef:true, newcap:true, + noarg:true, noempty:true, undef:true, strict:true, browser:true */ + +// You are one of those who like to know how things work inside? +// Let me show you the cogs that make impress.js run... +(function ( document, window ) { + 'use strict'; + + // HELPER FUNCTIONS + + // `pfx` is a function that takes a standard CSS property name as a parameter + // and returns it's prefixed version valid for current browser it runs in. + // The code is heavily inspired by Modernizr http://www.modernizr.com/ + var pfx = (function () { + + var style = document.createElement('dummy').style, + prefixes = 'Webkit Moz O ms Khtml'.split(' '), + memory = {}; + + return function ( prop ) { + if ( typeof memory[ prop ] === "undefined" ) { + + var ucProp = prop.charAt(0).toUpperCase() + prop.substr(1), + props = (prop + ' ' + prefixes.join(ucProp + ' ') + ucProp).split(' '); + + memory[ prop ] = null; + for ( var i in props ) { + if ( style[ props[i] ] !== undefined ) { + memory[ prop ] = props[i]; + break; + } + } + + } + + return memory[ prop ]; + }; + + })(); + + // `arraify` takes an array-like object and turns it into real Array + // to make all the Array.prototype goodness available. + var arrayify = function ( a ) { + return [].slice.call( a ); + }; + + // `css` function applies the styles given in `props` object to the element + // given as `el`. It runs all property names through `pfx` function to make + // sure proper prefixed version of the property is used. + var css = function ( el, props ) { + var key, pkey; + for ( key in props ) { + if ( props.hasOwnProperty(key) ) { + pkey = pfx(key); + if ( pkey !== null ) { + el.style[pkey] = props[key]; + } + } + } + return el; + }; + + // `toNumber` takes a value given as `numeric` parameter and tries to turn + // it into a number. If it is not possible it returns 0 (or other value + // given as `fallback`). + var toNumber = function (numeric, fallback) { + return isNaN(numeric) ? (fallback || 0) : Number(numeric); + }; + + // `byId` returns element with given `id` - you probably have guessed that ;) + var byId = function ( id ) { + return document.getElementById(id); + }; + + // `$` returns first element for given CSS `selector` in the `context` of + // the given element or whole document. + var $ = function ( selector, context ) { + context = context || document; + return context.querySelector(selector); + }; + + // `$$` return an array of elements for given CSS `selector` in the `context` of + // the given element or whole document. + var $$ = function ( selector, context ) { + context = context || document; + return arrayify( context.querySelectorAll(selector) ); + }; + + // `triggerEvent` builds a custom DOM event with given `eventName` and `detail` data + // and triggers it on element given as `el`. + var triggerEvent = function (el, eventName, detail) { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent(eventName, true, true, detail); + el.dispatchEvent(event); + }; + + // `translate` builds a translate transform string for given data. + var translate = function ( t ) { + return " translate3d(" + t.x + "px," + t.y + "px," + t.z + "px) "; + }; + + // `rotate` builds a rotate transform string for given data. + // By default the rotations are in X Y Z order that can be reverted by passing `true` + // as second parameter. + var rotate = function ( r, revert ) { + var rX = " rotateX(" + r.x + "deg) ", + rY = " rotateY(" + r.y + "deg) ", + rZ = " rotateZ(" + r.z + "deg) "; + + return revert ? rZ+rY+rX : rX+rY+rZ; + }; + + // `scale` builds a scale transform string for given data. + var scale = function ( s ) { + return " scale(" + s + ") "; + }; + + // `perspective` builds a perspective transform string for given data. + var perspective = function ( p ) { + return " perspective(" + p + "px) "; + }; + + // `getElementFromHash` returns an element located by id from hash part of + // window location. + var getElementFromHash = function () { + // get id from url # by removing `#` or `#/` from the beginning, + // so both "fallback" `#slide-id` and "enhanced" `#/slide-id` will work + return byId( window.location.hash.replace(/^#\/?/,"") ); + }; + + // `computeWindowScale` counts the scale factor between window size and size + // defined for the presentation in the config. + var computeWindowScale = function ( config ) { + var hScale = window.innerHeight / config.height, + wScale = window.innerWidth / config.width, + scale = hScale > wScale ? wScale : hScale; + + if (config.maxScale && scale > config.maxScale) { + scale = config.maxScale; + } + + if (config.minScale && scale < config.minScale) { + scale = config.minScale; + } + + return scale; + }; + + // CHECK SUPPORT + var body = document.body; + + var ua = navigator.userAgent.toLowerCase(); + var impressSupported = + // browser should support CSS 3D transtorms + ( pfx("perspective") !== null ) && + + // and `classList` and `dataset` APIs + ( body.classList ) && + ( body.dataset ) && + + // but some mobile devices need to be blacklisted, + // because their CSS 3D support or hardware is not + // good enough to run impress.js properly, sorry... + ( ua.search(/(iphone)|(ipod)|(android)/) === -1 ); + + if (!impressSupported) { + // we can't be sure that `classList` is supported + body.className += " impress-not-supported "; + } else { + body.classList.remove("impress-not-supported"); + body.classList.add("impress-supported"); + } + + // GLOBALS AND DEFAULTS + + // This is where the root elements of all impress.js instances will be kept. + // Yes, this means you can have more than one instance on a page, but I'm not + // sure if it makes any sense in practice ;) + var roots = {}; + + // some default config values. + var defaults = { + width: 1024, + height: 768, + maxScale: 1, + minScale: 0, + + perspective: 1000, + + transitionDuration: 1000 + }; + + // it's just an empty function ... and a useless comment. + var empty = function () { return false; }; + + // IMPRESS.JS API + + // And that's where interesting things will start to happen. + // It's the core `impress` function that returns the impress.js API + // for a presentation based on the element with given id ('impress' + // by default). + var impress = window.impress = function ( rootId ) { + + // If impress.js is not supported by the browser return a dummy API + // it may not be a perfect solution but we return early and avoid + // running code that may use features not implemented in the browser. + if (!impressSupported) { + return { + init: empty, + goto: empty, + prev: empty, + next: empty + }; + } + + rootId = rootId || "impress"; + + // if given root is already initialized just return the API + if (roots["impress-root-" + rootId]) { + return roots["impress-root-" + rootId]; + } + + // data of all presentation steps + var stepsData = {}; + + // element of currently active step + var activeStep = null; + + // current state (position, rotation and scale) of the presentation + var currentState = null; + + // array of step elements + var steps = null; + + // configuration options + var config = null; + + // scale factor of the browser window + var windowScale = null; + + // root presentation elements + var root = byId( rootId ); + var canvas = document.createElement("div"); + + var initialized = false; + + // STEP EVENTS + // + // There are currently two step events triggered by impress.js + // `impress:stepenter` is triggered when the step is shown on the + // screen (the transition from the previous one is finished) and + // `impress:stepleave` is triggered when the step is left (the + // transition to next step just starts). + + // reference to last entered step + var lastEntered = null; + + // `onStepEnter` is called whenever the step element is entered + // but the event is triggered only if the step is different than + // last entered step. + var onStepEnter = function (step) { + if (lastEntered !== step) { + triggerEvent(step, "impress:stepenter"); + lastEntered = step; + } + }; + + // `onStepLeave` is called whenever the step element is left + // but the event is triggered only if the step is the same as + // last entered step. + var onStepLeave = function (step) { + if (lastEntered === step) { + triggerEvent(step, "impress:stepleave"); + lastEntered = null; + } + }; + + // `initStep` initializes given step element by reading data from its + // data attributes and setting correct styles. + var initStep = function ( el, idx ) { + var data = el.dataset, + step = { + translate: { + x: toNumber(data.x), + y: toNumber(data.y), + z: toNumber(data.z) + }, + rotate: { + x: toNumber(data.rotateX), + y: toNumber(data.rotateY), + z: toNumber(data.rotateZ || data.rotate) + }, + scale: toNumber(data.scale, 1), + el: el + }; + + if ( !el.id ) { + el.id = "step-" + (idx + 1); + } + + stepsData["impress-" + el.id] = step; + + css(el, { + position: "absolute", + transform: "translate(-50%,-50%)" + + translate(step.translate) + + rotate(step.rotate) + + scale(step.scale), + transformStyle: "preserve-3d" + }); + }; + + // `init` API function that initializes (and runs) the presentation. + var init = function () { + if (initialized) { return; } + + // First we set up the viewport for mobile devices. + // For some reason iPad goes nuts when it is not done properly. + var meta = $("meta[name='viewport']") || document.createElement("meta"); + meta.content = "width=device-width, minimum-scale=1, maximum-scale=1, user-scalable=no"; + if (meta.parentNode !== document.head) { + meta.name = 'viewport'; + document.head.appendChild(meta); + } + + // initialize configuration object + var rootData = root.dataset; + config = { + width: toNumber( rootData.width, defaults.width ), + height: toNumber( rootData.height, defaults.height ), + maxScale: toNumber( rootData.maxScale, defaults.maxScale ), + minScale: toNumber( rootData.minScale, defaults.minScale ), + perspective: toNumber( rootData.perspective, defaults.perspective ), + transitionDuration: toNumber( rootData.transitionDuration, defaults.transitionDuration ) + }; + + windowScale = computeWindowScale( config ); + + // wrap steps with "canvas" element + arrayify( root.childNodes ).forEach(function ( el ) { + canvas.appendChild( el ); + }); + root.appendChild(canvas); + + // set initial styles + document.documentElement.style.height = "100%"; + + css(body, { + height: "100%", + overflow: "hidden" + }); + + var rootStyles = { + position: "absolute", + transformOrigin: "top left", + transition: "all 0s ease-in-out", + transformStyle: "preserve-3d" + }; + + css(root, rootStyles); + css(root, { + top: "50%", + left: "50%", + transform: perspective( config.perspective/windowScale ) + scale( windowScale ) + }); + css(canvas, rootStyles); + + body.classList.remove("impress-disabled"); + body.classList.add("impress-enabled"); + + // get and init steps + steps = $$(".step", root); + steps.forEach( initStep ); + + // set a default initial state of the canvas + currentState = { + translate: { x: 0, y: 0, z: 0 }, + rotate: { x: 0, y: 0, z: 0 }, + scale: 1 + }; + + initialized = true; + + triggerEvent(root, "impress:init", { api: roots[ "impress-root-" + rootId ] }); + }; + + // `getStep` is a helper function that returns a step element defined by parameter. + // If a number is given, step with index given by the number is returned, if a string + // is given step element with such id is returned, if DOM element is given it is returned + // if it is a correct step element. + var getStep = function ( step ) { + if (typeof step === "number") { + step = step < 0 ? steps[ steps.length + step] : steps[ step ]; + } else if (typeof step === "string") { + step = byId(step); + } + return (step && step.id && stepsData["impress-" + step.id]) ? step : null; + }; + + // used to reset timeout for `impress:stepenter` event + var stepEnterTimeout = null; + + // `goto` API function that moves to step given with `el` parameter (by index, id or element), + // with a transition `duration` optionally given as second parameter. + var goto = function ( el, duration ) { + + if ( !initialized || !(el = getStep(el)) ) { + // presentation not initialized or given element is not a step + return false; + } + + // Sometimes it's possible to trigger focus on first link with some keyboard action. + // Browser in such a case tries to scroll the page to make this element visible + // (even that body overflow is set to hidden) and it breaks our careful positioning. + // + // So, as a lousy (and lazy) workaround we will make the page scroll back to the top + // whenever slide is selected + // + // If you are reading this and know any better way to handle it, I'll be glad to hear about it! + window.scrollTo(0, 0); + + var step = stepsData["impress-" + el.id]; + + if ( activeStep ) { + activeStep.classList.remove("active"); + body.classList.remove("impress-on-" + activeStep.id); + } + el.classList.add("active"); + + body.classList.add("impress-on-" + el.id); + + // compute target state of the canvas based on given step + var target = { + rotate: { + x: -step.rotate.x, + y: -step.rotate.y, + z: -step.rotate.z + }, + translate: { + x: -step.translate.x, + y: -step.translate.y, + z: -step.translate.z + }, + scale: 1 / step.scale + }; + + // Check if the transition is zooming in or not. + // + // This information is used to alter the transition style: + // when we are zooming in - we start with move and rotate transition + // and the scaling is delayed, but when we are zooming out we start + // with scaling down and move and rotation are delayed. + var zoomin = target.scale >= currentState.scale; + + duration = toNumber(duration, config.transitionDuration); + var delay = (duration / 2); + + // if the same step is re-selected, force computing window scaling, + // because it is likely to be caused by window resize + if (el === activeStep) { + windowScale = computeWindowScale(config); + } + + var targetScale = target.scale * windowScale; + + // trigger leave of currently active element (if it's not the same step again) + if (activeStep && activeStep !== el) { + onStepLeave(activeStep); + } + + // Now we alter transforms of `root` and `canvas` to trigger transitions. + // + // And here is why there are two elements: `root` and `canvas` - they are + // being animated separately: + // `root` is used for scaling and `canvas` for translate and rotations. + // Transitions on them are triggered with different delays (to make + // visually nice and 'natural' looking transitions), so we need to know + // that both of them are finished. + css(root, { + // to keep the perspective look similar for different scales + // we need to 'scale' the perspective, too + transform: perspective( config.perspective / targetScale ) + scale( targetScale ), + transitionDuration: duration + "ms", + transitionDelay: (zoomin ? delay : 0) + "ms" + }); + + css(canvas, { + transform: rotate(target.rotate, true) + translate(target.translate), + transitionDuration: duration + "ms", + transitionDelay: (zoomin ? 0 : delay) + "ms" + }); + + // Here is a tricky part... + // + // If there is no change in scale or no change in rotation and translation, it means there was actually + // no delay - because there was no transition on `root` or `canvas` elements. + // We want to trigger `impress:stepenter` event in the correct moment, so here we compare the current + // and target values to check if delay should be taken into account. + // + // I know that this `if` statement looks scary, but it's pretty simple when you know what is going on + // - it's simply comparing all the values. + if ( currentState.scale === target.scale || + (currentState.rotate.x === target.rotate.x && currentState.rotate.y === target.rotate.y && + currentState.rotate.z === target.rotate.z && currentState.translate.x === target.translate.x && + currentState.translate.y === target.translate.y && currentState.translate.z === target.translate.z) ) { + delay = 0; + } + + // store current state + currentState = target; + activeStep = el; + + // And here is where we trigger `impress:stepenter` event. + // We simply set up a timeout to fire it taking transition duration (and possible delay) into account. + // + // I really wanted to make it in more elegant way. The `transitionend` event seemed to be the best way + // to do it, but the fact that I'm using transitions on two separate elements and that the `transitionend` + // event is only triggered when there was a transition (change in the values) caused some bugs and + // made the code really complicated, cause I had to handle all the conditions separately. And it still + // needed a `setTimeout` fallback for the situations when there is no transition at all. + // So I decided that I'd rather make the code simpler than use shiny new `transitionend`. + // + // If you want learn something interesting and see how it was done with `transitionend` go back to + // version 0.5.2 of impress.js: http://github.com/bartaz/impress.js/blob/0.5.2/js/impress.js + window.clearTimeout(stepEnterTimeout); + stepEnterTimeout = window.setTimeout(function() { + onStepEnter(activeStep); + }, duration + delay); + + return el; + }; + + // `prev` API function goes to previous step (in document order) + var prev = function () { + var prev = steps.indexOf( activeStep ) - 1; + prev = prev >= 0 ? steps[ prev ] : steps[ steps.length-1 ]; + + return goto(prev); + }; + + // `next` API function goes to next step (in document order) + var next = function () { + var next = steps.indexOf( activeStep ) + 1; + next = next < steps.length ? steps[ next ] : steps[ 0 ]; + + return goto(next); + }; + + // Adding some useful classes to step elements. + // + // All the steps that have not been shown yet are given `future` class. + // When the step is entered the `future` class is removed and the `present` + // class is given. When the step is left `present` class is replaced with + // `past` class. + // + // So every step element is always in one of three possible states: + // `future`, `present` and `past`. + // + // There classes can be used in CSS to style different types of steps. + // For example the `present` class can be used to trigger some custom + // animations when step is shown. + root.addEventListener("impress:init", function(){ + // STEP CLASSES + steps.forEach(function (step) { + step.classList.add("future"); + }); + + root.addEventListener("impress:stepenter", function (event) { + event.target.classList.remove("past"); + event.target.classList.remove("future"); + event.target.classList.add("present"); + }, false); + + root.addEventListener("impress:stepleave", function (event) { + event.target.classList.remove("present"); + event.target.classList.add("past"); + }, false); + + }, false); + + // Adding hash change support. + root.addEventListener("impress:init", function(){ + + // last hash detected + var lastHash = ""; + + // `#/step-id` is used instead of `#step-id` to prevent default browser + // scrolling to element in hash. + // + // And it has to be set after animation finishes, because in Chrome it + // makes transtion laggy. + // BUG: http://code.google.com/p/chromium/issues/detail?id=62820 + root.addEventListener("impress:stepenter", function (event) { + window.location.hash = lastHash = "#/" + event.target.id; + }, false); + + window.addEventListener("hashchange", function () { + // When the step is entered hash in the location is updated + // (just few lines above from here), so the hash change is + // triggered and we would call `goto` again on the same element. + // + // To avoid this we store last entered hash and compare. + if (window.location.hash !== lastHash) { + goto( getElementFromHash() ); + } + }, false); + + // START + // by selecting step defined in url or first step of the presentation + goto(getElementFromHash() || steps[0], 0); + }, false); + + body.classList.add("impress-disabled"); + + // store and return API for given impress.js root element + return (roots[ "impress-root-" + rootId ] = { + init: init, + goto: goto, + next: next, + prev: prev + }); + + }; + + // flag that can be used in JS to check if browser have passed the support test + impress.supported = impressSupported; + +})(document, window); + +// NAVIGATION EVENTS + +// As you can see this part is separate from the impress.js core code. +// It's because these navigation actions only need what impress.js provides with +// its simple API. +// +// In future I think about moving it to make them optional, move to separate files +// and treat more like a 'plugins'. +(function ( document, window ) { + 'use strict'; + + // throttling function calls, by Remy Sharp + // http://remysharp.com/2010/07/21/throttling-function-calls/ + var throttle = function (fn, delay) { + var timer = null; + return function () { + var context = this, args = arguments; + clearTimeout(timer); + timer = setTimeout(function () { + fn.apply(context, args); + }, delay); + }; + }; + + // wait for impress.js to be initialized + document.addEventListener("impress:init", function (event) { + // Getting API from event data. + // So you don't event need to know what is the id of the root element + // or anything. `impress:init` event data gives you everything you + // need to control the presentation that was just initialized. + var api = event.detail.api; + + // KEYBOARD NAVIGATION HANDLERS + + // Prevent default keydown action when one of supported key is pressed. + document.addEventListener("keydown", function ( event ) { + if ( event.keyCode === 9 || ( event.keyCode >= 32 && event.keyCode <= 34 ) || (event.keyCode >= 37 && event.keyCode <= 40) ) { + event.preventDefault(); + } + }, false); + + // Trigger impress action (next or prev) on keyup. + + // Supported keys are: + // [space] - quite common in presentation software to move forward + // [up] [right] / [down] [left] - again common and natural addition, + // [pgdown] / [pgup] - often triggered by remote controllers, + // [tab] - this one is quite controversial, but the reason it ended up on + // this list is quite an interesting story... Remember that strange part + // in the impress.js code where window is scrolled to 0,0 on every presentation + // step, because sometimes browser scrolls viewport because of the focused element? + // Well, the [tab] key by default navigates around focusable elements, so clicking + // it very often caused scrolling to focused element and breaking impress.js + // positioning. I didn't want to just prevent this default action, so I used [tab] + // as another way to moving to next step... And yes, I know that for the sake of + // consistency I should add [shift+tab] as opposite action... + document.addEventListener("keyup", function ( event ) { + if ( event.keyCode === 9 || ( event.keyCode >= 32 && event.keyCode <= 34 ) || (event.keyCode >= 37 && event.keyCode <= 40) ) { + switch( event.keyCode ) { + case 33: // pg up + case 37: // left + case 38: // up + api.prev(); + break; + case 9: // tab + case 32: // space + case 34: // pg down + case 39: // right + case 40: // down + api.next(); + break; + } + + event.preventDefault(); + } + }, false); + + // delegated handler for clicking on the links to presentation steps + document.addEventListener("click", function ( event ) { + // event delegation with "bubbling" + // check if event target (or any of its parents is a link) + var target = event.target; + while ( (target.tagName !== "A") && + (target !== document.documentElement) ) { + target = target.parentNode; + } + + if ( target.tagName === "A" ) { + var href = target.getAttribute("href"); + + // if it's a link to presentation step, target this step + if ( href && href[0] === '#' ) { + target = document.getElementById( href.slice(1) ); + } + } + + if ( api.goto(target) ) { + event.stopImmediatePropagation(); + event.preventDefault(); + } + }, false); + + // delegated handler for clicking on step elements + document.addEventListener("click", function ( event ) { + var target = event.target; + // find closest step element that is not active + while ( !(target.classList.contains("step") && !target.classList.contains("active")) && + (target !== document.documentElement) ) { + target = target.parentNode; + } + + if ( api.goto(target) ) { + event.preventDefault(); + } + }, false); + + // touch handler to detect taps on the left and right side of the screen + // based on awesome work of @hakimel: https://github.com/hakimel/reveal.js + document.addEventListener("touchstart", function ( event ) { + if (event.touches.length === 1) { + var x = event.touches[0].clientX, + width = window.innerWidth * 0.3, + result = null; + + if ( x < width ) { + result = api.prev(); + } else if ( x > window.innerWidth - width ) { + result = api.next(); + } + + if (result) { + event.preventDefault(); + } + } + }, false); + + // rescale presentation when window is resized + window.addEventListener("resize", throttle(function () { + // force going to active step again, to trigger rescaling + api.goto( document.querySelector(".step.active"), 500 ); + }, 250), false); + + }, false); + +})(document, window); + +// THAT'S ALL FOLKS! +// +// Thanks for reading it all. +// Or thanks for scrolling down and reading the last part. +// +// I've learnt a lot when building impress.js and I hope this code and comments +// will help somebody learn at least some part of it. diff --git a/js/vier-seiten-modell.js b/js/vier-seiten-modell.js new file mode 100644 index 0000000..c897959 --- /dev/null +++ b/js/vier-seiten-modell.js @@ -0,0 +1,60 @@ +window.onload = function() { + + document.addEventListener("keypress", function(e) { + if(e.charCode == 46) { + //Create the blanker if it doesn't exists + blankDiv = document.getElementById("blanker") + if( blankDiv == null ) { + blankDiv = document.createElement("div") + blankDiv.style.display = "block" + blankDiv.style.position = "absolute" + blankDiv.style.backgroundColor = "black" + blankDiv.style.top = "0" + blankDiv.style.left = "0" + blankDiv.style.width = "100%" + blankDiv.style.height = "100%" + blankDiv.id = "blanker" + + document.body.appendChild(blankDiv) + console.log("create") + } else { + //If the blanker exists, toggle it + if(blankDiv.style.display == "block") { blankDiv.style.display = "none" } else { blankDiv.style.display = "block" } + } + } + }); + + window.setInterval( function() { + var end = document.getElementById("thanks") + var questions = document.getElementById("questions") + var intro = document.getElementById("intro") + + if(end.classList.contains("active") || questions.classList.contains("active") || document.getElementById("result").classList.contains("active")) { + intro.classList.add("bye"); + } + + if(intro.classList.contains("active")) { + var allOthers = document.getElementsByClassName("step") + var lids = document.getElementsByClassName("lid"); + for (var i = 0; i < allOthers.length; i++) { + e = allOthers[i] + if(e.id != "intro") { + e.style.display = 'none' + } + } + lids[0].style.display = "none" + lids[1].style.display = "none" + } else { + console.log("else") + var allOthers = document.getElementsByClassName("step") + var lids = document.getElementsByClassName("lid") + for (var i = 0; i < allOthers.length; i++) { + e = allOthers[i] + e.style.display = 'block'; + } + lids[0].style.display = "block" + lids[1].style.display = "block" + } + }, 10); + +}