Трудный CSS-макет
Итак, я делаю сайт с довольно проблематичным макетом. Есть четыре изображения угла TL, TR, BL и BR, обозначенные черными блоками. Темно-оранжевая область является основным содержимым (шириной 960 пикселей), а внешняя область обозначается зеленой стрелкой в качестве окна браузера. См. Диаграмму:
Диаграмма http://dotcafedesigns.com/stackoverflow/problem.gif
Верхнее изображение представляет сайт как можно более узким - его нельзя разрезать уже (960px), если он больше, чем определенная область, там не должно быть полос прокрутки. Нижние два изображения представляют собой разную ширину браузера.
Нижние левые и правые черные блоки (изображения) должны быть в левом и правом краях экрана в любое время, если ширина не упадет до 960px, и в этом случае изображения BL и BR будут слегка выступываться в основную область, Если сайт сжат, скажем, 200 пикселей, изображение BR не должно все еще вызывать в правом углу.
На данный момент мне все равно, что он работает именно в IE6 (я могу заставить его грубо работать), но я не могу даже понять, как сделать это полностью без Javascript или чрезвычайно экспериментального CSS. В настоящее время я использую абсолютно позиционированный div, который работает, но не работает совершенно правильно.
Я думаю, что я был бы готов принять немного JS, если нет другого пути, но я бы предпочел не делать этого.
Ответ очень оценен!
Ответы
Ответ 1
Нет необходимости в Javascript. По крайней мере, в большинстве современных браузеров. Используя простое позиционирование и один запрос @media, я отключил его:
<head>
<style type="text/css" media="screen">
body {
margin: 0;
padding: 0;
font-family: sans-serif;
background: orange;
text-align: center;
color: black;
overflow-x: hidden;
}
#content {
width: 960px;
margin: 0 auto;
padding: 20px 0;
min-height: 800px;
background: #cc6600;
z-index: 0;
}
.image {
background: black;
color: white;
height: 60px;
width: 100px;
padding: 20px 0;
z-index: 1;
opacity: .95;
}
#top {
width: 960px;
margin: 0 auto;
position: relative;
overflow: visible;
}
#top .image {
position: absolute;
}
#top .left {
left: -80px;
}
#top .right {
right: -80px;
}
#bottom {
position: fixed;
bottom: 0;
width: 100%;
height: 100px;
}
#bottom .image {
position: absolute;
}
#bottom .left {
left: 0;
}
#bottom .right {
right: 0;
}
@media all and (max-width:1120px) {
#container {
width: 960px;
margin: 0 auto;
position: relative;
overflow: visible;
}
#bottom .left {
left: -80px;
}
#bottom .right {
right: -80px;
}
}
</style>
</head>
<body>
<div id="top">
<div class="left image">left image</div>
<div class="right image">right image</div>
</div>
<div id="content">
content
</div>
<div id="bottom">
<div id="container">
<div class="left image">left image</div>
<div class="right image">right image</div>
</div>
</div>
</body>
Это может подпасть под ваше описание "чрезвычайно экспериментального CSS", но я думаю, вы будете удивлены тем, насколько он поддерживается, и насколько легко было бы загружать это с помощью JS - просто проверьте браузер ширину при повторном размере и добавление дополнительного CSS, когда ширина падает ниже 1120 пикселей.
Ответ 2
Что-то вроде этого? Вы можете заменить код JavaScript похожим кодом JQuery, если хотите, просто хотели дать представление о том, как это может работать.
<html>
<head>
<title>....</title>
<style type="text/css">
html
{ height: 100%; margin: 0; background: white; }
body
{ height: 100%; width: 960px; margin: 0 auto; background: gray; overflow: hidden; }
#main
{ margin: 0px; padding: 5px 20px; position: relative; }
#headLeft
{ position: absolute; top: 0px; left: -80px;
width: 100px; height: 35px; background: green; }
#headRight
{ position: absolute; top: 0px; right: -80px;
width: 100px; height: 35px; background: green; }
#footLeft
{ position: absolute; bottom: 0px; left: 0px;
width: 100px; height: 35px; background: green; }
#footRight
{ position: absolute; bottom: 0px; right: 0px;
width: 100px; height: 35px; background: green; }
</style>
<script type="text/javascript">
function checkSize ( event )
{
var contentWidth = 960;
var minOuterBoxSize = 60; // maximum 100-60=40 px will be displayed inside the main area
if ( window.innerWidth - contentWidth < minOuterBoxSize * 2 )
{
var pos = ( ( minOuterBoxSize * 2 ) - window.innerWidth + contentWidth ) / 2;
document.getElementById( 'footLeft' ).style.left = '-' + pos;
document.getElementById( 'footRight' ).style.right = '-' + pos;
}
else
{
document.getElementById( 'footLeft' ).style.left = '0px';
document.getElementById( 'footRight' ).style.right = '0px';
}
}
</script>
</head>
<body onload="checkSize( event );" onresize="checkSize( event );">
<div id="main">
<div id="headLeft">TL</div>
<div id="headRight">TR</div>
<p>Normal content</p>
</div>
<div id="footLeft">BL</div>
<div id="footRight">BR</div>
</body>
</html>
Ответ 3
Единственная действительно сложная часть - это дно. В остальном это довольно просто:
<body>
<div id="container">
<div id="header">
<div class="right"></div>
<div class="left"></div>
</div>
<div id="footer">
<div class="right"></div>
<div class="left"></div>
</div>
</div>
</body>
CSS
#container {
margin: 0 auto;
width: 960px;
}
#header {
position: relative;
}
#header .right, #header .left {
position: absolute;
width: 100px;
}
#header .right {
left: 940px; /* leaves 20px inside the #header */
background: url(images/header_right.gif) no-repeat;
}
#header .left {
left: -80px; /* leaves 20px inside the #header */
background: url(images/header_left.gif) no-repeat;
}
И некоторые подобные вещи для #footer
, но вам нужно использовать немного javascript для определения ширины окна и слегка отрегулировать left
.