Gooey Text Hover Effect
SubscribeInspired and based on this demo
Repository: codrops/GooeyTextHoverEffect Branch: master Commit: 6db15b76e742 Files: 26 Total size: 658.0 KB Directory structure: gitextract_uc5mtrlm/ ├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── dist/ │ ├── base.98fd6c19.css │ ├── demo1.151408fb.js │ ├── demo2.44794d1a.js │ ├── demo3.b516845c.js │ ├── index.html │ ├── index2.html │ └── index3.html ├── package.json └── src/ ├── css/ │ └── base.css ├── index.html ├── index2.html ├── index3.html └── js/ ├── demo1/ │ ├── index.js │ ├── menu.js │ └── menuItem.js ├── demo2/ │ ├── index.js │ ├── menu.js │ └── menuItem.js ├── demo3/ │ ├── index.js │ ├── menu.js │ └── menuItem.js └── utils.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ # Auto detect text files and perform LF normalization * text=auto ================================================ FILE: .gitignore ================================================ /node_modules /.cache package-lock.json ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2009 - 2020 [Codrops](https://tympanus.net/codrops) 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. ================================================ FILE: README.md ================================================ # Gooey Text Hover Effect A gooey text hover effect using SVG filters based on this demo.  [Article on Codrops](https://tympanus.net/codrops/?p=49166) [Demo](http://tympanus.net/Development/GooeyTextHover/) ## Installation Install dependencies: ``` npm install ``` Compile the code for development and start a local server: ``` npm start ``` Create the build: ``` npm run build ``` ## Misc Follow Codrops: [Twitter](http://www.twitter.com/codrops), [Facebook](http://www.facebook.com/codrops), [GitHub](https://github.com/codrops), [Instagram](https://www.instagram.com/codropsss/) ## License [MIT](LICENSE) Made with :blue_heart: by [Codrops](http://www.codrops.com) ================================================ FILE: dist/base.98fd6c19.css ================================================ *, *::after, *::before { box-sizing: border-box; } :root { font-size: 18px; } body { margin: 0; --color-text: #fff; --color-bg: #c2c6c9; --color-link: #000; --color-link-hover: #000; --color-menu: #000; --fontsize-menu: 16px; --font-menu: titling-gothic-fb, sans-serif; color: var(--color-text); background-color: var(--color-bg); font-family: nimbus-sans-extended, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; overflow-x: hidden; } .demo-2 { --color-text: #fff; --color-bg: #000; --color-link: #ddd; --color-link-hover: #fff; --color-menu: #fff; --font-menu: hothouse, sans-serif; --fontsize-menu: 10px; } .demo-3 { --color-text: #fff; --color-bg: #e2c6cc; --color-link: #000; --color-link-hover: #fff; --color-menu: #000; --font-menu: laca-text, sans-serif; --fontsize-menu: 18px; } /* Page Loader */ .js .loading::before, .js .loading::after { content: ''; position: fixed; z-index: 1000; } .js .loading::before { top: 0; left: 0; width: 100%; height: 100%; background: var(--color-bg); } .js .loading::after { top: 50%; left: 50%; width: 60px; height: 60px; margin: -30px 0 0 -30px; border-radius: 50%; opacity: 0.4; background: var(--color-link); animation: loaderAnim 0.7s linear infinite alternate forwards; } @keyframes loaderAnim { to { opacity: 1; transform: scale3d(0.5, 0.5, 1); } } .hidden { opacity: 0; position: absolute; pointer-events: none; z-index: -1; } a { text-decoration: none; color: var(--color-link); outline: none; border-bottom: 2px solid; transition: border-color 0.1s; } a:hover, a:focus { color: var(--color-link-hover); outline: none; border-color: transparent; } main { padding: 3rem 5vw; position: relative; z-index: 1000; } .title { font-size: 1rem; margin: 0 0 1rem; font-weight: normal; } .links { display: inline; } .demos { margin: 1rem 0; } .demo--current, .demo--current:hover { border-color: transparent; } .text--menu { border: none; color: var(--color-link); margin: 1rem 0; } .credits a { color: currentColor; } .menu { width: 100%; min-height: 400px; display: grid; } .menu__item { border: none; transition: none; cursor: pointer; position: relative; } .menu__text { font-size: var(--fontsize-menu); fill: var(--color-menu); display: block; font-family: var(--font-menu); font-weight: 700; position: absolute; height: 120%; width: 100%; pointer-events: none; } .menu__text text { transform-origin: 50% 50%; transform-box: view-box; } .menu__text text:nth-child(2) { opacity: 0; } @media screen and (min-width: 53em) { main { position: fixed; z-index: 100; top: 0; left: 0; display: grid; justify-items: start; width: 100%; height: 100vh; padding: 2rem 3rem; grid-template-columns: 30% 30% 40%; grid-template-rows: auto 10vh auto 2fr 5rem; grid-template-areas: 'title text-menu text-subscribe' '... ... ...' 'links menu menu' 'demos menu menu' 'credits ... ...'; } .title { grid-area: title; margin: 0; } .demos { margin: 0; grid-area: demos; display: flex; flex-direction: column; } .demo, .links a { margin-bottom: 0.5rem; } .links { grid-area: links; display: flex; flex-direction: column; margin-bottom: 3rem; padding-top: 0.5rem; } .credits { margin: 0; grid-area: credits; align-self: end; } .text--menu { grid-area: text-menu; margin: 0; } .text--subscribe { grid-area: text-subscribe; justify-self: end; } .menu { grid-area: menu; } } ================================================ FILE: dist/demo1.151408fb.js ================================================ // modules are defined as an array // [ module function, map of requires ] // // map of requires is short require name -> numeric require // // anything defined in a previous bundle is accessed via the // orig method which is the require for previous bundles parcelRequire = (function (modules, cache, entry, globalName) { // Save the require from previous bundle to this closure if any var previousRequire = typeof parcelRequire === 'function' && parcelRequire; var nodeRequire = typeof require === 'function' && require; function newRequire(name, jumped) { if (!cache[name]) { if (!modules[name]) { // if we cannot find the module within our internal map or // cache jump to the current global require ie. the last bundle // that was added to the page. var currentRequire = typeof parcelRequire === 'function' && parcelRequire; if (!jumped && currentRequire) { return currentRequire(name, true); } // If there are other bundles on this page the require from the // previous one is saved to 'previousRequire'. Repeat this as // many times as there are bundles until the module is found or // we exhaust the require chain. if (previousRequire) { return previousRequire(name, true); } // Try the node require function if it exists. if (nodeRequire && typeof name === 'string') { return nodeRequire(name); } var err = new Error('Cannot find module \'' + name + '\''); err.code = 'MODULE_NOT_FOUND'; throw err; } localRequire.resolve = resolve; localRequire.cache = {}; var module = cache[name] = new newRequire.Module(name); modules[name][0].call(module.exports, localRequire, module, module.exports, this); } return cache[name].exports; function localRequire(x){ return newRequire(localRequire.resolve(x)); } function resolve(x){ return modules[name][1][x] || x; } } function Module(moduleName) { this.id = moduleName; this.bundle = newRequire; this.exports = {}; } newRequire.isParcelRequire = true; newRequire.Module = Module; newRequire.modules = modules; newRequire.cache = cache; newRequire.parent = previousRequire; newRequire.register = function (id, exports) { modules[id] = [function (require, module) { module.exports = exports; }, {}]; }; var error; for (var i = 0; i < entry.length; i++) { try { newRequire(entry[i]); } catch (e) { // Save first error but execute all entries if (!error) { error = e; } } } if (entry.length) { // Expose entry point to Node, AMD or browser globals // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js var mainExports = newRequire(entry[entry.length - 1]); // CommonJS if (typeof exports === "object" && typeof module !== "undefined") { module.exports = mainExports; // RequireJS } else if (typeof define === "function" && define.amd) { define(function () { return mainExports; }); //
Inspired and based on this demo