Choppy opacity keyframe animation in iOS Chrome - html

I am attempting to animate an opacity fade in effect when a button is pressed. It looks great in just about every browser including Safari on iOS. The intended behavior looks like the following:
However, when viewed in Chrome on iOS it struggles and seems to be delayed and choppy. Here is a video of what is happening:
I've tried the usual tricks, such as applying the backface-visibility and perspective properties but neither seems to do the trick. I've also explored other options such as animating on height, but in my application the height of the content isn't known until the tab is pressed, making that a tricky alternative.
Thanks for reading. I appreciate any suggestions!
const tab1Button = document.querySelector('.tab-1-button');
const tab2Button = document.querySelector('.tab-2-button');
const tab1 = document.querySelector('.tab-1');
const tab2 = document.querySelector('.tab-2');
tab1Button.addEventListener('click', () => {
tab1.classList.remove('hidden');
tab1.classList.add('fadein');
tab2.classList.remove('fadein');
tab2.classList.add('hidden')
})
tab2Button.addEventListener('click', () => {
tab2.classList.remove('hidden')
tab2.classList.add('fadein');
tab1.classList.remove('fadein');
tab1.classList.add('hidden')
})
#keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.fadein {
display: block;
animation: fadeIn 1s 0s;
will-change: opacity;
}
.hidden {
display: none;
}
<ul>
<li>
<button class="tab-1-button">Tab 1</button>
</li>
<li>
<button class="tab-2-button">Tab 2</button>
</li>
</ul>
<div class="tab-1 fadein">
Donec a ornare erat, ut feugiat odio. Morbi ultricies pulvinar gravida. Suspendisse posuere mi odio, a dignissim urna condimentum at. Duis mauris neque, fringilla ut suscipit vitae, aliquet vitae orci. Curabitur turpis lectus, facilisis non ipsum eget, ullamcorper consequat sem. Praesent dui tellus, vulputate eu varius ut, vehicula sed augue. Donec nec leo vel magna vulputate sagittis. Sed non varius justo, a tristique nulla. Morbi nunc nisl, interdum luctus ante a, gravida auctor quam. Fusce erat justo, euismod quis metus a, dictum pulvinar odio. Pellentesque convallis purus quis dui fermentum feugiat. Vestibulum quis rutrum enim. In tempor dui quam, vitae posuere sem imperdiet quis. Duis a libero massa. Donec massa purus, faucibus eleifend tellus vel, pharetra viverra diam. Pellentesque cursus laoreet odio rutrum ullamcorper.
</div>
<div class="tab-2 hidden">
Nunc ullamcorper ornare tempus. Phasellus gravida diam mauris, non malesuada eros fringilla sit amet. Cras a ornare quam. Mauris ut condimentum ipsum. Proin tristique nisl in purus pretium, et dictum tortor semper. Sed aliquam condimentum mauris, vitae iaculis est iaculis ut. Donec auctor magna at eros egestas tristique. In elit tellus, luctus eget nulla at, consequat porta nisl. Suspendisse potenti. Nam at fringilla risus. In semper tristique semper. Nunc dignissim felis nisi, ac semper turpis dignissim in.
</div>

Related

Why does display:inline affect children using position:sticky?

