17

SVG タグを垂直方向に中央揃えにする方法を見つけようとしています。

基本的に、これは私が中心にしようとしている単純化されたSVGコードです:

<svg height="272" style="background-color:transparent;margin-left: auto; margin-right: auto;" width="130" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <g style="font-size: 0.7em;" transform="scale(1 1) rotate(0) translate(0 270)">
        <g id="1" style="font-size: 0.7em;">
            <image height="32" width="32" x="49" xlink:href="../../images/JOB.GIF" y="-270"/>
        </g>
    </g>
</svg> 

ページの中央 (水平方向) に配置しても問題ありませんが、垂直方向の中央にも配置したいと考えています。

ラッパーを追加できますが、SVG サイズやウィンドウ サイズに依存しない、これを行う一般的な方法を知りたいです。

複数の方法を試しましたが、何もうまくいきませんでした。

ありがとう、

4

5 に答える 5

24

現在のブラウザにはそれに対するより優れたソリューションがあるため、この回答を更新しました。

賢い人が言ったように、最初の年はhtmlとcssを学び、さらに数年は高度なjavascriptを学び、5年後にはdivを垂直方向に中央揃えする方法を最終的に学びます.

CSS で何かを垂直方向/水平方向に整列するには、主に 2 つの方法を使用できます。

絶対の

<div class="outside">
    <div class="inside">Whatever</div>
</div>

そしてCSS:

.outside{
    position:relative;
}
.inside{
    position:absolute;
    top:50%;
    bottom:50%;
    transform:translate(-50%, -50%);
}

唯一の問題は、要素が高さを生成しないことです。

フレックスボックス

Flexbox はかなり優れたサポートを提供するようになったので、使用しない理由はありません。https://caniuse.com/#feat=flexbox

フレックスボックスを使用すると、アイテムは絶対である必要がないため、高さが生成されます。コード:

<div class="outside">
    <div>Whatever</div>
</div>

そしてCSS:

.outside{
    display: flex;
    align-items: center;
    justify-content: center;
}

古い答え:

高さと幅があるので、使用できますmargin : auto auto;

またはそれをdivに入れます

position:absolute ;
left:50% ;
margin-left: -(half of width of image)px;
top:50% ;
margin-top: -(half of height of image)px;

あなたがそれで何かをするなら、2番目のものはより良いでしょう(JavaScriptアニメーションか何か)

私はそれをチェックしませんでしたが、svgの2番目のオプション(外部​​divなし)も使用できるかもしれません

于 2013-01-14T11:24:38.530 に答える
1

svg要素に属性を指定し、その属性を&viewBoxに設定すると、すべてがうまくいくはずです (ほとんどのブラウザでは..)widthheight100%

$(document).ready(function(){
  $(".panel-left").resizable({handleSelector: ".splitter",containment: "parent"});
});
#ctr
{
	position:        absolute;
	border:          1px solid #131313;    
	top:             5%;
	left:            5%;
	bottom:          5%;
	right:           5%;    
	display:         flex;
	flex-direction:  row;    
}

#ctr svg
{
	height:    100%;
	width:     100%;
}

.panel-left 
{
  flex:         0 0 auto;
  padding:      10px;
  width:        50px;
  min-height:   50px;
  min-width:    50px;
  max-width:    80%;
  max-height:   100%;
  white-space:  nowrap;
  background:   #131313;
  color:        white;
}

.splitter 
{
  flex:         0 0 auto;
  width:        18px;  
}

.panel-right 
{
  flex:         1 1 auto;
  padding:      10px;
  min-width:    20px;
  background:   #eee;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>


<div style="visibility:hidden; position:absolute; width:0">
	<svg>
	  <g id="my-funky-svg-defs">
		<defs>
		  <radialGradient id="gradient" cx="25%" cy="25%" r="100%" fx="40%" fy="40%">
			<stop offset=  "0%" stop-color="hsla(313,  80%, 80%, 1)"/>
			<stop offset= "40%" stop-color="hsla(313, 100%, 65%, 1)"/>
			<stop offset="110%" stop-color="hsla(313, 100%, 50%, 0.7)"/>
		  </radialGradient>
		</defs>    
		<title>smarteee</title>
		<circle  class="face" cx="200" cy="200" r="195" fill="url(#gradient)" />
		<ellipse class="eye eye-left" cx="140" cy="150" rx="10" ry="40" fill="#131313"/>
		<ellipse class="eye eye-right" cx="260" cy="150" rx="10" ry="40" fill="#131313"/>
		<path class="smile" d="M120,280 Q200,330 280,280" stroke-width="10" stroke="#131313" fill="none" stroke-linecap="round"/>
	  </g>
	</svg>
</div>

<div id=ctr>
	<div class="panel-left">
	  <svg viewBox="0 0 400 400"><use xlink:href="#my-funky-svg-defs"></use></svg>        
	</div>

	<div class="splitter">
	</div>

	<div class="panel-right">
	  <svg viewBox="0 0 400 400"><use xlink:href="#my-funky-svg-defs"></use></svg>        
	</div>
</div>

&ここに対応する jsfiddle があります。

注意:設定preserveAspectRatioと連動する属性もありviewBoxます。例えば:preserveAspectRatio="xMidYMid meet"

于 2015-03-03T12:37:19.560 に答える
-2

私は最終的にそうするためにいくつかのJSコードを使用しました。

私はここから解決策を使用していました:ページの垂直方向と水平方向に <div> を中央に配置する最良の方法は?

それは:

div {
    width: 100px;
    height: 100px;
    background-color: red;

    position: absolute;
    top:0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;

}

しかし問題は、SVG がウィンドウ サイズよりも大きい場合、トリミングされることです。私が使用したJSコードは次のonLoadとおりです。

var heightDiff = window.innerHeight - svg.height.baseVal.value;
var widthDiff = window.innerWidth - svg.width.baseVal.value;
if (heightDiff > 0)                                                                                                                
    svg.style.marginTop = svg.style.marginBottom = heightDiff / 2;
if (widthDiff > 0)
    svg.style.marginLeft = svg.style.marginRight = widthDiff / 2; 
于 2013-01-15T03:31:32.830 に答える