Cách ẩn điều khiển video trong HTML

Sau đây là bài đăng của khách bởi Sara Soueidan. Tôi biết Sara qua tất cả những công việc xuất sắc của cô ấy trên CodePen. Cô ấy đang làm việc trên một số điều khiển video HTML5 tùy chỉnh và nhận thấy rằng các tùy chỉnh bị mất khi video chuyển sang chế độ toàn màn hình (ví dụ về điều đó xảy ra). Đi sâu vào bóng tối DOM, Sara tìm ra giải pháp…

Nếu bạn đã từng làm việc với video HTML5 thì có lẽ bạn đã tự hỏi làm thế nào bạn có được một loạt các nút điều khiển, thanh trượt và ngón tay cái thanh trượt trên trang của mình, khi bạn chỉ thêm một thẻ

::-moz-range-track
4 duy nhất vào DOM

Cách ẩn điều khiển video trong HTML
Tất cả những yếu tố kiểm soát này đến từ đâu?

Các trình duyệt thêm các điều khiển này dưới dạng “cây con” của thẻ video vào phần hiển thị tài liệu. Các phần tử này (nút, thanh trượt, v.v. ) là một phần của DOM, nhưng thực tế bạn không thể nhìn thấy chúng trong cây DOM chính, bạn chỉ thấy chúng được hiển thị trên trang. Thêm về điều này trong thời gian ngắn

Sự cố về điều khiển video HTML5 ở chế độ toàn màn hình

Gần đây, khi làm việc trên một khung video HTML5 tùy chỉnh, tôi tình cờ phát hiện ra một vấn đề mà rất nhiều nhà thiết kế và nhà phát triển gặp phải trong lĩnh vực này. Thay vì hiển thị các điều khiển tùy chỉnh mà tôi đang làm việc, các điều khiển trình duyệt gốc xuất hiện trên video khi video chuyển sang chế độ toàn màn hình. Giống như rất nhiều người khác, tôi đã tìm kiếm câu trả lời cho vấn đề này nhưng không may mắn tìm được bất kỳ câu trả lời nào. (Cập nhật. lỗi này được lưu trong trình theo dõi lỗi của Chrome)

Sau một số kiểm tra trong các công cụ dành cho nhà phát triển, tôi thấy rằng

  1. Các điều khiển gốc vẫn còn đó. Bằng cách đặt thuộc tính
    ::-moz-range-track
    5 của phần tử video thành
    ::-moz-range-track
    6, chúng tôi có thể ẩn các điều khiển nhưng vì một số lý do, khi vào chế độ toàn màn hình, chúng lại xuất hiện, mặc dù đã bị ẩn ở chế độ màn hình bình thường. (Tại sao?)
  2. Các điều khiển tùy chỉnh đã bị ẩn bên dưới video ở chế độ toàn màn hình. Kiểm tra các điều khiển bằng các công cụ dành cho nhà phát triển cho thấy lý do các điều khiển bị ẩn bên dưới là do biểu định kiểu của tác nhân người dùng (trong trường hợp này là biểu định kiểu của Chrome) đã ghi đè các kiểu được áp dụng cho các điều khiển, với một giá trị rất kỳ lạ là
    ::-moz-range-track
    0, tôi phải nói là
Cách ẩn điều khiển video trong HTML
Chỉ số z cao được áp dụng bởi biểu định kiểu tác nhân người dùng của Chrome

Làm thế nào để chúng tôi thực hiện công việc này?

Điểm thứ hai là dễ dàng. chỉ cần ghi đè biểu định kiểu tác nhân người dùng. Chúng tôi luôn làm điều đó trong bảng định kiểu của mình. Chúng tôi sẽ nhận được điều này trong thời gian ngắn. Nhưng còn điểm đầu tiên thì sao?

Lưu ý rằng kỹ thuật được giải thích trong bài viết này để ẩn các điều khiển gốc chỉ hoạt động trong các trình duyệt hỗ trợ Shadow DOM

Giới thiệu nhanh về Shadow DOM

Cây con của các phần tử DOM do trình duyệt tạo ra là cái mà chúng tôi gọi là “Shadow DOM”. Nói một cách dễ hiểu, đó là một loạt các phần tử DOM, giống như những phần tử bạn đã quen thuộc, như

