Less.js: Fungsi CSS3 calc() tidak berfungsi dengan KURANG

Dibuat pada 8 Okt 2012  ·  51Komentar  ·  Sumber: less/less.js

Saya tahu ini sudah dilaporkan tetapi bug ditutup karena informasi yang tidak mencukupi.

Saya memiliki kode CSS berikut:

#id1 {
    position: fixed;
    left: 0; top: 0;
    width: 130px;
}
#id2 {
    position: fixed;
    right: 0; top: 0;
    width: calc(100% - 130px);
}

Saya ingin mengubahnya menjadi KURANG menggunakan 130px sebagai parameter tetapi calc diinterpretasikan oleh KURANG dan ini:

<strong i="11">@id1width</strong>: 130px
#id1 {
    position: fixed;
    left: 0; top: 0;
    width: @id1width;
}
#id2 {
    position: fixed;
    right: 0; top: 0;
    width: calc(100% - @id1width);
}

membuat baris terakhir tetapi satu berubah menjadi width: calc(-30%); yang jelas bukan yang diinginkan. Saya mencoba menggunakan width: ~"calc(100% - @id1width)"; tetapi itu membuat @id1width tidak ditafsirkan.

Saya pikir KURANG seharusnya tidak menggunakan hal-hal yang disediakan oleh CSS3 untuk penggunaan internalnya ...

Komentar yang paling membantu

mereka mungkin ditutup sebagai duplikat .. meskipun saya tidak dapat menemukan satu tentang calc .. lihat #146 #122 dan #915

solusi: width: ~"calc(100% - @{id1width})"; - perhatikan tanda kurung kurawal di sekitar variabel.

Kami pindah ke sistem di mana hanya hal-hal di dalam tanda kurung yang akan dievaluasi untuk memperbaiki masalah ini.

Semua 51 komentar

mereka mungkin ditutup sebagai duplikat .. meskipun saya tidak dapat menemukan satu tentang calc .. lihat #146 #122 dan #915

solusi: width: ~"calc(100% - @{id1width})"; - perhatikan tanda kurung kurawal di sekitar variabel.

Kami pindah ke sistem di mana hanya hal-hal di dalam tanda kurung yang akan dievaluasi untuk memperbaiki masalah ini.

:+1:

<strong i="5">@rows</strong>: 10;

<strong i="6">@row1</strong>: 1 / <strong i="7">@rows</strong> * 100%;

.featured1
{
  top: ~'-webkit-calc(@{row1} + 20px)';
  right: 0;
  bottom: @row5;
  left: @col9;
}

Sedikit KURANG ini akan memproses nilai ' @row1 ' menjadi 10%, yang sangat bagus. Tetapi ketika itu berada di dalam bagian yang lolos dari KURANG dan dibungkus dengan keriting untuk mempertahankan variabel KURANG, ia mengembalikan '10' tanpa '%'.

Saya telah menemukan solusi yang belum mengecewakan saya. Jika Anda menempatkan '%' lain setelah ikal penutup variabel 'row1' di dalam kode yang lolos, itu akan berfungsi dengan benar ...

~'-webkit-calc(@{row1}% + 20px)';

Tapi itu sepertinya cukup meretas untuk menambahkan tipe unit lain yang seharusnya sudah ada di variabel.

@jonjohnjohnson ini diperbaiki di kepala dan akan di 1.3.2

sisa bug ini akan diselesaikan di 1.4.0

Tidak yakin apakah ini masalah yang sama, tetapi saya mengalami masalah dengan yang berikut ini. Perhatikan bahwa tidak ada hal-hal yang kurang spesifik di sini, kurang 1.3.3 adalah munging CSS yang valid.

Berikut CSSnya

html, body {
    margin:0, padding:0, border:0;
    height: 100%;
}

#content {
    height: -webkit-calc(100% - 40px);
    height: calc(100% - 40px);
    background-color:gray;
}

#footer {
    background-color:black;
}

Dan inilah HTML untuk memasukkannya

<!doctype html>
<html lang="en">
<head>
<link rel="stylesheet/less" type="text/css" href="test.css" />
<script src="less-1.3.3.min.js"></script>
<body>
<div id="content"></div>
<div id="footer" style="height:40px"></div>
</body>
</html>

"konten" sedang diatur ke ketinggian 60%, jadi lebih sedikit parsing & salah menyelesaikan ekspresi calc daripada meneruskannya tidak berubah ke browser. Diuji di Safari 6.0.2 dan Firefox.

Diperbaiki pada master untuk 1.4.0

height: ~"calc(100% - 50px)";

masih menghasilkan:

height: calc(50%);

untuk saya. Aku ingin:

height: calc(100% - 50px);

Terlebih lagi, masih menghasilkan height: calc(50%); bahkan dengan matematika yang ketat diatur ke on .

