現在ソートされている列のヘッダーにアイコンが表示される「ソート可能な」テーブルがあります。
ソートアイコンはテキストのendに表示されます(つまり、LTR/RTLをサポートしています)。現在、display:flex
を使用しています。ただし、テーブルの幅が小さくなり、列ヘッダーのテキストが折り返され始めると、並べ替えられている列が明確でないあいまいな状態になります。
代わりに、次の要件を満たしたいと思います。
例えば:
display: inline/inline-block/flex/grid
、position
、::before/::after
、さらにはfloat
(!)のさまざまな組み合わせを試してみましたが、望ましい動作を得ることができません。これが問題を示す私の現在のコードです:
.table {
border-collapse: collapse;
width: 100%;
}
.thead {
border-bottom: 3px solid #d0d3d3;
}
.thead .tr {
vertical-align: bottom;
}
.button {
padding: 1rem;
text-align: start;
font-family: Arial, "noto sans", sans-serif;
font-size: 0.875rem;
border: 0;
background-color: transparent;
width: 100%;
display: flex;
align-items: flex-end;
font-weight: bold;
line-height: 1.4;
}
.sort {
width: 1.25rem;
height: 1.25rem;
}
<table class="table">
<thead class="thead">
<tr class="tr">
<th class="th">
<button class="button">
Age
<span class="sort"></span>
</button>
</th>
<th class="th">
<button class="button">
Favorite Food
<span class="sort"></span>
</button>
</th>
<th class="th" aria-sort="ascending">
<button class="button">
Favorite Color
<span class="sort">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.25rem; height: 1.25rem;"> <path d="M11.4709 4.2136C11.7638 3.92071 12.2386 3.92071 12.5315 4.2136L17.1277 8.8098C17.4206 9.10269 17.4206 9.57756 17.1277 9.87046C16.8348 10.1633 16.3599 10.1633 16.0671 9.87046L12.7512 6.55459V19.25C12.7512 19.6642 12.4154 20 12.0012 20C11.587 20 11.2512 19.6642 11.2512 19.25V6.55459L7.93533 9.87046C7.64244 10.1633 7.16756 10.1633 6.87467 9.87046C6.58178 9.57756 6.58178 9.10269 6.87467 8.8098L11.4709 4.2136Z"> </path></svg>
</span>
</button>
</th>
<th class="th">
<button class="button">
Likes Neil Diamond?
<span class="sort"></span>
</button>
</th>
</tr>
</thead>
</table>
このUIを実現する方法に関するアイデアはありますか?これはおそらく、テーブルやボタンに関するものとはほとんど関係ありません。本当にThing A
を「しっかり」下/端をThing B
に揃える必要があります(幅は柔軟で、テキストを折り返すことができます)が、Thing A
は独自の行に折り返すことができません。
私はflex
の値をいじってみましたが、どのような組み合わせでもテキストの折り返しが時期尚早になるか、まもなく遅くなります。
視覚的な曖昧さ以外は何も問題はないと思います。ここに私の観察があります。
したがって、tight境界が存在します。動的な間隔が視覚的なあいまいさを引き起こしているだけです。
今解決策に来ています、JavaScriptの介入なしに思いつくことができる最も近い解決策は、完璧ではありませんが、
Max-widthを指定して、このテキストの幅を制限します。
button.button > span {
max-width: 60%; // I saw this to be decent enough
text-align: center; // This is to offset the visual effect of spacing
}
注:text-align: center
は、これを使用しないという厳密な要件がない限り、不足しているスペースの影響を減らすためだけのものです。
これでご質問が解決したかどうかをお知らせください。
これにはJSが必要だと思います。 5を除くすべての条件を満たす必要がある答えは次のとおりです。
const debounce = fn => {
let frame;
return (...params) => {
if (frame) {
cancelAnimationFrame(frame);
}
frame = requestAnimationFrame(() => {
fn(...params);
});
};
};
const text = [...document.querySelectorAll(".text")];
const iconWidth = "1.25rem";
const positionIcon = () => {
if (!text) return;
text.forEach(t => {
const width = t.getBoundingClientRect().width;
const icon = t.nextElementSibling;
if (!icon) return;
icon.style.left = `calc(${width}px + ${iconWidth})`;
});
};
positionIcon();
window.addEventListener("resize", debounce(positionIcon));
.table {
border-collapse: collapse;
width: 100%;
}
.thead {
border-bottom: 3px solid #d0d3d3;
}
.thead .tr {
vertical-align: bottom;
}
.button {
padding: 1rem;
text-align: start;
font-family: Arial, "noto sans", sans-serif;
font-size: 0.875rem;
border: 0;
background-color: transparent;
width: 100%;
font-weight: bold;
line-height: 1.4;
position: relative;
}
.sort {
width: 1.25rem;
height: 1.25rem;
position: absolute;
bottom: 1rem;
left: 100%; /* no js fallback */
}
.sort svg {
height: 1.25rem;
width: 1.25rem;
}
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<svg id="arrow" viewBox="0 0 24 24" role="presentation"> <path d="M11.4709 4.2136C11.7638 3.92071 12.2386 3.92071 12.5315 4.2136L17.1277 8.8098C17.4206 9.10269 17.4206 9.57756 17.1277 9.87046C16.8348 10.1633 16.3599 10.1633 16.0671 9.87046L12.7512 6.55459V19.25C12.7512 19.6642 12.4154 20 12.0012 20C11.587 20 11.2512 19.6642 11.2512 19.25V6.55459L7.93533 9.87046C7.64244 10.1633 7.16756 10.1633 6.87467 9.87046C6.58178 9.57756 6.58178 9.10269 6.87467 8.8098L11.4709 4.2136Z"> </path></svg>
</svg>
<table class="table">
<thead class="thead">
<tr class="tr">
<th class="th">
<button class="button">
<span class="text">Age</span>
<span class="sort">
<svg>
<use xlink:href="#arrow">
</svg>
</span>
</button>
</th>
<th class="th">
<button class="button">
<span class="text">Favourite Food</span>
<span class="sort">
<svg>
<use xlink:href="#arrow">
</svg>
</span>
</button>
</th>
<th class="th" aria-sort="ascending">
<button class="button">
<span class="text">Favorite Color</span>
<span class="sort">
<svg>
<use xlink:href="#arrow">
</svg>
</span>
</button>
</th>
<th class="th">
<button class="button">
<span class="text">Likes Neil Diamond?</span>
<span class="sort">
<svg>
<use xlink:href="#arrow">
</svg>
</span>
</button>
</th>
</tr>
</thead>
</table>
私はあなたがほとんど上手で、少しトリックである(3)を逃していると思います。アイコン要素の幅を0
に等しくし、テキストと並べ替えアイコンの間の空白を無効にするというアイデアがあります。このために、テキスト用の追加のラッパーを使用し、フレックスボックスの使用を削除しました。
オーバーフローが発生しますが、パディングを適用しているため、問題にはなりません。必要に応じて、padding-right
を増やすこともできます
.table {
border-collapse: collapse;
width: 100%;
}
.thead {
border-bottom: 3px solid #d0d3d3;
}
.thead .tr {
vertical-align: bottom;
}
.button {
padding: 1rem;
text-align: start;
font-family: Arial, "noto sans", sans-serif;
font-size:0;
border: 0;
background-color: transparent;
width: 100%;
font-weight: bold;
line-height: 1.4;
}
.button > span {
font-size: 0.875rem;
}
.sort {
width: 0;
height: 1.25rem;
display: inline-block;
vertical-align: bottom;
}
<table class="table">
<thead class="thead">
<tr class="tr">
<th class="th">
<button class="button">
<span>Age</span>
<span class="sort"></span>
</button>
</th>
<th class="th">
<button class="button">
<span>Favorite Food</span>
<span class="sort"></span>
</button>
</th>
<th class="th" aria-sort="ascending">
<button class="button">
<span>Favorite Color</span>
<span class="sort">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.25rem; height: 1.25rem;"> <path d="M11.4709 4.2136C11.7638 3.92071 12.2386 3.92071 12.5315 4.2136L17.1277 8.8098C17.4206 9.10269 17.4206 9.57756 17.1277 9.87046C16.8348 10.1633 16.3599 10.1633 16.0671 9.87046L12.7512 6.55459V19.25C12.7512 19.6642 12.4154 20 12.0012 20C11.587 20 11.2512 19.6642 11.2512 19.25V6.55459L7.93533 9.87046C7.64244 10.1633 7.16756 10.1633 6.87467 9.87046C6.58178 9.57756 6.58178 9.10269 6.87467 8.8098L11.4709 4.2136Z"> </path></svg>
</span>
</button>
</th>
<th class="th">
<button class="button">
<span>Likes Neil Diamond?</span>
<span class="sort"></span>
</button>
</th>
</tr>
</thead>
</table>
あなたはこのように試すことができます:
<style>
.table {
border-collapse: collapse;
width: 100%;
}
.thead {
border-bottom: 3px solid #d0d3d3;
}
.thead .tr {
vertical-align: bottom;
}
.button {
padding: 1rem;
text-align: start;
font-family: Arial, "noto sans", sans-serif;
font-size: 0.875rem;
border: 0;
background-color: transparent;
/* display: flex;
align-items: flex-end;*/
font-weight: bold;
line-height: 1.4;
float: left;
}
@media only screen and (min-width:502px)
{.button {
width: calc(192px - 89px);
}
.button.food {
width: calc(214px - 89px);
}
}
.sort {
width: 1.25rem;
height: 1.25rem;
position: relative;
}
.sort svg {
position: absolute;
}
</style>
<meta name="viewport" content="width=device-width, initial-scale=1">
<table class="table">
<thead class="thead">
<tr class="tr">
<th class="th">
<button class="button">
Age
<span class="sort"></span>
</button>
</th>
<th class="th">
<button class="button food">
Favorite Food
<span class="sort"></span>
</button>
</th>
<th class="th" aria-sort="ascending">
<button class="button">
Favorite Color
<span class="sort">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.25rem; height: 1.25rem;"> <path d="M11.4709 4.2136C11.7638 3.92071 12.2386 3.92071 12.5315 4.2136L17.1277 8.8098C17.4206 9.10269 17.4206 9.57756 17.1277 9.87046C16.8348 10.1633 16.3599 10.1633 16.0671 9.87046L12.7512 6.55459V19.25C12.7512 19.6642 12.4154 20 12.0012 20C11.587 20 11.2512 19.6642 11.2512 19.25V6.55459L7.93533 9.87046C7.64244 10.1633 7.16756 10.1633 6.87467 9.87046C6.58178 9.57756 6.58178 9.10269 6.87467 8.8098L11.4709 4.2136Z"> </path></svg>
</span>
</button>
</th>
<th class="th">
<button class="button">
Likes Neil Diamond?
<span class="sort"></span>
</button>
</th>
</tr>
</thead>
</table>
この回答がお役に立てば幸いです。モバイルビュー用のCSSを作成していません。
シードのタイトルが動的でない場合は、簡単に修正できます。
このためには、最後のWord of Titleとsvgアイコンを一緒に配置する必要があります。
例:-html
<button>
Long
<span> title
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.25rem; height: 1.25rem;"> <path d="M11.4709 4.2136C11.7638 3.92071 12.2386 3.92071 12.5315 4.2136L17.1277 8.8098C17.4206 9.10269 17.4206 9.57756 17.1277 9.87046C16.8348 10.1633 16.3599 10.1633 16.0671 9.87046L12.7512 6.55459V19.25C12.7512 19.6642 12.4154 20 12.0012 20C11.587 20 11.2512 19.6642 11.2512 19.25V6.55459L7.93533 9.87046C7.64244 10.1633 7.16756 10.1633 6.87467 9.87046C6.58178 9.57756 6.58178 9.10269 6.87467 8.8098L11.4709 4.2136Z"> </path></svg>
</span>
</button>
.buttonクラスからdisplay:flexを削除し、追加されたスパンにスタイルdisplay:inline-blockを付与します
スパンがインラインブロックであるため、svgアイコンが別の行になることはありません。その前に少なくとも1つの単語があります