Làm cách nào để CHỈ thay đổi kích thước theo chiều ngang hoặc chiều dọc với jQuery UI Resizable?


81

Giải pháp duy nhất mà tôi đã tìm thấy là đặt chiều cao hoặc chiều rộng tối đa và tối thiểu với giá trị hiện tại.

Thí dụ:

foo.resizable({ 
  maxHeight: foo.height(), 
  minHeight: foo.height() 
});

Nhưng điều này thực sự xấu, đặc biệt nếu tôi phải thay đổi chiều cao của phần tử theo lập trình.

Câu trả lời:


145

Bạn có thể đặt handlestùy chọn thay đổi kích thước để chỉ hiển thị ở bên trái và bên phải (hoặc phía đông / phía tây), như sau:

foo.resizable({
    handles: 'e, w'
});​

Bạn có thể thử ở đây.


7
Tôi chỉ tìm thấy một báo trước với giải pháp này. Nó vẫn sẽ đặt chiều rộng & chiều cao khi được thực hiện dưới dạng kiểu nội tuyến. Điều này gây ra vấn đề cho tôi với một giải pháp duy nhất theo chiều dọc. Khi tôi đã thay đổi kích thước, chiều rộng được đặt và nó không còn là 100% (mà là giá trị px). Chỉ đặt điều này ở đây trong trường hợp người khác đang tìm kiếm và bắt gặp nó.
Fernker

@Fernker Vâng, đó là một nỗi đau.
Ben,

bạn có thể lấy lại chiều rộng phần trăm nếu bạn cung cấp thuộc tính chiều rộng tối thiểu và chiều rộng tối đa có cùng giá trị cho div của mình. Nó sẽ không bị ghi đè :)
Sébastien

2
Không thực hiện được thử nghiệm kéo shift.
cần thiết

@nothingis Cần bạn có thể mô tả "thử nghiệm kéo shift" không?
Jon z

27

Trong khi người đăng chủ yếu yêu cầu thay đổi kích thước theo chiều ngang, câu hỏi cũng yêu cầu chiều dọc.

Trường hợp dọc có một vấn đề đặc biệt: Bạn có thể đã đặt chiều rộng tương đối (ví dụ: 50%) mà bạn muốn giữ lại ngay cả khi cửa sổ trình duyệt được thay đổi kích thước. Tuy nhiên, giao diện người dùng jQuery đặt chiều rộng tuyệt đối bằng px khi bạn đổi kích thước phần tử lần đầu tiên và chiều rộng tương đối bị mất.

Nếu tìm thấy mã sau hoạt động cho trường hợp sử dụng này:

$("#resizable").resizable({
    handles: 's',
    stop: function(event, ui) {
        $(this).css("width", '');
   }
});

Xem thêm http://jsfiddle.net/cburgmer/wExtX/giao diện người dùng jQuery có thể thay đổi kích thước: chiều cao tự động khi chỉ sử dụng tay cầm ghi đông


2
Rất thú vị, cảm ơn bạn. Tôi sẽ ghi nhớ nó. Tôi nghĩ điều quan trọng cần lưu ý là phần tử có thể thay đổi kích thước phải có chiều rộng của nó được đặt bởi css nếu không nó sẽ bị mất sau khi thay đổi kích thước. Xem tại đây jsfiddle.net/paska/wExtX/10
Diego

1
Đây là giải pháp tôi đang tìm kiếm. Vì lý do nào đó, mặc dù tay cầm bị vô hiệu hóa cho vùng, nhưng kích thước của nó dường như vẫn được đặt thành px. Nếu bạn không sử dụng phương pháp này, bạn sẽ mất% chiều cao hoặc chiều rộng dựa trên.
Serhiy

Trên thực tế, điều này dường như không hoạt động trong jQuery-ui 1.11.0. Chiều rộng CSS được đặt trực tiếp trên phần tử không được lấy từ chiều rộng ban đầu. Tôi đang cố gắng đặt chiều rộng thành phần trăm và nó được ghi đè lên với một số px.
Ben,