@OliverJAsh Saya tidak dapat mereproduksi hasil Anda dengan Less 1.7.0 (baik nilai lolos dan --strict-math:on berfungsi seperti yang diharapkan)... Bisakah Anda memberikan detail lebih lanjut tentang kompiler/lingkungan/skrip yang Anda gunakan? (Untuk berjaga-jaga jika ada masalah skrip pembuatan Bootstrap yang dapat menyebabkan hasil yang salah: https://github.com/twbs/bootstrap/issues/13604, mungkin ini juga kasus Anda?).

Saya mengalami masalah ini di 1.6.3 (untuk beberapa alasan, WinLESS gagal dikompilasi ketika saya memutakhirkan ke 1.7.x, jadi saya tetap menggunakan 1.6.x untuk saat ini)

Perbaikan cepat saya hanya untuk menghindari satu bagian dari persamaan seperti:

height: calc(~"100%" - unit(<strong i="7">@var</strong>, px));

Ini bahkan berfungsi untuk variabel, seperti <strong i="10">@var</strong>: 50 . Atau Anda dapat menghindari seluruh perhitungan seperti calc(~"100% - 50px");

@twiginteractive Jika Anda harus menggunakan escaping dengan opsi --strict-math off (pengaturan default) maka itu bukan masalah tetapi perilaku yang diharapkan. Lihat --strict-math .

@seven-phases-max Hmmm - menurut dokumen, dengan SM mati (default) maka _harus_ ini diuraikan dengan benar (yaitu tidak tersentuh)
height: calc(100% - 10px);

Tapi tidak. CSS keluaran adalah height: calc(90%); , yang bukan hasil yang diinginkan. Mungkin ini diperbaiki di 1.7, tetapi seperti yang saya katakan, saya tidak dapat menggunakan versi itu sekarang sampai saya mengetahui apa yang merusak kompilasi WinLESS.

(Kecuali saya salah membaca dokumen ketika dikatakan "akan diproses dengan benar"... KURANG tidak dapat mengetahui nilai 100%, jadi seharusnya tidak melakukan perhitungan matematis pada '100% - 10px')

@twiginteractive

menurut dokumen, dengan SM mati (default) maka ini harus diuraikan dengan benar (yaitu tidak tersentuh)

Tidak, kata di sana adalah currently bukan correctly (yaitu "akan _akan diproses_ saat ini").

@seven-phases-max Ah - buruk, masuk akal sekarang. Terimakasih atas klarifikasinya.

tinggi: ~"calc(100% - 50px)"; Bekerja untuk saya.

Di sinilah Less.js mulai mengacaukan kode Anda.

height: _calc(50%);
height: calc(100% - 50%); /* browser-native */

@stevenvachon

Seharusnya v2.0 akan memiliki opsi untuk mengawali fungsinya seperti:

Ini tidak akan memengaruhi calc dengan cara apa pun. Tidak ada fungsi calc bawaan, Less hanya mengevaluasi ekspresi matematika sesuai dengan aturannya (Less). Itu dia. Jika Anda tidak ingin "kekacauan" ini gunakan --strict-math .

Ps solusi untuk masalah ini adalah matematika yang ketat. Dan mungkin kita harus
memaksakan matematika yang ketat saat dalam panggilan ke calc?

Masalahnya meluas saat menggunakan Mitos setelah Kurang.

Mengapa? Apakah mitos menghapus tanda kurung? Matematika yang ketat membuat superset yang kurang tepat
dari css.

Dan mungkin kita harus memaksakan matematika yang ketat saat melakukan panggilan ke calc?

Kami telah membahas ini di # 1872 dan ada beberapa argumen yang menentang solusi "local strict- math:on ". Solusi yang diusulkan (belum diputuskan) ada di #1880.

@stevenvachon

Bahkan dengan strictMath, kita perlu ~"calc(...)" agar Less mengabaikannya.

Contoh? Yaitu cuplikan di mana Less memasang ekspresi di dalam calc dengan --strict-math=on .

Sejak kapan awalan v2 akan berfungsi? Apakah kita memutuskan itu dan aku lupa?

Sejak kapan awalan v2 akan berfungsi? Apakah kita memutuskan itu dan aku lupa?

Tidak. Saya kira ini hanya sedikit berlebihan https://github.com/less/less.js/issues/2102#issuecomment -50286985.

Ya, maaf, bukan "opsi untuk" tetapi "kemampuan menulis plugin yang menyediakan opsi untuk". Saya harus menguji beberapa kode lagi dengan dan tanpa ~"" pada calc() . Saya pasti salah beberapa waktu lalu dan terus bergerak maju dengan kesalahpahaman itu. Saya memiliki beberapa kode lama yang harus saya modifikasi sekarang.

Saya telah melihat sesuatu yang aneh terjadi dengan calc ketika digunakan bersama dengan width . Saya sudah memasukkan semuanya ke dalam codepen hanya untuk membuatnya lebih mudah: http://codepen.io/anon/pen/OVpJvP

@alenb

Lalu apa yang aneh disana? Kode dalam codepen Anda dikompilasi seperti yang diharapkan...

@seven-fase-max

Ini dikompilasi, tetapi bukan itu yang diharapkan. Periksa kode CSS sedikit lebih dekat.

Aneh karena masih ada celah di paling kanan meskipun harus meregang penuh dengan 3 kolom. Dua kolom pertama harus 33,33% dikurangi 20px dengan kolom terakhir 33,33%. 2 kolom pertama akan memiliki padding-right 20px, tetapi ini tidak tercermin karena jelas ada celah di paling kanan.

Saya telah bermain lebih banyak dengannya tadi malam dan margin-right alih-alih padding-right melakukan trik dan menyelesaikan masalah.

@alenb

Ini dikompilasi, tetapi bukan itu yang diharapkan. Periksa kode CSS sedikit lebih dekat.

Tentu saja. Jadi jika Anda mengharapkan sesuatu yang berbeda - sebutkan.

2 kolom pertama akan memiliki padding-right 20px, tetapi ini tidak tercermin

padding tidak memengaruhi lebar dengan cara apa pun (kecuali jika Anda menetapkan [ box-sizing ](https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing tertentu )), consult [CSS specs](http://www.w3.org/TR/REC-CSS2/box.html). So you simply get : (33% - 20px) + (33% - 20px) + 33% = 99% - 40px -> 40px` gap seperti yang diharapkan.

Either way ini hanya terkait dengan CSS dan tidak ada hubungannya dengan bagaimana Less mengkompilasi calc . Klik tombol "lihat yang dikompilasi" dalam kode codepen dan di sana Anda melihat pernyataan calc dikompilasi oleh Kurang persis seperti yang Anda tentukan).

@seven-fase-max

Saya akan berpikir codepen akan membuat ini jelas, tetapi tidak ada masalah sama sekali.

Terimakasih atas infonya!

Hari ini masih tidak berfungsi dengan instalasi default less (menggunakan npm).

Saya harus menggunakan:
min-height: ~"calc(100% - 262px)"; //calc(100% - 262px);

Saya tidak tahu apakah itu normal, karena bug ditandai "ditutup", tetapi hanya ingin memberi tahu Anda.

@RenaudParis --strict-math

Oke saya akan mencobanya, terima kasih! Tapi bukankah akan lebih baik kalau itu dengan
bawaan? Karena itu cukup mengejutkan, ketika Anda tidak tahu tentang ini
parameter.

Terima kasih!

Le ven. 8 rata-rata 2016 20:48, pemberitahuan Max [email protected] a
écrit:

@RenaudParis https://github.com/RenaudParis --strict-math
http://lesscss.org/usage/#command -line-usage-strict-math


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung atau lihat di GitHub
https://github.com/less/less.js/issues/974#issuecomment -207553212

Tapi bukankah lebih baik jika itu secara default?

Menjadikannya sebagai default akan merusak banyak basis kode Less yang ada. Suatu ketika (di ~ v1.4.0 ) sebenarnya ada upaya untuk menjadikannya default, tetapi kemudian dibalik karena kompatibilitas mundur yang lama... Metode yang lebih baru dan tidak terlalu mengganggu dikembangkan di #1880 (tetapi belum dilaksanakan).

Oke, terima kasih telah meluangkan waktu untuk menjelaskannya kepada saya Max!

Le sam. 9 rata-rata 2016 13:46, pemberitahuan Max [email protected] a
écrit:

Tapi bukankah akan lebih baik kalau itu dengan
bawaan?

Menjadikannya sebagai default akan merusak banyak basis kode Less yang ada. Satu kali
(di ~v1.4.0) sebenarnya ada upaya untuk menjadikannya default, tapi
kemudian dibalik karena kompatibilitas mundur lama... Yang lebih baru,
metode yang kurang mengganggu dikembangkan di # 1880
https://github.com/less/less.js/issues/1880 (tetapi tidak diimplementasikan
belum)).


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung atau lihat di GitHub
https://github.com/less/less.js/issues/974#issuecomment -207776654

