2017-12-13 109 views
6

Tôi đang sử dụng thuộc tính CSS resize:both; để cho phép người dùng thay đổi kích thước nội dung của tôi. Xem mã bên dưới.Đổi kích thước theo giá trị cố định bằng cách sử dụng CSS

.foo { 
 
    resize: both; 
 
    min-width: 250px; 
 
    width: auto; 
 
    text-align: center; 
 
    min-height: 30px; 
 
    border: 1px solid #515151; 
 
    border-radius: 6px; 
 
    position: absolute; 
 
    padding: 0; 
 
    overflow: hidden; 
 
    text-shadow: 1px 1px 1px rgba(0,0,0,0.33); 
 
    box-shadow: 5px 5px rgba(0,0,0, 0.1); 
 
} 
 
.thClass { 
 
    margin-left: -3px; 
 
    text-align: center; 
 
    box-shadow: 0 2px 2px rgba(0,0,0,0.26); 
 
    -webkit-box-shadow: 0 2px 2px rgba(0,0,0,0.26); 
 
    -moz-box-shadow: 0 2px 2px rgba(0,0,0,0.26); 
 
    margin-top: -2px; 
 
    min-height: 30px; 
 
    line-height: 30px; 
 
    font-size: 19px; 
 
    cursor: move; 
 
} 
 
.header{ 
 
    margin-left: 17px; 
 
} 
 
.tableBody { 
 
    display: block; 
 
    min-height: 25px; 
 
    text-align: center; 
 
    width: 102%; 
 
    margin-left: -2px; 
 
    cursor: default; 
 
} 
 
.foo tbody tr td { 
 
    display: block; 
 
    line-height: 25px; 
 
    text-align: center; 
 
    border-bottom: 1px solid rgba(0,0,0,0.2); 
 
} 
 
#displaySizes { 
 
    list-style: none; 
 
    padding: 0; 
 
    margin-top: 0; 
 
} 
 
.disp tbody tr th { 
 
    border: 1px solid black; 
 
} 
 
.disp tbody tr td { 
 
    display: table-cell; 
 
}
<table class="foo disp elementTable"> 
 
       <tr class="tableHeader"> 
 
        <th class="thClass" colspan="5"> 
 
         <span class="header">Device</span> 
 
        </th> 
 
       </tr> 
 
       <tr> 
 
        <td rowspan="4" id="sizeContainer"> 
 
         <ul id="displaySizes"> 
 
          <li>4:3</li> 
 
          <li>16:9</li> 
 
          <li>Clock</li> 
 
         </ul> 
 
        </td> 
 
        <td>$100</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
       </tr> 
 
       <tr> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
       </tr> 
 
       <tr> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
       </tr> 
 
       <tr> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
       </tr> 
 
      </table>

Có cách nào để thay đổi kích thước bước bảng này bằng cách sử dụng CSS bước, ví dụ, bằng cách [10,10] pixel? JavaScript cũng OK. Tôi đã tìm kiếm trên web nhưng không thể tìm thấy bất kỳ thứ gì. Đây là cách làm việc fiddle để bạn có thể chơi với mã.

+3

Bạn muốn bảng để thay đổi kích thước với tốc độ thiết lập khác hơn so với chuyển động kéo của người sử dụng? Nếu như vậy sẽ gây nhầm lẫn như ballz cho người dùng vì nó sẽ có vẻ như thay đổi kích thước là tụt hậu nếu nó không đồng bộ với chuyển động kéo của người dùng. – Nope

+0

@Fran Đồng ý, điều đó có vẻ lạ. Nhưng lý do tôi muốn làm điều này là tôi sẽ có một mạng lưới, và tôi không muốn các bảng này làm hỏng tầm nhìn. Vì vậy, nếu lưới của tôi là ví dụ 100x100 pixel, tôi sẽ đặt bước [100,100] và lưới sẽ đẹp hơn. –

+5

Tôi nghĩ bạn đã làm cho nó hoạt động tốt, đặc biệt là từ quan điểm của người dùng. Nếu bạn muốn chụp lại kích thước sau đó chụp kích thước * sau * thay đổi kích thước, thay vì trong quá trình. Điều đó sẽ trông đẹp hơn rất nhiều cho người sử dụng và cũng cung cấp cho bạn những gì bạn đang sau. – Archer

Trả lời

2

Đó là một điểm tốt, Vì vậy, Có thể sử dụng css-element-queries Thư viện, Tất cả bạn phải đang tạo ra một ResizeSensor() cho bảng của bạn và sau đó hãy tính toán để đặt cả chiều cao và thay đổi phạm vi rộng:

Xem dưới đây Snippet:

var width = $('.elementTable').width(); 
 
var height = $('.elementTable').height(); 
 
