Saya mencoba menggabungkan penggunaan variabel Sass dengan kueri @media sebagai berikut:
$base_width:1160px;
@media screen and (max-width: 1170px) {$base_width: 960px;}
@media screen and (min-width: 1171px) {$base_width: 1160px;}
$base_width
kemudian ditentukan di berbagai titik dalam pengukuran berbasis persentase lebar stylesheet untuk menghasilkan tata letak yang dapat disesuaikan.
Ketika saya melakukan ini, variabel tampaknya dikenali dengan benar tetapi kondisi untuk kueri media tidak. Misalnya, kode di atas menghasilkan tata letak 1160 piksel terlepas dari lebar layar. Jika saya membalik pernyataan @media seperti ini:
@media screen and (min-width: 1171px) {$base_width: 1160px;}
@media screen and (max-width: 1170px) {$base_width: 960px;}
Ini menghasilkan tata letak 960px, sekali lagi terlepas dari lebar layar. Juga perhatikan bahwa jika saya menghapus baris pertama $base_width: 1160px;
itu mengembalikan kesalahan untuk variabel yang tidak ditentukan. Ada ide apa yang saya lewatkan?
sass
media-queries
Jeremy S.
sumber
sumber
Jawaban:
Ini tidak mungkin. Karena pemicunya
@media screen and (max-width: 1170px)
terjadi di sisi klien.Mencapai hasil yang diharapkan hanya mungkin jika SASS mengambil semua aturan dan properti di lembar gaya yang berisi
$base_width
variabel Anda dan menyalin / mengubahnya sesuai.Karena ini tidak akan bekerja secara otomatis, Anda dapat melakukannya dengan tangan seperti ini:
Ini tidak benar-benar KERING tetapi yang terbaik yang dapat Anda lakukan.
Jika perubahannya sama setiap kali Anda juga bisa menyiapkan mixin yang berisi semua nilai yang berubah, jadi Anda tidak perlu mengulanginya. Selain itu, Anda dapat mencoba menggabungkan mixin dengan perubahan tertentu. Suka:
Dan Mixin akan terlihat seperti ini
sumber
$foo: 1rem; @media (min-width: 10rem) {$foo: 2rem} .class {font-size: $foo} .class2 {padding: $foo}
akan menghasilkan.class {font-size: 1rem} .class2 {padding: 1rem} @media (min-width: 10rem) (.class {font-size: 2rem} .class2 {padding: 2rem}}
Mirip dengan jawaban Philipp Zedler, Anda dapat melakukannya dengan mixin. Itu memungkinkan Anda memiliki semuanya dalam satu file jika Anda mau.
sumber
Sunting: Tolong jangan gunakan solusi ini. Jawaban dengan ronen jauh lebih baik.
Sebagai solusi KERING, Anda dapat menggunakan
@import
pernyataan di dalam kueri media, misalnya seperti ini.Anda menentukan semua elemen responsif dalam file yang disertakan menggunakan variabel yang ditentukan dalam kueri media. Jadi, yang perlu Anda ulangi hanyalah pernyataan impor.
sumber
Ini tidak mungkin dilakukan dengan SASS, tetapi dapat dilakukan dengan variabel CSS (atau properti khusus CSS ). Satu-satunya kelemahan adalah dukungan browser - tetapi sebenarnya ada plugin PostCSS - postcss-css-variable - yang "meratakan" penggunaan variabel CSS (yang juga memberi Anda dukungan untuk browser lama).
Contoh berikut berfungsi baik dengan SASS (dan dengan variabel postcss-css-Anda mendapatkan dukungan untuk browser lama juga).
Ini akan menghasilkan CSS berikut. Kueri media berulang akan meningkatkan ukuran file, tetapi saya telah menemukan bahwa peningkatan biasanya dapat diabaikan begitu server web berlaku
gzip
(yang biasanya akan dilakukan secara otomatis).sumber
Dengan jawaban bagus dari @ ronen dan peta, ada beberapa kekuatan nyata yang tersedia:
Sekarang mungkin untuk memiliki lebih banyak penargetan kueri media KERING
.myDiv
dengan sekumpulan nilai berbeda.Dokumen peta: https://sass-lang.com/documentation/functions/map
Contoh penggunaan peta: https://www.sitepoint.com/using-sass-maps/
sumber
Saya memiliki masalah yang sama.
The
$menu-width
variabel harus 240px pada ponsel pandangan@media only screen and (max-width : 768px)
dan 340px pada desktop yang tampilan.Jadi saya hanya membuat dua variabel:
Dan inilah cara saya menggunakannya:
sumber
Dua rekomendasi
1 Tulis pernyataan CSS "default" Anda untuk layar kecil dan hanya gunakan kueri media untuk layar yang lebih besar. Biasanya tidak diperlukan
max-width
kueri media.Contoh (dengan asumsi elemen memiliki kelas "container")
2 Gunakan variabel CSS untuk menyelesaikan masalah, jika Anda bisa .
catatan:
Karena akan memiliki lebar 1160px ketika jendela memiliki lebar 1170px, mungkin lebih baik menggunakan lebar 100% dan lebar maksimum 1160px, dan elemen induk mungkin memiliki bantalan horizontal 5px, selama properti ukuran kotak diatur ke kotak-batas. Ada banyak cara untuk memecahkan masalah tersebut. Jika induknya bukan wadah flex atau grid yang bisa Anda gunakan
.container { margin: auto }
.sumber