2017-07-06 113 views
0

我試圖結合兩個世界的最佳,並完成什麼固定定位時,當你設置top: 0(附加到視口的頂部),同時保持元素絕對定位,使它滾動水平地與其父元素(這與固定這是有問題的)。修復絕對定位元素到視口頂部的滾動

趕上這是一個表頭,所以試圖破解我的方式通過嵌套divs設置爲不同的定位方法將無法在這裏工作。

我目前嘗試是保持表頭用的absolute的位置而計算所述表的頂部的距離視口的頂端的滾動事件偵聽器內:

const distanceToTop = this.headerElement.getBoundingClientRect().top; 
this.stickyHeaderElement.style.top = `${Math.abs(distanceToTop)}px`; 

this.headerElement是原始表格標題,您可以滾動過去(不執行任何操作),而stickyHeader實例是發生冒煙的鏡像的位置。

這個電流的方法是做我想要的它... 然而,當你滾過原始表頭和粘實例附加是令人難以置信的,因爲哈克,粘頭搖因爲所有的DOM操作發生的每事件監聽器觸發的時間。

因爲它是用上面的邏輯重新計算的。

問:我可以有一個絕對定位的表頭元素也添加到視象固定定位允許的頂部?那裏有更高效的解決方案嗎?

+0

我相信你正在尋找的字是 「** **粘」。已經有很多的例子和解決方案,只是搜索它:) – Terry

+0

如果我明白你要找的是什麼,你可以添加'position:fixed',一旦元素的頂部位於頂部視口(或任何你想要觸發效果的地方)。 – ingridly

+0

@ingridly是的,問題是,當位置設置爲固定並且水平滾動時,附加的表頭不會隨其餘內容一起滾動。絕對定位**不允許表格標題與內容水平滾動。棘手的情況。 – Jose

回答

1

這是你要什麼?

let fixed = document.getElementById('fixed'); 
 

 
window.addEventListener("scroll", e => window.requestAnimationFrame(() => { 
 
    fixed.style.marginLeft = -1 * window.scrollX + "px"; 
 
}));
#fixed { 
 
    position: fixed; 
 
    background-color: white; 
 
} 
 

 
#unfixed { 
 
    color: white; 
 
}
<link href="//cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css" rel="stylesheet"/> 
 
<div> 
 
    <table> 
 
    <thead> 
 
     <tr id="fixed"> 
 
     <td>foo</td> 
 
     <td>bar</td> 
 
     <td>baz</td> 
 
     <td>fibble</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>ffft</td> 
 
     </tr>  
 
     <tr id="unfixed"> 
 
     <td>foo</td> 
 
     <td>bar</td> 
 
     <td>baz</td> 
 
     <td>fibble</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>meow</td> 
 
     <td>ffft</td> 
 
     </tr> 
 
    </thead> 
 
    <tbody> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
     <tr> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     <td>6</td> 
 
     <td>7</td> 
 
     <td>8</td> 
 
     <td>9</td> 
 
     <td>10</td> 
 
     <td>1</td> 
 
     <td>2</td> 
 
     <td>3</td> 
 
     <td>4</td> 
 
     <td>5</td> 
 
     </tr> 
 
    </tbody> 
 
    </table>

+0

今天你贏了互聯網,先生。 – Jose

0

使用位置:固定時,粘滯標頭很簡單。

#header_container { 
 
    background: green; 
 
    height: 60px; 
 
    left: 0; 
 
    position: fixed; 
 
    width: 100%; 
 
    top: 0; 
 
} 
 

 
#header { 
 
    line-height: 60px; 
 
    margin: 0 auto; 
 
    width: 100%; 
 
    text-align: center; 
 
} 
 

 
#container { 
 
    margin: 0 auto; 
 
    overflow: auto; 
 
    padding: 80px 0; 
 
    width: 100%; 
 
} 
 

 
#content { 
 
    height: 500px; 
 
}
<div id="header_container"> 
 
    <div id="header"> 
 
    Header Content 
 
    </div> 
 
</div> 
 

 
<div id="container"> 
 
    <div id="content"> 
 
    Content Here 
 
    </div> 
 
</div>

+0

並不那麼簡單。如果您閱讀我的問題,我不打算只將一個元素附加到視口的頂部。這很簡單。問題是保持這種行爲,同時** ALSO **將附加標題與表格的其餘部分橫向滾動**。有一個固定位置的東西不允許你這樣做。 – Jose

相關問題