Sau 48 giờ nghiên cứu, tôi đã kết thúc việc này để có được tỷ lệ theo tỷ lệ:
LƯU Ý: Mẫu này được viết bằng React. Nếu bạn không sử dụng điều đó, hãy thay đổi công cụ vỏ lạc đà trở lại dấu gạch nối (nghĩa là: thay đổi backgroundColor
thành background-color
và thay đổi kiểu Object
trở lại a String
).
<div
style={{
backgroundColor: 'lightpink',
resize: 'horizontal',
overflow: 'hidden',
width: '1000px',
height: 'auto',
}}
>
<svg
width="100%"
viewBox="113 128 972 600"
preserveAspectRatio="xMidYMid meet"
>
<g> ... </g>
</svg>
</div>
Đây là những gì đang xảy ra trong mã mẫu ở trên:
XEM
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribution/viewBox
min-x, min-y, chiều rộng và chiều cao
tức là: viewbox = "0 0 1000 1000"
Viewbox là một thuộc tính quan trọng vì về cơ bản nó cho SVG biết kích thước sẽ vẽ và ở đâu. Nếu bạn đã sử dụng CSS để tạo SVG 1000x1000 px nhưng hộp xem của bạn là 2000x2000, bạn sẽ thấy quý trên cùng bên trái của SVG.
Hai số đầu tiên, min-x và min-y, xác định xem SVG có được bù trong hộp xem không.
SVG của tôi cần thay đổi lên / xuống hoặc trái / phải
Kiểm tra cái này: viewbox = "50 50 450 450"
Hai số đầu tiên sẽ thay đổi SVG của bạn sang trái 50px và 50px, và hai số thứ hai là kích thước hộp xem: 450x450 px. Nếu SVG của bạn có kích thước 500x500 nhưng nó có thêm một số phần đệm trên đó, bạn có thể thao tác các số đó để di chuyển nó bên trong "hộp xem".
Mục tiêu của bạn tại thời điểm này là thay đổi một trong những con số đó và xem điều gì sẽ xảy ra.
Bạn cũng có thể bỏ hoàn toàn hộp xem, nhưng sau đó, số dặm của bạn sẽ thay đổi tùy thuộc vào mọi cài đặt khác bạn có tại thời điểm đó. Theo kinh nghiệm của tôi, bạn sẽ gặp phải các vấn đề với việc duy trì tỷ lệ khung hình vì hộp xem giúp xác định tỷ lệ khung hình.
BẢO TỈ LỆ
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribution/preserveAspectRatio
Dựa trên nghiên cứu của tôi, có rất nhiều cài đặt tỷ lệ khung hình khác nhau, nhưng cài đặt mặc định được gọi xMidYMid meet
. Tôi đặt nó trên mỏ để nhắc nhở bản thân một cách rõ ràng. xMidYMid meet
làm cho nó có tỷ lệ cân xứng dựa trên điểm giữa X và Y. Điều này có nghĩa là nó nằm ở giữa trong khung nhìn.
CHIỀU RỘNG
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribution/ thong
Nhìn vào mã ví dụ của tôi ở trên. Chú ý cách tôi chỉ đặt chiều rộng, không có chiều cao. Tôi đặt nó thành 100% để nó lấp đầy thùng chứa. Đây là điều có lẽ đóng góp nhiều nhất để trả lời câu hỏi Stack Overflow này.
Bạn có thể thay đổi nó thành bất kỳ giá trị pixel nào bạn muốn, nhưng tôi khuyên bạn nên sử dụng 100% như tôi đã làm để thổi nó lên kích thước tối đa và sau đó kiểm soát nó bằng CSS thông qua bộ chứa chính. Tôi khuyên bạn nên làm điều này bởi vì bạn sẽ có được sự kiểm soát "thích hợp". Bạn có thể sử dụng truy vấn phương tiện và bạn có thể kiểm soát kích thước mà không cần JavaScript điên.
LẬP TRÌNH VỚI CSS
Nhìn vào mã ví dụ của tôi ở trên một lần nữa. Lưu ý cách tôi có các thuộc tính này:
resize: 'horizontal', // you can safely omit this
overflow: 'hidden', // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',
Đây là bổ sung, nhưng nó chỉ cho bạn cách cho phép người dùng thay đổi kích thước SVG trong khi duy trì tỷ lệ khung hình phù hợp. Vì SVG duy trì tỷ lệ khung hình của riêng nó, bạn chỉ cần thay đổi kích thước chiều rộng trên vùng chứa chính và nó sẽ thay đổi kích thước theo ý muốn.
Chúng tôi để chiều cao một mình và / hoặc đặt nó thành tự động và chúng tôi kiểm soát thay đổi kích thước theo chiều rộng. Tôi chọn chiều rộng vì nó thường có ý nghĩa hơn do thiết kế đáp ứng.
Dưới đây là hình ảnh của các cài đặt này đang được sử dụng:
Nếu bạn đọc mọi giải pháp trong câu hỏi này và vẫn còn bối rối hoặc không thấy rõ những gì bạn cần, hãy xem liên kết này tại đây. Tôi tìm nó rất có ích:
https://css-tricks.com/scale-svg/
Đây là một bài viết lớn, nhưng nó phá vỡ khá nhiều cách có thể để thao tác một SVG, có hoặc không có CSS. Tôi khuyên bạn nên đọc nó trong khi tình cờ uống cà phê hoặc lựa chọn chất lỏng của bạn.