var changePX = 50; 
 

 

 
new ResizeSensor(jQuery('.elementTable'), function(){ 
 

 
    //width calcuation 
 
    if(Math.abs($('.elementTable').width()-width) > changePX) { 
 
     $('.elementTable').width() > width ? width +=changePX : width -=changePX; 
 
    } 
 
    $('.elementTable').width(width); 
 
    
 
    //height calcuation 
 
    if(Math.abs($('.elementTable').height()-height) > changePX) { 
 
     $('.elementTable').height() > height ? height +=changePX : height -=changePX; 
 
    } 
 
    $('.elementTable').height(height); 
 
    
 
})
.foo { 
 
    resize: both; 
 
    min-width: 250px; 
 
    width: auto; 
 
    text-align: center; 
 
    min-height: 30px; 
 
    border: 1px solid #515151; 
 
    border-radius: 6px; 
 
    position: absolute; 
 
    padding: 0; 
 
    overflow: hidden; 
 
    text-shadow: 1px 1px 1px rgba(0,0,0,0.33); 
 
    box-shadow: 5px 5px rgba(0,0,0, 0.1); 
 
} 
 
.thClass { 
 
    margin-left: -3px; 
 
    text-align: center; 
 
    box-shadow: 0 2px 2px rgba(0,0,0,0.26); 
 
    -webkit-box-shadow: 0 2px 2px rgba(0,0,0,0.26); 
 
    -moz-box-shadow: 0 2px 2px rgba(0,0,0,0.26); 
 
    margin-top: -2px; 
 
    min-height: 30px; 
 
    line-height: 30px; 
 
    font-size: 19px; 
 
    cursor: move; 
 
} 
 
.header{ 
 
    margin-left: 17px; 
 
} 
 
.tableBody { 
 
    display: block; 
 
    min-height: 25px; 
 
    text-align: center; 
 
    width: 102%; 
 
    margin-left: -2px; 
 
    cursor: default; 
 
} 
 
.foo tbody tr td { 
 
    display: block; 
 
    line-height: 25px; 
 
    text-align: center; 
 
    border-bottom: 1px solid rgba(0,0,0,0.2); 
 
} 
 
#displaySizes { 
 
    list-style: none; 
 
    padding: 0; 
 
    margin-top: 0; 
 
} 
 
.disp tbody tr th { 
 
    border: 1px solid black; 
 
} 
 
.disp tbody tr td { 
 
    display: table-cell; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/css-element-queries/0.4.0/ResizeSensor.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/css-element-queries/0.4.0/ElementQueries.min.js"></script> 
 
<table class="foo disp elementTable"> 
 
       <tr class="tableHeader"> 
 
        <th class="thClass" colspan="5"> 
 
         <span class="header">Device</span> 
 
        </th> 
 
       </tr> 
 
       <tr> 
 
        <td rowspan="4" id="sizeContainer"> 
 
         <ul id="displaySizes"> 
 
          <li>4:3</li> 
 
          <li>16:9</li> 
 
          <li>Clock</li> 
 
         </ul> 
 
        </td> 
 
        <td>$100</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
       </tr> 
 
       <tr> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
       </tr> 
 
       <tr> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
       </tr> 
 
       <tr> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
        <td>February</td> 
 
       </tr> 
 
      </table>

+0

Lạ, nhưng chức năng này không hoạt động trong ứng dụng của tôi. Tôi đã bao gồm những tập tin kịch bản và sao chép các chức năng, nhưng ResizeSensor không được kích hoạt. Có suy nghĩ gì không? –

+0

bạn có thể tạo ra một fiddle, hoặc một cái gì đó giống như sử dụng các tập tin này. –

+0

Đây là câu hỏi: https://jsfiddle.net/vaxobasilidze/cvkatuhw/1/ Kéo bất kỳ mục nào vào đúng thùng chứa và thay đổi kích thước của nó. –

2

Dưới đây là một giải pháp tôi đặt lại với nhau rằng sẽ chụp để lưới trao đổi kích thước (Trong ví dụ 20px này.)

Nó sử dụng "cross trình duyệt thay đổi kích thước lý sự kiện", mà một nhà phát triển khác đã đặt lại với nhau (source):

Về cơ bản nó chỉ lắng nghe sự kiện thay đổi kích thước, sau đó thiết lập phong cách cho chiều rộng và chiều cao bằng javascript.

Fiddle ở đây:

https://jsfiddle.net/treetop1500/co8zbatz/

// utility function for rounding (20px in this case) 
function round20(x) 
{ 
    return Math.ceil(x/20)*20; 
} 

// Attach listener 
var myElement = document.getElementById('resize'), 
    myResizeFn = function(){ 
     h = round20(parseInt(this.style.height,10)); 
     w = round20(parseInt(this.style.width,10)); 
     this.style.height = h + "px"; 
     this.style.width = w + "px"; 
    }; 

addResizeListener(myElement, myResizeFn); 
+0

Chức năng tốt và được tối ưu hóa. Cảm ơn! –

+0

Bạn có thể xem fiddle này không? https://jsfiddle.net/vaxobasilidze/ryxks2ob/ thả bất kỳ mục nào sang phải và thay đổi kích thước. mã của bạn không hoạt động. Bạn có thể giúp tôi khắc phục sự cố không? Tôi đã đóng gói kích thước nghe vào một chức năng và tôi gọi nó khi mục được giảm xuống. –

Các vấn đề liên quan