Flexbox like chat box css - css

I need to make a box. I Want an implementation of a flexbox to make a chat box.
But somewhat it doesn't gives me what I need.
.box{
width:350px;
margin:10px auto;
height:250px;
border:1px solid #000;
display:flex;
flex-flow:column;
}
.header{
border:1px solid blue;
width:100%;
flex: 0 1 auto;
}
.body{
width:100%;
flex: 1 1 auto;
border:1px solid red;
display:flex;
flex-flow:column;
}
.scrollable{
flex: 1 1 auto;
height:100px;
overflow:auto;
}
.writebox{
flex: 1 1 auto;
position:relative;
}
.writebox textarea{
height:100%;
width:100%;
}
<div class="box">
<div class="header">SOME CONTENT . Its fixed always</div>
<div class="body">
<div class="scrollable">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam luctus sapien lacus, vestibulum eleifend metus placerat at. Proin nec velit id orci lobortis feugiat. Phasellus cursus felis et imperdiet congue. In tincidunt vel urna eget venenatis. Ut libero velit, auctor non ipsum quis, interdum bibendum metus. Donec ut tempor nulla, sagittis volutpat magna. Donec ut ex fermentum, cursus lectus fringilla, vehicula quam. Morbi leo massa, rutrum non tortor eu, tristique mollis erat. Donec suscipit libero sit amet eleifend interdum. Quisque ut malesuada quam. Morbi interdum libero sed enim sodales rutrum.
Integer non metus vel tellus elementum auctor eu at lacus. Cras dapibus metus id purus porta, vitae fermentum mi imperdiet. Integer eget augue neque. Aenean varius lorem lectus, vitae lacinia nisl scelerisque et. Proin sed nibh aliquet, luctus elit sed, suscipit ligula. Morbi porttitor ligula eu risus varius, id hendrerit massa pharetra. Nullam nisl elit, sagittis nec libero non, tristique fermentum mauris. Phasellus posuere sem eu eros aliquam laoreet. Integer dui tellus, laoreet mollis nibh a, pretium finibus magna. Praesent quis convallis eros. Quisque pulvinar in sapien non dignissim. Praesent eu est nisl. Mauris sit amet nibh non nulla convallis sodales. Vestibulum porttitor dui vel nisl ultricies, non sollicitudin tortor imperdiet. Pellentesque vel nunc a est hendrerit accumsan non quis neque. Nam sagittis interdum elementum.</div>
<div class="writebox"><textarea></textarea></div>
</div>
</div>
Here is what it looks like: http://i.imgur.com/xCT7mCA.png
In my original code the textarea has variable height upto a limit x (I'm using autogrow plugin I didn't include that in the snippet)

