Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Что вы не можете перенести из .HTC файлов в обычный JS (https://javascript.ru/forum/offtopic/29099-chto-vy-ne-mozhete-perenesti-iz-htc-fajjlov-v-obychnyjj-js.html)

devote 14.06.2012 19:28

Что вы не можете перенести из .HTC файлов в обычный JS
 
Привет всем!

Собственно сабж. В ИЕ много разных моментов решается через HTC файлы, но порой HTC это не всегда удобно, но если по вашему мнению функционал реально осуществить лишь только через HTC, и если у вас есть что-то что вы желаете иметь в обычных JS файлах, я могу вам это смело переиначить, причем функционал от этого совершенно не измениться. Скорость работы ниже не будет. То-есть вы получите в результате то чего было в HTC но уже ввиде нормального, привычного .js файла.

Если есть идеи, пишите, решим. Ибо ничего нерешаемого не бывает.

melky 14.06.2012 22:23

devote, для верстальщиков проще написать behavior(bla bla), чем присоединить скрипт в условном комментарии. А может быть, они не знают, что это одно и то же.

devote 14.06.2012 22:33

Цитата:

Сообщение от melky
что это одно и то же.

видимо, хотя верстальщики скрипты так же приклеивают, когда всякие там UI библы юзают.. не думаю что проблема будет вписать один раз .js файл и не мучать мозг

Gozar 14.06.2012 23:21

Как-то делал летающие деревья по экрану отражающиеся в воде.

Была задача вписать прямоугольное изображение с острыми углами в прямоугольник с закругленными углами, отразить его вертикально, сверху наложить полупрозрачный затухающий градиент и заставить это всё двигаться по экрану в количестве 5-9 штук и изменяться в размерах. Исходное изображение изменять было нельзя. Сроки ограничены, во всех браузерах 2 недели потолок.

Решал с помощью PIE.htc и фильтров, удалось решить только в статике в IE7, IE8, анимация расходилась и глючила по полной программе. В IE7 были очень большие траблы и пришлось отказаться от анимации совсем. IE8 частично, без отражений.

К чему это я. Статика и динамика это разные вещи. Мне бы хотелось иметь универсальный скрипт, но я уже понял, что таких не бывает.

devote,
Хочу отражение в динамике, как описано выше и чтобы летало :)

devote 14.06.2012 23:35

Цитата:

Сообщение от Gozar
Хочу отражение в динамике, как описано выше и чтобы летало

Скока? :D

melky 14.06.2012 23:51

Цитата:

Сообщение от Gozar (Сообщение 181563)
Хочу отражение в динамике, как описано выше и чтобы летало :)

Не так то сложно. Всё упирается в желание и время.

В моем случае, только в интерес к теме :).

devote 14.06.2012 23:54

Цитата:

Сообщение от melky
Всё упирается в желание и время.

вот именно, но у него 2 недели потолок)

Gozar 15.06.2012 00:02

Цитата:

Сообщение от melky
Не так то сложно.

Я знаю, болтать легко.

Цитата:

Сообщение от devote
Скока?

Мне ужо не надо. Я про универсальность. Многим просто не нужно того, что ты предлагаешь.

devote 15.06.2012 00:03

Цитата:

Сообщение от Gozar
Многим просто не нужно того, что ты предлагаешь.

никто не спорит

melky 15.06.2012 01:33

Цитата:

Сообщение от Gozar
Я знаю, болтать легко.

:D после курения манов микрософт уже ничего не кажется невозможным в IE. завтра утром для зарядки мозгов попробую. можно же сюда написать?)

devote 15.06.2012 02:13

Цитата:

Сообщение от melky
после курения манов микрософт уже ничего не кажется невозможным в IE

О да, я их прокурил так что уж ничего и не видно сквозь никотин налипший на их писанину :D

Цитата:

Сообщение от melky
завтра утром для зарядки мозгов попробую. можно же сюда написать?)

