2013-04-12 37 views
5

Khi làm việc trên các thiết kế đáp ứng, tôi sử dụng truy vấn phương tiện CSS3, bao gồm cả các trình duyệt cũ sử dụng response.js. Đôi khi tôi cũng cần sử dụng JavaScript/jQuery để thao tác một số phần tử trên trang. Tuy nhiên, khi sử dụng $ (window) .width(), giá trị đó thường khác với giá trị được sử dụng trong truy vấn phương tiện CSS do trình duyệt chrome và/hoặc sự hiện diện của thanh cuộn dọc, nghĩa là truy vấn phương tiện CSS sẽ kích hoạt điểm ngắt khác với truy vấn phương tiện JS.Đồng bộ hóa các truy vấn phương tiện truyền thông CSS và JS qua trình duyệt

Tôi biết Modernizr làm giảm bớt vấn đề này thông qua việc sử dụng Modernizr.mq, nhưng chỉ hoạt động trong các trình duyệt hỗ trợ truy vấn phương tiện CSS để bắt đầu, thường có nghĩa là nó sẽ không hoạt động trong IE8 trở xuống. Và nếu bạn sử dụng một polyfill để thêm hỗ trợ truy vấn phương tiện cho các trình duyệt cũ hơn (ví dụ: response.js), thì Modernizr.mq không còn hoạt động do xung đột/ghi đè giữa hai trình duyệt.

Điều tôi đã thực hiện thay vì được thực hiện bằng cách sử dụng phần tử đầu vào bị ẩn trên trang và cho nó một kiểu chiều rộng CSS trong mỗi truy vấn phương tiện. sau đó tôi có một chức năng chạy tự động trên trang (và đã đổi kích thước) mà được rằng giá trị chiều rộng và thực hiện như sau:

 if (width == "320px") { 
      //Functions 
     } 

     //481px to 600px 
     else if (width == "481px") { 
      //Functions 
     } 

     //601px to 768px 
     else if (width == "601px") { 
      //Functions 
     } 

     //769px to 960px 
     else if (width == "769px") { 
      //Functions 
     } 

     //769 to 1024px 
     else if (width == "961px") { 
      //Functions 
     } 

     //1024px+ 
     else { 
      //Functions 
     } 

này về cơ bản buộc JS để làm việc hoàn toàn tắt của các truy vấn phương tiện CSS, đồng bộ các hai. Điều này có thể trở nên cụ thể hơn là chung chung như tôi có, thay vì bắn dựa trên một yếu tố cụ thể và một phong cách cụ thể thay đổi trên yếu tố đó, nó phụ thuộc vào nhu cầu của từng dự án.

Câu hỏi của tôi là, có cách nào đơn giản hơn để thực hiện việc này không? Tôi đã dành thời gian đáng kể xem xét và thử nghiệm với điều này và nó có vẻ là lựa chọn tốt nhất cho đến nay mà sẽ đưa vào tài khoản trình duyệt cũ là tốt.

Trả lời

2

PPK được liệt kê một cách tốt đẹp để ghép CSS & JS trên blog của mình mà loại phương pháp sao lưu của bạn:

@media all and (max-width: 900px) { 
// styles 
} 

if (document.documentElement.clientWidth < 900) { 
    // scripts 
} 

bài đầy đủ của ông trên đó là here.

Ngoài ra còn có plugin enquire.js.

+0

Tôi đã thực sự đọc bài đăng đó và cảm ơn bạn đã trả lời. Screen.width trả về một giá trị nhất quán vì nó rõ ràng đánh giá chiều rộng màn hình trên chiều rộng cửa sổ, nghĩa là bạn sẽ không thấy bất kỳ thay đổi đáp ứng nào nếu bạn đổi kích thước cửa sổ trình duyệt của mình. Mặc dù đây không phải là một vấn đề nhưng nó gây khó khăn hơn cho việc thử nghiệm vì bạn sẽ phải có các thiết bị thực tế ở các độ rộng cụ thể để kiểm tra. – seannachie

+0

Ngoài ra, với Inquire, bạn cần sử dụng một polyfill để thêm hỗ trợ mediaMatch. Tuy nhiên, để có được IE8 và dưới đây để nhận ra các truy vấn phương tiện truyền thông, bạn cũng phải sử dụng một polyfill cho hỗ trợ truy vấn phương tiện truyền thông ... hai polyfills không hoạt động cùng nhau. Có nghĩa là nếu tôi muốn JS/CSS của tôi được đồng bộ hóa, các truy vấn của tôi sẽ phải tất cả trong JS hoặc tất cả trong CSS. Nếu điều đó có ý nghĩa ... lol – seannachie

+0

Nếu oldIE là một mối quan tâm, có thể RespondJS? – kaidez

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