<section class="demo"> <dl class="list nigiri"> <dt>Nigiri</dt> <dd><a href="#">Maguro</a></dd> <dd><a href="#">Sake</a></dd> <dd><a href="#">Unagi</a></dd> <dd><a href="#">Buri</a></dd> <dd><a href="#">Suzuki</a></dd> <dd><a href="#">Saba</a></dd> <dd><a href="#">Iwashi</a></dd> <dd><a href="#">Kohada</a></dd> <dd><a href="#">Hirame</a></dd> <dd><a href="#">Tobiwo</a></dd> </dl> <dl class="list maki"> <dt>Maki</dt> <dd><a href="#">Ana-kyu</a></dd> <dd><a href="#">Chutoro</a></dd> <dd><a href="#">Kaiware</a></dd> <dd><a href="#">Kampyo</a></dd> <dd><a href="#">Kappa</a></dd> <dd><a href="#">Natto</a></dd> <dd><a href="#">Negitoro</a></dd> <dd><a href="#">Oshinko</a></dd> <dd><a href="#">Otoro</a></dd> <dd><a href="#">Tekka</a></dd> </dl> <dl class="list sashimi"> <dt>Sashimi</dt> <dd><a href="#">Maguro</a></dd> <dd><a href="#">Toro</a></dd> <dd><a href="#">Ebi</a></dd> <dd><a href="#">Saba</a></dd> <dd><a href="#">Ika</a></dd> <dd><a href="#">Tako</a></dd> <dd><a href="#">Tomago</a></dd> <dd><a href="#">Kani</a></dd> <dd><a href="#">Katsuo</a></dd> <dd><a href="#">Maguro</a></dd> </dl> <a href="#" class="toggle">Toggle</a> </section> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> //Скрипт js надо подключать здесь body { background-color: #0e3e50; } .list { -webkit-transform-style: preserve-3d; -moz-transform-stle: preserve-3d; -ms-transform-style: preserve-3d; -o-transform-style: preserve-3d; transform-style: preserve-3d; text-transform: uppercase; position: absolute; margin-left: -140px; top: 20%; } .list a { display: block; color: #fff; } .list a:hover { text-indent: 20px; } .list dt, .list dd { text-indent: 10px; line-height: 55px; background: #E0FBAC; margin: 0; height: 55px; width: 270px; color: #fff; } .list dt { /* Since we're hiding elements behind here, we need it in 3d */ -webkit-transform: translateZ(0.3px); -moz-transform: translateZ(0.3px); -ms-transform: translateZ(0.3px); -o-transform: translateZ(0.3px); transform: translateZ(0.3px); text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2); font-size: 15px; } .list dd { border-top: 1px dashed rgba(255,255,255,0.3); line-height: 35px; font-size: 11px; height: 35px; margin: 0; } /* UI */ .toggle { -webkit-transform: translateZ(100px); -moz-transform: translateZ(100px); -ms-transform: translateZ(100px); -o-transform: translateZ(100px); transform: translateZ(100px); box-shadow: 0 1px 4px rgba(0,0,0,0.15); border-radius: 3px; text-transform: uppercase; letter-spacing: -1px; line-height: 50px; margin-left: -70px; margin-top: -20px; background: #2b2b2b; text-align: center; font-size: 12px; position: absolute; z-index: 1; height: 50px; bottom: 10%; width: 140px; color: #fff; left: 50%; } .toggle:hover { background: #E42692; } /* No CSS 3D support warning */ .warning { -webkit-transform: translateZ(2px); -moz-transform: translateZ(2px); -ms-transform: translateZ(2px); -o-transform: translateZ(2px); transform: translateZ(2px); background: rgba(255,255,255,0.6); position: fixed; display: none; z-index: 999; height: 100%; width: 100%; left: 0; top: 0; } .warning .message { box-shadow: 0 1px 8px rgba(0, 0, 0, 0.6); border-radius: 5px; text-align: center; margin-left: -150px; margin-top: -60px; line-height: 1.5; background: #222; font-size: 12px; position: absolute; padding: 10px; width: 280px; color: #fff; left: 50%; top: 50%; } /* Individual styles */ .sashimi dt, .sashimi dd, .sashimi a { background: #73C8A9; } .nigiri dt, .nigiri dd, .nigiri a { background: #E32551; } .maki dt, .maki dd, .maki a { background: #FFC219; } .sashimi a:hover { background: #61c19e; } .nigiri a:hover { background: #d31b46; } .maki a:hover { background: #ffbb00; } .nigiri { -webkit-transform: perspective(1200px) rotateY(40deg) !important; -moz-transform: perspective(1200px) rotateY(40deg) !important; -ms-transform: perspective(1200px) rotateY(40deg) !important; -o-transform: perspective(1200px) rotateY(40deg) !important; transform: perspective(1200px) rotateY(40deg) !important; -webkit-transform-origin: 110% 25%; -moz-transform-origin: 110% 25%; -ms-transform-origin: 110% 25%; -o-transform-origin: 110% 25%; transform-origin: 110% 25%; left: 20%; } .maki { -webkit-transform: perspective(600px) translateZ(1px) !important; -moz-transform: perspective(600px) translateZ(1px) !important; -ms-transform: perspective(600px) translateZ(1px) !important; -o-transform: perspective(600px) translateZ(1px) !important; transform: perspective(600px) translateZ(1px) !important; left: 50%; } .sashimi { -webkit-transform: perspective(1200px) rotateY(-40deg) !important; -moz-transform: perspective(1200px) rotateY(-40deg) !important; -ms-transform: perspective(1200px) rotateY(-40deg) !important; -o-transform: perspective(1200px) rotateY(-40deg) !important; transform: perspective(1200px) rotateY(-40deg) !important; -webkit-transform-origin: -10% 25%; -moz-transform-origin: -10% 25%; -ms-transform-origin: -10% 25%; -o-transform-origin: -10% 25%; transform-origin: -10% 25%; left: 80%; } /** * Copyright (C) 2012 by Justin Windle * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ (function ($) { // Global initialisation flag var initialized = false; // For detecting browser prefix and capabilities var el = document.createElement("div"); var re = /^(Moz|(w|W)ebkit|O|ms)(?=[A-Z])/; // Establish vendor prefix and CSS 3D support var vendor = (function () { for (var p in el.style) if (re.test(p)) return p.match(re)[0]; })() || ""; var canRun = vendor + "Perspective" in el.style; var prefix = "-" + vendor.toLowerCase() + "-"; var $this, $root, $base, $kids, $node, $item, $over, $back; var wait, anim, last; // Public API var api = { // Toggle open / closed toggle: function () { $this = $(this); $this.makisu($this.hasClass("open") ? "close" : "open"); }, // Trigger the unfold animation open: function (speed, overlap, easing) { // Cache DOM references $this = $(this); $root = $this.find(".root"); $kids = $this.find(".node").not($root); // Establish values or fallbacks speed = utils.resolve($this, "speed", speed); easing = utils.resolve($this, "easing", easing); overlap = utils.resolve($this, "overlap", overlap); $kids.each(function (index, el) { // Establish settings for this iteration anim = "unfold" + (!index ? "-first" : ""); last = index === $kids.length - 1; time = speed * (1 - overlap); wait = index * time; // Cache DOM references $item = $(el); $over = $item.find(".over"); // Element animation $item.css( utils.prefix({ transform: "rotateX(180deg)", animation: anim + " " + speed + "s " + easing + " " + wait + "s 1 normal forwards" }) ); // Shading animation happens when the next item starts if (!last) wait = (index + 1) * time; // Shading animation $over.css( utils.prefix({ animation: "unfold-over " + speed * 0.45 + "s " + easing + " " + wait + "s 1 normal forwards" }) ); }); // Add momentum to the container $root.css( utils.prefix({ animation: "swing-out " + $kids.length * time * 1.4 + "s ease-in-out 0s 1 normal forwards" }) ); $this.addClass("open"); }, // Trigger the fold animation close: function (speed, overlap, easing) { // Cache DOM references $this = $(this); $root = $this.find(".root"); $kids = $this.find(".node").not($root); // Establish values or fallbacks speed = utils.resolve($this, "speed", speed) * 0.66; easing = utils.resolve($this, "easing", easing); overlap = utils.resolve($this, "overlap", overlap); $kids.each(function (index, el) { // Establish settings for this iteration anim = "fold" + (!index ? "-first" : ""); last = index === 0; time = speed * (1 - overlap); wait = ($kids.length - index - 1) * time; // Cache DOM references $item = $(el); $over = $item.find(".over"); // Element animation $item.css( utils.prefix({ transform: "rotateX(0deg)", animation: anim + " " + speed + "s " + easing + " " + wait + "s 1 normal forwards" }) ); // Adjust delay for shading if (!last) wait = ($kids.length - index - 2) * time + speed * 0.35; // Shading animation $over.css( utils.prefix({ animation: "fold-over " + speed * 0.45 + "s " + easing + " " + wait + "s 1 normal forwards" }) ); }); // Add momentum to the container $root.css( utils.prefix({ animation: "swing-in " + $kids.length * time * 1.0 + "s ease-in-out 0s 1 normal forwards" }) ); $this.removeClass("open"); } }; // Utils var utils = { // Resolves argument values to defaults resolve: function ($el, key, val) { return typeof val === "undefined" ? $el.data(key) : val; }, // Prefixes a hash of styles with the current vendor prefix: function (style) { for (var key in style) { style[prefix + key] = style[key]; } return style; }, // Inserts rules into the document styles inject: function (rule) { try { var style = document.createElement("style"); style.innerHTML = rule; document.getElementsByTagName("head")[0].appendChild(style); } catch (error) {} } }; // Element templates var markup = { node: '<span class="node"/>', back: '<span class="face back"/>', over: '<span class="face over"/>' }; // Plugin definition $.fn.makisu = function (options) { // Notify if 3D isn't available if (!canRun) { var message = "Failed to detect CSS 3D support"; if (console && console.warn) { // Print warning to the console console.warn(message); // Trigger errors on elements this.each(function () { $(this).trigger("error", message); }); } return; } // Fires only once if (!initialized) { initialized = true; // Unfold utils.inject( "@" + prefix + "keyframes unfold {" + "0% {" + prefix + "transform: rotateX(180deg); }" + "50% {" + prefix + "transform: rotateX(-30deg); }" + "100% {" + prefix + "transform: rotateX(0deg); }" + "}" ); // Unfold (first item) utils.inject( "@" + prefix + "keyframes unfold-first {" + "0% {" + prefix + "transform: rotateX(-90deg); }" + "50% {" + prefix + "transform: rotateX(60deg); }" + "100% {" + prefix + "transform: rotateX(0deg); }" + "}" ); // Fold utils.inject( "@" + prefix + "keyframes fold {" + "0% {" + prefix + "transform: rotateX(0deg); }" + "100% {" + prefix + "transform: rotateX(180deg); }" + "}" ); // Fold (first item) utils.inject( "@" + prefix + "keyframes fold-first {" + "0% {" + prefix + "transform: rotateX(0deg); }" + "100% {" + prefix + "transform: rotateX(-180deg); }" + "}" ); // Swing out utils.inject( "@" + prefix + "keyframes swing-out {" + "0% {" + prefix + "transform: rotateX(0deg); }" + "30% {" + prefix + "transform: rotateX(-30deg); }" + "60% {" + prefix + "transform: rotateX(15deg); }" + "100% {" + prefix + "transform: rotateX(0deg); }" + "}" ); // Swing in utils.inject( "@" + prefix + "keyframes swing-in {" + "0% {" + prefix + "transform: rotateX(0deg); }" + "50% {" + prefix + "transform: rotateX(-10deg); }" + "90% {" + prefix + "transform: rotateX(15deg); }" + "100% {" + prefix + "transform: rotateX(0deg); }" + "}" ); // Shading (unfold) utils.inject( "@" + prefix + "keyframes unfold-over {" + "0% { opacity: 1.0; }" + "100% { opacity: 0.0; }" + "}" ); // Shading (fold) utils.inject( "@" + prefix + "keyframes fold-over {" + "0% { opacity: 0.0; }" + "100% { opacity: 1.0; }" + "}" ); // Node styles utils.inject(".node {" + "position: relative;" + "display: block;" + "}"); // Face styles utils.inject( ".face {" + "pointer-events: none;" + "position: absolute;" + "display: block;" + "height: 100%;" + "width: 100%;" + "left: 0;" + "top: 0;" + "}" ); } // Merge options & defaults var opts = $.extend({}, $.fn.makisu.defaults, options); // Extract api method arguments var args = Array.prototype.slice.call(arguments, 1); // Main plugin loop return this.each(function () { // If the user is calling a method... if (api[options]) { return api[options].apply(this, args); } // Store options in view $this = $(this).data(opts); // Only proceed if the scene hierarchy isn't already built if (!$this.data("initialized")) { $this.data("initialized", true); // Select the first level of matching child elements $kids = $this.children(opts.selector); // Build a scene graph for elements $root = $(markup.node).addClass("root"); $base = $root; // Process each element and insert into hierarchy $kids.each(function (index, el) { $item = $(el); // Which animation should this node use? anim = "fold" + (!index ? "-first" : ""); // Since we're adding absolutely positioned children $item.css("position", "relative"); // Give the item some depth to avoid clipping artefacts $item.css( utils.prefix({ "transform-style": "preserve-3d", transform: "translateZ(-0.1px)" }) ); // Create back face $back = $(markup.back); $back.css("background", $item.css("background")); $back.css(utils.prefix({ transform: "translateZ(-0.1px)" })); // Create shading $over = $(markup.over); $over.css(utils.prefix({ transform: "translateZ(0.1px)" })); $over.css({ background: opts.shading, opacity: 0.0 }); // Begin folded $node = $(markup.node).append($item); $node.css( utils.prefix({ "transform-origin": "50% 0%", "transform-style": "preserve-3d", animation: anim + " 1ms linear 0s 1 normal forwards" }) ); // Build display list $item.append($over); $item.append($back); $base.append($node); // Use as parent in next iteration $base = $node; }); // Set root transform settings $root.css( utils.prefix({ "transform-origin": "50% 0%", "transform-style": "preserve-3d" }) ); // Apply perspective $this.css( utils.prefix({ transform: "perspective(" + opts.perspective + "px)" }) ); // Display the scene $this.append($root); } }); }; // Default options $.fn.makisu.defaults = { // Perspective to apply to rotating elements perspective: 1200, // Default shading to apply (null => no shading) shading: "rgba(0,0,0,0.12)", // Area of rotation (fraction or pixel value) selector: null, // Fraction of speed (0-1) overlap: 0.6, // Duration per element speed: 0.8, // Animation curve easing: "ease-in-out" }; $.fn.makisu.enabled = canRun; })(jQuery); // The `enabled` flag will be `false` if CSS 3D isn't available if ($.fn.makisu.enabled) { var $sashimi = $(".sashimi"); var $nigiri = $(".nigiri"); var $maki = $(".maki"); // Create Makisus $nigiri.makisu({ selector: "dd", overlap: 0.85, speed: 1.7 }); $maki.makisu({ selector: "dd", overlap: 0.6, speed: 0.85 }); $sashimi.makisu({ selector: "dd", overlap: 0.2, speed: 0.5 }); // Open all $(".list").makisu("open"); // Toggle on click $(".toggle").on("click", function () { $(".list").makisu("toggle"); }); // Disable all links $(".demo a").click(function (event) { event.preventDefault(); }); } else { $(".warning").show(); } Навигация по записям Navigation menu – Sidebar Dropdown menu