Salah satu aspek dari kelengkapan Turing adalah masalah penghentian .
Ini berarti bahwa, jika CSS sudah selesai, maka tidak ada algoritma umum untuk menentukan apakah program CSS akan selesai berjalan atau berulang selamanya.
Tapi kita bisa mendapatkan algoritma untuk CSS! Ini dia:
Jika stylesheet tidak menyatakan animasi apa pun , maka itu akan berhenti.
Jika memang memiliki animasi, maka:
Jika ada animation-iteration-count
adalah infinite
, dan pemilih yang mengandung cocok di HTML, maka akan tidak menghentikan.
Kalau tidak, itu akan berhenti.
Itu dia. Karena kami baru saja menyelesaikan masalah penghentian untuk CSS, itu berarti bahwa CSS tidak Turing lengkap .
(Orang lain telah menyebutkan IE 6, yang memungkinkan untuk menanamkan ekspresi JavaScript sewenang-wenang dalam CSS; yang jelas akan menambah kelengkapan Turing. Tetapi fitur itu tidak standar, dan toh tidak ada orang waras yang menggunakannya).
Daniel Wagner mengemukakan satu hal yang saya lewatkan dalam jawaban aslinya. Dia mencatat bahwa sementara saya sudah membahas animasi , bagian lain dari mesin gaya seperti pencocokan pemilih atau tata letak dapat menyebabkan kelengkapan Turing juga. Meskipun sulit untuk membuat argumen formal tentang ini, saya akan mencoba untuk menguraikan mengapa kelengkapan Turing masih tidak mungkin terjadi.
Pertama: Turing bahasa lengkap memiliki beberapa cara untuk memasukkan data kembali ke dalam dirinya sendiri , apakah itu melalui rekursi atau perulangan. Tetapi desain bahasa CSS memusuhi umpan balik ini:
@media
kueri hanya dapat memeriksa properti browser itu sendiri, seperti ukuran viewport atau resolusi piksel. Properti ini dapat berubah melalui interaksi pengguna atau kode JavaScript (misalnya mengubah ukuran jendela browser), tetapi tidak melalui CSS saja.
::before
dan ::after
pseudo-elemen tidak dianggap sebagai bagian dari DOM , dan tidak dapat dicocokkan dengan cara lain.
Combinator pemilih hanya dapat memeriksa elemen di atas dan sebelum elemen saat ini, sehingga mereka tidak dapat digunakan untuk membuat siklus ketergantungan.
Dimungkinkan untuk menggeser elemen ketika Anda mengarahkan mouse ke atasnya , tetapi posisinya hanya diperbarui ketika Anda menggerakkan mouse.
Itu seharusnya cukup untuk meyakinkan Anda bahwa pencocokan pemilih, sendiri, tidak bisa Turing lengkap . Tapi bagaimana dengan tata letak?
Algoritma tata letak CSS modern sangat kompleks, dengan fitur-fitur seperti Flexbox dan Grid memperkeruh perairan. Tetapi bahkan jika itu mungkin untuk memicu loop tak terbatas dengan tata letak, akan sulit untuk memanfaatkan ini untuk melakukan perhitungan yang bermanfaat. Itu karena penyeleksi CSS hanya memeriksa struktur internal DOM, bukan bagaimana elemen-elemen ini diletakkan di layar. Jadi setiap bukti kelengkapan Turing menggunakan sistem tata letak harus bergantung pada tata letak saja .
Akhirnya - dan ini mungkin alasan paling penting - vendor browser tertarik untuk menjaga agar CSS tidak lengkap . Dengan membatasi bahasa, vendor memungkinkan untuk optimasi pintar yang membuat web lebih cepat untuk semua orang. Selain itu, Google mendedikasikan seluruh server pertanian untuk mencari bug di Chrome. Jika ada cara untuk menulis infinite loop menggunakan CSS, maka mereka mungkin sudah menemukannya 😉