HEADER (Globale Elemente )
src/app/core/components/header/templates
Demo Section
Each variation will be presented in the following section.
Readme
header (coreComponent
)
Description
This blueprint is based on the blueprint of Veams.
JIRA
Requirements
- @veams/core - Veams Core Framework.
- @veams/query or
jquery
- Veams Query or jQuery. - @veams/component - Veams Component.
Installation
Installation with Veams from local machine
veams install bp absolute/filepath/to/header
Fields
header.hbs
Settings
Parameter | Type | Default | Description |
---|---|---|---|
settings.headerClasses | String | '' |
Modifier classes for component |
settings.headerJsOptions | Object | null |
JavaScript options object which gets stringified |
Content
Parameter | Type | Description |
---|---|---|
content.logoLinkHref | String | Link for logo |
content.logoImageSrc | String | Logo image source |
content.logoImageAltText | String | Logo image alternative text |
JavaScript Options
The module gives you the possibility to override default JS options:
Option | Type | Default | Description |
---|---|---|---|
classes.scrolled | String | 'is-scrolled' |
Class which is set to header as soon as page is scrolled considering offset option |
offsetTop | Number | 100 |
Top offset to be considered |
Templates
header.hbs
<header id="header" class="c-header{{#if settings.headerClasses}} {{settings.headerClasses}}{{/if}}"
data-js-module="header"{{#if settings.headerJsOptions}}
data-js-options='{{stringify settings.headerJsOptions}}'{{/if}} data-js-item="header">
{{#wrapWith "grid__container"}}
{{#wrapWith "grid__row"}}
<div class="header__wrapper">
<a class="header__logo-wrapper" href="index.html"><img class="header__logo" src="./img/Logo_LMU.svg" alt="Logo Ludwig Maximilians Universität München"/></a>
<div class="header__facilities-title">
<span>10 Fakultät für Philosophie, Wissenschaftstheorie und Religionswissenschaft</span>
</div>
<div class="header__navigation-wrapper">
{{#with @root.main-navigation.variations.default }}
{{> main-navigation }}
{{/with}}
</div>
</div>
{{/wrapWith}}
{{/wrapWith}}
</header>
Data File
header.hjson
{
"title": "Header",
"variations": {
"default": {
"docs": {
"variationName": "Default"
},
"settings": {
"headerClasses": false,
"headerJsOptions": {}
},
"content": {
"logoLinkHref": "index.html",
"logoImageSrc": "../img/Logo_LMU.svg",
"logoImageAltText": "Logo Ludwig Maximilians Universität München",
"facilitiesTitle": "10 Fakultät für Philosophie, Wissenschaftstheorie und Religionswissenschaft"
}
}
}
}
Styles
header.scss
/* ===================================================
coreComponent: header
=================================================== */
.c-header {
@include clearfix();
position: relative;
background-color: $color-white;
width: 100%;
z-index: 998;
height: 72px;
@include bp($bp-tablet-p) {
position: fixed;
top: 0;
left: 0;
height: 72px;
}
@include print() {
height: auto;
position: relative;
}
/*
MODIFIERS
----------------------- */
&.is-scrolled {
.header__logo {
/*
MODIFIERS
----------------------- */
.is-frontpage &, .is-frontpage-w-txt & {
transform: translate3d(0, 0, 0);
width: 125px;
}
}
.header__logo-wrapper {
/*
MODIFIERS
----------------------- */
.is-frontpage &, .is-frontpage-w-txt & {
width: 125px;
}
}
}
.header__wrapper {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 7px 0;
height: 72px;
.is-frontpage &, .is-frontpage-w-txt & {
height: 72px;
}
}
.header__logo-wrapper {
position: relative;
flex: 0 1 auto;
width: 125px;
align-self: flex-start;
/*
MODIFIERS
----------------------- */
&.a11y-focus-key {
outline: none !important; // FORCE HIDING OF OUTLINE
.header__logo {
@include a11y-focus-key();
}
}
/*
MODIFIERS
----------------------- */
.is-frontpage & { // ANIMATE LOGO ONLY ON FRONTPAGE
width: 180px;
@include bp($bp-tablet-p) {
width: 250px;
transition: width 150ms ease-in-out;
@include print() {
width: 125px;
}
}
@include print() {
width: 125px;
}
}
.is-frontpage-w-txt & {
width: 125px;
@include bp($bp-mobile-p) {
width: 160px;
}
@include bp($bp-tablet-p) {
width: 250px;
transition: width 150ms ease-in-out;
}
@include print() {
width: 125px;
}
}
}
.header__logo {
position: relative;
transform: translate3d(0, 0, 0);
width: 125px;
transition: transform 150ms ease-in-out, width 150ms ease-in-out;
/*
MODIFIERS
----------------------- */
.is-frontpage & { // ANIMATE LOGO ONLY ON FRONTPAGE
width: 180px;
@include bp($bp-tablet-p) {
position: absolute;
top: 0;
left: 0;
display: block;
width: 250px;
}
@include print() {
width: 125px;
}
}
.is-frontpage-w-txt & {
width: 125px;
@include bp($bp-mobile-p) {
width: 160px;
}
@include bp($bp-tablet-p) {
width: 250px;
position: absolute;
top: 0;
left: 0;
display: block;
}
@include print() {
width: 125px;
}
}
}
.header__navigation-wrapper {
flex: 0 1 auto;
}
.header__facilities-title {
display: flex;
width: calc(100% - 190px);
height: 100%;
max-width: 260px;
color: #232323;
font-size: 1.1rem;
line-height: 1.2;
font-family: "Roboto-bold", sans-serif;
font-weight: 700;
text-transform: uppercase;
margin-left: 7px;
margin-right: auto;
& > span {
align-self: flex-end;
}
@include bp($bp-tablet-p) {
font-size: 1.2rem;
line-height: 1.3;
width: calc(100% - 125px);
}
}
}
Scripts
header.js
/**
* Description of Header.
*
* @module Header
* @version v1.0.0
*
* @author Christian Rohowski
*/
// Imports
import $ from 'jquery';
import Component from '@veams/component'; // Only use that in combination with browserify
class Header extends Component {
$el = $(this.el);
/**
* Constructor for our class
*
* @see module.js
*
* @param {Object} obj - Object which is passed to our class
* @param {Object} obj.el - element which will be saved in this.el
* @param {Object} obj.options - options which will be passed in as JSON object
*/
constructor(obj) {
let options = {
classes: {
scrolled: 'is-scrolled'
},
offsetTop: 100
};
super(obj, options);
}
/**
* Get module information
*/
static get info() {
return {
version: '1.0.0'
};
}
/**
* Subscribe handling
*/
get subscribe() {
return {
'{{context.EVENTS.pagescroll}}': 'onPageScroll'
};
}
/**
* Scroll handler
*
* @param {Object} e - Event object
*/
onPageScroll(e) {
let browserWidth = this.context.detections.width;
if (parseInt(window.pageYOffset) > this.options.offsetTop && browserWidth >= 768) {
this.$el.addClass(this.options.classes.scrolled);
} else {
this.$el.removeClass(this.options.classes.scrolled);
}
}
/**
* Render class
*/
render() {
return this;
}
}
export default Header;
HTML Output
Default
<header id="header" class="c-header" data-js-module="header" data-js-options='{}' data-js-item="header">
<div class="grid__container">
<div class="grid__row">
<div class="header__wrapper">
<a class="header__logo-wrapper" href="index.html"><img class="header__logo" src="./img/Logo_LMU.svg" alt="Logo Ludwig Maximilians Universität München" /></a>
<div class="header__facilities-title">
<span>10 Fakultät für Philosophie, Wissenschaftstheorie und Religionswissenschaft</span>
</div>
<div class="header__navigation-wrapper">
<nav class="c-main-navigation" data-js-module="main-navigation">
<h2 class="main-navigation__headline">Hauptnavigation</h2>
<ul class="main-navigation__list">
<li class="main-navigation__list-item">
<a class="main-navigation__list-link" href="#" title="Link öffnet im neuen Fenster">
<span class="main-navigation__list-link-text">Studium</span>
</a></li>
<li class="main-navigation__list-item">
<a class="main-navigation__list-link" href="#" title="Link öffnet im neuen Fenster">
<span class="main-navigation__list-link-text">Forschung</span>
</a></li>
<li class="main-navigation__list-item">
<a class="main-navigation__list-link" href="#" title="Link öffnet im neuen Fenster">
<span class="main-navigation__list-link-text">Die LMU</span>
</a></li>
<li class="main-navigation__list-item is-bordered is-language">
<a class="main-navigation__list-link" href="#" title="Zur Englischen Sprachversion">
<span class="main-navigation__list-link-text" lang="en">EN</span>
<span class="main-navigation__list-link-text-a11y" lang="en">Zur englischen Sprachversion / Switch to English</span>
</a></li>
<li class="main-navigation__list-item is-bordered is-search">
<button type="button" class="main-navigation__list-link is-search" data-js-item="toggle-search">
<span class="main-navigation__list-link-text">Suche öffnen/schließen</span>
</button></li>
<li class="main-navigation__list-item is-bordered is-last">
<button type="button" class="main-navigation__list-link is-burger" data-js-item="toggle-stack-navigation">
<span class="main-navigation__list-link-text">Erweiterte Navigation öffnen/schließen</span>
</button></li>
<li id="hamburgermenu" class="main-navigation__list-item is-bordered is-last">
<hamburger-menu-app></hamburger-menu-app>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
</header>