Cảm ơn, thủ thuật này cũng đã có ích để bỏ qua các 'phím shift và kéo' duy trì tỷ lệ khía cạnh trong khi thay đổi kích thước (đối với thay đổi kích thước ngang, bộ css heightđể ''resizestopxử lý)
nothingisnecessary

18

Một giải pháp rất đơn giản:

$( ".selector" ).resizable({ grid: [1, 10000] }); // horizontal
$( ".selector" ).resizable({ grid: [10000, 1] }); // vertical

Điều này cũng hoạt động cho draggable (). Ví dụ: http://jsfiddle.net/xCepm/


1
Nó thực sự là xấu xí !! Ngoài ra, các giải pháp chính xác (mà chúng ta có nghĩa vụ phải sử dụng) là @Nick Craver của
Diego

1
Tôi đồng ý! :-) Nhưng thật tuyệt khi nó hoạt động với resizable () và draggable ().
tháng 1

1
Tôi thích cái này! Bên cạnh việc tuyệt vời về mặt toán học, nó còn để tay cầm ở góc dưới bên phải, mang đến gợi ý trực quan rằng phần tử có thể thay đổi kích thước. Trong giải pháp được chấp nhận, điều khiển thay đổi kích thước bị ẩn và người dùng phải đoán rằng lề dưới là một điểm nóng.
corwin.amber

Điều này là hoàn hảo vì những lý do mà @ corwin.amber đã nêu
Lombas

Đó là hoàn hảo cho nhu cầu của tôi:{handles: 'se', grid: [10000, 1], autoHide: true}
mạ

9

Giải pháp là định cấu hình có thể thay đổi kích thước của bạn để nó hủy các thay đổi của thứ nguyên bạn không muốn.

đây là một ví dụ về chỉ có thể thay đổi kích thước theo chiều dọc:

foo.resizable({
  resize: function(event, ui) { 
    ui.size.width = ui.originalSize.width;
  }      
}); 

Điều đó không phải là loại uggly quá?
Diego

1
Bằng cách này, người dùng thấy một tay cầm mà anh ta không thể sử dụng.
nima

1

Tôi muốn cho phép kích thước lại chiều rộng khi trình duyệt kích thước lại, nhưng không phải khi người dùng thay đổi kích thước của phần tử, điều này hoạt động tốt:

foo.first().resizable({
    resize: function(event, ui) { 
    ui.element.css('width','auto');
    },
}); 

0

Đối với tôi, các giải pháp có cả tay cầm và resizetrình xử lý đều hoạt động tốt, vì vậy người dùng thấy tay cầm nhưng chỉ có thể thay đổi kích thước theo chiều ngang, giải pháp tương tự sẽ hoạt động cho chiều dọc. Nếu không có trình xử lý phía dưới bên phải, người dùng có thể không biết rằng anh ta có thể thay đổi kích thước phần tử.

Khi sử dụng ui.size.height = ui.originalSize.height;nó sẽ không hoạt động bình thường nếu phần tử thay đổi kích thước của nó từ trạng thái ban đầu.

foo.resizable({
    // Handles left right and bottom right corner
    handles: 'e, w, se',
    // Remove height style
    resize: function(event, ui) {
        $(this).css("height", '');
    }
});

Để có hiệu suất tốt hơn $(this)có thể bị xóa:

var foo = jQuery('#foo');
foo.resizable({
    // Handles left right and bottom right corner
    handles: 'e, w, se',
    // Remove height style
    resize: function(event, ui) {
        foo.css("height", '');
    }
});

0
Successfully working div position Vertically and horizontally
-------------------------------------------------------------

<head>

    <style>
    .resizable {
        height: 100px;
        width: 500px;
        background: #09C;
    }
    .resizable-x {
        height: 100px;
        width: 500px;
        background: #F60;
    }
    </style>

    <script>
     $(function() {

        $( ".resizable" ).resizable({
            grid: [10000, 1]
        });

        $( ".resizable-x " ).resizable({
            grid: [1, 10000]
        });


        $( ".resizable" ).draggable();
        });

      });
        </script>`enter code here`
    </head>

    <body>
    <div class="resizable"></div>
    <div class="resizable-x"></div>
    </body>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.