<div>
Tarayıcı ekranına ortalamak istediğim bir tane olduğunu varsayalım (görünüm alanı). Bunu yapmak için, <div>
elemanın genişliğini ve yüksekliğini hesaplamam gerekiyor .
Ne kullanmalıyım? Lütfen tarayıcı uyumluluğu hakkında bilgi ekleyin.
<div>
Tarayıcı ekranına ortalamak istediğim bir tane olduğunu varsayalım (görünüm alanı). Bunu yapmak için, <div>
elemanın genişliğini ve yüksekliğini hesaplamam gerekiyor .
Ne kullanmalıyım? Lütfen tarayıcı uyumluluğu hakkında bilgi ekleyin.
Yanıtlar:
.offsetWidth
Ve .offsetHeight
özelliklerini kullanmalısınız . Notlar elemente aittir, değil .style
.
var width = document.getElementById('foo').offsetWidth;
İşlev.getBoundingClientRect()
, CSS dönüşümleri gerçekleştirdikten sonra öğenin boyutlarını ve konumunu kayan nokta sayısı olarak döndürür.
> console.log(document.getElementById('id').getBoundingClientRect())
DOMRect {
bottom: 177,
height: 54.7,
left: 278.5,
right: 909.5,
top: 122.3,
width: 631,
x: 278.5,
y: 122.3,
}
.offsetWidth
ve .offsetHeight
: developer.mozilla.org/en/Determining_the_dimensions_of_elements
offsetWidth
öğe ise 0 display:none
olurken, hesaplanan width
bu örnekte yine de pozitif bir değere sahip olabilir. visibility:hidden
etkilemez offsetWidth
.
offsetWidth
içerik, dolgu ve kenarlıklar dahil olmak üzere "bütün" kutusunu döndürür; while clientWidth
, yalnızca içerik kutusunun boyutunu döndürür (böylece öğede sıfır olmayan dolgu ve / veya kenarlık olduğunda daha küçük bir değere sahip olur). (mod netlik için düzenlenmiştir)
Bir göz atın Element.getBoundingClientRect()
.
Bu yöntem içeren bir nesne döndürür width
, height
ve diğer bazı faydalı değerler:
{
width: 960,
height: 71,
top: 603,
bottom: 674,
left: 360,
right: 1320
}
Örneğin:
var element = document.getElementById('foo');
var positionInfo = element.getBoundingClientRect();
var height = positionInfo.height;
var width = positionInfo.width;
Bunun bazen geri döndükleri yerde bulunmadığı .offsetWidth
ve bu konudaki sorunlara sahip olmadığına inanıyorum (buradaki yorumlarda tartışıldığı gibi ).offsetHeight
0
Diğer bir fark, en yakın tamsayıya yuvarlanacak ve kesilecek getBoundingClientRect()
kesirli pikselleri döndürebilir ..offsetWidth
.offsetHeight
IE8 Not : IE8 ve altı getBoundingClientRect
için yükseklik ve genişlik döndürmez . *
Eğer varsa gerekir IE8 destekleyen, kullanımı .offsetWidth
ve .offsetHeight
:
var height = element.offsetHeight;
var width = element.offsetWidth;
Bu yöntemle döndürülen nesnenin gerçekten normal bir nesne olmadığını belirtmek gerekir . Özellikleri numaralandırılamaz (örneğin, Object.keys
kutudan çıktığı gibi çalışmaz.)
Burada daha fazla bilgi: En iyi nasıl bir ClientRect / DomRect düz bir nesneye dönüştürmek
Referans:
.offsetHeight
: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight.offsetWidth
: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetWidth.getBoundingClientRect()
: https://developer.mozilla.org/tr-TR/docs/Web/API/Element/getBoundingClientRectoffsetHeight
ve offsetWidth
olmayacaktır.
NOT : Bu cevap 2008 yılında yazılmıştır. O zaman çoğu insan için en iyi çapraz tarayıcı çözümü gerçekten jQuery kullanmaktı. Cevabı burada gelecek kuşaklar için bırakıyorum ve jQuery kullanıyorsanız, bunu yapmanın iyi bir yoludur. Başka bir çerçeve veya saf JavaScript kullanıyorsanız, kabul edilen cevap muhtemelen gitmenin yoludur.
JQuery 1.2.6 itibariyle çekirdek birini kullanabilirsiniz CSS fonksiyonları , height
ve width
(veya outerHeight
ve outerWidth
uygun olanları).
var height = $("#myDiv").height();
var width = $("#myDiv").width();
var docHeight = $(document).height();
var docWidth = $(document).width();
Herkes için yararlı olması durumunda, ben aynı css ile bir metin kutusu, düğme ve div koymak:
width:200px;
height:20px;
border:solid 1px #000;
padding:2px;
<input id="t" type="text" />
<input id="b" type="button" />
<div id="d"></div>
Chrome, firefox ve ie-edge'de denedim, jquery ile ve onsuz denedim ve denedim ve onsuz denedim box-sizing:border-box
. Her zaman ile<!DOCTYPE html>
Sonuçlar:
Firefox Chrome IE-Edge
with w/o with w/o with w/o box-sizing
$("#t").width() 194 200 194 200 194 200
$("#b").width() 194 194 194 194 194 194
$("#d").width() 194 200 194 200 194 200
$("#t").outerWidth() 200 206 200 206 200 206
$("#b").outerWidth() 200 200 200 200 200 200
$("#d").outerWidth() 200 206 200 206 200 206
$("#t").innerWidth() 198 204 198 204 198 204
$("#b").innerWidth() 198 198 198 198 198 198
$("#d").innerWidth() 198 204 198 204 198 204
$("#t").css('width') 200px 200px 200px 200px 200px 200px
$("#b").css('width') 200px 200px 200px 200px 200px 200px
$("#d").css('width') 200px 200px 200px 200px 200px 200px
$("#t").css('border-left-width') 1px 1px 1px 1px 1px 1px
$("#b").css('border-left-width') 1px 1px 1px 1px 1px 1px
$("#d").css('border-left-width') 1px 1px 1px 1px 1px 1px
$("#t").css('padding-left') 2px 2px 2px 2px 2px 2px
$("#b").css('padding-left') 2px 2px 2px 2px 2px 2px
$("#d").css('padding-left') 2px 2px 2px 2px 2px 2px
document.getElementById("t").getBoundingClientRect().width 200 206 200 206 200 206
document.getElementById("b").getBoundingClientRect().width 200 200 200 200 200 200
document.getElementById("d").getBoundingClientRect().width 200 206 200 206 200 206
document.getElementById("t").offsetWidth 200 206 200 206 200 206
document.getElementById("b").offsetWidth 200 200 200 200 200 200
document.getElementById("d").offsetWidth 200 206 200 206 200 206
MDN'ye göre : Elemanların boyutlarının belirlenmesi
offsetWidth
ve offsetHeight
"görünür içeriğin genişliği, kaydırma çubukları (varsa), dolgu ve kenarlık dahil olmak üzere bir öğenin kapladığı toplam alan miktarını döndür"
clientWidth
ve clientHeight
"dolgu dahil ancak kenarlık, kenar boşlukları veya kaydırma çubukları hariç gerçek görüntülenen içeriğin ne kadar yer kapladığını"
scrollWidth
ve scrollHeight
"şu anda ne kadarının görünür olduğuna bakılmaksızın içeriğin gerçek boyutunu" döndürür
Dolayısıyla, ölçülen içeriğin geçerli görüntülenebilir alanın dışında olup olmayacağına bağlıdır.
Yalnızca IE7 ve daha eski sürümler için hesaplamanız gerekir (ve yalnızca içeriğinizin boyutu sabit değilse). Hack'i CSS2'yi desteklemeyen eski IE'lerle sınırlamak için HTML koşullu yorumları kullanmanızı öneririm. Diğer tüm tarayıcılar için bunu kullanın:
<style type="text/css">
html,body {display:table; height:100%;width:100%;margin:0;padding:0;}
body {display:table-cell; vertical-align:middle;}
div {display:table; margin:0 auto; background:red;}
</style>
<body><div>test<br>test</div></body>
Bu mükemmel bir çözüm. <div>
Herhangi bir boyutta ortalar ve içeriğinin boyutuna küçültür.
Elemanlar stillerini değiştirmek kolaydır, ancak değeri okumak biraz zordur.
Javascript'te getComputedStyle yerleşik yöntem çağrısını kullanmadığınız sürece JavaScript, css'den (dahili / harici) gelen herhangi bir öğe stili özelliğini (elem.style) okuyamaz.
getComputedStyle (öğe [, sözde])
Öğe: Değerinin okunacağı öğe.
sözde: Gerekirse sözde öğe, örneğin :: önce. Boş bir dize veya hiçbir bağımsız değişken, öğenin kendisi anlamına gelir.
Sonuç, elem.style gibi stil özelliklerine sahip, ancak şimdi tüm css sınıflarına göre bir nesnedir.
Örneğin, burada stil kenar boşluğunu görmez:
<head>
<style> body { color: red; margin: 5px } </style>
</head>
<body>
<script>
let computedStyle = getComputedStyle(document.body);
// now we can read the margin and the color from it
alert( computedStyle.marginTop ); // 5px
alert( computedStyle.color ); // rgb(255, 0, 0)
</script>
</body>
Böylece javaScript kodunuzu, genişliğini / yüksekliğini veya başka bir özelliğini almak istediğiniz öğenin getComputedStyle'sini içerecek şekilde değiştirdi
window.onload = function() {
var test = document.getElementById("test");
test.addEventListener("click", select);
function select(e) {
var elementID = e.target.id;
var element = document.getElementById(elementID);
let computedStyle = getComputedStyle(element);
var width = computedStyle.width;
console.log(element);
console.log(width);
}
}
Hesaplanmış ve çözülmüş değerler
CSS'de iki kavram vardır:
Hesaplanan stil değeri, CSS kademesinin sonucu olarak tüm CSS kuralları ve CSS devralma uygulandıktan sonraki değerdir. Yükseklik gibi görünebilir: 1em veya yazı tipi boyutu:% 125.
Çözülmüş bir stil değeri, öğeye nihayet uygulanan değerdir. 1em veya% 125 gibi değerler görecelidir. Tarayıcı hesaplanan değeri alır ve tüm birimleri sabit ve mutlak yapar, örneğin: yükseklik: 20 piksel veya yazı tipi boyutu: 16 piksel. Geometri özellikleri için, çözülen değerler genişlik gibi bir kayan noktaya sahip olabilir: 50.5 piksel.
Hesaplanan değerleri almak için uzun zaman önce getComputedStyle oluşturuldu, ancak çözülen değerlerin çok daha kullanışlı olduğu ve standardın değiştiği ortaya çıktı.
Yani bugünlerde getComputedStyle aslında özelliğin çözümlenmiş değerini döndürür.
Lütfen aklınızda bulundurun:
getComputedStyle tam özellik adını gerektirir
Her zaman, paddingLeft veya height veya width gibi tam olarak istediğiniz özelliği istemelisiniz. Aksi takdirde doğru sonuç garanti edilmez.
Örneğin, paddingLeft / paddingTop özellikleri varsa, getComputedStyle (elem) .padding için ne almalıyız? Bilinen dolgulardan hiçbir şey mi yoksa “üretilen” bir değer mi? Burada standart bir kural yok.
Başka tutarsızlıklar da var. Örnek olarak, bazı tarayıcılar (Chrome) aşağıdaki belgede 10 piksel gösterir ve bazıları (Firefox) - şunları yapmaz:
<style>
body {
margin: 30px;
height: 900px;
}
</style>
<script>
let style = getComputedStyle(document.body);
alert(style.margin); // empty string in Firefox
</script>
daha fazla bilgi için https://javascript.info/styles-and-classes
element.offsetWidth ve element.offsetHeight, önceki gönderide önerildiği gibi yapmalıdır.
Ancak, içeriği yalnızca ortalamak istiyorsanız, bunu yapmanın daha iyi bir yolu vardır. Xhtml katı DOCTYPE kullandığınızı varsayarsak. kenar boşluğu: 0, otomatik özellik ve piksel cinsinden gereken genişliği gövde etiketine ayarlayın. İçerik, sayfaya ortalanacak şekilde hizalanır.
... CSS'in div'ı ortaya koymasına yardımcı olduğu anlaşılıyor ...
<style>
.monitor {
position:fixed;/* ... absolute possible if on :root */
top:0;bottom:0;right:0;left:0;
visibility:hidden;
}
.wrapper {
width:200px;/* this is size range */
height:100px;
position:absolute;
left:50%;top:50%;
visibility:hidden;
}
.content {
position:absolute;
width: 100%;height:100%;
left:-50%;top:-50%;
visibility:visible;
}
</style>
<div class="monitor">
<div class="wrapper">
<div class="content">
... so you hav div 200px*100px on center ...
</div>
</div>
</div>
ayrıca bu kodu kullanabilirsiniz:
var divID = document.getElementById("divid");
var h = divID.style.pixelHeight;
Belirli bir Dom öğesinin yüksekliğini belirleyen WKWebView kodu (tüm sayfa için düzgün çalışmıyor)
let html = "<body><span id=\"spanEl\" style=\"font-family: '\(taskFont.fontName)'; font-size: \(taskFont.pointSize - 4.0)pt; color: rgb(\(red), \(blue), \(green))\">\(textValue)</span></body>"
webView.navigationDelegate = self
webView.loadHTMLString(taskHTML, baseURL: nil)
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.getElementById(\"spanEl\").getBoundingClientRect().height;") { [weak self] (response, error) in
if let nValue = response as? NSNumber {
}
}
}
swift
kodu, değil mi? JavaScript değil. Bir downvote stopaj ediyorum (b / bu aslında oldukça yararlı olabilir c) ama bu lütfen unutmayın değil soruyu cevaplamak ve muhtemelen başka daha uygun olacağını, iOS belirli bir sorum var. Eğer zaten yoksa, belki bir soru sormayı ve kendi kendine cevap vermeyi düşünün.