а кто против? )

B~Vladi 15.06.2012 11:02

devote, тебе открылись тайные знания? Был у меня один такой случай, что без подключения htc не обойтись, но сейчас уже не вспомню.

melky 15.06.2012 11:27

Ну, вот моя попытка. Всё свелось к аналогии с 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>

Gozar 15.06.2012 12:30

melky,
Всё нормально за исключением того, что это не картинка и ты потерял закругленные углы и градиент. Ну и кроссбраузерность обязательна. И я напомню, что картинка берется изначально с острыми углами.


melky 15.06.2012 12:41

Цитата:

Сообщение от Gozar
потерял закругленные углы

закруглённые углы? там отражение является точной копией отражаемого элемента, с добавлением ещё одного класса... как мог стиль потеряться? Недавно появившееся свойство element должно помочь.

картинка... да. её придётся wrap'ать, а дальше то же самое :
FIREFOX ONLY; При клике откроется пример на jsbin.

Цитата:

Сообщение от Gozar
и градиент

Тут уже намного сложнее.

Ну вот-с решение на SVG Mask (FIREFOX ONLY). Нажать - откроется пример.


PS Надеюсь, Вы не против того, что я использовал ваш аватар для теста :)

Gozar 15.06.2012 12:55

Цитата:

Сообщение от melky
закруглённые углы? там отражение является точной копией отражаемого элемента, с добавлением ещё одного класса... как мог стиль потеряться?

Исходник такой:

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

B~Vladi 15.06.2012 13:07

Цитата:

Сообщение от Gozar
видно, что должно получиться.

VML же?

melky 15.06.2012 13:17

Цитата:

Сообщение от Gozar (Сообщение 181623)
Исходник такой:

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

Угу. Как-то так :

Было :


Стало (клик-пример):


... для оперы ещё придётся ставить пару свойств для округления картинки, а исчезающий градиент в голове не появляется.

Gozar 15.06.2012 13:27

Цитата:

Сообщение от melky
для оперы ещё придётся ставить пару свойств для округления картинки, а исчезающий градиент в голове не появляется.

Угу, но тема про IE.

Это всё должно работать в IE7, IE8. Я уж молчу про то, что оно должно менять размеры и летать по экрану и не разваливаться на лету. Ну а так, да, че сложного?!

Цитата:

Сообщение от B~Vladi
VML же?

Ась?

B~Vladi 15.06.2012 14:03

Цитата:

Сообщение от Gozar
Ась?

Я не пробовал, но судя по документации это можно сделать в IE через VML. Рисуем прямоугольник нужных размеров со скругленными углами (roundrect
), а внутрь помещаем элемент fill с атрибутом src и type="tile". Так нарисуем верхнее изображение.
Нижнее изображение можно сделать фильтрами (если получится, должно), хотя на счет градиента не уверен. Смотря на каком фоне это всё должно летать.

melky 15.06.2012 15:31

Цитата:

Сообщение от B~Vladi (Сообщение 181632)
Я не пробовал, но судя по документации это можно сделать в IE через VML. Рисуем прямоугольник нужных размеров со скругленными углами (roundrect
), а внутрь помещаем элемент fill с атрибутом src и type="tile". Так нарисуем верхнее изображение.
Нижнее изображение можно сделать фильтрами (если получится, должно), хотя на счет градиента не уверен. Смотря на каком фоне это всё должно летать.

я нижнее сделал тоже через roundrect, и повернул его с помощью BasicImage (aka FlipH) - уголки округляются самым простым образом так, через roundrect.

Как сделать градиент из "элемента" в "прозрачность", я знаю только в случае градиента с цветами. А тут - хз. Но должен быть способ.

B~Vladi 15.06.2012 16:00

Цитата:

Сообщение от melky
я нижнее сделал тоже через roundrect, и повернул его с помощью BasicImage (aka FlipH) - уголки округляются самым простым образом так, через roundrect.

Ну вот, работает.
Цитата:

Сообщение от melky
Как сделать градиент из "элемента" в "прозрачность"

Да никак походу.
Gozar, а можно же заюзать другую картинку внизу для осла? По-любому можно.

devote 15.06.2012 21:46

Цитата:

Сообщение от B~Vladi
devote, тебе открылись тайные знания?

Ага типо того, пока о них не хочу писать, хочу что-то сделать для начала. что бы в пример можно было привести.

B~Vladi 15.06.2012 23:07

Цитата:

Сообщение от devote
Ага типо того

Ух ты, ух ты, ух ты, а что мы сделаем, босс?
© South Park

danik.js 16.01.2015 20:01

devote, хочу перенести htc в js файл. В инете чет инфы не нашел.
Песочница: http://learn.javascript.ru/play/rc5dBb
Тема: Прозрачный полифил атрибута placeholder
Мож че еще подскажешь )

devote 16.01.2015 21:21

danik.js,
для начала позволь задать вопрос... Накой черт тебе это надо? Поддержка ИЕ7? Уж давно пора сказать ИЕ7 бай.

melky 16.01.2015 22:21

Цитата:

Сообщение от devote (Сообщение 351766)
danik.js,
для начала позволь задать вопрос... Накой черт тебе это надо? Поддержка ИЕ7? Уж давно пора сказать ИЕ7 бай.

мало IE7, можно и на IE8 забить

да чего уж там, и IE9 туда же

danik.js 16.01.2015 23:27

devote, для IE8 нужно.

devote 17.01.2015 00:40

Цитата:

Сообщение от danik.js
devote, для IE8 нужно.

HTC нужен был всегда для ИЕ7, так как в нем нету defineProperty, а в ИЕ8 он есть, зачем для ИЕ8 юзать HTC? Или я что-то упустил?

danik.js 17.01.2015 08:20

Мне не defineProperty нужен, а событие вставки узла в DOM:
http://blogs.developpeur.org/fremyco...xplorer-5.aspx

l-liava-l 17.01.2015 21:56

Дедули... даже не понимаю о чем вы говорите :D НТС ШМНТС

kobezzza 17.01.2015 22:00

Цитата:

Сообщение от l-liava-l (Сообщение 351932)
Дедули... даже не понимаю о чем вы говорите :D НТС ШМНТС

:lol:

cyber 17.01.2015 23:37

Цитата:

Сообщение от devote
для начала позволь задать вопрос... Накой черт тебе это надо? Поддержка ИЕ7? Уж давно пора сказать ИЕ7 бай.

ТЫ вон удивляешься, я когда дома был, матери на рабочем пк поставил ие9, так как только в 2014 году компания решила перейти с 8й на 9ю, а в начале года я ставил ие8, так как в начале года они перешли на 8, а в конце на 9. Понятно что это довольно узкий сектор но все же есть те кому это нужно. Конечно там еще те дибилы, говорят типо ставьте вин 9, но эти кретины даже не знают что на xp он не станет без танцев с бубном...

danik.js 23.01.2015 21:34

devote, ну так что? У тебя есть идеи?
Хочу избавиться от htc-файла. Мне нужно событие-аналог DOMNodeInserted в IE8. С htc-файлом все отлично работает. Но я хочу его запихать в скрипт как-нибудь. Неужели это невозможно?
Пробовал через data:uri - облом. Через mhtml - тоже облом. Пробовал через тег <object data="data:{uri}"> - после встраивания не работает. Вдобавок страшилку выдает чета там про activeX.

Пробовал <public:component id="cmp"> встраивать в html - не катит.

Мне бы мож подошел behavior: expression() - но оно не работает в IE8.

danik.js 23.01.2015 21:36

Кстати, посмотрел доки по HTC и понял: да ведь HTML5 Custom Components - это копирка с MS HTC :)
Все новое - хорошо забытое старое.


Часовой пояс GMT +3, время: 04:49.