Gulp sadece css'i watch etmek için kullanılmıyor o yüzden :) js, html, compress taraflarında da oldukça yaygın pluginleri var.
o yüzden bir düzen organize ederek kodlama yapmak için ideal, ama popüler değil.
yatay olarak ortalamak istersen, kapsayıcının belli bir genişliği olmalı. Diyelim ki var, o zaman şu değerleri verirsen
button {
left: 50%;
transform: translateX(-50%);
}
butonun içindeki genişliği bilmene gerek kalmaz dinamik olarak yatayda ortalayabilirsin. Dikeyde de ortalamak istersen
button {
top: 50%;
transform: translateY(-50%);
}
her iki eksen için istersen
button {
top: 50%;
left: 50%;
transform: translate(-50%, -50%)
}
örnek bir kullanım
<div>
<button>test</button>
</div>
<style>
div {
width: 100%;
height: 200px;
border: 1px solid #ccc;
position: relative;
}
button {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%)
}
</style>
burada önemli olan dediğim gibi buton position uygulanınca kapsayıcıda belli bir yükseklik ve genişlik yoksa sorun yaratır min. bir değer vermen gerekir ki ona göre ortalama işlemi yapabil.
aslında bu normal bir davranış, overflow: hidden ya da auto dendiğinde otomatik olarak gizleniyor içindeki elemanlar.
bu gibi durumlar için tooltip bunun içinde değilde bağımsız olarak body'nin içinde yer alan bir alanda olmalı.
fare ile ilgili elemana gelince farenin konumu (top, left) alınıp body'deki tooltip'e anlık olarak atanmalı.
ayrıca yine fare üstündeyken global bir değişkene tooltip'te görünecek değerler belirlenmeli, fare odağını çekince bu işlemleri sıfırlamalısın.
kodlar temiz olsa bir örnek verecektim ama belki bu teorik detay bir şeyleri farklı düşünmeni sağlayabilir.
npm run build dedikten sonra public klasörüne html, css ve js dosyaları çıkıyor. vercel'e ya da başka bir yere deploy ederken bu public klasörünün içindekileri deploy edeceksin, bunları herhangi bir hostingde de rahatça çalıştırabilirsin.
fonksiyon'da default olarak $wherearray = "" yerine $wherearray = [] yaparsan problem çözülecektir muhtemelen. Çünkü execute() metodu array ya da null bekliyormuş varsayılan olarak sen string geçiyorsun.
ben şu şekilde kullanıyorum. genel kullandığmı componentler için
./src/components
./src/components/shared
servisler, store ve utils için
./src/services
./src/stores
./src/utils
sayfalar içinde genel view klasörünü kullanıyorum. Ama her sayfa için bir index.js oluşturuyorum çağırması daha kolay olsun diye. Ayrıca sayfaya özel componentler varsa yine ilgili klasörde belirtiyorum.
./views
./views/home
./views/home/index.js
./views/home/components
bu tamamen kişisel tercih, ben bu şekilde kullanıyorum ama seninki de fena değil, farklı bir çok alternatifini de görebilirsin. Mümkün olduğunca requestleri tek bir yerden yönetirsin. Requestlerin tamamını service klasöründe mantıklı şekillerde export edip kullanırsın. Ayrıca store yönetimi için redux toolkit çok daha kolay bir düzen kurmanı sağlar.
id'ler yanlış yerde, ek olarak zaten seçtiğin elemanın text'ini almamışsın ama alsan bile NaN verecek aşağıdaki kodu çalıştırırsan anlarsın durumu
console.log( parseInt('ornek sayi : 34') )
yapacağın şey id'leri sayılara vermek. Yani;
<td>ornek sayi : <span id="hisse1">34</span></td>
<td>ornek sayi : <span id="hisse2">25</span></td>
<script>
for(i = 1; i <= 9; i++){
var bolme = 920 / parseInt(document.getElementedById("hisse" + i).innerText) //????
// diğer işlemler..
}
</script>
buyur dostum
<table border="1">
<thead>
<tr>
<th>MODEL ADI</th>
<th>MALAFA</th>
<th>TEL ÖLÇÜSÜ</th>
<th>TEL GRAM</th>
<th>TEL ADET</th>
<th>DÖKÜM</th>
<th>DÖKÜM ADET</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="2">
pc101
</td>
<td></td>
<td>130x130</td>
<td>90</td>
<td>220</td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td>200 TERS DOÇ</td>
<td>40</td>
<td>200</td>
<td></td>
<td></td>
</tr>
<tr>
<td>ADET</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td rowspan="2">
20
</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
yapacağın şey $elemanlar değişkeninde sanırım db'den kategorileri çekiyorsun, join ile urunler tablona bağlanacaksın, böylece sadece ürün olan kategorileri döndürecek join eşleşmesinden dolayı, fonksiyonda bir şey yapmaya gerek yok.
şöyle bir sorgu olabilir
select kategoriler.* from kategoriler
inner join urunler on urunler.kat_id = kategoriler.id
yani şöyle düşün, fonksiyonda parametre olarak geçtiğin elemanı değiştirmek istiyorsan ama onu geriye döndürmek yerine değerinin direk etkilenmesini istiyorsan kullanabilirsin, sonuçta fonksiyonun sadece onunla ilgili bir işlemi olmayabilir, ya da aldığın parametreye göre fonksiyon farklı bir işlem için değer döndürebilir ama alınan parametreninde bundan etkilenilmesi istenebilir.
kısaca referans aldığın değişkenin değerini etkiliyor bu şekilde kullanırsan, en basit örneği;
<?php
$text = 'hello';
function changeText(&$text) {
$text .= ' world';
}
changeText($text);
echo $text; // hello world
başka bir örnek
<?php
$numbers = [2, 3, 5];
function multiply(&$nums) {
$nums = array_reduce($nums, function($prev, $num) {
$prev[] = $num * 2;
return $prev;
}, []);
}
multiply($numbers);
print_r($numbers);
/*
Array
(
[0] => 4
[1] => 6
[2] => 10
)
*/
tabi bu olay sadece parametre geçmekle alakalı değil, örneğin şöyle kullanımlarıda var;
$text1 = 'hello';
$text2 = &$text1;
$text2 = 'deneme';
echo $text1;
$text2 oluşturulurken $text1 referansıyla oluşturuluyor, dolayısı ile $text2 değiştirince aslında referansı yani $text1 değişiyor. Bu tarz kullanımlara çok takılma, vakti gelirse zaten ihtiyacın olduğu bir noktada mutlaka kullanırsın :)