::-moz-range-track
1 và
::-moz-range-track
2, được trình duyệt thêm vào dưới dạng một đoạn tài liệu và được hiển thị trên trang giống như cây DOM chính

James Edwards tóm tắt chức năng của Shadow DOM một cách hoàn hảo trong bài viết của anh ấy cho SitePoint

Shadow DOM đóng gói nội dung bằng cách tạo các đoạn tài liệu. Thực tế, nội dung của Shadow DOM là một tài liệu khác, được hợp nhất với tài liệu chính để tạo đầu ra được kết xuất tổng thể

Trên thực tế, một số trình duyệt đã sử dụng điều này để hiển thị một số tiện ích gốc của chúng

Lý do tại sao các trình duyệt làm điều này là bởi vì các nhà phát triển trình duyệt đã quyết định đóng gói một số phần tử DOM để ẩn chúng khỏi các nhà phát triển của chúng tôi, vì vậy chúng tôi không quan tâm đến chi tiết triển khai của các phần tử này, nhằm giúp chúng tôi làm việc với mọi thứ dễ dàng hơn. Ngoài ra, như James Edwards cũng đã nói trong bài viết của mình

Vì nó bị cô lập nên người dùng không thể vô tình phá vỡ nó, không có khả năng xung đột tên với bất kỳ lớp hoặc ID nào bạn sử dụng và CSS trên trang chính sẽ không ảnh hưởng gì cả

Vì vậy, bây giờ chúng ta biết rằng các điều khiển được thêm vào thẻ video chỉ là một phần của cây con DOM bóng được tạo cho thẻ này bởi trình duyệt

Ẩn các điều khiển video gốc

Chúng ta cần có khả năng tạo kiểu cho các điều khiển vốn là một phần của Shadow DOM, nhưng làm cách nào để thực hiện điều đó nếu các bộ chọn CSS thông thường mà chúng ta biết không thể truy cập các phần tử Shadow DOM?

Sau khi đọc bài viết giới thiệu tuyệt vời này của Dimitri Glazkov, tôi biết được rằng “có một khả năng thuộc tính giả tiện dụng, cho phép các cây con Shadow DOM liên kết một định danh phần tử giả tùy ý với một phần tử trong cây con. ”

Điều đó có nghĩa là một số phần tử bên trong cây con DOM bóng tối có thể được tạo kiểu bằng cách nhắm mục tiêu chúng thông qua phần tử giả được liên kết của chúng. Nghe thật tuyệt

Nhưng làm cách nào để xác định phần tử giả nào được liên kết với phần tử DOM bóng mà chúng ta cần tạo kiểu?

::-webkit-slider-thumb

Firefox cũng cung cấp hai phần tử giả cho các đầu vào phạm vi kiểu hiện tại nó hỗ trợ chúng bắt đầu từ phiên bản 23. 0

::-moz-range-track

::-moz-range-thumb

Nhưng còn các phần tử giả ít được biết đến khác được liên kết với các phần tử DOM bóng khác thì sao?

Xác định các phần tử giả được liên kết với các phần tử Shadow DOM

Một trong những tính năng tuyệt vời của công cụ dành cho nhà phát triển Chrome là bạn có thể kiểm tra các cây con DOM bóng trong bảng Thành phần giống như bạn sẽ kiểm tra cây DOM “thông thường”. Tất cả bạn phải làm là kích hoạt tính năng này

  1. Chuyển đến cài đặt công cụ dành cho nhà phát triển (bằng cách nhấp vào biểu tượng bánh răng nhỏ ở dưới cùng bên phải của công cụ dành cho nhà phát triển)
  2. Trong tab Chung, đánh dấu vào tùy chọn “Show Shadow DOM”
  3. Khởi động lại các công cụ dành cho nhà phát triển (đóng và mở lại)

Bây giờ, khi bạn kiểm tra phần tử

::-moz-range-track
4, bạn sẽ nhận được một cái gì đó tương tự như ảnh chụp màn hình bên dưới

