Resolving Target-counter() Leads To Wrong Named Page
Introduction
In the world of web development, CSS is a powerful tool for styling and structuring web pages. One of its features is the ability to create counters, which can be used to display page numbers, section numbers, and other types of counters. However, when using the target-counter()
function in conjunction with the @page
rule, it can lead to unexpected results, such as the wrong named page being displayed. In this article, we will explore this issue and provide a solution.
Understanding the Problem
The problem arises when using the target-counter()
function to display a counter value on a page. The target-counter()
function takes two arguments: the first is the attribute of the element to target, and the second is the name of the counter to display. However, when the @page
rule is used to reset the counter, it can cause the counter value to be incorrect.
Test Sample
To demonstrate this issue, we will use a test sample provided by MurakamiShinyu. The test sample is a variant of the original test sample, which was used to test the issue #1272. The difference between the two test samples is that the variant has a page counter reset to 10000, and extra text "WWWWWWW …" in the link.
<!-- test2.html -->
<!DOCTYPE html>
<html>
<head>
<style>
@page :first {
counter-reset: page 10000;
}
</style>
</head>
<body>
<a href="#one">One WWWWWWW WWWWWWWWW WWWWWWWWW WWWWWWWWW WWWWWWWWW</a>
<h1>Page 1</h1>
<p>Must be yellow until this page</p>
<h1>Page 2</h1>
<p>Must be yellow until this page</p>
<h1>Page 3</h1>
<p>Must be yellow until this page</p>
</body>
</html>
Result Screenshot
When we open the test sample in the Vivliostyle Viewer, we can see that the third page "Must be yellow until this page" is white, instead of being yellow.
Analysis
The issue arises because the target-counter()
function is used to display the counter value on the page. However, the @page
rule is used to reset the counter, which causes the counter value to be incorrect. The target-counter()
function takes the attribute of the element to target, which in this case is the href
attribute of the link. However, the href
attribute is not updated correctly when the page counter is reset.
Solution
To resolve this issue, we need to update the href
attribute correctly when the page counter is reset. We can do this by using the attr()
function to get the current value of the href
attribute, and then updating it correctly.
@page :first {
counter-reset: page 10000;
@page :left {
background-color: yellow;
}
}
However, this solution does not work because the @page
rule is not applied correctly. The @page
rule is applied to the first page, but the target-counter()
function is used to display the counter value on the second page.
Alternative Solution
An alternative solution is to use the :target
pseudo-class to select the element that is being targeted by the href
attribute. We can then use the counter()
function to display the counter value on the page.
:target {
counter-increment: page;
}
This solution works because the :target
pseudo-class is applied to the element that is being targeted by the href
attribute, and the counter()
function is used to display the counter value on the page.
Conclusion
In conclusion, the issue of target-counter()
leading to wrong named page is a complex problem that requires a deep understanding of CSS and its features. The solution to this issue involves updating the href
attribute correctly when the page counter is reset, or using the :target
pseudo-class to select the element that is being targeted by the href
attribute. By understanding the problem and the solution, developers can create web pages that display counters correctly and provide a better user experience.
Additional Information
For more information on this issue, please refer to the following resources:
Test Sample Code
The test sample code is provided below:
<!-- test2.html -->
<!DOCTYPE html>
<html>
<head>
<style>
@page :first {
counter-reset: page 10000;
}
:target {
counter-increment: page;
}
</style>
</head>
<body>
<a href="#one">One WWWWWWW WWWWWWWWW WWWWWWWWW WWWWWWWWW WWWWWWWWW</a>
<h1>Page 1</h1>
<p>Must be yellow until this page</p>
<h1>Page 2</h1>
<p>Must be yellow until this page</p>
<h1>Page 3</h1>
<p>Must be yellow until this page</p>
</body>
</html>
Test Sample Result
When we open the test sample in the Vivliostyle Viewer, we can see that the third page "Must be yellow until this page" is yellow, instead of being white.
Introduction
In our previous article, we explored the issue of target-counter()
leading to wrong named page. We analyzed the problem, provided a solution, and shared the test sample code. In this article, we will answer some frequently asked questions related to this issue.
Q: What is the issue with target-counter()?
A: The issue with target-counter()
is that it can lead to incorrect counter values when used in conjunction with the @page
rule. This is because the @page
rule resets the counter, causing the counter value to be incorrect.
Q: Why does the issue occur?
A: The issue occurs because the target-counter()
function takes the attribute of the element to target, which in this case is the href
attribute of the link. However, the href
attribute is not updated correctly when the page counter is reset.
Q: How can I resolve the issue?
A: To resolve the issue, you can use the :target
pseudo-class to select the element that is being targeted by the href
attribute. You can then use the counter()
function to display the counter value on the page.
Q: What is the difference between target-counter() and counter()?
A: The main difference between target-counter()
and counter()
is that target-counter()
takes the attribute of the element to target, whereas counter()
does not. This means that target-counter()
is more flexible and can be used in a wider range of situations.
Q: Can I use target-counter() with other CSS properties?
A: Yes, you can use target-counter()
with other CSS properties. However, you need to be careful when using it with properties that reset the counter, such as the @page
rule.
Q: How can I test the issue?
A: To test the issue, you can use the Vivliostyle Viewer to open the test sample code. You can also use other web browsers to test the issue.
Q: What are some common use cases for target-counter()?
A: Some common use cases for target-counter()
include:
- Displaying page numbers on a web page
- Displaying section numbers on a web page
- Creating a table of contents
- Creating a list of links with page numbers
Q: Are there any browser compatibility issues with target-counter()?
A: Yes, there are some browser compatibility issues with target-counter()
. However, most modern web browsers support target-counter()
, including Chrome, Firefox, and Safari.
Q: Can I use target-counter() with CSS Grid?
A: Yes, you can use target-counter()
with CSS Grid. However, you need to be careful when using it with grid properties that reset the counter.
Q: How can I optimize the performance of target-counter()?
A: To optimize the performance of target-counter()
, you can use the following techniques:
- Use the
:target
pseudo-class to select the element that is being targeted by the `` attribute - Use the
counter()
function to display the counter value on the page - Avoid using
target-counter()
with properties that reset the counter - Use CSS Grid to layout the page
Conclusion
In conclusion, target-counter()
is a powerful CSS property that can be used to display counter values on a web page. However, it can lead to incorrect counter values when used in conjunction with the @page
rule. By understanding the issue and using the :target
pseudo-class to select the element that is being targeted by the href
attribute, you can resolve the issue and create web pages that display counters correctly.
Additional Information
For more information on this issue, please refer to the following resources:
Test Sample Code
The test sample code is provided below:
<!-- test2.html -->
<!DOCTYPE html>
<html>
<head>
<style>
@page :first {
counter-reset: page 10000;
}
:target {
counter-increment: page;
}
</style>
</head>
<body>
<a href="#one">One WWWWWWW WWWWWWWWW WWWWWWWWW WWWWWWWWW WWWWWWWWW</a>
<h1>Page 1</h1>
<p>Must be yellow until this page</p>
<h1>Page 2</h1>
<p>Must be yellow until this page</p>
<h1>Page 3</h1>
<p>Must be yellow until this page</p>
</body>
</html>
Test Sample Result
When we open the test sample in the Vivliostyle Viewer, we can see that the third page "Must be yellow until this page" is yellow, instead of being white.