2016-08-08 101 views
1

我正在嘗試創建一個側欄,當用戶單擊某個按鈕時它將滑入並顯示內容。在不移動相鄰內容的情況下滑動div

我遇到的問題是當它點擊標題上的所有內容時,正文和頁腳正在移動。

我想滑動div來點擊時無需移動它的菜單和內容上滑動,創造一個覆蓋

檢查小提琴http://jsfiddle.net/livewirerules/tsmpraym/9/

下面是我到目前爲止已經試過

jQuery(document).ready(function($) { 
 
    $("#side").click(function() { 
 
     $('#slidable').animate({ 
 
      width: 'toggle' 
 
     }); 
 
    }); 
 
})
#menu { 
 
    background-color: green; 
 
    height: 100px; 
 
} 
 

 
#footer { 
 
    background-color: blue; 
 
    height: 100px; 
 
} 
 

 
#content { 
 
    background-color: red; 
 
    height: 400px; 
 
} 
 

 
#side { 
 
    float: left; 
 
    width: 50px; 
 
    height: 50px; 
 
    background: #BBB; 
 
} 
 

 
.hide { 
 
    display: none; 
 
} 
 

 
#slidable { 
 
    float: left; 
 
    height: 200px; 
 
    background: #888; 
 
    width: 200px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script> 
 
<div id="slidable" class="hide">Foobar</div> 
 
<div id="side">+</div> 
 

 
<div id="menu"> 
 
    the menu 
 
</div> 
 
<div id="content"> 
 
    content 
 
</div> 
 

 
<div id="footer"> 
 
    the footer 
 
</div>

+1

爲此,您可以設置絕對的滑動元件的位置。看看這裏:http://jsfiddle.net/tsmpraym/12/ –

回答

2

jQuery(function($) { // yep. DOM ready 
 
    
 
    $("#side").click(function() { 
 
    $('#slidable').toggleClass("open"); 
 
    }); 
 
    
 
})
body{margin:0;} /* yey? */ 
 

 
#menu { 
 
    background-color: green; 
 
    height: 100px; 
 
} 
 
#footer { 
 
    background-color: blue; 
 
    height: 100px; 
 
} 
 
#content { 
 
    background-color: red; 
 
    height: 400px; 
 
} 
 
#side { 
 
    /*float: left; huh? */ 
 
    position:absolute; /* add this */ 
 
    left:100%;   /* add this */ 
 
    width: 50px; 
 
    height: 50px; 
 
    background: #BBB; 
 
} 
 
/*.hide { display: none;} */ 
 
#slidable { 
 
    /*float: left; why but why */ 
 
    position: fixed; /* add this */ 
 
    top:0; 
 
    height: 100vh; 
 
    background: #888; 
 
    width: 200px; 
 
    right: 100%; /* add this */ 
 
    transition: 0.4s; 
 
} 
 
#slidable.open{ 
 
    right: calc(100% - 200px); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script> 
 

 
<div id="slidable"> 
 
    Foobar 
 
    <div id="side">+</div> 
 
</div> 
 

 

 
<div id="menu"> 
 
    the menu 
 
</div> 
 
<div id="content"> 
 
    content 
 
</div> 
 

 
<div id="footer"> 
 
    the footer 
 
</div>

+0

上述代碼的一個問題是,現在絕對的「side」按鈕將編碼「menu」div中的任何內容:http://jsfiddle.net/tsmpraym/30/ –

+0

@ ErikUggeldahl你最好像我一樣絕對地使用它,並以不同的方式處理內容間距。 –

1

你應該把位置絕對和保持availab也可以使用切換按鈕。

jQuery(document).ready(function($) { 
 
    $("#side").click(function() { 
 
    $('#slidable').animate({width: 'toggle'}); 
 
    $('#side').toggleClass('keepRight'); 
 
     }); 
 
    })
#menu { 
 
    background-color:green; 
 
    height:100px; 
 
} 
 

 
#footer { 
 
    background-color:blue; 
 
    height:100px; 
 
} 
 

 
#content { 
 
    background-color:red; 
 
    height:400px; 
 
} 
 
#side{ 
 
    float:left; 
 
    width:50px; 
 
    height:50px; 
 
    background:#BBB; 
 
    transition: all .5s; 
 
    transition-timing-function: swing; 
 
} 
 
.keepRight{ 
 
    margin-left: 200px; 
 
    transition: all .5s; 
 
    transition-timing-function: swing; 
 
} 
 

 
.hide{ 
 
    display:none; 
 
} 
 

 
#slidable{ 
 
    float:left; 
 
    height:200px; 
 
    background:#888; 
 
    width:200px; 
 
    position: absolute; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> 
 
<div id="slidable"class="hide">Foobar</div> 
 
<div id="side">+</div> 
 
<div id="menu"> 
 
the menu 
 
</div> 
 
<div id="content"> 
 
content 
 
</div> 
 
    <div id="footer"> 
 
    the footer 
 
    </div>

+0

這是一個有點馬虎,按鈕滑動速度不同於菜單。嘗試將按鈕放在菜單Div內,給它一個絕對定位和一個負的右邊緣(或負的「右」位置),使它們一起滑動,而不必分別爲按鈕設置動畫。 – SeanKendle

+1

@SeanKendle,我知道。我只是展示瞭解決方案的核心。當然,他會使用他的過渡類型和時間。當然,這可以通過其他方式完成。主要觀點是絕對位置 – Mojtaba

+0

因爲有第一個「絕對定位」答案而被投票,儘管其他答案以更清晰的方式接近菜單按鈕動畫 - 這在OP的問題範圍之外。乾杯! – SeanKendle

1

CSS屬性position:absolute;將菜單位置絕對在其他元素之上。這樣它就不會重新流動它下面的元素的內容。

http://www.w3schools.com/css/css_positioning.asp

然而,在你的榜樣,這會抵消用於打開它的按鈕。您可能想要添加一個內部按鈕來關閉它。

我已經更新您的jsfiddle:

<div id="slidable"class="hide">Foobar<div id="close">+</div></div> 

您可以通過附加其ID相同屬性添加到它(或重構爲:

格您可以添加其他關閉按鈕,裏面的菜單一個共同的階級,而不是ID):

#side, #close{ 
    float:left; 
    width:50px; 
    height:50px; 
    background:#BBB; 
} 

爲了讓掛完的一面,你可以把它帶負權值絕對定位:

#close { 
    position: absolute; 
    top:0px; 
    right:-50px; 
} 

關閉按鈕也需要觸發切換:

jQuery(document).ready(function($) { 
    $('#side').click(function() { 
    $('#slidable').animate({width: 'toggle'}); 
    }); 
    $('#close').click(function() { 
    $('#slidable').animate({width: 'toggle'}); 
    }); 
}); 
+1

我通常允許用戶在菜單打開時單擊頁面中的任何其他位置關閉它。似乎是一個受歡迎的功能,因爲大多數菜單都遵循該方法。只是一個建議!^_^ – SeanKendle

+0

我在寫這篇文章的時候也是這麼想的,我同意,這往往是一種很好的方法。 似乎這是一個解決方案:http://stackoverflow.com/questions/9992368/html-click-anywhere-except-one-element –

+0

我通常與身體上的點擊事件關閉菜單,一個'對任何我不想關閉菜單的元素使用e.stopPropagation()方法。乾杯! – SeanKendle