jjzjj

javascript - 进行图像翻转的最佳方法?

coder 2025-02-02 原文

我希望将鼠标悬停时更改主徽标。

我知道有几种方法可以实现此目的,并且想知道哪种方法最稳定,浏览器兼容,效率更高,易于设置的最佳方法。

我发现的一些方法是:

  • 用Javascript(jQuery)替换“src”属性。
  • CSS使用背景和“悬停”

  • 还有吗
    什么才好

    最佳答案

    底线

    对于内容丰富的图像,您希望在HTML标记中包含src。您要使用Javascript解决方案,并将过渡图像放在属性中。

    对于无内容的图像UI元素,尤其是在站点中常见或重复的图像UI元素,最好使用直接的CSS解决方案(因此您不必在每次调用时都重新声明图像位置)。在CSS解决方案中, Sprite 是最好的,因为它们不需要预加载开销。

    Javascript解决方案

    HTML:

    <img src="/img/one.jpg" data-rollover="/img/two.jpg" />
    

    在jQuery中:
    $(function(){
      $('img.rollover').hover(function(){
        var e = $(this);
        e.data('originalSrc', e.attr('src'));
        e.attr('src', e.attr('data-rollover'));
      }, function(){
        var e = $(this);
        e.attr('src', e.data('originalSrc'));
      }); /* a preloader could easily go here too */
    });
    

    示例实现:http://jsfiddle.net/dtPRM/1/

    好处:很简单;这说得通;建立资料库后,它以最少的额外标记工作。

    缺点:需要Javascript和加载jQuery库的开销。

    可能是最好的选择。 如果您的用户使用的是与过渡相关的浏览器(可能是这种情况),那么他们就具有运行此选项的Javascript功能。如果您留下一点<noscript>注释说他们可能无法获得完整的功能集,则出于某种原因而故意关闭Java的人们会有所提示。

    CSS解决方案:最佳

    HTML:
    <div id="img1" />
    

    CSS:
    div#img1 {
      height: 400px;
      width: 300px;
      background: url('http://dummyimage.com/600x400/000/fff') no-repeat top left;}
    div#img1:hover {
      background-position: top right;}
    

    示例实现:http://jsfiddle.net/dtPRM/5/

    就个人而言,我认为对于内容丰富的图像,这比CSS +两个背景图像解决方案更为糟糕。您正在将HTML标记与显示的语义值分开。

    但是,如果您使用的是无内容的图像(例如UI元素),这是我认为的最佳解决方案。

    CSS解决方案:也可以

    另一个不涉及背景图像的CSS选项可用(如果要在HTML中包含图像标签,例如在语义上有意义的图像中,则在CSS解决方案中首选)。
    <div class="rollover">
      <img class="rollover" src="http://dummyimage.com/600x400/000/fff" />
      <img class="" src="http://dummyimage.com/600x400/fff/000" />
    </div>
    

    CSS(我在这里使用:not伪选择器,但是很容易避免使用它;我还认为我从语义上向后获得了类名):
    div.rollover img:not(.rollover) {display: none;}
    div.rollover:hover img:not(.rollover) {display: inline;}
    div.rollover:hover img.rollover {display: none;}
    

    示例实现:http://jsfiddle.net/dtPRM/2/

    好处:与以前的将所有信息置于样式表中的CSS解决方案相比在语义上是明智的。

    缺点:需要多余的标记。

    评论:这可能会自动预加载,具体取决于浏览器是否要求它。

    底线:如果您因为绝对需要IE2兼容性或非JS支持而无法使用选项(1),则可以进行适当的回退。

    CSS解决方案:远离

    我之所以提及这一点,仅是因为您在问题中提到了这一点。我不会用

    HTML:
    <div id="img1" />
    

    CSS:
    div#img1 {
      height: 400px;
      width: 600px;
      background: url('http://dummyimage.com/600x400/000/fff') no-repeat top left;}
    div#img1:hover {
      background-image: url('http://dummyimage.com/600x400/fff/000');}
    

    示例实现:http://jsfiddle.net/dtPRM/4/

    好处:广泛兼容;您真正需要支持的只是背景图片和悬停。

    缺点:在语义上很奇怪,无法将图像放入CSS并将其集中到那里。使将来的修改更加困难。话虽这么说,如果您有一个需要提供过渡图像的场景,则很有可能是非内容图像(例如,UI元素),在这种情况下,CSS在语义上(也许)比在内容上更合适。常规图像。请参阅下面有关 Sprite 的注释。

    其他缺点:您必须小心声明图像的高度和宽度(无论如何,这都是一个好习惯,但是当您只想把事情做好时,可能会很麻烦)。在移动浏览器上查看的用户可能会异常处理CSS背景图像。

    甚至还有更多缺点:如果您想在其上放置一个预加载器,则将使用Javascript,并以某种方式选择可翻转的元素,以这种速率,您最好将Javascript用于所有内容。

    底线:请勿将其用于内容丰富的图像。如果您必须远离Javascript,请对用户界面元素使用 Sprite ,对语义上有意义的图像使用替代解决方案。

    关于javascript - 进行图像翻转的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4260080/

    有关javascript - 进行图像翻转的最佳方法?的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    5. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

      我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

    6. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

      在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

    7. Ruby 方法() 方法 - 2

      我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

    8. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    9. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

      我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

    10. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    随机推荐