It was my understanding, that if an element with position:sticky is nested within a parent element: when the parent leaves the viewport, that "sticky" element will leave with it.
Here I have a "sticky" <ul> within a <nav> within <main>. When scrolling through the main element, when the <nav> would normally scroll off-screen, it instead behaves as if it's become position:sticky. However, if I change the display of the <nav> to be either block or inline-block, it behaves as I thought that it would. What's happening here?
body {
border: 2px dotted gray;
padding: 2rem;
}
nav {
display: inline;
}
ul {
top: 0;
position: sticky;
width: 100%;
list-style: none;
padding: 1rem 0;
display: flex;
gap: 1rem;
font-weight: bold;
border: 2px dotted gray;
background: white;
}
<body>
<main>
<nav>
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
</nav>
<h1>Main Heading</h1>
<div>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean quis enim ipsum. Quisque vel lacinia urna. Aenean et cursus nisi. Mauris eleifend fermentum elit, id finibus sem varius id. Duis imperdiet massa at velit ultrices gravida id sit amet ipsum. Praesent convallis quis metus nec dignissim. Etiam et odio id odio tincidunt bibendum quis vel urna. Cras ultricies diam eget nisl posuere, vel mollis sapien venenatis. Nulla eu diam hendrerit, gravida dolor vitae, cursus nulla.</p>
<p>Maecenas vulputate viverra diam elementum volutpat. Sed vulputate ac velit et tincidunt. Mauris eget nisl ut mauris eleifend accumsan. Phasellus accumsan ultricies leo, vitae gravida tellus rutrum sed. Proin condimentum pulvinar rhoncus. Duis quis massa ligula. Cras ac est aliquet, facilisis leo nec, scelerisque arcu. Nunc ultricies sollicitudin semper. Nulla varius laoreet posuere. Suspendisse hendrerit nulla id mi rhoncus iaculis. Donec interdum ultricies risus, eget malesuada justo pellentesque placerat. Cras convallis eget dolor in tempus. Ut imperdiet tellus eu nibh bibendum rutrum.</p>
<p>Integer eros purus, porta non rhoncus a, accumsan et lectus. Ut a ullamcorper purus. Proin mattis fermentum lorem varius mollis. Nullam imperdiet, neque auctor sodales molestie, nulla enim suscipit leo, id cursus nibh quam vel neque. Curabitur mauris nunc, varius id pharetra sed, elementum nec tellus. Morbi luctus auctor egestas. Cras accumsan arcu ullamcorper porttitor imperdiet. Sed semper magna nec nibh venenatis, sed laoreet neque malesuada. Aenean sit amet erat molestie, efficitur lacus vitae, laoreet lectus. Proin elit enim, ultrices nec nibh eget, vehicula maximus odio. Nunc egestas dapibus porta. Mauris aliquet bibendum ultrices.</p>
<p>Praesent efficitur sit amet magna bibendum bibendum. In convallis nisl aliquam vulputate gravida. Praesent ornare pretium dapibus. Aliquam malesuada in metus eget eleifend. Morbi at cursus augue, sed sagittis dolor. Pellentesque facilisis urna metus, et maximus risus tristique et. Cras blandit condimentum pulvinar. Fusce mattis egestas tortor, ut aliquam libero ultrices eu. Praesent mauris enim, egestas id tristique in, mollis in tellus. Integer tristique augue quis lorem facilisis, non convallis lorem consequat. Morbi sagittis at mi ac finibus. Vivamus eget diam nec quam lobortis viverra. Morbi viverra ut odio non vehicula.</p>
<p>Proin faucibus tortor quis nisl placerat, eget commodo ante iaculis. Proin quis aliquam ante, a iaculis nisi. Vivamus porta mi et neque ullamcorper mattis. Suspendisse cursus, urna et placerat posuere, risus arcu tempor nunc, eget hendrerit nulla ex maximus ante. Morbi elit mauris, vestibulum vel elementum et, mattis non quam. Quisque aliquet congue quam, id dictum nunc scelerisque in. Mauris ipsum risus, vestibulum venenatis lorem vitae, porta semper ante. Aliquam eu velit vitae neque iaculis vestibulum id a magna. Integer malesuada at lacus ac vulputate.</p>
</div>
</main>
</body>
It's all about "containing block". sticky position doesn't consider the parent element but consider its containing block which is the parent element in most of the cases but in your case it's not because:
For other elements, if the element's position is 'relative' or 'static', the containing block is formed by the content edge of the nearest ancestor box that is a block container or which establishes a formatting context. ref
sticky is not mentioned there but it behave the same as relative and static (https://www.w3.org/TR/css-position-3/#def-cb)
If you check the definition of sticky you can read:
Identical to relative, except that its offsets are automatically adjusted in reference to the nearest ancestor scroll container’s scrollport (as modified by the inset properties) in whichever axes the inset properties are not both auto, to try to keep the box in view within its containing block as the user scrolls. This positioning scheme is called sticky positioning. ref
So the containing block in your case is no more nav but main

Make a position fixed not scrollable

I was wondering if there is a way to make a div with position fixed immobile, so if the user scrolls the div will be immobile to the initial position. I need it because I have a toast spawning inside another div, and I need this toast in foreground otherwise it will spawn inside the div (with scrollbar and partially visible).
That's an example image to explain better:
With position absolute:
With position fixed (the desired effect):
That's my component code (it's a child component):
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true" style="position:absolute; z-index:999; left:80%; width:300px;opacity:1;cursor:unset !important" *ngIf="!isCollapsed && onlyOnePopup == dataItem.Id">
<div class="toast-header" style="background-color: #00549F;">
<strong class="mr-auto" style="color:#fff;"></strong>
<button (click)="onlyOnePopup = null && isCollapsed = true" type="button" class="ml-2 mb-1 close" data-dismiss="toast" aria-label="Close">
<span aria-hidden="true" class="close" style="color:white;">×</span>
</button>
</div>
<div class="toast-body" style="font-family:Font; white-space:pre-line; color:black; cursor:unset">
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
</div>
</div>
Use position: fixed, and then set the exact position that you want. Here's a snippet showing you an example of how to do it.
body {
height: 2000px;
background-color: aqua;
}
.fixed-div {
width: 200px;
heigth: 200px;
background-color: white;
padding: 50px;
position: fixed;
top: 0px;
right: 0px;
margin-right: 20px;
margin-top: 20px;
}
<html>
<head></head>
<body>
<div class="fixed-div">
Fixed Div
</div>
</body>
</html>
Instead of left: 80% try bottom: 0; right: 0 along with position: fixed; and then set right-margin accordingly.
the main thing is to set the height of html as 100vh (veriable height) and width to 100vw(veriable width). this will set your page to 100% of the space available in the browser window regardless of size. then set the toast div to fixed with the right and bottom set where you like (0 for bottom and right puts it in the lower right corner completly)
you cannot set a fixed point with no reference to what it should be fixed to. so by setting the html page size explicitly, the fixed position can be set based off that.
html {
height: 100vh;
width: 100vw;
}
.toast {
position: fixed;
right: 1rem;
bottom: 1rem;
background-color: rgb(0, 255, 255, 0.8);
padding: 1rem;
height: 2.5rem;
width: 15rem;
}
.display-content {
max-height: 100vh;
overflow-y scroll;
}
<div class="display-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur efficitur felis neque, et viverra tellus fermentum eget. Quisque nunc tellus, pulvinar id felis sed, sodales iaculis magna. Morbi sodales pellentesque sapien, nec dignissim augue. Integer odio enim, posuere et convallis et, ultricies in odio. Curabitur felis libero, iaculis et elit in, feugiat tempor augue. Duis finibus mattis leo eu facilisis. In faucibus tincidunt dui. Nullam pulvinar est vel mauris rhoncus euismod. Praesent vel pharetra neque, vitae sollicitudin enim. Nunc placerat sagittis malesuada. Suspendisse potenti. In tempus risus eget dapibus semper. Vestibulum vitae elit congue, tempor quam at, ultricies mauris.
</p>
<p>
Suspendisse ut ullamcorper libero. Quisque consectetur gravida nisi, non faucibus turpis iaculis nec. Phasellus vulputate, tellus sed dapibus dapibus, turpis mauris facilisis eros, eu sagittis quam ante eget felis. In nec nisl at lorem tincidunt vulputate vel eu est. Phasellus ipsum velit, placerat quis pulvinar non, auctor at ex. Nam pharetra dolor a semper feugiat. In sed commodo mauris. Aenean in turpis sed orci molestie efficitur quis id orci. Duis laoreet leo a nulla interdum hendrerit. Suspendisse molestie tristique semper. Vestibulum convallis purus et orci mollis sodales. Praesent ut lectus laoreet, suscipit velit nec, pharetra neque.
</p>
<p>
Morbi placerat metus a eros viverra, luctus ultricies eros fringilla. Nunc mollis lorem at lacus lobortis, vitae blandit ex condimentum. Maecenas et ultricies tortor, sit amet ornare risus. Nunc id nisl et ligula commodo vehicula in et risus. Pellentesque molestie et risus quis lacinia. Quisque quis risus laoreet, venenatis enim nec, hendrerit nisl. Nulla facilisi. Pellentesque pretium turpis vestibulum urna auctor sodales. Vivamus mattis sem eu tellus scelerisque tempus. Sed venenatis felis in mollis suscipit. Sed quis felis ac erat facilisis pellentesque eget nec purus. Phasellus libero odio, semper sed auctor at, ultrices non nibh. Proin consectetur metus sed ultrices aliquam. Pellentesque placerat, nibh vitae semper sodales, mauris elit vestibulum mauris, sit amet condimentum odio est tincidunt neque. Quisque metus lacus, ullamcorper non accumsan nec, placerat et lectus.
</p>
<p>
Vestibulum nec sem ex. Pellentesque volutpat quam eget justo rhoncus congue. Etiam in lorem pellentesque, pulvinar turpis non, dignissim nibh. Etiam eget urna congue, sodales nulla eget, fringilla lorem. Aliquam suscipit dapibus augue eget mollis. Phasellus feugiat sagittis massa, in posuere odio ultrices eu. Aliquam erat volutpat. Morbi eleifend augue vel sagittis pellentesque. Cras auctor interdum purus non fermentum. Aliquam erat volutpat. Integer elit mi, molestie vitae pulvinar vel, elementum et dui. Pellentesque leo risus, elementum eu accumsan nec, pharetra non massa. Phasellus pulvinar mollis aliquam.
</p>
<p>
Sed elementum facilisis erat, in molestie tortor varius ut. Vestibulum dapibus dolor quis mi malesuada, id venenatis ante vulputate. Aliquam fermentum viverra ante, sit amet rhoncus turpis laoreet vel. Vestibulum a vestibulum dolor. Mauris ut efficitur nunc. Donec sit amet consectetur orci. Ut at erat non sem mattis dictum. Aliquam vestibulum nulla nunc, nec varius est vestibulum sit amet.
</p>
<p>
Aenean imperdiet eros non eleifend molestie. Nullam venenatis nibh non pellentesque imperdiet. Quisque volutpat eros non odio convallis ultricies. Etiam convallis facilisis libero, a commodo tellus condimentum quis. Curabitur congue erat ut tincidunt eleifend. Donec tincidunt ullamcorper consequat. Etiam iaculis elementum fermentum.
</p>
<p>
Fusce vehicula libero nisl. Aliquam tempor sem at lacinia facilisis. Donec vestibulum sit amet augue non rhoncus. Nulla sagittis leo elit, a interdum metus dapibus in. Nulla in mattis nunc. Sed sit amet est in tellus vehicula molestie vel tempor nisl. Donec dignissim est lectus, ac pharetra neque bibendum nec.
</p>
<p>
Sed porta dui eget turpis scelerisque rutrum. Aliquam eu diam nec nunc ultrices hendrerit. Quisque convallis metus vitae tellus fermentum finibus. Cras id ullamcorper nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed gravida lorem non blandit porta. Aliquam ac dui laoreet, interdum dui vel, pellentesque arcu. Aenean gravida nunc sit amet arcu rhoncus mollis. Nullam sit amet risus at urna dictum pharetra. Nunc maximus condimentum dui, sed hendrerit metus pretium et. Curabitur eu sollicitudin lorem, et luctus magna. Donec tincidunt id purus sed placerat. Proin vel tristique velit. Donec ornare nisi at laoreet luctus. Integer id metus molestie, fermentum massa non, porta diam.
</p>
<p>
Quisque at volutpat augue. Maecenas porttitor ornare scelerisque. Ut pretium sapien a placerat dapibus. Fusce vel urna eu sem blandit euismod. In imperdiet eros sit amet quam tempor aliquam. Morbi volutpat tincidunt massa, non convallis dui pharetra nec. Ut velit odio, pellentesque mollis sodales et, eleifend ac libero. Curabitur orci ante, varius ac congue id, rutrum id leo. Pellentesque massa massa, lacinia pretium sapien ut, dignissim congue ipsum. Aliquam commodo leo in nisl pharetra, sed viverra est auctor.
</p>
</div>
<div class="toast">This is a toast</div>