Saya telah memecahkan ini:

.calc(<strong i="6">@prop</strong>, @val) {
    @{prop}: ~"calc(~'@{val}')";
    @{prop}: ~"-moz-calc(~'@{val}')";
    @{prop}: ~"-webkit-calc(~'@{val}')";
    @{prop}: ~"-o-calc(~'@{val}');"
}
.calc(width, "80% - 36px");

Ketika saya menggunakan command line itu benar . Hanya less-loader yang tidak benar. Jadi saya menemukan solusi ini di stackoverflow

Saya menyalinnya ke kode saya, Sayangnya itu juga tidak benar. Jadi saya memodifikasi sesuatu. Berhasil!

Sayangnya, baris perintah tidak benar!!😂 😂 😂

Tidak yakin mengapa masalah ini ditutup. Tidak masuk akal bahwa Less akan mengubah perilaku CSS asli.

... Lebih sedikit akan mengubah perilaku CSS asli.

Itu tidak akan terjadi. Cukup setel --strict-math=on (tidak diaktifkan secara default karena kompatibilitas dengan sejumlah besar proyek Less tergantung pada --strict-math=off , ditambah beberapa pertimbangan yang disebutkan di #1880).

Dalam tema UIkit 3 saya menggunakan ini di my_theme.less :

height: ~"calc(100vh - 20px)";

Dan itu berhasil.

Ini bekerja untuk saya ketika menulis dalam file *.less https://github.com/less/less.js/issues/974#issuecomment -9229470

Terima kasih @lukeapage ! 🥇

Hai @mqliutie terima kasih telah menambahkan saran mixin untuk calc, tapi, ada tambahan ~ di Mixin Anda yang merusak kompilasi:

campurannya harus

.calc(<strong i="8">@prop</strong>, @val) {
    @{prop}: ~"-webkit-calc('@{val}')";
    @{prop}: ~"-moz-calc('@{val}')";
    @{prop}: ~"calc('@{val}')";
}

Masukan sebagai berikut:
.calc(lebar, "100% - 60px");

Keluaran sebagai berikut:
lebar: calc(100% - 60px);

Kenapa masalah ini ditutup?! Ini tidak tetap.

Saya masih mendapatkan calc(30%) ketika saya menulis calc(50% - 20px) . Ini tidak pernah diinginkan oleh siapa pun. Terlepas dari kenyataan bahwa menghitung secara membabi buta dengan unit yang berbeda adalah salah , itu harus membiarkannya apa adanya dalam calc(), kecuali jika dapat dihitung dengan keandalan 100% (misalnya unit yang sama). Saya menggunakan KURANG 2.7.3.

Silakan buka kembali masalah ini.

@thany
Lihat komentar ini, mereka menjelaskan bagaimana ini bukan masalah, sebanyak pengaturan default pemrosesan matematika adalah produk sampingan dari sejarah, dan Anda selalu dapat mengubah pengaturan default.
https://github.com/less/less.js/issues/974#issuecomment -207553212
https://github.com/less/less.js/issues/974#issuecomment -207776654

@jonjohnjohnson Itu hanya menyatakan masalahnya lagi. Jika mode ketat memperbaikinya (belum mencoba, seharusnya tidak perlu mengaktifkan semua jenis flag nondefault untuk mengatasi bug) maka itu harus diaktifkan secara default.

Tidak peduli bagaimana Anda mengatakannya, masalah ini tidak diperbaiki dengan definisi apa pun.

@thany Saya hanya mencoba membantu Anda memahami bahwa pengembang memutuskan itu bukan masalah menurut mereka. Komentar tersebut tidak hanya menyatakan kembali masalah, mereka menggambarkan sikap pengembang tentang masalah tersebut. Semoga beruntung.

@thany

maka itu harus aktif secara default.

Tidak mungkin karena ini akan segera menghancurkan jutaan proyek di luar sana. Jadi, jika Anda memperlakukan perilaku default sebagai masalah, cukup atur opsi yang didokumentasikan dan selesai. Dengan definisi apapun.

Kenapa masalah ini ditutup?!

Karena diskusi terkini tentang cara meningkatkan perilaku default ada di sini .

@thany Sebagai @seven-phases-max, jika Anda ingin melihat ini diselesaikan, berkontribusi #1880. Saya pikir solusinya sudah ada, tetapi belum ada cukup pertimbangan masyarakat untuk mengambil keputusan yang siap untuk diterapkan. Ini adalah utas yang panjang, tetapi itulah yang diperlukan untuk menemukan solusi: meninjau proposal dan menimbang dalam satu atau lain cara. Dan kemudian: seseorang untuk mengambil pekerjaan untuk diimplementasikan.

 width: 15%;
 height: ~"calc(width)";

cara membuat tinggi = lebar

@xiaomizhou66
Itu tidak ada hubungannya dengan KURANG, atau dengan masalah ini. Ini murni pertanyaan CSS. Silakan cari sesuatu seperti "css keep aspek" dan Anda akan menemukan beberapa jawaban.

Jadi ini masih rusak. calc(100vh - 138px) menjadi -38px.

@willatathena

Jika Anda mengalami masalah ini dengan Less 3.x, harap buat laporan bug terpisah.
Untuk versi Kurang sebelumnya, ini adalah perilaku yang diharapkan secara default (baca posting di atas untuk menemukan cara menanganinya).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat