Полигональные блоки Делаете переполнение содержимого в определенной форме?

Вот сайт, над которым я сейчас работаю: http://willcrichton.net/

Если вы нажмете стрелки на каждой стороне шестиугольника посередине, вы увидите, что он перемещается влево и вправо с помощью jQuery + jQuery Cycle + jQuery Easing. Однако вы также можете видеть, что это довольно уродливо - потому что я использую шестиугольники, а не квадраты, и поскольку div имеют квадратную форму, шестиугольник содержимого неприятным образом перекрывается с фоном.

Итак, мой вопрос: как мне по сути взломать div на шестиугольник? Этот шестиугольник должен быть того же размера / формы, что и div содержимого, и когда содержимое находится за пределами области шестиугольника, оно должно быть невидимым.

Редактировать:

HTML

<div id="content"> 
<div class="slide">

    <a href="#"><div class="arrow left"></div></a>
    <a href="#"><div class="arrow right"></div></a>

    <div id="websites-title"></div>
    <div class="website">

    </div>
</div>
<div class="slide">
    <a href="#"><div class="arrow left"></div></a>
    <a href="#"><div class="arrow right"></div></a>

</div></div>


<script type="text/javascript">
    $("#content").cycle({
        fx: 'scrollHorz',
        timeout: 0,
        prev: ".left",
        next: ".right",
        easing: "easeInOutBack"
    });
</script>

CSS

/* Container styles */

#container {
    width: 908px;
    height: 787px;
    left: 50%;
    top: 50%;
    position: absolute;
    margin-top: -393.5px;
    margin-left: -452px;
    background-image: url("images/background.png");
    font: 12px "Lucida Sans Unicode", "Arial", sans-serif;
    z-index: 3;
}    

#content {
    width: 686px;
    height: 598px;
    position: absolute;
    left: 50%;
    top: 50%;
    margin-top: -282px;
    margin-left: -343.5px;
    /*background-image: url("images/hacky_hole2.png");*/
    z-index: 1;
}

    .slide {
        width: 100%;
        height: 100%;
        background-image: url("images/content.png");
        position: relative;
        z-index: 2;
    }

ОБНОВЛЕНИЕ: если вы проверите сайт сейчас, вы увидите мою неудачную попытку использования метода «окна» и поймете, почему z-index не работает.


person Will    schedule 02.06.2010    source источник
comment
Для вашего слоя hacky_hole2.png ваш z-index должен быть выше, чем ваш слой слайда. Более высокие числа идут выше в стеке z-индекса.   -  person Jeff Fohl    schedule 03.06.2010


Ответы (3)


Вы не можете превратить div в шестиугольник, но вы можете использовать файлы PNG с альфа-прозрачностью, чтобы замаскировать нужную область. Итак, вам нужно будет создать четыре div, каждый с фоном, который имеет файл PNG с прозрачностью, которая действует как маска. Эти div будут расположены абсолютно над вашим div с помощью ползунка.

РЕДАКТИРОВАТЬ: Как отметил ниже Пекка, это также можно сделать с помощью одного большого файла PNG, выступающего в качестве маски.

РЕДАКТИРОВАТЬ №2: Глядя на опубликованный вами код, я бы изменил его следующим образом:

<div id="content"></div>
<div class="slide">

    <a href="#"><div class="arrow left"></div></a>
    <a href="#"><div class="arrow right"></div></a>

    <div id="websites-title"></div>
    <div class="website">

    </div>
</div>
<div class="slide">
    <a href="#"><div class="arrow left"></div></a>
    <a href="#"><div class="arrow right"></div></a>
</div>

Обратите внимание, что я закрыл элемент <div id="content">. Этот элемент должен быть родственником ваших слайдов, но располагаться над слайдами с более высоким z-index. Или вам может потребоваться создать новый элемент, предназначенный для отображения маски, если ваш div «контент» используется не только для отображения маски, но и для других целей.

