【问题标题】:How can I center scaled radio button icons in their DIV?如何在其 DIV 中居中缩放单选按钮图标?
【发布时间】:2021-12-22 11:57:01
【问题描述】:

下面显示为黄色 SVG 圆圈的“徽标”可以通过 adjusting the height ratio 进行缩放(代码中由 <==== (1) 指示的行),无需修改 SVG 本身即可进行调整。

但即使.left_center_myicon.right_center_myicon 中大部分重复,<==== (2) 中的相同调整不会影响单选按钮图标。

如何在其 DIV 中将缩放的单选按钮图标居中?我在这里使用内联 SVG,甚至将它们更改为链接(从 <svg><img src="xyz.svg"> 本身就是一个脆弱而微妙的变化。如果您发现这个困难,请在您的答案中切换到链接的 SVG。

更新

我希望单选按钮在其 div 中垂直居中,而该 div 本身在标题中垂直居中并右对齐。

理想情况下,我还希望能够从样式文件中调整 SVG 单选按钮图标的比例(尽管我开始怀疑这样做是否会违背已建立的习惯——在其他方面)换句话说,我想知道也许设计师最终会编辑 SVG 文件而不是从 CSS 中操纵 SVG 的比例)。

.header {
    width: 100%;
    height: 300px;
    background-color: #ddd;
    margin: 5px;
    align-items:center;
    display: block;
    text-align: center;
}
.left_center_myicon {
    margin: 0 auto;
    
    background-color: #bbb;

    float: left;
    height: 70%; /* <==== (1) */
    position: relative;
    top: 50%;
    left: 0;
    transform: translate(0%, -50%);
}

.right_center_myicon {
    background-color: #ccc;
    margin: 0 auto;
    
    float: right;
    height: 70%; /* <==== (2) */
    position: relative;
    top: 50%;
    left: 0;
    transform: translate(0%, -50%);

    vertical-align: middle;
}

svg { stroke:black; stroke-width:5; opacity:0.5; vertical-align: middle; }
<div class="header">
    <a href="index.html">
        <img class="left_center_myicon" src="svg/logo.svg"/>
    </a>

    <div class="right_center_myicon">
        <label class="myLabel">
            <input type="radio" name="radioGroup" class="myradioG" checked>
            <svg width="100" height="100" viewBox="0 0 100 100">
                <circle cx="50" cy="50" r="30" style="fill:blue;" />
            </svg>
        </label>
        <label class="inline-radio">
            <input type="radio" name="radioGroup" class="myradioG">
            <svg width="100" height="100" viewBox="0 0 100 100">
                <rect x="20" y="20" rx="15" ry="15" width="60" height="60" style="fill:red;" />
            </svg>
        </label>
    </div>

</div>

logo.svg的内容是:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    width="160" height="120"
    viewBox="0 0 160 120"
    version="1.1">
    <g>
        <circle cx="80" cy="60" r="50" fill="yellow" stroke="blue" stroke-width="10" />
    </g>
</svg>

【问题讨论】:

  • 你能发布一张你想要什么的图片吗?当您说“中心”时,您是指水平、垂直还是两者兼而有之?
  • @CalvinNunes 您能否阅读更新,看看问题现在是否更清楚?

标签: html css svg centering


【解决方案1】:

当有疑问时,flexbox 所有的东西。并添加一些包装器......和一个垫片。

我发现 CSS float 令人抓狂,所以我像避免瘟疫一样避免它。为了回答您的其他问题,我尽可能将我的 svgs 内联,以便内部组件仍然可以使用 CSS 定位/设置样式。不过,这种方法应该适用于任何一种。

我尝试制作一个小提琴,但即使是最简单的代码也无法工作或显示任何内容,所以我不确定是我还是他们……虽然在我的浏览器中本地工作得很好。 https://imgur.com/AWrWK8Z

我添加了 2 个元素,一个中间间隔元素设置为 flex 增长,因此它可以占用所有可用空间,将其他元素推向右侧/左侧。以及围绕输入/标签对的包装器(以及唯一的左派)。我在标题容器和左右子容器上都使用了 flex,以简化垂直居中。

.header {
        width: 100%;
        height: 300px;
        display: flex; 
        align-items: center;
        background-color: #ddd;  
    }
    .spacer {
        flex: 1 0 auto;
        background: rgba(200,200,200,1);
    }
    .left {   
        background-color: #bbb;  
    } 
    .right {  
        background-color: #ccc;  
    }
    .wrapper {  
        display: flex;
        height: 70%;
        align-items: center; 
        outline: 1px solid blue;
    }
    .wrapper > div {
        flex: 1 1 auto;
        outline: 1px solid black;
    }


 
   <div class="header"> 

        <div class="left wrapper">
           <div>
                <a>
                    <svg  xmlns="http://www.w3.org/2000/svg"
                        xmlns:xlink="http://www.w3.org/1999/xlink"
                        width="160" height="120"
                        viewBox="0 0 160 120"
                        version="1.1">
                        <g>
                            <circle cx="80" cy="60" r="50" fill="yellow" stroke="blue" stroke-width="10" />
                        </g>
                    </svg>
                </a>
            </div>
        </div> 

        <div class="spacer"></div>
 
        <div class="right wrapper"> 
            <div>
                <label class="myLabel">
                    <input type="radio" name="radioGroup" class="myradioG" checked>
                    <svg width="100" height="100" viewBox="0 0 100 100">
                        <circle cx="50" cy="50" r="30" style="fill:blue;" />
                    </svg>
                </label>
            </div>

             <div>
                <label class="inline-radio">
                    <input type="radio" name="radioGroup" class="myradioG">
                    <svg width="100" height="100" viewBox="0 0 100 100">
                        <rect x="20" y="20" rx="15" ry="15" width="60" height="60" style="fill:red;" />
                    </svg>
                </label>
            </div> 
        </div> 

    </div>

【讨论】:

  • 这看起来是在正确的轨道上,但是:1- 提高或降低 height: 70%; 中的 70 不再放大或缩小 SVG,并且 2- 单选按钮小部件不再与他们的 SVG 图标一起居中。
  • 要使 svg 缩放,您必须删除固定的高度和宽度属性,并将它们替换为相对的值,例如 100%。然后它们根据 viewBox 属性定义的纵横比填充它们放入的任何容器。您的 svg 文件内容具有这样的内容,因此我认为需要固定大小。如果您希望 svg 具有响应性,那么显式设置 svg 的高度和宽度通常不是一个好主意。尽管指定了高度和宽度,但它们在 img 标签中使用时是否像您想要的那样拉伸?自从我在 img 标签中尝试过它们以来,它已经永远......
  • 我使用以下顺序: 1- 在px 中设置标题的高度,而不是整体高度的百分比。 2- 调整标题中 SVG 图标的比例。我认为您的建议是:A-将标题的高度设置为百分比,B-将 SVG 图标设置为标题的百分比。 1-可能和A-不同,但是2-还是和B-一样,不是吗?
  • 标题应该可以是您需要/想要的任何高度。我只是说将 svg 图标的宽度和高度属性设置为百分比。我可能记错了它们在 标签中的工作方式。那是我的错,我应该像你的 OP 一样使用 img 标签发布我的答案。
猜你喜欢
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2013-07-14
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多