Wrap text to fill vertical space in CSS

On the web, how can I flow text to fill the vertical space in a fixed height container before filling the horizontal space? (ideally, without Javascript)
css:
h1 {
text-align: center;
font-family: 'Bowlby One SC', cursive;
}
JS:
jQuery("h1").fitText(0.38);
You would need to do it with inline css and it wouldn't be simple or perfect.
Basically, you would need to estimate the number of characters that could fit the entire container. Then, every time you show, count the characters you have and do something like current_chars/max_chars
e.g.
max_chars = 1000
Current_chars = 500
500/1000 = 0.5
padding-left: 25%
padding-right: 25%
Something like that
It's doubtful you can pull this off in CSS.
For reference, here's a working JS solution. It may have some extra fluff, but it's functional.
Basically checking paragraph height against the parent, adjusting it by 1px incrementally until it fits within the fixed-height. If no more horizontal room is available, like in a mobile view, it scrolls automatically via overflow: auto;.
Codepen
var container = document.getElementById('container');
var paragraph = document.getElementById('paragraph');
var containerHeight = container.offsetHeight - 40; /* 40 is for 2 x parent padding */
var paragraphHeight = paragraph.offsetHeight;
/* This is needed to extract and seperate number from "px"; FYI there are other ways to do this, but this works for demo purposes. */
var paragraphStyle = window.getComputedStyle ? getComputedStyle(paragraph, null) : paragraph.currentStyle;
var paragraphInitialMaxWidth = parseInt(paragraphStyle.maxWidth, 10);
console.log("-------------");
console.log("Container initial height: " + containerHeight);
console.log("Paragraph initial height: " + paragraphHeight);
console.log("Paragraph initial max-width: " + paragraphInitialMaxWidth);
checkHeight();
function checkHeight() {
paragraphHeight = paragraph.offsetHeight;
if (paragraphHeight > containerHeight) {
while (paragraphHeight > containerHeight) {
paragraph.style.maxWidth = parseInt(paragraphStyle.maxWidth, 10) + 1 + "px";
paragraphHeight = document.getElementById('paragraph').offsetHeight;
}
} else {
paragraph.style.maxWidth = paragraphInitialMaxWidth + "px";
paragraphHeight = paragraph.offsetHeight;
}
console.log("New paragraph computed height: " + paragraph.offsetHeight);
console.log("New paragraph max-width: " + parseInt(paragraphStyle.maxWidth, 10));
}
document.getElementById('button1').onclick = function() {
paragraph.innerHTML = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tincidunt euismod augue, ut aliquam velit dapibus at. Nullam ultrices accumsan nulla, non pharetra metus. Phasellus finibus blandit sem, ac ultrices arcu posuere in. Phasellus nibh leo, vulputate quis est a, auctor tincidunt arcu. Mauris rutrum turpis sed magna lacinia, quis placerat magna vulputate. Integer augue eros, feugiat et ipsum sit amet, ullamcorper lacinia nisi. Cras id urna ac massa laoreet ornare quis at lacus. Pellentesque in erat eros. Aliquam dignissim mollis mi, a placerat nibh sollicitudin vel. Vivamus accumsan ultricies eleifend. Suspendisse semper feugiat ex. Curabitur sagittis tempor lorem. Cras a volutpat erat. Quisque mattis ultrices orci vel condimentum. Donec imperdiet mauris vitae nisl sodales, non fermentum dolor eleifend.";
checkHeight();
}
document.getElementById('button2').onclick = function() {
paragraph.innerHTML = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tincidunt euismod augue, ut aliquam velit dapibus at. Nullam ultrices accumsan nulla, non pharetra metus. Phasellus finibus blandit sem, ac ultrices arcu posuere in. Phasellus nibh leo, vulputate quis est a, auctor tincidunt arcu. Mauris rutrum turpis sed magna lacinia, quis placerat magna vulputate. Integer augue eros, feugiat et ipsum sit amet, ullamcorper lacinia nisi. Cras id urna ac massa laoreet ornare quis at lacus. Pellentesque in erat eros. Aliquam dignissim mollis mi, a placerat nibh sollicitudin vel. Vivamus accumsan ultricies eleifend. Suspendisse semper feugiat ex. Curabitur sagittis tempor lorem. Cras a volutpat erat. Quisque mattis ultrices orci vel condimentum. Donec imperdiet mauris vitae nisl sodales, non fermentum dolor eleifend. Suspendisse rhoncus turpis lacus, ac vestibulum ante facilisis id. Vivamus vestibulum tellus quis odio elementum aliquam. Quisque id magna nibh. Phasellus ac dignissim mauris. Curabitur rhoncus ultricies libero non efficitur. Nulla posuere, lectus tristique tincidunt dapibus, diam velit maximus ligula, nec gravida nisl sem sed nisl. Nam in vulputate libero. Quisque aliquet, quam non sagittis luctus, libero elit iaculis risus, et sollicitudin ligula augue id erat. Mauris consectetur risus vitae arcu condimentum pulvinar. Curabitur sit amet orci vel massa eleifend tempus non id elit. Integer a ante a arcu fringilla congue. Maecenas ante sapien, imperdiet ac dictum ut, sodales ut erat. Phasellus et scelerisque tortor. Nunc pulvinar nisl id massa imperdiet, ut ullamcorper ipsum consectetur. Maecenas porttitor tristique volutpat. Integer a justo vitae felis pellentesque pretium. Etiam congue, turpis in vulputate tristique, orci enim tincidunt sapien, ac dictum lacus ex ut ex. Duis nec gravida magna, feugiat volutpat eros. In hac habitasse platea dictumst. Morbi sit amet orci a nisi viverra molestie. Quisque sodales velit a ex tincidunt vehicula. Etiam sodales efficitur velit, sed auctor tellus auctor eu. Curabitur aliquam dui ac tellus feugiat, nec mollis leo auctor. Maecenas malesuada rhoncus arcu sed condimentum. Cras sem arcu, tempus eu arcu ac, condimentum efficitur augue. Cras posuere magna quis nisl blandit tincidunt. Maecenas elementum turpis et risus viverra semper. Nullam libero elit, fermentum ullamcorper placerat quis, malesuada vel velit. Fusce tempus lacinia velit nec consequat. Donec gravida, dui eget elementum posuere, massa mi posuere nisi, vel tempus sem turpis vitae metus. Morbi egestas elit quis velit aliquam, et imperdiet felis condimentum. Sed eget euismod massa. Phasellus id dictum elit. Pellentesque imperdiet, mauris semper vehicula porta, nisi nulla sagittis turpis, vitae posuere nisl magna vel urna.";
checkHeight();
}
#container {
background-color: pink;
border: 3px solid red;
height: 400px;
padding: 20px;
overflow: auto;
}
#paragraph {
max-width: 300px;
margin: 0 auto;
text-align: center;
}
<button id="button1">Short text</button>
<button id="button2">Long text</button>
<div id="container">
<p id="paragraph">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tincidunt euismod augue, ut aliquam velit dapibus at. Nullam ultrices accumsan nulla, non pharetra metus. Phasellus finibus blandit sem, ac ultrices arcu posuere in. Phasellus nibh leo, vulputate quis est a, auctor tincidunt arcu. Mauris rutrum turpis sed magna lacinia, quis placerat magna vulputate. Integer augue eros, feugiat et ipsum sit amet, ullamcorper lacinia nisi. Cras id urna ac massa laoreet ornare quis at lacus. Pellentesque in erat eros. Aliquam dignissim mollis mi, a placerat nibh sollicitudin vel. Vivamus accumsan ultricies eleifend. Suspendisse semper feugiat ex. Curabitur sagittis tempor lorem. Cras a volutpat erat. Quisque mattis ultrices orci vel condimentum. Donec imperdiet mauris vitae nisl sodales, non fermentum dolor eleifend.</p>
</div>

