2016-04-19 3 views
1

У меня есть интерактивное изображение (логотип), которое я хочу определить в HTML (а не в CSS), поскольку это логотип, который находится в меню, должен быть масштабирован с текстом, а также является смысловой частью содержимого.Как я могу избежать мерцания при изменении изображения для другого с помощью MouseEvent?

Я хочу, чтобы изменить на парения так:

<img src="logo.svg" 
    onmouseover="this.src='logo_hover.svg'" 
    onmouseout="this.src='logo.svg'"> 

Проблема заключается в том, что меню и логотип мерцает, когда я парить изображение. Это не всегда происходит, но, похоже, это связано с тем, что требуется немедленное масштабирование нового изображения. У меня есть width: 100% на логотипе и width: 5em, установленных на div, который его удерживает.

Как я могу избежать этого мерцания? Должен ли я задать как ширину, так и высоту изображения, если да, то как мне узнать, какую высоту должно иметь изображение? Или есть ли другой способ избежать «удивления» браузера при загрузке нового изображения?


Что я triend до сих пор:

Я уже пытался поджать изображение с JavaScript, а также с <link rel='prefetch'> тегом, но мерцающие все еще происходит.

+0

Почему css не подходит? Вы можете использовать изображение и установить его как фоновое изображение div. Это изображение будет слишком большим и будет содержать фотографии, которые вы хотите отобразить. Вы должны контролировать видимую часть с помощью css, с помощью функций mouseover/mouseout, просто изменяя смещение изображения, показанного в левом верхнем углу. Поскольку у вас есть только одно изображение, оно всегда будет загружено (загрузка происходит из-за вашего фликкера) и может измениться смещение в мгновение ока. (Вот как SO делает свои значки - они находятся в одном файле) – enhzflep

+0

@enhzflep Очень хорошая идея, но я думаю, что еще правильнее сохранить изображение, определенное в '', что вы думаете? См. Мое редактирование выше для размышлений вокруг этого. – PetaspeedBeaver

+1

Ну, я видел, как обычно используется трюк. Он используется по нескольким причинам (0), чтобы сократить количество запросов на сервер (1), чтобы сократить переданные переданные байты, поскольку вам нужно отправить только один заголовок изображения (2), он помогает сохранить все ваши изображения вместе (3) он избегает мерцания, так как 2-е изображение, как гарантируется, уже загружено (4), вы можете добиться дополнительной экономии полосы пропускания, так как есть больше шансов получить хорошее сжатие на изображении. Если вы перейдете на страницу http://cdn.sstatic.net/Sites/stackoverflow/img/sprites.svg?v=bc7c2f3904bf, вы можете увидеть один из spritemaps SO. – enhzflep

ответ

1

Основываясь на том, как вы пытаетесь это сделать, я бы настоятельно советовал против этого подхода, поскольку вы можете фактически манипулировать свойствами SVG, используя только CSS для состояния зависания.

Что вы меняете на логотипе - если я могу спросить?

Если бы это был случай цветов и т. Д., Вы могли бы использовать подход встроенного SVG-кода непосредственно в свой HTML-код, а затем использовать CSS для применения цветов и т. Д. Затем это позволит вам редактировать эти свойства CSS для состояния зависания , Проблема с использованием SVG с помощью тега img - вы не можете редактировать свои свойства, о чем я уверен, что вы знаете.

, для примера - это SVG логотип:

<svg version="1.1" id="my-Logo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
    viewBox="0 0 140.9 36.1" xml:space="preserve"> 
