Шаблон резинового блока с прозрачными уголками

Опубликовано Александр в Втр, 02.02.2010 - 18:30

Довольно часто на страницах приходится строить блоки, которые должны иметь прозрачные уголки, тянуться по горизонтали и вертикали и иметь графические границы. В сети описано очень много способов, но красивого решения я так и не увидел. Поэтому хочу предложить свое. Суть его в том, что левая и правая стороны позиционируются с помощью отрицательных маргинов, а верхняя и нижняя - с помощью относительного позиционирования. Уголочки расставляются float'ами.
HTML

<div class="block">
  <span class="up-r"></span>
  <span class="up-l"></span>
    <div class="side-left">
      <div class="side-right">
        <div class="side-up">
          <div class="side-bottom">
            <div class="box">
              <h2>Тело блока</h2>
              <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</p>
            </div>
          </div>
        </div>
      </div>
    </div>
  <span class="bottom-r"></span>
  <span class="bottom-l"></span>
</div>

CSS

/* reset */
p, h2, div, span{padding:0;margin:0}
/*  */
body{ background: url(img/main-fon.gif) 0 0 repeat; }
.block{ position:relative; margin:10px 0 15px;}
.box{ position:relative;top:-10px}
/* sides */
.side-left{ background:url(img/w-v-l.gif) 0 0 repeat-y #fff;margin-right:10px;padding-left:10px}
.side-right{ background:url(img/w-v-r.gif) right 0 repeat-y;margin-right:-10px;padding-right:10px}
.side-up{ background:url(img/bw-up.gif) 0 0 repeat-x; position:relative;top:-10px}
.side-bottom{ background:url(img/w-down.gif) 0 bottom repeat-x;position:relative;top:15px}
/* corners */
.up-l{background:url(img/bw-up-l.gif) 0 0 no-repeat;height:68px;width:10px;float:left;margin-top:-10px}
.up-r{ background:url(img/bw-up-r.gif) right 0 no-repeat;height:68px;width:10px;float:right;margin-top:-10px}
.bottom-l{background:url(img/w-down-l.gif) 0 bottom no-repeat;width:10px;height:6px;margin-top:-1px;float:left}
.bottom-r{background:url(img/w-down-r.gif) right bottom no-repeat;width:10px;height:6px;margin-top:-1px;float:right}
/* fix-ie */
.up-l, .up-r, .bottom-l, .bottom-r{font-size:1px;position:relative}

Есть соблазн сократить код на 1 div и переместить уголки внутрь блока и разметить их с помощью абсолютного позиционирования. Однако это решение не кроссбраузерное, так как уголки в ие6 будут гулять на 1 пиксель при разных разрешениях, поэтому только float'ами. Конечно же, под свои блоки придется несколько изменить CSS, тогда как HTML трогать не нужно. К плюсам метода могу отнести возможность темизации всех сторон и уголков блока с помощью изображений. К минусам - большое количество div'ов.
Самое главное - это вариант построения блока является валидным и кроссбраузерным, а также испытан мной во многих проектах.

Re: Шаблон резинового блока с прозрачными уголками

годно, у меня на 1920х1080 все ровно :)

Re: Шаблон резинового блока с прозрачными уголками

Спасибо, старался :)

Re: Шаблон резинового блока с прозрачными уголками

Quote:
Есть соблазн сократить код на 1 div и переместить уголки внутрь блока и разметить их с помощью абсолютного позиционирования. Однако это решение не кроссбраузерное, так как уголки в ие6 будут гулять на 1 пиксель при разных разрешениях, поэтому только float'ами.

В данном моменте вы не правы. Для ie6 есть очень красивое решение. Делается через очень простой expression, прописанный в конд. комментах. Т.ч. данный способ ужасно громоздкий, и не очень заслуживает на жизнь.

html:

  <div id="main_text">
    <div class="top_left"></div>
    <div class="top_right"></div>
    <div class="bottom_left"></div>
    <div class="bottom_right"></div>
    
    Lorem ipsum
  </div>

css для нормальных браузеров:

Quote:
#main_text {position:relative}
#main_text div.top_left {display:block; background-image:url(images/main_text_top_left.gif); width:10px; height:10px; top:0; left:0; position:absolute; overflow:hidden}
#main_text div.top_right {display:block; background-image:url(images/main_text_top_right.gif); width:10px; height:10px; top:0; right:0; position:absolute; overflow:hidden}
#main_text div.bottom_left {display:block; background-image:url(images/main_text_bottom_left.gif); width:10px; height:10px; bottom:0; left:0; position:absolute; overflow:hidden}
#main_text div.bottom_right {display:block; background-image:url(images/main_text_bottom_right.gif); width:10px; height:10px; bottom:0; right:0; position:absolute; overflow:hidden}

css ie6:

#main_text div.top_right, #main_text div.bottom_right {righty:expression(parentNode.offsetWidth % 2 ? style.right="-1px" : style.right="0px")}
#main_text div.bottom_left, #main_text div.bottom_right  {bottomy:expression(parentNode.offsetHeight % 2 ? style.bottom="-1px" : style.bottom="0px")}

http://nz-studio.com/flight/fair/ - вот макет, в котором это используется в блоке "Коротко о нас" и футере.

ЗЫ. отступы в главном меню - извращённый взгляд дизайнера.
ЗЗЫ. если вам нужен третий человек в команду - свяжитесь, хотел бы поработать в команде с нормальными верстальщиками. Занимаюсь версткой уже 4 года, сделанных проектов больше сотни. (ICQ 212 666 восемь шесть девять)

Re: Шаблон резинового блока с прозрачными уголками

За expression спасибо. Действительно, даже не знал что так можно.
Мой способ действительно громоздкий, но он предназначен для блоков, в котором стороны можно оформить только с помощью фоновых изображений(когда применение бордера не дает нужный эффект). Возможно, пример выбрал неудачный.
Евгений, Ваша верстка действительно очень хорошая, однако у меня есть несколько замечаний, если хотите, я бы мог поделиться своими мыслями о ней.

Re: Шаблон резинового блока с прозрачными уголками

win xp sp2, ie6, 1699x900:

http://clip2net.com/page/m0/5957239

Re:

1600x900

Re: Шаблон резинового блока с прозрачными уголками

Дело в том, что блок слишком растянулся и его высота стала меньше высоты верхних уголков. Из-за этого-то и произошла деформация. Наверно стоило указать минимальную высоту для блока, тогда этой проблемы бы не возникло.