我的网站使用Google地图。完全加载后,应显示地图本身。这是fadeIn()开始将不透明度从0增加到100%的地方。
由于某种原因,fadeIn()不做任何事情,而fadeTo()对我有用。 我之前使用过fadeIn,但从未见过它的行为方式 - 也许我长时间盯着文档。
var map = new google.maps.Map(document.getElementById('map'),
{
center: {lat: -34.397, lng: 150.644},
zoom: 8
});
google.maps.event.addListenerOnce(map, 'idle', div_fadein);
// Don't invoke callback on *every* map move
function div_fadein()
{
$("#map").fadeTo(600, 1); // <-- Works
//$("#map").fadeIn(800); // <-- Doesn't work
}
#map
{
height: 350px;
width: 500px;
border: 1px solid black;
opacity: 0;
filter: alpha(opacity=0); /* For IE8 and earlier */;
}
<div id="map"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDAyvHRW1gtIv3XOjSWN_Gngb9tz2cNJjs"></script>
答案 0 :(得分:2)
看起来fadeIn工作它依赖于display none来设置。所以因为动画后的最终结果不是opacity = 1;你的div仍然不可行。
在使用fadeIn动画结束时,显示设置为阻止,这将正确显示您的div。你有什么理由不能使用fadeTo吗?
答案 1 :(得分:2)
区别在于这两个函数如何处理div元素的显示属性。
FadeTo:首先显示元素,然后显示动画
return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
// Animate to the value specified
.end().animate( { opacity: to }, speed, easing, callback );
FadeIn:显示元素和动画
jQuery.fn[ name ] = function( speed, easing, callback ) {
return this.animate( props, speed, easing, callback );
};
来源:https://github.com/jquery/jquery/blob/731c501155ef139f53029c0e58409b80f0af3a0c/src/effects.js
Google地图应该以可见元素显示,否则会显示意外行为,这就是FadeIn的情况。
答案 2 :(得分:1)
来吧:) 你只想淡出一个元素; 它是2017年!
多年来,我们不再需要用js完成那些非常简单的任务。当然,在某些情况下,您应该使用js(-frameworks,-libraries,-platforms),但前提是它是关于具有复杂序列和/或广泛用户交互功能的细粒度设置。如果您遇到这样的情况:不要将jQuery用于动画部分!对于复杂的动画内容,您可以使用GSAP(喜欢它并大量使用它),Velocity.js或任何专为动画设计的内容。
jQuery很棒(例如Deffered / Promise和Ajax的东西,我也经常使用jQuery.type())但它从来没有被设计成在动画中做一个至少非常好的工作({{3 }})。但回到主题:
所以让我们重建(只是一个粗略的模型,请参阅下面的opacity或代码段):
<!-- states are: transparent and opaque -->
<div id="map" class="state state--off"></div>
<!-- compare to <div id="map" class="state state--on"></div> -->
/* the different states | please consider how reusable this is */
.state {
-webkit-transition: all 2s ease-in-out;
transition: all 2s ease-in-out;
}
.state.state--off {
opacity: 0; /* WYSIWYG */
}
.state.state--on {
opacity: 1; /* very clean and straight forward */
}
几乎就是这样。
// BTW: no jQuery dependency and no styling at all as well
var domMap = document.getElementById('map'); // cache DOMelement
google.maps.event.addListenerOnce( // listen once!
new google.maps.Map(
domMap,
{ center: {lat: -34.397, lng: 150.644}, zoom: 8 }
),
'idle',
function() { // toggle state in anonymous callback function
domMap.className = 'state state--on';
}
);
var domMap = document.getElementById('map');
google.maps.event.addListenerOnce(
new google.maps.Map(
domMap,
{ center: {lat: -34.397, lng: 150.644}, zoom: 8 }
),
'idle',
function() { // callback
domMap.className = 'state state--on';
/* the jQuery way: $(domMap).attr('class', '') or
* $(domMap).toggleClass('state--on state--off')
* the latter would be a good one for a generic no brainer toggle function
* function toggleState( sSelector ) {
* return $(sSelector).toggleClass('state--on state--off');
* }
* and then one can call toggleState('#map')
*/
}
);
&#13;
#map {
border: 1px solid black;
height: 350px;
width: 500px;
}
.state {
-webkit-transition: all 2s ease-in-out;
transition: all 2s ease-in-out;
}
.state.state--off {
opacity: 0; /* very clean and straight forward */
}
.state.state--on {
opacity: 1; /* WYSIWYG */
}
&#13;
<div id="map" class="state state--off"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDAyvHRW1gtIv3XOjSWN_Gngb9tz2cNJjs"></script>
&#13;
(93.59%)至少对于这个特别的人来说,忘记这一点。不支持的浏览器
css3 transition
会给出imidiate响应而不是动画响应,这也很好。如果您想提供后备,您可以使用Can I use?检测其是否为nessecary,并提供js后备。如果你这样做:保持简单,也许会寻找一些(不是很多)强大的工具,你可以随着时间的推移处理。如果你想用jQuery动画,那么试试:
$('#map').animate({opacity: 1}, 2000)
!像魅力一样 - 见下面的片段。
var domMap = document.getElementById('map');
google.maps.event.addListenerOnce(
new google.maps.Map(
domMap,
{ center: {lat: -34.397, lng: 150.644}, zoom: 8 }
),
'idle',
function() { // callback
$( domMap ).animate({ opacity: 1}, 2000 )
}
);
&#13;
#map {
border: 1px solid black;
height: 350px;
opacity: 0;
width: 500px;
}
&#13;
<div id="map"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDAyvHRW1gtIv3XOjSWN_Gngb9tz2cNJjs"></script>
&#13;
不要浪费你的时间来弄清楚如何处理某些通用功能的实现。另外对我来说很难调试这个jQuery fadeIn --fadeTo实现!
所以下次只设计一个元素的状态。给它一个合适的类名,然后设计你的下一个状态,命名它。并通过js切换这些状态。这适用于很多用例!
首选的解决方案是elegenat,简单,易于理解和可维护。如果你发现自己是黑客,那就休息一下,然后尝试回归基础。
var $map = $("#map"); // cache element
google.maps.event.addListenerOnce( // listen once!
new google.maps.Map(
$map[0],
{ center: {lat: -34.397, lng: 150.644}, zoom: 8 }
),
'idle',
function() { // callback
$("#map")
.css({display: 'none', opacity:1}) // this line is so hacky that it hurts
.fadeIn(1800);
}
);
&#13;
#map {
height: 350px;
width: 500px;
border: 1px solid black;
opacity: 0;
filter: alpha(opacity=0); /* For IE8 and earlier */;
}
&#13;
<div id="map"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDAyvHRW1gtIv3XOjSWN_Gngb9tz2cNJjs"></script>
&#13;