person Jeff Fohl    schedule 02.06.2010
comment
Я пробовал аналогичное решение, но по какой-то причине, когда я использую z-index для размещения окна над содержимым, оно не работает. Любая идея, почему / какие-либо альтернативы? - person Will; 03.06.2010
comment
Проблема в том, что у этих PNG будет видимая область, которая является маской. Фактически вам нужно будет поместить весь шестиугольник, который теперь виден, в PNG, и оставить отверстие в середине. Это будет работать, но не очень гибко (не то чтобы я мог придумать что-нибудь получше ...) - person Pekka; 03.06.2010
comment
Убедитесь, что элементы расположены абсолютно, с помощью position:absolute. Вы также должны убедиться, что родительский элемент имеет атрибут position:relative, чтобы все элементы располагались относительно одного и того же родителя. Затем, конечно, убедитесь, что ваши z-индексы размещают ваши элементы в том порядке, в котором вы хотите. Если вы разместите код, я могу взглянуть на него. - person Jeff Fohl; 03.06.2010
comment
@Pekka - Да, это один из вариантов. Вы также можете просто использовать ту часть шестиугольника, которую хотите заблокировать ползунком ниже. Итак, это будет одна грань шестиугольника. - person Jeff Fohl; 03.06.2010
comment
@ Джефф ммм, посмотри на белое пространство за пределами шестиугольника. Вам также придется замаскировать это, иначе там будет видно скользящее содержимое ... Я действительно не могу придумать способ сделать это, кроме как иметь всю область шестиугольника на одном изображении. Конечно, я могу ошибаться. - person Pekka; 03.06.2010
comment
@Pekka - Да, ты прав. У маски также должен быть белый фон. В этом методе можно использовать один div с одним большим фоном или четыре div, каждый из которых покрывает одну грань шестиугольника. Они оба будут работать. В обоих случаях необходимо включить белый фон. - person Jeff Fohl; 03.06.2010
comment
Кстати, в IE6 этот метод работать не будет. Не уверен, заботит вас это или нет. - person Jeff Fohl; 03.06.2010
comment
Это было странно, закрывающий тег div не отображался в подсветке синтаксиса. Да ладно, но он был закрыт - это не параллельный div, это родительский div для всех шестиугольников и прочего. - person Will; 03.06.2010
comment
@Will - в этом случае вам нужно будет создать новый элемент div, который является родственником разделов ползунка, но расположен над ними. Этот div будет содержать вашу маску. - person Jeff Fohl; 03.06.2010
comment
@ Джефф: Новая проблема. Я пробовал это, и это ПОЧТИ работает, но проблема в том, что маска отключает возможность нажимать ссылки. Если вы проверите его еще раз, вы можете увидеть содержимое в порядке, но поскольку маска находится над ней, вы не можете щелкнуть ссылки внутри нее. - person Will; 03.06.2010
comment
Хорошо - ваши ссылки также должны быть позиционированы абсолютно, превыше всего. По сути, вам нужно будет разместить все в макете абсолютно (кроме самого внешнего контейнера) и сложить все в том порядке, в котором вы хотите. - person Jeff Fohl; 03.06.2010
comment
Я думаю, я понимаю, о чем вы говорите - ссылки ВНУТРИ слайдов должны быть интерактивными, верно? Хорошо, вот еще один подход. Вместо использования одного большого div с фоном в качестве маски (это то, что блокирует ваши клики) создайте четыре маски (по одной для каждого угла) и расположите само изображение абсолютно над слайдами. Это оставит кликабельным в центральной области. Однако вы по-прежнему не сможете нажимать на области, покрытые прозрачностью ваших изображений маски, поэтому будет доступен только самый центр. Следовать? - person Jeff Fohl; 03.06.2010
comment
Думаю, я понимаю, к чему вы клоните, но это все еще создает проблему, поскольку, поскольку углы диагональные, div все равно должен быть треугольным, чтобы создать правильное окно, которое я ищу. И, кстати, спасибо за вашу помощь, вы первый, кто сможет оказать хоть какую-то помощь. - person Will; 03.06.2010
comment
Что ж, да - вы не сможете сделать прозрачные области кликабельными, но, по крайней мере, вы сможете сделать так, чтобы некоторые из них были кликабельными, поэтому, если вы правильно спроектируете свои слайды, это может сработать. - person Jeff Fohl; 03.06.2010
comment
Последнее, что вы могли бы сделать, - это использовать CSS-преобразования для создания более тонких масок и повернуть их на место. Однако преобразования CSS поддерживаются только в Firefox и Webkit (не в Internet Explorer). Вот сообщение об этом в блоге: davidwalsh.name/css-transform-rotate - person Jeff Fohl; 03.06.2010

Если бы я занимался разработкой, я бы превратил вашу двухуровневую связь в слой дерева ...

ex:

1. Слой с существующим фоном.

2. Слой с серым шестиугольником.

3. Слой с окружающими словами и окружающим фоном

Таким образом, когда вы нажимаете стрелки влево и вправо, серый шестиугольник будет скользить в середине слоев 1. и 3., тем самым предотвращая то уродство, о котором вы упомянули :)

Надеюсь, это поможет!

person Zuul    schedule 02.06.2010

Концепция и демонстрация curvelicious Эрика Мейера могут указать вам правильное направление. Это сложный прием из «первых дней CSS», но это мощный прием.

person kevingessner    schedule 02.06.2010