Xin chào, hôm nau mình xin được giới thiệu một chuên mục nóng hổi vừa thổi vừa ăn, đó cính là #sandbox, đúng như cái tên của nó sandbox sẽ là nơi mình show những sản phẩm siêu nhỏ mà mình làm trõng những lúc rảnh rỗi, như những lâu đài cayys thôi tất cả chỉ làm trong vòng vài tiếng và chủ yếu mang tính chất giải trí là chính. Để khởi đâu cho loạt bài này hôm nay mình sẽ quết định làm cái gì thực tế một chút, một nút submit của tương lai, ít nhất thì mình tinh là thế 😄.
Mục tiêu hôm nay của chúng ta là là xây xựng một nút submit có thể dùng cho form, upload file, xóa file… như hình cover ở trên thay vì tốn diện tích cho tất cả các progress bar, har alert tất cả sẽ được buit-in trong một nút duy nhất thôi. vô tình thấy được ý tưởng này trên mạng thấy khá hay nên quên định trển luôn vào cuối tuần.
cũng không có gì đặc biệt, nút của chúng ta bao gông hai phần phần là front phần ddawcf trước và back phần dằng sau mỗi phần có mooyj content chứa nột dung và icon.
Tiếp là icon, các bạn có thể dùng font aswesome nhưng vấn đề là ta chỉ dùng một vài icon thôi nên mình sẽ chỉ lấy vài icon cần thiết fontello sẽ giúp ta tạo được một icon font của riêng mình.
he, hơi dài nhỉ mình cũng chả biết mình viết cái gì dây nữa, kỳ sau mình sẽ dùng sass cho anh em dễ nhìn nhé, chứ thế này hiếp dâm thị giác người đọc quá 😄.
có một lưu ý nhỏ ở dây là bạn phải style sao cho khi trình duyệt không chạy javascript họn vẫn submit được bình thường và không bị vỡ design, code ra phải dảm bảo ai cũng dừng được chứ 😃.
tạo scandal nào!
Tất nhiên chỉ làm màu thôi là chưa đủ, để có thể thành công ta không thể thiếu scandal, javascript sẽ qui định các trạng thái của nút.
var staticClass = el.getAttribute('class'); var inner = el.querySelector('.inner'); var front = inner.querySelector('.front'); var frontContent = front.querySelector('.content'); var frontIcon = front.querySelector('[class^=icon-]'); var back = inner.querySelector('.back'); var backContent = back.querySelector('.content'); var backIcon = back.querySelector('[class^=icon-]');
var instance = function(el) { var state = 'primary'; var value = 0; var error = false;
var pushState = function(nextState) { if (!states[nextState]) return; var data = Object.assign({}, defaultState, states[nextState]); state = nextState; inner.className = 'inner ' + nextState; front.className = 'front ' + data.frontClass; frontContent.innerHTML = data.text || data.frontText; frontIcon.className = data.icon || data.frontIcon; backContent.innerHTML = data.backText; backIcon.className = data.backIcon; }
đây là một UI component nên mình sẽ không tập trung vào logic, cũng như không có thiều thời gian nên code chưa tối ưu anh em thông cảm nhé.
kết quả
và dây là kết quả của chúng ta. bạn có thể fork lại tai codepen
Ôi trời ơi, sandbox đầu tiên mệt ngoài sức tưởng tượng. ban đầu mình định dung tất cả basic để chơi nhưng thực sự là không vui một chút nào cả. chắc lần sau mình sẽ dùng libs, jQuery, React gì đó để đỡ khổ hơn. Hy vọng đã dem lại được điều gì đó cho anh em, Hẹn gặp lại ở sandbox kỳ sau.