Показать сообщение отдельно
  #13 (permalink)  
Старый 15.06.2012, 11:27
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Ну, вот моя попытка. Всё свелось к аналогии с box-shadow: клонировали элемент, и добавили копии эффектов. Эффекты такие: поворот (на 180 градусов), ревёрсинг (отражение справа налево), и размытие. Последнее достигается сложновато в опере и файрфоксе.

Я разделю пример на несколько, чтобы было удобней писать читать код.

Начну с классического вида элемента, без отражения.
<style>
* {margin:0;padding:0}

.mirrorize {
    font-family: sans-serif;
    font-size: 18px;
    font-weight: bold;
    border: 2px red solid;
    padding: 5px;
    background-color: #F58C8C;
    position: absolute;
    top: 0;
}
</style>
<div class="mirrorize">
    Mirrorize me.
</div>


БЫЛО БЫ НЕПЛОХО ДОБАВИТЬ ОТРАЖЕНИЮ USER-SELECT: NONE. Но я последую принципу "работает - не трожь" (мне просто лень ).

А теперь начну мешать сюда грязный код. Пример для браузеров, поддерживающих CSS Filters (у меня только хром):
<style>
* {margin:0;padding:0}

.mirrorize {
    font-family: sans-serif;
    font-size: 18px;
    font-weight: bold;
    border: 2px red solid;
    padding: 5px;
    background-color: #F58C8C;
    position: absolute;
    top: 0;
}
.reflection {
    position: absolute;
    width: 100%;

    left: 0;
    padding: 0;
    margin: 0;

    top: 105%; /* outer высота + отступ */

    -webkit-transform: scaleY(-1);
    -moz-transform: scaleY(-1);
    -ms-transform: scaleY(-1);
    -o-transform: scaleY(-1);
    transform: scaleY(-1);

    -webkit-filter: blur(2px);
    -moz-filter: blur(2px);
    -ms-filter: blur(2px);
    -o-filter: blur(2px);
    filter: blur(2px);
}
</style>
<div class="mirrorize">
    Mirrorize me.
    <div class="reflection mirrorize">Mirrorize me.</div>
</div>

Теперь решение для IE:
<style>
* {margin:0;padding:0}

.mirrorize {
    font-family: sans-serif;
    font-size: 18px;
    font-weight: bold;
    border: 2px red solid;
    padding: 5px;
    background-color: #F58C8C;
    position: absolute;
    top: 0;
}
.reflection {
    position: absolute;
    width: 100%;

    left: 0;
    padding: 0;
    margin: 0;

    top: 105%;

    /*IE 5.5 - IE 7*/
    filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1) progid:DXImageTransform.Microsoft.Blur(pixelRadius=2);
    
    /*IE8 вроде как.*/
    -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1) progid:DXImageTransform.Microsoft.Blur(pixelRadius=2)";
}
</style>
<div class="mirrorize">
    Mirrorize me.
    <div class="reflection mirrorize">Mirrorize me.</div>
</div>

Ну а теперь решение для браузеров, поддерживающих CSS Transformations, но не поддерживающих CSS Filters - т.е. размытие. На ум мне пришло SVG.

В ОПЕРЕ НЕ РАБОТАЕТ. ЖАЛЬ. Можно было бы сделать размытие в канвасе (слыхал про такое), но я канвас ни разу не трогал, и в ближайшее время даже не собираюсь.
<style>
* {margin:0;padding:0}

.mirrorize {
    font-family: sans-serif;
    font-size: 18px;
    font-weight: bold;
    border: 2px red solid;
    padding: 5px;
    background-color: #F58C8C;
    position: absolute;
    top: 0;
}
.reflection {
    position: absolute;
    width: 100%;

    left: 0;
    padding: 0;
    margin: 0;

    top: 105%;

    -webkit-transform: scaleY(-1);
    -moz-transform: scaleY(-1);
    -ms-transform: scaleY(-1);
    -o-transform: scaleY(-1);
    transform: scaleY(-1);

    filter: url(#reflection_blur);
}
</style>

<svg>
    <defs>
        <filter id="reflection_blur">
            <feGaussianBlur stdDeviation="2" />
        </filter>
    </defs>
</svg>

<div class="mirrorize">
    Mirrorize me.
    <div class="reflection mirrorize">Mirrorize me.</div>
</div>

Последний раз редактировалось melky, 15.06.2012 в 11:44.
Ответить с цитированием