<g> 
    <path d="M0,35.8v-35h7.8v28h14.9v7H0z"/> 
    <path d="M56.9,30.9c-3.5,3.5-7.9,5.2-13.1,5.2c-5.2,0-9.5-1.7-13-5.2c-3.5-3.4-5.3-7.7-5.3-12.9c0-5.1,1.8-9.4,5.3-12.9 
     c3.5-3.4,7.9-5.2,13-5.2c5.2,0,9.5,1.7,13.1,5.2c3.5,3.5,5.3,7.7,5.3,12.9C62.1,23.2,60.4,27.5,56.9,30.9z M54.2,18.1 
     c0-3.1-1-5.8-3-8c-2-2.2-4.5-3.3-7.4-3.3c-2.9,0-5.4,1.1-7.4,3.3c-2,2.2-3,4.9-3,8c0,3.1,1,5.8,3,7.9c2,2.2,4.5,3.3,7.4,3.3 
     c2.9,0,5.4-1.1,7.4-3.3C53.2,23.8,54.2,21.2,54.2,18.1z"/> 
    <path d="M91.4,18h7.9v12.4c-3.5,3.9-8.3,5.8-14.4,5.8c-5.1,0-9.4-1.7-12.9-5.1c-3.5-3.4-5.2-7.7-5.2-12.9c0-5.2,1.8-9.5,5.3-13 
     S79.9,0,84.9,0c5,0,9.4,1.6,13.1,5l-4,5.8c-1.6-1.4-3-2.3-4.3-2.8c-1.3-0.5-2.7-0.8-4.3-0.8c-3,0-5.5,1-7.5,3c-2,2-3,4.7-3,8 
     c0,3.3,1,5.9,2.9,7.9c2,2,4.3,3,7,3s5-0.5,6.8-1.6V18z"/> 
    <path d="M135.6,30.9c-3.5,3.5-7.9,5.2-13.1,5.2c-5.2,0-9.5-1.7-13-5.2c-3.5-3.4-5.3-7.7-5.3-12.9c0-5.1,1.8-9.4,5.3-12.9 
     c3.5-3.4,7.9-5.2,13-5.2c5.2,0,9.5,1.7,13.1,5.2c3.5,3.5,5.3,7.7,5.3,12.9C140.9,23.2,139.2,27.5,135.6,30.9z M133,18.1 
     c0-3.1-1-5.8-3-8c-2-2.2-4.5-3.3-7.4-3.3c-2.9,0-5.4,1.1-7.4,3.3c-2,2.2-3,4.9-3,8c0,3.1,1,5.8,3,7.9c2,2.2,4.5,3.3,7.4,3.3 
     c2.9,0,5.4-1.1,7.4-3.3C132,23.8,133,21.2,133,18.1z"/> 
</g> 
</svg> 

CSS для изменения парения цвета:

#my-Logo{ 
    fill: orange; 
} 

#my-Logo:hover{ 
    fill: red; 
} 

Вы имеете гораздо больше гибкости, если вы хотите редактировать/манипулировать свойства SVG с помощью этого метода что может избежать некоторых чрезмерно запутанных javascript магов shazaam.

Live Example

+0

Да, это лучший метод, я пробовал этот подход, но имел некоторые проблемы с совместимостью с некоторыми не столь старыми версиями IE. Но, возможно, мне все равно придется пойти на это и просто признать, что логотип не меняется на некоторых IE ... – PetaspeedBeaver

+0

Предполагаю, что, возможно, IE8? Вы всегда можете просто использовать резервную копию и отображать нечто иное, чем SVG, если это соответствует требованиям вашего проекта. – Doidgey

+1

** Все ответы - очень хорошие предложения **, но я лично поеду для этого и, если нужно, воспользуюсь [Modernizr] (https://en.wikipedia.org/wiki/Modernizr), чтобы перейти на png для IE что имеет проблемы с изменением цвета на svg. – PetaspeedBeaver

0

Мерцание, вероятно, связано с тем, что новое изображение не было загружено, поэтому оно не начинает загружаться до момента установки атрибута src атрибута тега img. Поэтому, чтобы избежать этого, вы предварительно загрузите новое изображение с помощью javascript.

Если вы хотите знать, как сделать это вы можете проверить этот ответ: Load Image from javascript

Но лучшее решение для переключения изображения на парении бы поместить оба изображения в spritesheet, установить изображение в качестве фона div, span, a и т. д. и используйте положение фона CSS, чтобы наведите указатель мыши на часть изображения, как показано здесь: https://stackoverflow.com/a/19967062/1768033

1

Если это вопрос изображения, которое не загружается, когда вы наведите объект на объект, вам нужно предварительно загрузить изображение. Вы можете сделать это по-разному.

Вы можете сделать это без единого бита CSS, добавив изображение еще в самом конце своей страницы и установите для этого дубликата ширину и высоту 0. Я предлагаю «конец страницы», потому что вы, вероятно, сначала хотите, чтобы видимые биты вашей страницы загружались. Если вы поместите его в начале, время загрузки видимых битов страницы может занять немного больше времени, но для опрокидывания не требуется, чтобы страница была полностью загружена для работы.

<img src="myimage_onhover.png" height="0" width="0" /> 

Таким образом, браузер имеет изображение в кеше, хотя оно не отображается.

Так что, если у вас есть изображение, как:

<img src="myimage.png" onmouseover="this.src='myimage_onhover.png'" [...] /> 

Когда пользователь наводит курсор на изображение, браузер должен получать изображение кэша, который уже был загружен на этой же странице загрузки.