Use flex: 1 only on .scrollable and make your .writable a flex container, Like:
.scrollable {
flex: 1;
}
.writeable {
display: flex;
}
Have a look at the snippet below (I've integrated the auto grow plugin for textarea as well):
autosize($('textarea'));
.box{
width:350px;
margin:10px auto;
height:250px;
border:1px solid #000;
display:flex;
flex-flow:column;
}
.header{
border:1px solid blue;
width:100%;
flex: 0 1 auto;
}
.body{
width:100%;
flex: 1 1 auto;
border:1px solid red;
display:flex;
flex-flow:column;
}
.scrollable{
flex: 1;
height:100px;
overflow:auto;
}
.writebox{
position:relative;
display: flex;
}
.writebox textarea{
height:100%;
width:100%;
}
<div class="box">
<div class="header">SOME CONTENT . Its fixed always</div>
<div class="body">
<div class="scrollable">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam luctus sapien lacus, vestibulum eleifend metus placerat at. Proin nec velit id orci lobortis feugiat. Phasellus cursus felis et imperdiet congue. In tincidunt vel urna eget venenatis. Ut libero velit, auctor non ipsum quis, interdum bibendum metus. Donec ut tempor nulla, sagittis volutpat magna. Donec ut ex fermentum, cursus lectus fringilla, vehicula quam. Morbi leo massa, rutrum non tortor eu, tristique mollis erat. Donec suscipit libero sit amet eleifend interdum. Quisque ut malesuada quam. Morbi interdum libero sed enim sodales rutrum.
Integer non metus vel tellus elementum auctor eu at lacus. Cras dapibus metus id purus porta, vitae fermentum mi imperdiet. Integer eget augue neque. Aenean varius lorem lectus, vitae lacinia nisl scelerisque et. Proin sed nibh aliquet, luctus elit sed, suscipit ligula. Morbi porttitor ligula eu risus varius, id hendrerit massa pharetra. Nullam nisl elit, sagittis nec libero non, tristique fermentum mauris. Phasellus posuere sem eu eros aliquam laoreet. Integer dui tellus, laoreet mollis nibh a, pretium finibus magna. Praesent quis convallis eros. Quisque pulvinar in sapien non dignissim. Praesent eu est nisl. Mauris sit amet nibh non nulla convallis sodales. Vestibulum porttitor dui vel nisl ultricies, non sollicitudin tortor imperdiet. Pellentesque vel nunc a est hendrerit accumsan non quis neque. Nam sagittis interdum elementum.</div>
<div class="writebox"><textarea></textarea></div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://www.jacklmoore.com/js/autosize.min.js"></script>
Hope this helps!

Related

CSS: how to display an image object-fit:cover in a responsive 50% width context?

I'm working on a profile-kind-of template – half the page (class="actor-info") should show scrollable text and info about a person and the other half should be filled by the person's portrait picture. The picture should always fill half of the screen – so cropping would be fine.
What I have so far:
all ancestor element set to height 100%
left column and right column are both flex boxes
the image container has the property object-fit: cover;
the image container has the property position:fixed;
the image hight and width are set to auto
Basically it looks 'as if' it worked right – but when changing the browser window with the image doesn't adopt to the width – so at some point the portrait doesn't fill the height.
What I have so far:
<div class="layout">
<div class= "actor-info">
Lorem Ipsum
</div>
<div class="actor-portrait">
<div class="img-container">
<img src="…">
</div>
</div>
</div>
CSS:
html, body, .layout {
width: 100%;
height:100%;
}
.actor-portrait,
.actor-info {
width: 50%;
height:100%;
}
.actor-portrait .img-container {
height:100%;
}
.layout {
align-items: stretch;
display: flex;
width: 100%;
height:100%;
}
.actor-portrait .img-container {
object-fit: cover;
position:fixed;
}
.actor-portrait .img-container img {
width:auto;
height:auto;
}
I hope somebody has done this / been there before? All pointers appreciated! Thank you!
EDIT: I added a 'wireframe' of what i have – and what i would like to have. The image should 'cover' the red rectangle at all times and would get cropped ba the rectangle (.img-container).
As you use predefined width's and height's, you can simplify the code a lot and use background and background-size: cover to accomplish that.
Stack snippet
html, body {
margin: 0;
}
.layout {
display: flex;
height: 100vh;
}
.actor-portrait, .actor-info {
flex: 0 1 50%;
}
.actor-info {
overflow: auto;
}
.actor-portrait {
background: url(http://lorempixel.com/400/400/nature/1/) center no-repeat;
background-size: cover;
}
<div class="layout">
<div class="actor-info">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce leo lorem, mollis accumsan posuere a, sagittis eget magna. In sem est, rutrum ultrices bibendum id, convallis eu purus. Curabitur tincidunt metus mollis aliquet pharetra. Aliquam sed massa
nec neque pulvinar lacinia. Integer tempor dolor justo, quis commodo magna aliquet a. Cras mi ipsum, tempus facilisis auctor non, mattis id justo. Nullam facilisis magna justo, nec consequat dolor luctus nec. Fusce eu dignissim lacus, eu tempor tortor.
Nulla facilisi. Etiam sit amet tristique sapien, eget euismod velit. Vivamus egestas quis nulla malesuada ullamcorper. Quisque euismod dolor vel sem iaculis, in commodo leo convallis.
<br><br> In in massa facilisis, gravida mi a, dignissim leo. In neque tellus, vulputate eget lorem ut, tincidunt commodo neque. Donec viverra imperdiet ligula et sagittis. Aenean sed cursus odio. Praesent tristique magna vitae lectus luctus sodales.
Integer eget leo vitae lacus venenatis lacinia. Integer bibendum lectus tristique turpis tincidunt dignissim. Maecenas faucibus viverra porta. Praesent non dui a metus fermentum molestie. Vestibulum blandit massa id massa facilisis bibendum. Nunc
iaculis, ipsum sed dignissim sollicitudin, elit purus porttitor odio, hendrerit ornare purus arcu id mauris. Sed et gravida felis, ac imperdiet justo. Proin tincidunt vestibulum cursus. Pellentesque in urna leo.
<br><br> Donec nec ultricies eros, sed varius neque. Aliquam sed nisi nulla. Suspendisse hendrerit, orci placerat bibendum vehicula, nisl sem pellentesque nibh, commodo tincidunt lacus orci non erat. Aliquam in quam tincidunt, condimentum diam id,
aliquam lectus. Nullam ut commodo dolor, a gravida magna. Nunc viverra massa eu lobortis tristique. Aenean tristique orci erat, tempus accumsan arcu vulputate a. Nunc consequat congue ante. Cras magna lorem, ultrices eu elit eget, luctus faucibus
neque. Sed dictum fermentum lectus. In bibendum dictum ligula in pharetra. Nullam venenatis vitae sapien a fermentum.
</div>
<div class="actor-portrait">
</div>
</div>
And if you need to set the image source in the markup, you can do that too.
html, body {
margin: 0;
}
.layout {
display: flex;
height: 100vh;
}
.actor-portrait, .actor-info {
flex: 0 1 50%;
}
.actor-info {
overflow: auto;
}
.actor-portrait {
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
<div class="layout">
<div class="actor-info">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce leo lorem, mollis accumsan posuere a, sagittis eget magna. In sem est, rutrum ultrices bibendum id, convallis eu purus. Curabitur tincidunt metus mollis aliquet pharetra. Aliquam sed massa
nec neque pulvinar lacinia. Integer tempor dolor justo, quis commodo magna aliquet a. Cras mi ipsum, tempus facilisis auctor non, mattis id justo. Nullam facilisis magna justo, nec consequat dolor luctus nec. Fusce eu dignissim lacus, eu tempor tortor.
Nulla facilisi. Etiam sit amet tristique sapien, eget euismod velit. Vivamus egestas quis nulla malesuada ullamcorper. Quisque euismod dolor vel sem iaculis, in commodo leo convallis.
<br><br> In in massa facilisis, gravida mi a, dignissim leo. In neque tellus, vulputate eget lorem ut, tincidunt commodo neque. Donec viverra imperdiet ligula et sagittis. Aenean sed cursus odio. Praesent tristique magna vitae lectus luctus sodales.
Integer eget leo vitae lacus venenatis lacinia. Integer bibendum lectus tristique turpis tincidunt dignissim. Maecenas faucibus viverra porta. Praesent non dui a metus fermentum molestie. Vestibulum blandit massa id massa facilisis bibendum. Nunc
iaculis, ipsum sed dignissim sollicitudin, elit purus porttitor odio, hendrerit ornare purus arcu id mauris. Sed et gravida felis, ac imperdiet justo. Proin tincidunt vestibulum cursus. Pellentesque in urna leo.
<br><br> Donec nec ultricies eros, sed varius neque. Aliquam sed nisi nulla. Suspendisse hendrerit, orci placerat bibendum vehicula, nisl sem pellentesque nibh, commodo tincidunt lacus orci non erat. Aliquam in quam tincidunt, condimentum diam id,
aliquam lectus. Nullam ut commodo dolor, a gravida magna. Nunc viverra massa eu lobortis tristique. Aenean tristique orci erat, tempus accumsan arcu vulputate a. Nunc consequat congue ante. Cras magna lorem, ultrices eu elit eget, luctus faucibus
neque. Sed dictum fermentum lectus. In bibendum dictum ligula in pharetra. Nullam venenatis vitae sapien a fermentum.
</div>
<div class="actor-portrait"
style="background-image: url(http://lorempixel.com/400/400/nature/1/)">
</div>
</div>
If you still want to use object-fit: cover you can, though it has less browser support than background-size: cover
html, body {
margin: 0;
}
.layout {
display: flex;
height: 100vh;
}
.actor-portrait, .actor-info {
flex: 0 1 50%;
}
.actor-info {
overflow: auto;
}
.actor-portrait {
display: flex;
}
.actor-portrait img {
object-fit: cover;
width: 100%;
min-width: 0; /* allow a flex item to be smaller than its content */
}
<div class="layout">
<div class="actor-info">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce leo lorem, mollis accumsan posuere a, sagittis eget magna. In sem est, rutrum ultrices bibendum id, convallis eu purus. Curabitur tincidunt metus mollis aliquet pharetra. Aliquam sed massa
nec neque pulvinar lacinia. Integer tempor dolor justo, quis commodo magna aliquet a. Cras mi ipsum, tempus facilisis auctor non, mattis id justo. Nullam facilisis magna justo, nec consequat dolor luctus nec. Fusce eu dignissim lacus, eu tempor tortor.
Nulla facilisi. Etiam sit amet tristique sapien, eget euismod velit. Vivamus egestas quis nulla malesuada ullamcorper. Quisque euismod dolor vel sem iaculis, in commodo leo convallis.
<br><br> In in massa facilisis, gravida mi a, dignissim leo. In neque tellus, vulputate eget lorem ut, tincidunt commodo neque. Donec viverra imperdiet ligula et sagittis. Aenean sed cursus odio. Praesent tristique magna vitae lectus luctus sodales.
Integer eget leo vitae lacus venenatis lacinia. Integer bibendum lectus tristique turpis tincidunt dignissim. Maecenas faucibus viverra porta. Praesent non dui a metus fermentum molestie. Vestibulum blandit massa id massa facilisis bibendum. Nunc
iaculis, ipsum sed dignissim sollicitudin, elit purus porttitor odio, hendrerit ornare purus arcu id mauris. Sed et gravida felis, ac imperdiet justo. Proin tincidunt vestibulum cursus. Pellentesque in urna leo.
<br><br> Donec nec ultricies eros, sed varius neque. Aliquam sed nisi nulla. Suspendisse hendrerit, orci placerat bibendum vehicula, nisl sem pellentesque nibh, commodo tincidunt lacus orci non erat. Aliquam in quam tincidunt, condimentum diam id,
aliquam lectus. Nullam ut commodo dolor, a gravida magna. Nunc viverra massa eu lobortis tristique. Aenean tristique orci erat, tempus accumsan arcu vulputate a. Nunc consequat congue ante. Cras magna lorem, ultrices eu elit eget, luctus faucibus
neque. Sed dictum fermentum lectus. In bibendum dictum ligula in pharetra. Nullam venenatis vitae sapien a fermentum.
</div>
<div class="actor-portrait">
<img src="http://lorempixel.com/400/400/nature/1/" alt="">
</div>
</div>
I actually did something similar on a site, but I had a fixed side nav to deal with too: polarlab.anchoragemuseum.org.
I don't remember exactly where I found this code initially, but the trick is the css on the image. I've adjusted the markup and css a bit to accommodate a fixed image.
Here's a fiddle for reference as well.
.banner {
position: fixed;
width: 50%;
top: 0;
right: 0;
bottom: 0;
overflow: hidden;
}
.banner__image {
max-width: none;
min-height: 100%;
min-width: 100%;
position: absolute;
top: -9999px;
right: -9999px;
bottom: -9999px;
left: -9999px;
margin: auto;
}
.text {
width: 48%;
float: left;
font-size: 24px;
line-height: 34px;
}
<div class="wrapper">
<section class="text">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam suscipit sollicitudin turpis, eget pulvinar nulla efficitur non. Sed fermentum est interdum odio lobortis tempor. Mauris euismod molestie sapien sit amet pharetra. Suspendisse condimentum, velit in egestas tristique, augue nunc rutrum odio, sed imperdiet arcu velit ac lectus. Nam tortor magna, venenatis vel diam sit amet, elementum tempor massa. Aenean pretium lectus at enim commodo, ac dignissim dui tempor. Maecenas tincidunt tellus bibendum, porta erat non, pellentesque mauris. Vestibulum lacus nisi, cursus at bibendum ut, pulvinar eu elit. Nulla sodales nunc in quam ornare, non ultrices risus sollicitudin. Nullam gravida non turpis nec tempor. Fusce rhoncus consequat dolor, at euismod metus mattis eget. Maecenas ligula tellus, viverra at mi eu, commodo lacinia enim. Proin auctor sem eu risus malesuada, eu ullamcorper mauris elementum. Morbi commodo mi congue sagittis euismod.</p>
<p>Aliquam cursus interdum diam sed aliquet. Aliquam sollicitudin rutrum diam. Integer viverra, dolor non pulvinar aliquam, enim diam faucibus purus, at suscipit nulla sapien eu augue. Curabitur maximus, nulla vitae faucibus sodales, justo erat suscipit odio, a porttitor turpis ex ut nibh. Curabitur finibus fermentum lectus, vitae pharetra quam convallis in. Nam sollicitudin finibus libero, ut mattis nunc vestibulum nec. Proin gravida dapibus velit.</p>
<p>Ut id augue est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris lobortis ac purus fringilla tempus. Morbi nec diam in orci luctus malesuada. Duis consequat tortor tellus, hendrerit interdum metus maximus quis. Nulla non aliquet tortor. Nunc at quam non nibh volutpat pulvinar ut id nisi.</p>
<p>Curabitur ullamcorper dolor eget odio sodales, sit amet consequat est iaculis. Praesent vel consectetur nisi. Quisque tempus nisi quis mollis tincidunt. Pellentesque fermentum mauris enim, id feugiat lorem malesuada ut. Maecenas eleifend lacus a eros hendrerit efficitur. Nunc blandit quam auctor, auctor elit accumsan, dapibus sem. Mauris commodo enim nec ligula congue convallis. Cras cursus cursus felis, quis tempus orci eleifend in.</p>
<p>Mauris rutrum imperdiet ipsum, mollis pretium ipsum maximus id. Vivamus interdum non metus sed imperdiet. Nunc pharetra nisi id nisi convallis, nec gravida felis aliquam. Vestibulum quis molestie purus. Quisque a aliquet magna. Sed gravida quis sem id congue. Donec dolor est, sollicitudin at leo vitae, fringilla tempor mauris. Donec sodales mi vitae sem molestie tincidunt. Fusce ut elit nunc. Cras ullamcorper pharetra augue vitae lobortis. Maecenas hendrerit vulputate suscipit. Ut ut ante elit. Quisque mollis non felis sit amet aliquam. Ut suscipit vel nisi ac lobortis.</p>
</section>
<section class="banner">
<img src="http://www.canvaz.com/portrait/charcoal-1.jpg" class="banner__image">
</section>
</div>

three absolute positioned divs inside one div acting strangely

im exhausted, why is this absolute positioned footer do not stick to the bottom of its relative parent? thanks in advance
html {
height:100%;
}
body {
position:relative;
min-height:100%;
}
.nav {
position:absolute;
top:0;
width:100%;
padding:10px;
}
.wrapper {
position:absolute;
min-height:calc(100% - 100px);
width:100%;
opacity:0.4;
margin-top:100px;
padding-bottom:50px;
}
.footer {
width:100%;
height:50px;
position:absolute;
bottom:0;
left:0;
}
https://jsfiddle.net/182L8fus/
absolute The element is positioned relative to its first positioned (not static) ancestor element
fixed The element is positioned relative to the browser window
relative The element is positioned relative to its normal position, so "left:20px" adds 20 pixels to the element's LEFT position
* {
margin:0;
padding:0;
box-sizing:border-box;
}
html {
height:100%;
display:block;
}
body {
min-height:100%;
display:block;
}
.nav {
position:absolute;
top:0;
background:grey;
width:100%;
padding:10px;
}
.wrapper {
position:relative;
min-height:calc(100% - 100px);
width:100%;
opacity:0.4;
margin-top:100px;
padding-bottom:50px;
}
.footer {
width:100%;
height:50px;
position:relative;
background:grey;
bottom:0;
left:0;
}
<div class="nav">home</div>
<div class="wrapper">
<div class="content">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc accumsan sollicitudin augue, non condimentum neque molestie vitae. Mauris eget tortor euismod, elementum arcu ac, dapibus arcu. Donec nec risus quis mi vulputate varius ac ut magna. Mauris condimentum, mi sit amet pulvinar aliquet, magna purus interdum enim, sit amet mattis ipsum mi et nunc. Vivamus non tristique mi. Maecenas iaculis ornare felis sit amet condimentum. Quisque molestie ullamcorper hendrerit. Ut ut libero tincidunt, aliquet sapien nec, congue velit. Sed malesuada sapien non magna scelerisque pharetra. Suspendisse posuere nunc eu quam fermentum ultricies sit amet et sapien. In eleifend quam non tincidunt faucibus. Proin commodo a ex ut blandit. Donec sagittis, risus eget lacinia ultrices, sem risus aliquet orci, id lacinia libero erat at mauris. Nulla vestibulum volutpat lacus in sodales.
Sed accumsan tristique leo, nec iaculis dolor rutrum congue. Suspendisse sed arcu lectus. Cras metus felis, efficitur non libero ut, condimentum blandit velit. Aenean pellentesque lacinia sem in fermentum. Nam egestas ac felis a eleifend. Sed eget dui leo. Ut vehicula blandit diam, vitae porttitor diam iaculis quis. Sed consectetur, sem vel tempus tincidunt, eros ex finibus ante, et porta justo velit ut mi. Sed ac tincidunt lorem. Nullam nisi tortor, ullamcorper a tristique et, aliquam vitae lectus. Morbi nisi erat, pellentesque eu elit vel, dictum rutrum diam. Ut ac augue mauris. Quisque eu tincidunt lacus, et rutrum augue. Quisque sed posuere lacus. Etiam ornare eros condimentum sem tempor ullamcorper. Vestibulum convallis augue diam, ac tempus ipsum facilisis quis.
Aenean luctus non justo ut euismod. Integer convallis libero et lectus varius, eu bibendum massa molestie. Curabitur et bibendum orci. Curabitur eleifend sollicitudin purus et aliquet. In maximus consectetur sem, eu rhoncus metus finibus ut. Proin sit amet laoreet mi. Pellentesque bibendum imperdiet purus, a viverra elit ultricies non. Duis bibendum sem eu neque sagittis rhoncus. Aenean nibh erat, dignissim nec augue ut, efficitur sagittis libero.
Praesent vel sagittis dolor. Donec vestibulum, nisi quis faucibus porttitor, metus ex gravida mi, ac bibendum lectus enim at velit. Mauris malesuada tincidunt ipsum nec auctor. Donec quis semper lectus. Maecenas maximus sodales diam, nec cursus dui laoreet a. Sed nibh massa, maximus sed felis nec, dapibus faucibus nunc. Maecenas posuere libero in dolor pellentesque tincidunt. Vivamus sit amet leo velit. Praesent ultrices tincidunt erat, feugiat hendrerit nisl aliquet vel. Ut varius vulputate tortor, vel sollicitudin neque porttitor sed. Sed imperdiet egestas enim, sed consectetur justo pulvinar ut. Vestibulum viverra risus non urna laoreet, quis porttitor neque volutpat.
Praesent facilisis lectus quis urna ornare mollis. Maecenas consectetur mauris in blandit aliquet. Aliquam hendrerit vulputate mauris vel feugiat. In neque nisl, tempus eget congue in, mattis eu felis. Pellentesque ut ex vel enim euismod viverra nec quis urna. Mauris lacinia aliquet magna, sed lacinia metus aliquam a. Sed bibendum nisi sed augue sodales bibendum. Fusce vulputate tincidunt magna, et iaculis odio posuere eu. Quisque interdum, diam et aliquam euismod, nisl arcu pellentesque magna, et dictum lorem metus quis justo.</div>
</div>
<div class="footer">footer</div>
Your footer is inside the .wrapper div which also has position: absolute.
Change the settings as follows:
.wrapper {
position:relative;
min-height:calc(100% - 100px);
width:100%;
opacity:0.4;
padding-top:100px;
padding-bottom:50px;
}
https://jsfiddle.net/hvvq47fu/

Best practices to make 3 column page [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 7 years ago.
Improve this question
Best practices to make page with 3 columns (responsive) (left, center ,right), where left and right column will be fixed , 100 vh and both have fixed width like 200px and not scroll, and center column will be overflow-y: scroll; . ?
Is this what you are looking for http://jsfiddle.net/DIRTY_SMITH/abtuj3xj/3/
.header {
background: blue;
height: 50px;
position: fixed;
width: 100%;
left: 0;
top: 0;
}
.container {
width: 100%;
position: relative;
margin: 0;
}
.left {
position: absolute;
top: 50px;
left: 0;
width: 200px;
height: 100vh;
background: red;
}
.right {
position: absolute;
top: 50px;
right: 0;
width: 200px;
height: 100vh;
background: red;
}
.middle {
margin-left: 200px;
margin-right: 200px;
margin-top: 50px;
background: yellow;
}
You have to set the left and right column to position:fixed; top:0;
for the right column you add right:0; and the width x% you want. Do the same for left but with left attribute.
For the center column you just to set margin:0 auto; width x%;.
Just make sure that if you add your 3 width % it's = 100%.
I made you a JsFiddle : http://jsfiddle.net/Beauceron/Lv750fcb/2/
body{
margin:0;
}
*{
box-sizing:border-box;
}
.header, .footer{
position:fixed;
width:100%;
height:50px;
background:#000;
color:#fff;
text-align:center;
font-size:30px;
}
.footer{
top:auto;
bottom:0;
}
.left, .right {
position:fixed;
width:20%;
top:50px;
padding:10px;
height:100%;
}
.left{
left:0;
}
.right{
right:0;
}
.center{
padding:60px 10px;
margin:0 auto;
width:60%;
}
<div class="wrapper">
<div class="header">HEADER</div>
<div class="column left" style="background:red">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
<div class="column center">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc sit amet risus nec dolor vulputate pulvinar. Donec fringilla in dolor sed commodo. Sed dignissim lacus quis lacus porta, sed elementum massa aliquam. Aliquam id fermentum arcu, id imperdiet diam. Pellentesque fermentum turpis quis eros dapibus vestibulum. Quisque fringilla tincidunt turpis, quis vehicula nibh fermentum sed. Phasellus pulvinar condimentum arcu, eu sollicitudin orci finibus eu.
Maecenas ornare tempor nisi non varius. Aliquam commodo vulputate consequat. Morbi commodo gravida odio in ultricies. Maecenas quis eleifend turpis, id ullamcorper ligula. Nunc eu sapien dolor. Nam luctus ante nec mi semper, non vestibulum dui vehicula. Vivamus ac placerat arcu. Duis auctor lacinia mi non dapibus. Curabitur pretium erat non justo aliquam, vitae feugiat libero venenatis. Sed varius ex ac lacus lobortis auctor.
Phasellus pretium elit sit amet nisi iaculis varius. Suspendisse eu est eget quam cursus suscipit et non dolor. Duis ac faucibus lorem. Cras maximus sem ullamcorper lacus consequat, ut convallis magna placerat. Sed at arcu turpis. Nunc ut volutpat justo, et tempor tellus. Duis nec sapien ligula. Cras pulvinar felis ligula, nec fringilla nisl aliquam ornare. Aenean mattis urna lorem, vel rhoncus diam condimentum quis. Quisque pulvinar nec nulla non tristique.
In hac habitasse platea dictumst. Ut quis lorem ac nulla aliquet laoreet. Morbi dignissim, nisi non convallis blandit, lorem massa accumsan odio, et pharetra ex dolor nec sem. Phasellus magna justo, facilisis in tortor ac, molestie accumsan nunc. Morbi finibus lacinia tristique. Nulla pulvinar consequat risus a porttitor. Mauris mollis, velit vel lacinia malesuada, dolor nibh pulvinar nulla, eget mollis nibh sem nec diam. Donec fringilla at ipsum at vehicula. Sed commodo porta odio sed ornare. Curabitur porttitor vulputate nulla, id bibendum lectus finibus id. Nulla a neque eget urna pharetra sollicitudin. Donec eget ex sed est mattis feugiat. Proin id arcu ac nulla elementum porttitor.
Ut condimentum ligula nec nisi efficitur, non ullamcorper tellus viverra. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc scelerisque mauris ut ex tristique, at pretium metus pharetra. Nam quis leo id dolor ultricies placerat. Sed massa libero, facilisis id felis id, vehicula convallis est. Duis rutrum, ante sit amet rhoncus ultricies, turpis diam pharetra arcu, vel mattis diam orci eu metus. Aenean in nisl enim. Integer congue sit amet quam et luctus. Quisque dapibus consequat tortor, ac sagittis purus tristique ut. Duis efficitur non elit eu porttitor. Nullam sit amet nibh tortor. Nulla dictum lobortis tristique. Sed egestas pretium placerat. Ut sit amet tincidunt elit. Aliquam cursus libero erat.
Nulla rutrum maximus eleifend. Nam at odio ac velit lacinia sagittis. Quisque sollicitudin sem sapien, sit amet tincidunt lectus molestie id. Nam sagittis dolor eu purus elementum, eu mattis erat feugiat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed rutrum risus nec tincidunt volutpat. Sed ultricies, tellus vel imperdiet venenatis, libero diam lobortis augue, eget eleifend mi nisl et est. Phasellus placerat lacus vel erat imperdiet sodales. Vivamus vel purus id turpis convallis elementum molestie ac libero. Suspendisse tortor diam, pretium id ipsum vitae, sollicitudin viverra odio. Pellentesque faucibus lacinia neque at malesuada.
Nam mi magna, pretium sed rhoncus ut, laoreet eu eros. Phasellus porttitor lectus non elit ultricies, sit amet consequat quam venenatis. Sed sit amet fringilla purus. Maecenas vitae nisl venenatis, pretium leo vel, sodales nulla. Aliquam erat volutpat. Mauris ipsum nisl, commodo rutrum nisi eget, placerat dapibus velit. Aenean condimentum pharetra sapien, a aliquam dui lobortis ut. Suspendisse tempus fringilla accumsan. Morbi vitae faucibus orci.
Suspendisse potenti. Sed massa justo, sollicitudin sed augue sit amet, tempor rutrum erat. Nunc eu porttitor ligula, a hendrerit leo. Cras pulvinar dapibus justo, in vulputate orci pharetra ac. Nulla facilisis at nibh a dignissim. Quisque condimentum condimentum ex, a vulputate dui. Praesent cursus blandit semper. Cras ac nisi sed ex dapibus feugiat. Suspendisse accumsan luctus arcu eget rhoncus. Maecenas sodales lacus a lacus condimentum tristique. Curabitur id dolor varius, pretium mi non, dignissim metus. Ut quis enim aliquam, eleifend purus sit amet, bibendum nisl. Nullam vel placerat neque, ut rhoncus lectus. In in aliquet erat. Morbi bibendum, metus non lacinia venenatis, risus turpis viverra est, semper aliquam purus est a nisi. Suspendisse potenti.</div>
<div class="column right" style="background:yellow">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
<div class="footer">FOOTER</div>
</div>

absolute parent - display overflow on child content

http://codepen.io/Kalesh/pen/xbBmdj?editors=110
Absolute parent containing a header and content divs. Both are dynamic. I want to display scroll-bar on the content only.
I don't want to give any height to header or make the content absolute with top X.
Is there any way to accomplish this?
#parent {
position:absolute;
top: 10px; bottom: 225px; right: 340px; width: 320px;
border: 1px solid black;
}
#header {
border-bottom: 2px solid #426da9; padding: 4px 10px 0; font-size: 32px;
}
#content {
padding: 10px;
font-size: 20px;
}
<div id="parent">
<div id="header">
HEADER
Duis risus eros, bibendum nec pretium at, eleifend non nisi.
</div>
<div id="content">
CONTENT
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ut sollicitudin arcu, sit amet varius purus. Proin eget magna nec sapien vehicula tincidunt. Vestibulum commodo magna sit amet tempor posuere. Ut ac consequat ipsum. Phasellus nulla est, elementum in dictum pulvinar, lacinia sit amet turpis. Nulla auctor placerat dapibus. Nulla vestibulum non nunc sed venenatis. In ac enim scelerisque, ornare leo at, posuere diam. Sed molestie metus semper fermentum maximus. Aliquam in accumsan risus, id maximus mauris.
Duis risus eros, bibendum nec pretium at, eleifend non nisi. Curabitur auctor, odio eu congue aliquet, sapien sapien rutrum orci, sit amet hendrerit sem sem et lectus. Nulla facilisi. Praesent fermentum id nunc et volutpat. Vivamus ac sodales nisi. Duis nec libero eu quam faucibus iaculis et vel magna. Cras erat mauris, imperdiet a porta eu, pharetra eu augue.
Duis risus eros, bibendum nec pretium at, eleifend non nisi. Curabitur auctor, odio eu congue aliquet, sapien sapien rutrum orci, sit amet hendrerit sem sem et lectus. Nulla facilisi. Praesent fermentum id nunc et volutpat. Vivamus ac sodales nisi. Duis nec libero eu quam faucibus iaculis et vel magna. Cras erat mauris, imperdiet a porta eu, pharetra eu augue.
</div>
</div>
Since the header must have a flexible height, it will be difficult to achieve this in old CSS. However, new browsers support flexible boxes, which are perfect for this:
#parent {
display: flex; /* Magic begins */
flex-direction: column; /* Column layout */
}
#content {
flex: 1; /* Starting at 0, grow to fill the remaining space */
overflow: auto; /* Add scrollbars if necessary */
}
#parent {
position:absolute;
top: 10px; bottom: 225px; right: 340px; width: 320px;
border: 1px solid black;
display: flex;
flex-direction: column;
}
#header {
border-bottom: 2px solid #426da9; padding: 4px 10px 0; font-size: 32px;
}
#content {
padding: 10px;
font-size: 20px;
flex: 1;
overflow: auto;
}
<div id="parent">
<div id="header">
HEADER
Duis risus eros, bibendum nec pretium at, eleifend non nisi.
</div>
<div id="content">
CONTENT
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ut sollicitudin arcu, sit amet varius purus. Proin eget magna nec sapien vehicula tincidunt. Vestibulum commodo magna sit amet tempor posuere. Ut ac consequat ipsum. Phasellus nulla est, elementum in dictum pulvinar, lacinia sit amet turpis. Nulla auctor placerat dapibus. Nulla vestibulum non nunc sed venenatis. In ac enim scelerisque, ornare leo at, posuere diam. Sed molestie metus semper fermentum maximus. Aliquam in accumsan risus, id maximus mauris.
Duis risus eros, bibendum nec pretium at, eleifend non nisi. Curabitur auctor, odio eu congue aliquet, sapien sapien rutrum orci, sit amet hendrerit sem sem et lectus. Nulla facilisi. Praesent fermentum id nunc et volutpat. Vivamus ac sodales nisi. Duis nec libero eu quam faucibus iaculis et vel magna. Cras erat mauris, imperdiet a porta eu, pharetra eu augue.
Duis risus eros, bibendum nec pretium at, eleifend non nisi. Curabitur auctor, odio eu congue aliquet, sapien sapien rutrum orci, sit amet hendrerit sem sem et lectus. Nulla facilisi. Praesent fermentum id nunc et volutpat. Vivamus ac sodales nisi. Duis nec libero eu quam faucibus iaculis et vel magna. Cras erat mauris, imperdiet a porta eu, pharetra eu augue.
</div>
</div>