How to expend a div to alway be 100% of the page?

I want to expand my menu height to always take 100% of the visible height.
For the moment it only take the 100% at the loading, then if I scroll down there is a white block and it's ugly.
I can't post images because I haven't 10points
The CSS of my menu is the following one:
.nav-sm .container.body .col-md-3.left_col {
min-height: 100%;
width: 70px;
padding: 0;
z-index: 9999;
position: absolute;
}
The thing I want to achieve is to have my menu who always took all the visible height and I can't find how to do that.
Another possibility is to use vh (viewheight) instead of working with percentages:
.nav-sm .container.body .col-md-3.left_col {
min-height: 100vh;
width: 70px;
padding: 0;
z-index: 9999;
position: absolute;
border: 1px solid black;
}
(For reference, check this W3Schools page
Hope this helps
Try this:
div#navi{
width:100px;
height:auto;
top:0px;
bottom:0px;
position:fixed;
background:maroon;
}
body {
height:2000px;
margin: 0px;
padding: 0px;
}
<div id="navi">
test
</div>
.demo{
width:100%;
height:100%;
background:#e0e0e0;
}
body {
height:2000px;
margin:0px;
padding:0px;
}
<body>
<div class="demo">
<span>Hello World</span>
</div>
</body>
Here's how you can do this.
Set the position of the menu to be fixed and then use height: 100%; to make it full height and not move when the page is scrolled.
Here's the working demo: https://jsfiddle.net/jv8a4hhh/
And the code snippent:
body {
margin: 0;
padding: 0;
height: 1000px;
}
navigation {
background: #cccccc;
color: #2e2e2e;
padding: 10px 10px;
position: fixed;
height: 100%;
left: 0;
top: 0;
}
<navigation>
THIS IS MENU
</navigation>
<content>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce quis accumsan massa, id scelerisque elit. Morbi vel arcu accumsan, facilisis magna quis, accumsan ex. Cras congue enim aliquam, accumsan nulla tincidunt, dapibus justo. Phasellus nec pellentesque
est. Morbi rutrum lectus libero, quis imperdiet turpis ultricies ut. Etiam pharetra dictum dui sit amet iaculis. Curabitur rhoncus gravida augue, dapibus semper nisl rutrum sed. Etiam facilisis lacus eget ullamcorper molestie. Duis vestibulum tortor
lorem, sed auctor tellus efficitur id.
</p>
<p>
Maecenas dapibus erat ac erat vehicula, nec iaculis dui faucibus. Mauris non gravida nunc. Duis eget leo sit amet sapien dictum tempus eu eget enim. Ut eu est vel nibh dictum malesuada in a metus. Sed finibus mollis ipsum, scelerisque maximus mauris blandit
non. Aenean vel urna nisl. Ut facilisis nibh dolor, non malesuada felis facilisis eu. Maecenas ut neque quis purus rutrum pharetra sed id mauris. Ut eu ex eu turpis tincidunt placerat accumsan sed elit. Duis egestas, lectus et euismod tempor, nunc
nibh convallis lectus, fringilla tincidunt odio augue a mauris. Aliquam ultrices arcu et orci laoreet, in congue magna gravida. Mauris posuere quis justo eu egestas.
</p>
<p>
Praesent vehicula venenatis felis vel semper. Aenean pharetra dictum augue, laoreet scelerisque leo euismod vel. Aliquam scelerisque eleifend eleifend. Pellentesque a felis quis diam fringilla cursus at ac nibh. Etiam tellus lectus, vehicula non risus
in, pellentesque tincidunt quam. Integer elit magna, euismod sit amet lorem quis, facilisis consectetur metus. Aliquam dictum ante quis laoreet congue. Morbi hendrerit posuere faucibus. Aliquam augue est, faucibus quis consequat in, pretium tincidunt
libero. Fusce vulputate aliquam turpis eu sollicitudin. Nam accumsan eget nulla ut molestie. Morbi turpis felis, egestas eget velit et, fringilla sodales est.
</p>
<p>
Duis vel velit quis metus efficitur luctus. Proin porttitor sapien eget diam fringilla mollis. Curabitur interdum efficitur enim, laoreet bibendum dui aliquet vitae. Etiam arcu ipsum, condimentum nec scelerisque vitae, ornare at justo. Duis eget tincidunt
sapien. Quisque non arcu volutpat, lacinia sem id, volutpat tellus. Vivamus dui lorem, aliquam non iaculis posuere, euismod et velit. Vestibulum nunc mauris, pharetra porta nisi eu, convallis molestie massa. Donec tincidunt tempus egestas. Sed lectus
sem, vestibulum at felis et, finibus egestas sem.
</p>
<p>
Nulla auctor, quam sed efficitur tempor, felis justo egestas justo, ac bibendum sem ante eu nisi. Aliquam erat volutpat. Suspendisse turpis ante, dapibus in purus et, aliquet rutrum arcu. Suspendisse sem massa, ultrices sed felis vel, mollis porta nisl.
Curabitur lectus urna, porta eu placerat id, tempor eget erat. Duis mattis eget nisi et bibendum. Aliquam nibh libero, elementum et leo nec, egestas vestibulum lacus. Suspendisse vel augue diam. Phasellus fermentum, quam sed euismod finibus, erat
ante fermentum mi, at ullamcorper nisi sapien quis orci. Morbi id sem tincidunt, semper eros non, facilisis velit. Nam tincidunt neque ullamcorper, tristique justo quis, dapibus nunc. In in pharetra enim.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce quis accumsan massa, id scelerisque elit. Morbi vel arcu accumsan, facilisis magna quis, accumsan ex. Cras congue enim aliquam, accumsan nulla tincidunt, dapibus justo. Phasellus nec pellentesque
est. Morbi rutrum lectus libero, quis imperdiet turpis ultricies ut. Etiam pharetra dictum dui sit amet iaculis. Curabitur rhoncus gravida augue, dapibus semper nisl rutrum sed. Etiam facilisis lacus eget ullamcorper molestie. Duis vestibulum tortor
lorem, sed auctor tellus efficitur id.
</p>
<p>
Maecenas dapibus erat ac erat vehicula, nec iaculis dui faucibus. Mauris non gravida nunc. Duis eget leo sit amet sapien dictum tempus eu eget enim. Ut eu est vel nibh dictum malesuada in a metus. Sed finibus mollis ipsum, scelerisque maximus mauris blandit
non. Aenean vel urna nisl. Ut facilisis nibh dolor, non malesuada felis facilisis eu. Maecenas ut neque quis purus rutrum pharetra sed id mauris. Ut eu ex eu turpis tincidunt placerat accumsan sed elit. Duis egestas, lectus et euismod tempor, nunc
nibh convallis lectus, fringilla tincidunt odio augue a mauris. Aliquam ultrices arcu et orci laoreet, in congue magna gravida. Mauris posuere quis justo eu egestas.
</p>
<p>
Praesent vehicula venenatis felis vel semper. Aenean pharetra dictum augue, laoreet scelerisque leo euismod vel. Aliquam scelerisque eleifend eleifend. Pellentesque a felis quis diam fringilla cursus at ac nibh. Etiam tellus lectus, vehicula non risus
in, pellentesque tincidunt quam. Integer elit magna, euismod sit amet lorem quis, facilisis consectetur metus. Aliquam dictum ante quis laoreet congue. Morbi hendrerit posuere faucibus. Aliquam augue est, faucibus quis consequat in, pretium tincidunt
libero. Fusce vulputate aliquam turpis eu sollicitudin. Nam accumsan eget nulla ut molestie. Morbi turpis felis, egestas eget velit et, fringilla sodales est.
</p>
<p>
Duis vel velit quis metus efficitur luctus. Proin porttitor sapien eget diam fringilla mollis. Curabitur interdum efficitur enim, laoreet bibendum dui aliquet vitae. Etiam arcu ipsum, condimentum nec scelerisque vitae, ornare at justo. Duis eget tincidunt
sapien. Quisque non arcu volutpat, lacinia sem id, volutpat tellus. Vivamus dui lorem, aliquam non iaculis posuere, euismod et velit. Vestibulum nunc mauris, pharetra porta nisi eu, convallis molestie massa. Donec tincidunt tempus egestas. Sed lectus
sem, vestibulum at felis et, finibus egestas sem.
</p>
<p>
Nulla auctor, quam sed efficitur tempor, felis justo egestas justo, ac bibendum sem ante eu nisi. Aliquam erat volutpat. Suspendisse turpis ante, dapibus in purus et, aliquet rutrum arcu. Suspendisse sem massa, ultrices sed felis vel, mollis porta nisl.
Curabitur lectus urna, porta eu placerat id, tempor eget erat. Duis mattis eget nisi et bibendum. Aliquam nibh libero, elementum et leo nec, egestas vestibulum lacus. Suspendisse vel augue diam. Phasellus fermentum, quam sed euismod finibus, erat
ante fermentum mi, at ullamcorper nisi sapien quis orci. Morbi id sem tincidunt, semper eros non, facilisis velit. Nam tincidunt neque ullamcorper, tristique justo quis, dapibus nunc. In in pharetra enim.
</p>
</content>
Hope this helps :)