Cách ẩn điều khiển video trong HTML
Cây con DOM bóng được thêm vào phần tử
::-moz-range-track
4 khi được kiểm tra bằng các công cụ dành cho nhà phát triển của Chrome cho thấy một #đoạn văn bản mới

Sau đó, giống như bạn có thể lấy các quy tắc kiểu cho bất kỳ phần tử HTML nào nếu bạn nhấp vào phần tử đó trong bảng Thành phần, bạn cũng có thể thấy các phần tử giả được liên kết với cây con của DOM bóng. Khá gọn gàng, phải không?. )

Cách ẩn điều khiển video trong HTML
Bảng điều khiển CSS trong công cụ dành cho nhà phát triển của Chrome hiển thị tên phần tử giả được liên kết với
::-moz-range-track
1 bên trong cây con DOM bóng tối

Vì vậy, đối với các điều khiển video, chúng ta có thể thấy từ ảnh chụp màn hình rằng có một phần tử giả được gọi là

::-moz-range-track
6, như cái tên đã chỉ ra rõ ràng, được liên kết với các thẻ chứa các điều khiển phương tiện

Đặt

::-moz-range-track
7 trên phần tử giả này sẽ ẩn phần tử hoàn toàn ở chế độ bình thường và toàn màn hình

::-webkit-media-controls {
  display:none !important;
}

Nhưng hãy nhớ rằng phần tử giả này được liên kết với

::-moz-range-track
1 ngoài cùng trong cây con, cây con này sẽ chứa các điều khiển phương tiện, tất cả các loại điều khiển phương tiện, có nghĩa là nếu bạn có thẻ
::-moz-range-track
9 ở đâu đó trên trang, bạn sẽ bị ẩn

Vì vậy, trừ khi bạn muốn ẩn tất cả các điều khiển phương tiện gốc của trình duyệt, bạn sẽ cần chỉ định loại điều khiển phương tiện nào sẽ ẩn, đó là những điều khiển được liên kết với phần tử video và bạn sẽ nhắm mục tiêu chúng bằng cách chỉ định “phạm vi” cho điều này

::-moz-range-track
2

Điều này sẽ ẩn hoàn toàn các điều khiển gốc

Một tùy chọn khác là bạn có thể đi sâu hơn vào cây con để tìm phần tử giả được liên kết với

::-moz-range-thumb
0 bên trong và cụ thể hơn có chứa các điều khiển thực tế. nút, thanh trượt, v.v. , và ẩn nó đi

Vì vậy, đi sâu hơn một cấp, chúng tôi nhận được phần tử giả được liên kết với

::-moz-range-thumb
0 bên trong

::-moz-range-track
5

Đặt thuộc tính

::-moz-range-thumb
2 của phần tử giả này thành
::-moz-range-thumb
3 sẽ ẩn hoàn toàn các điều khiển gốc ở cả chế độ bình thường và chế độ toàn màn hình. Bạn cũng có thể thấy rằng phần tử giả này cụ thể hơn về phạm vi (phần tử video) và
::-moz-range-thumb
0 mà nó được liên kết với.
::-moz-range-thumb
0 “kèm theo” các yếu tố kiểm soát thực tế

Và đó là tất cả những gì bạn cần làm để ẩn các điều khiển gốc ở chế độ toàn màn hình. Đơn giản, phải không?

Hiển thị các điều khiển video tùy chỉnh

Đối với các điều khiển tùy chỉnh, chúng vẫn không xuất hiện trong bản trình diễn của tôi sau khi ẩn các điều khiển gốc, bởi vì, như bạn đã thấy trong ảnh chụp màn hình ở trên, biểu định kiểu tác nhân người dùng có giá trị cho chỉ mục z được đặt thành đầy đủ-

Cách ẩn điều khiển video trong HTML
Chỉ số z cao được áp dụng bởi biểu định kiểu tác nhân người dùng của Chrome

Tôi không biết tại sao các nhà phát triển lại chọn giá trị này cụ thể, nhưng có thể là do, như Nate Volker đã chỉ ra trong nhận xét của anh ấy bên dưới rằng con số này là giá trị tối đa cho một số nguyên có chữ ký 32 bit, có thể là kiểu dữ liệu của trình duyệt . Vì vậy, để đảm bảo hiển thị các điều khiển tùy chỉnh, bạn cần đặt chỉ mục z cho các điều khiển tùy chỉnh bằng hoặc cao hơn giá trị này