CSS - display:table-row?

I have a layout like this:
[left-image] | [title-------------------------------------]
(width up to 150) | [left-floated-p -----------[right-floated-p]
|
| lots of text................................
The only way I could implement this is by using float:left on the "left-image" and display:table-row on the contents from the right side.
The problem is that this doesn't seem to work in IE 7 :(
Are there any fixes for it? or other alternatives to implement such a layout?
note that I can't use margin-left on the right blocks because I don't know the exact size of the left image + I have 2 floats on the right side and clearing them messes up the layout...
Unfortunately IE 7 doesn't support it. A quick solution:
CSS
<style type="text/css">
#wrapper {
width: 800px;
margin: 0 auto;
}
#leftcol {
width: 150px;
}
#rightcol {
width: 650px;
}
#twocols {
overflow: auto;
}
#leftp,#rightp {
width: 325px;
}
#leftcol, #leftp {
float: left;
}
#rightcol, #rightp {
float: right;
}
</style>
HTML
<div id="wrapper">
<div id="leftcol"><img src="yourimage.jpg" /></div>
<div id="rightcol">
<h1>Title</h1>
<div id="twocols">
<p id="leftp">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam sed iaculis augue. Proin accumsan tortor at dui imperdiet pellentesque. In eu purus vulputate orci porta scelerisque. Maecenas eget purus mauris, et sagittis turpis. Phasellus bibendum elit et risus dignissim gravida. Quisque feugiat mauris sit amet urna porta imperdiet. Proin feugiat rhoncus orci dictum mattis.</p>
<p id="rightp">Praesent condimentum, dolor eu aliquet adipiscing, neque est vestibulum nunc, id dignissim tortor risus sed tortor. Donec luctus scelerisque ornare. In fringilla ullamcorper erat, convallis adipiscing nulla adipiscing ut. Nunc convallis consequat tellus ut aliquam. Vivamus tortor tortor, lacinia eget dignissim sed, pharetra ac risus. Vestibulum quis condimentum turpis. Maecenas magna tellus, dignissim eu suscipit id, placerat quis metus.</p>
</div>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lacinia, nulla quis tempus tempus, arcu velit elementum risus, consectetur rutrum diam odio vitae mi. Curabitur euismod tincidunt ipsum, id volutpat lectus bibendum eget. Nam at pulvinar felis. Vestibulum non lectus id turpis congue tempor sed eget orci. Sed pellentesque felis vitae augue cursus ac gravida arcu tincidunt. Aenean et sem lectus. Curabitur vehicula odio lorem. Morbi ultricies fermentum dolor, vitae convallis leo condimentum at. Pellentesque faucibus justo non enim varius varius. Nulla accumsan feugiat orci, egestas laoreet mauris rhoncus non. In lacinia purus in magna pulvinar et sollicitudin urna mollis. In eleifend augue ac sem suscipit eget adipiscing odio gravida. Nam tincidunt dui pharetra lacus bibendum volutpat. Integer faucibus luctus magna, et eleifend metus iaculis vitae. Cras imperdiet dignissim mi, porta elementum elit dignissim non. Ut egestas congue elit quis volutpat. Nunc ac massa neque.</p>
<p>Praesent id lectus felis. Phasellus sapien leo, ultrices nec rhoncus a, tincidunt in lacus. Mauris tincidunt volutpat nisi, quis viverra ligula pellentesque semper. Phasellus sem sem, tristique vitae sollicitudin eu, tincidunt egestas felis. Aliquam id nunc augue. Integer lectus dolor, lacinia non pellentesque non, elementum at lorem. Donec nec vulputate magna. Vestibulum lobortis risus a elit fringilla dapibus congue tellus tincidunt. Nulla a eleifend justo. Sed nec nisl augue, id vulputate ante. Vestibulum dapibus tristique nisl, non consequat nisi bibendum sit amet. Phasellus quis diam orci, et fringilla est. Morbi quis aliquam ante. Donec bibendum suscipit magna tempus feugiat. Mauris ultricies, neque sed venenatis lacinia, nulla magna scelerisque libero, vitae pharetra urna mi eget nunc. Nullam tellus quam, sagittis a volutpat id, imperdiet vel libero. Curabitur fringilla velit id ligula faucibus dapibus. Aliquam id augue leo. Aenean ac felis vel lectus commodo tempus.</p>
<p>Fusce facilisis facilisis enim et pharetra. Vivamus luctus pellentesque accumsan. Mauris sem metus, ullamcorper vel ornare in, eleifend id risus. Pellentesque viverra lacinia nulla eget hendrerit. Integer consequat egestas placerat. Etiam libero nisl, euismod in tristique ac, convallis eget purus. Nulla vulputate quam sit amet purus consectetur dapibus. Etiam aliquet purus non felis sagittis porta. Fusce id libero nibh. Ut auctor odio sed leo iaculis ut faucibus leo blandit. Maecenas imperdiet enim imperdiet elit hendrerit mattis. Etiam mauris ipsum, malesuada eget posuere eget, molestie quis sem. In commodo consequat arcu laoreet fermentum. Duis et magna massa, et molestie magna.</p>
</div>
</div>
You would need to make the text and headline prettier, but this works.
The best alternative for implementing such a layout would be using a grid framework like blueprintcss, yahoo grid etc.
I think something like this would work
<div id="wrapper">
<div id="leftImage">Hello</div>
<div id="rightSide">
<!-- Right side things here -->
</div>
</div>
#wrapper {
width:400px;
height:400px;
background:red;
}
#leftImage {
position:absolute;
width:200px;
height:200px;
background:blue;
}
#rightSide {
position:relative;
width:200px;
height:200px;
background:green;
float:left;
margin-left:200px;
}
With the same HTML code used by Gert G in his answer, here is an alternative using display: inline-block;:
#wrapper {
width: 960px;
}
#leftcol {
display: inline-block;
width: 150px;
vertical-align: top;
}
#rightcol {
display: inline-block;
width: 800px;
}
Conditional comment for IE<8
#leftcol, #rightcol { display: inline; zoom: 1; }
#rightcol can have a width of 810px IF you strip whitespace between ending tag of #leftcol and the beginning one of #rightcol
if height of title & paragraphs height are static/
just write a margin-bottom to your left image. you dont need a extra column at right of the page/
height (title & paragraphs) = X;
margin-bottom (img) = X + 100; (for your text;)
btw text should be in a division/
max-width (img) = 150px;
min-width (div.all or body) = width(img)+width(your text at right) /

Resources