Prevent overlapping Div

I'm at a loss on trying to get my content body to end at the bottom of the screen before my footer. What am I missing?
<body class="v4master">
<form id="aspnetForm">
<div id="SharingBoundaryHeader">Banner</div>
<div id="s4-ribbonrow">Ribbon</div>
<div id="s4-titlerow">Title Row</div>
<div id="s4-workspace">WorkSpace
</p></br>Aenean ex diam, tincidunt eu risus sit amet, condimentum cursus nunc. Nulla viverra ligula quis leo porttitor mattis. Proin at nibh sed nibh consectetur iaculis. Donec accumsan finibus ipsum. Cras aliquet velit condimentum urna fringilla molestie. Vivamus vitae ultrices tellus. Curabitur ac mi sit amet nisl posuere sollicitudin. Vestibulum sodales purus ac accumsan vulputate. Donec semper orci ac lorem volutpat euismod. Donec faucibus massa finibus erat commodo pharetra. Integer facilisis pretium pharetra. Curabitur auctor viverra sodales.
</div>
<div id="ctl00_IdLMFooter_footer">Footer</div>
</form>
</body>
jsFiddle
Edit:
I want it to look like this: but with the inner scroll-bar active when the content overflows instead of the outer one.
Try this in your CSS see if you get what you are looking for.
#s4-workspace {
position: absolute;
bottom:20px;
}
#ctl00_IdLMFooter_footer {
position:absolute;
bottom:0;
}
The footer needs position: relative
http://jsfiddle.net/23n76huL/4/
I initally stated that you needed position: absolute on the form, but this is not necessary.
#ctl00_IdLMFooter_footer {
position:relative;
bottom:0;
}
Might be overkill but here is a dynamic version using javascript: http://jsfiddle.net/23n76huL/7/
var height1 = document.getElementById('SharingBoundaryHeader').offsetHeight,
height2 = document.getElementById('s4-ribbonrow').offsetHeight,
height3 = document.getElementById('s4-titlerow').offsetHeight,
//height4 = document.getElementById('s4-workspace').offsetHeight,
height5 = document.getElementById('ctl00_IdLMFooter_footer').offsetHeight,
bodyheight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
a = 0;
a = bodyheight - (height1 + height2 + height3 + height5 + 2);
document.getElementById('s4-workspace').style.height = a + "px";
Try this http://jsfiddle.net/23n76huL/9/
CSS
div {
border: 1px solid black;
}
#ctl00_IdLMFooter_footer {
background: white;
bottom: 0;
position: fixed;
width: 100%;
}
#s4-workspace {
position:relative;
overflow-y:scroll;
}
body {
height:auto;
min-height:100%;
height:100%;
}
.content {
height: 100vh;
border: none;
}
HTML
<body class="v4master">
<form id="aspnetForm">
<div id="SharingBoundaryHeader">Banner</div>
<div id="s4-ribbonrow">Ribbon</div>
<div id="s4-titlerow">Title Row</div>
<div id="s4-workspace">
<div class="content">
WorkSpace
</p></br>Aenean ex diam, tincidunt eu risus sit amet, condimentum cursus nunc. Nulla viverra ligula quis leo porttitor mattis. Proin at nibh sed nibh consectetur iaculis. Donec accumsan finibus ipsum. Cras aliquet velit condimentum urna fringilla molestie. Vivamus vitae ultrices tellus. Curabitur ac mi sit amet nisl posuere sollicitudin. Vestibulum sodales purus ac accumsan vulputate. Donec semper orci ac lorem volutpat euismod. Donec faucibus massa finibus erat commodo pharetra. Integer facilisis pretium pharetra. Curabitur auctor viverra sodales.
Integer cursus ornare lobortis. Ut felis tellus, tincidunt vitae finibus lobortis, mollis aliquet tortor. In molestie lacus justo, eget viverra ante viverra id. Fusce vehicula nibh quis molestie lacinia. Aenean ultricies lorem eros, vehicula commodo lectus feugiat tempus. Suspendisse potenti. Aenean sit amet felis tincidunt, efficitur sem sed, bibendum erat. Fusce a tellus in nisl tempor hendrerit at non ligula. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec lorem ligula, pharetra ut mi vel, pharetra auctor felis. Fusce erat orci, sodales at dapibus vitae, viverra non lorem. Curabitur tincidunt mi imperdiet est mattis ultricies.
Integer magna lorem, aliquam a lobortis et, pulvinar et eros. Nullam consectetur semper dui, condimentum venenatis mi ultricies non. Suspendisse non maximus felis. Praesent cursus est a sollicitudin commodo. Sed enim risus, varius id sagittis sed, tempor et orci. Nulla vestibulum nulla id arcu tincidunt sagittis. Nunc eu est quis massa iaculis laoreet et ut odio. Praesent feugiat felis a neque pulvinar ultrices. Donec eget leo dui. Nulla in eros sit amet quam iaculis euismod eget ut augue. Ut vitae hendrerit velit. Quisque massa sem, vulputate id nunc ut, lacinia cursus turpis. Proin lobortis, enim sed varius sollicitudin, urna dolor mollis mauris, et sodales tortor metus non sapien. Quisque eget mauris vitae mi dapibus tincidunt. Praesent eget posuere odio, ac dictum diam.
Sed rutrum libero vel dui volutpat egestas. Nullam ultricies dignissim nunc non tristique. Aliquam erat volutpat. Curabitur vel enim eget tortor dictum rutrum. Aliquam a lacus id diam luctus faucibus eu eget neque. Nullam ut lacus lacinia, pellentesque ipsum sit amet, consectetur sem. Proin tristique eleifend nisi vitae sollicitudin. Aliquam accumsan orci eget libero sollicitudin, vitae tempus diam blandit. Vestibulum quam dui, viverra vel commodo id, dapibus at erat.
Etiam interdum varius pellentesque. Suspendisse potenti. Nulla venenatis posuere elementum. Suspendisse potenti. Pellentesque varius accumsan enim. Donec molestie urna at arcu posuere egestas. Praesent mattis nisi ut erat euismod, a venenatis velit viverra. Vestibulum ultricies tempus eleifend. Nulla vitae dui suscipit, hendrerit tortor quis, viverra urna. Pellentesque et varius turpis. Morbi in risus vel elit euismod pharetra. Cras ut mi in ligula venenatis vulputate non in nibh. Sed quis sapien eget sapien blandit viverra. Donec sed magna eget lacus sodales consectetur.
</div>
</div>
<div id="ctl00_IdLMFooter_footer">Footer</div>
</form>
</body>