Đặt nó thành 2147483646 làm cho các điều khiển biến mất ở chế độ toàn màn hình trên Firefox và đôi khi (một lỗi?), Trong Chrome, do đó, chỉ mục z cho vùng chứa điều khiển phải là >= 2147483647

::-moz-range-track
0

Bản tóm tắt

Để ẩn các điều khiển gốc ở chế độ toàn màn hình trong các trình duyệt hỗ trợ Shadow DOM, bạn cần phải

  1. nhắm mục tiêu phần tử giả được liên kết với chúng.
    ::-moz-range-thumb
    6 mà bạn có thể tìm thấy bằng cách sử dụng các công cụ dành cho nhà phát triển của Chrome và kiểm tra Shadow DOM, đồng thời đặt hiển thị của nó thành không, sau đó hiển thị các điều khiển theo kiểu tùy chỉnh của bạn
  2. đặt chỉ mục z của các điều khiển tùy chỉnh của bạn thành giá trị cao hơn chỉ mục z do biểu định kiểu tác nhân người dùng cung cấp

Và đó là khá nhiều nó

Thử nghiệm

Xem Điều khiển video HTML5 tùy chỉnh của bút ở chế độ toàn màn hình của Chris Coyier (@chriscoyier) trên CodePen

Còn các trình duyệt khác không hỗ trợ Shadow DOM thì sao?

Trong khi làm việc tôi cũng đã kiểm tra kết quả trên Firefox. Đặt

::-moz-range-track
0 thành giá trị được đề cập ở trên làm cho các điều khiển tùy chỉnh cũng xuất hiện ở chế độ toàn màn hình của Firefox, do đó, việc hiển thị các điều khiển rất dễ dàng, nhưng giải pháp DOM bóng tối không hoạt động vì Firefox chưa hỗ trợ nó, do đó, các điều khiển gốc cũng vậy

Chắc chắn, bạn có thể mong đợi hành vi tương tự trong các trình duyệt khác không hỗ trợ DOM bóng tối

Cách duy nhất mà tôi tìm thấy để ẩn các điều khiển gốc trong các trình duyệt này là che các điều khiển gốc bằng các điều khiển tùy chỉnh, bằng cách chỉ cần đặt các điều khiển tùy chỉnh lên trên chúng bằng cách sử dụng các kiểu CSS cơ bản và đơn giản nhắm mục tiêu toàn bộ .
Điều này ẩn các điều khiển gốc nhưng cũng có giới hạn. các điều khiển tùy chỉnh không được có nền trong suốt, nếu không, các điều khiển gốc sẽ hiển thị xuyên suốt.

Có một giải pháp khả thi khác ở đây. Ông. James Edwards đã lưu ý trong nhận xét của mình bên dưới rằng các điều khiển gốc cũng có thể được ẩn trong chế độ toàn màn hình theo một cách khác mà không cần phải sử dụng DOM bóng, bằng cách áp dụng chế độ toàn màn hình cho một phần tử, ví dụ:

, chứa phần tử video. Tôi đã thử nghiệm kỹ thuật của anh ấy và nó đã hoạt động trong Chrome và nó cũng hoạt động trong phiên bản Firefox mới nhất trên Windows 7, và theo lời của Mr. Edwards nó cũng sẽ hoạt động trong các trình duyệt khác hỗ trợ chế độ toàn màn hình

Đọc thêm

  • Dự thảo làm việc Shadow DOM của W3C
  • Shadow DOM 101 trên HTML5Rocks
  • Bóng tối của DOM trên SitePoint
  • Cái quái gì là Shadow DOM của Dimitri Glazkov

Và nếu bạn quan tâm, bạn cũng có thể xem cách bạn có thể sử dụng API DOM bóng tối và HTML

::-moz-range-thumb
8 để tạo mã “đóng gói” và mẫu HTML của riêng mình bằng cách xem bài trình bày này của Peter Gasston về Thành phần web mà anh ấy đã trình bày tại CSSConfEU năm nay